leaflet-control-geocoder
Version:
Extendable geocoder with builtin support for OpenStreetMap Nominatim, Bing, Google, Mapbox, MapQuest, What3Words, Photon, Pelias, HERE, Neutrino, Plus codes
172 lines (152 loc) • 4.49 kB
text/typescript
import * as L from 'leaflet';
import { getJSON } from '../util';
import { IGeocoder, GeocoderOptions, geocodingParams, GeocodingResult, reverseParams } from './api';
export interface PeliasOptions extends GeocoderOptions {}
/**
* Implementation of the [Pelias](https://pelias.io/), [geocode.earth](https://geocode.earth/) geocoder (formerly Mapzen Search)
*/
export class Pelias implements IGeocoder {
options: PeliasOptions = {
serviceUrl: 'https://api.geocode.earth/v1'
};
constructor(options?: Partial<PeliasOptions>) {
L.Util.setOptions(this, options);
}
async geocode(query: string): Promise<GeocodingResult[]> {
const params = geocodingParams(this.options, {
api_key: this.options.apiKey,
text: query
});
const data = await getJSON<any>(this.options.serviceUrl + '/search', params);
return this._parseResults(data, 'bbox');
}
async suggest(query: string): Promise<GeocodingResult[]> {
const params = geocodingParams(this.options, {
api_key: this.options.apiKey,
text: query
});
const data = await getJSON<any>(this.options.serviceUrl + '/autocomplete', params);
return this._parseResults(data, 'bbox');
}
async reverse(location: L.LatLngLiteral, scale: number): Promise<GeocodingResult[]> {
const params = reverseParams(this.options, {
api_key: this.options.apiKey,
'point.lat': location.lat,
'point.lon': location.lng
});
const data = await getJSON<any>(this.options.serviceUrl + '/reverse', params);
return this._parseResults(data, 'bounds');
}
_parseResults(data, bboxname): GeocodingResult[] {
const results: GeocodingResult[] = [];
L.geoJSON(data, {
pointToLayer(feature, latlng) {
return L.circleMarker(latlng);
},
onEachFeature(feature, layer: any) {
const result = {} as GeocodingResult;
let bbox;
let center;
if (layer.getBounds) {
bbox = layer.getBounds();
center = bbox.getCenter();
} else if (layer.feature.bbox) {
center = layer.getLatLng();
bbox = L.latLngBounds(
L.GeoJSON.coordsToLatLng(layer.feature.bbox.slice(0, 2)),
L.GeoJSON.coordsToLatLng(layer.feature.bbox.slice(2, 4))
);
} else {
center = layer.getLatLng();
bbox = L.latLngBounds(center, center);
}
result.name = layer.feature.properties.label;
result.center = center;
result[bboxname] = bbox;
result.properties = layer.feature.properties;
results.push(result);
}
});
return results;
}
}
/**
* [Class factory method](https://leafletjs.com/reference.html#class-class-factories) for {@link Pelias}
* @param options the options
*/
export function pelias(options?: Partial<PeliasOptions>) {
return new Pelias(options);
}
export const GeocodeEarth = Pelias;
export const geocodeEarth = pelias;
/**
* r.i.p.
* @deprecated
*/
export const Mapzen = Pelias;
/**
* r.i.p.
* @deprecated
*/
export const mapzen = pelias;
/**
* Implementation of the [Openrouteservice](https://openrouteservice.org/dev/#/api-docs/geocode) geocoder
*/
export class Openrouteservice extends Pelias {
constructor(options?: Partial<PeliasOptions>) {
super(
L.Util.extend(
{
serviceUrl: 'https://api.openrouteservice.org/geocode'
},
options
)
);
}
}
/**
* [Class factory method](https://leafletjs.com/reference.html#class-class-factories) for {@link Openrouteservice}
* @param options the options
*/
export function openrouteservice(options?: Partial<PeliasOptions>) {
return new Openrouteservice(options);
}
/**
* @internal
*/
export type PeliasResponse = GeoJSON.FeatureCollection<GeoJSON.Geometry, Properties> & {
geocoding: Geocoding;
};
interface Properties {
id: string;
layer: string;
source_id: string;
name: string;
confidence: number;
match_type: string;
accuracy: string;
country: string;
country_a: string;
region: string;
region_a: string;
county: string;
county_a: string;
localadmin: string;
locality: string;
continent: string;
label: string;
}
interface Geocoding {
version: string;
attribution: string;
query: Query;
warnings: string[];
engine: Engine;
}
interface Engine {
name: string;
author: string;
version: string;
}
interface Query {
}