add Here provider

This commit is contained in:
Stephan Meijer
2020-04-27 17:38:18 +02:00
parent 0c6f4f0bdb
commit 8b122c43ff
8 changed files with 201 additions and 1 deletions

View File

@@ -2,3 +2,4 @@ BING_API_KEY=___YOUR_KEY___
GOOGLE_API_KEY=___YOUR_KEY___
LOCATIONIQ_API_KEY=___YOUR_KEY___
OPENCAGE_API_KEY=___YOUR_KEY___
HERE_API_KEY=___YOUR_KEY___

View File

@@ -2,6 +2,7 @@ import {
BingProvider,
EsriProvider,
GoogleProvider,
HereProvider,
LocationIQProvider,
OpenCageProvider,
OpenStreetMapProvider,
@@ -18,6 +19,10 @@ export default {
params: { key: process.env.GATSBY_GOOGLE_API_KEY },
}),
Here: new HereProvider({
params: { apiKey: process.env.GATSBY_HERE_API_KEY },
}),
LocationIQ: new LocationIQProvider({
params: { key: process.env.GATSBY_LOCATIONIQ_API_KEY },
}),

38
docs/providers/here.mdx Normal file
View File

@@ -0,0 +1,38 @@
---
name: Here
menu: Providers
route: /providers/here
---
import Playground from '../components/Playground';
import Map from '../components/Map';
# Here Provider
**note**: Here services require an API key. [Obtain here][1].
For more options and configurations, see the [Here developer docs][2].
<Playground>
<Map provider="Here" />
</Playground>
```js
import { HereProvider } from 'leaflet-geosearch';
const provider = new HereProvider({
params: {
apiKey: '__YOUR_HERE_KEY__'
},
});
// add to leaflet
import { GeoSearchControl } from 'leaflet-geosearch';
map.addControl(new GeoSearchControl({
provider,
}));
```
[1]: https://developer.here.com
[2]: https://developer.here.com/documentation/geocoding-search-api

View File

@@ -20,6 +20,7 @@ export default {
'Bing',
'Esri',
'Google',
'Here',
'LocationIQ',
'OpenCage',
'OpenStreetMap',

View File

@@ -5,8 +5,8 @@ export { default as SearchElement } from './SearchElement';
export { default as BingProvider } from './providers/bingProvider';
export { default as EsriProvider } from './providers/esriProvider';
export { default as GoogleProvider } from './providers/googleProvider';
export { default as HereProvider } from './providers/hereProvider';
export { default as LocationIQProvider } from './providers/locationIQProvider';
export { default as OpenCageProvider } from './providers/openCageProvider';
export { default as OpenStreetMapProvider } from './providers/openStreetMapProvider';
export { default as JsonProvider } from './providers/provider';

View File

@@ -0,0 +1,25 @@
import Provider from '../hereProvider';
import fixtures from './hereResponse.json';
describe('HereProvider', () => {
beforeAll(() => {
fetch.mockResponse(async () => ({ body: JSON.stringify(fixtures) }));
});
test('Can fetch results', async () => {
const provider = new Provider({
params: {
apiKey: process.env.HERE_API_KEY,
},
});
const results = await provider.search({ query: 'Madurodam' });
const result = results[0];
expect(result.label).toBeTruthy();
expect(result.x).toEqual(+fixtures.items[0].position.lng);
expect(result.y).toEqual(+fixtures.items[0].position.lat);
// here provider doesn't return bounds :(
expect(result.bounds).toBeFalsy();
});
});

View File

@@ -0,0 +1,70 @@
{
"items": [
{
"title": "Madurodam",
"id": "here:pds:place:528u1703-2f80762a07494e6b9d5442d7ca773402",
"resultType": "place",
"address": {
"label": "Madurodam, George Maduroplein 1, 2584 RZ Den Haag, Nederland",
"countryCode": "NLD",
"countryName": "Nederland",
"state": "Zuid-Holland",
"county": "Den Haag",
"city": "Den Haag",
"district": "Van Stolkpark/Scheveningse Bosjes",
"street": "George Maduroplein",
"postalCode": "2584 RZ",
"houseNumber": "1"
},
"position": {
"lat": 52.0991,
"lng": 4.29904
},
"access": [
{
"lat": 52.09909,
"lng": 4.2995
}
],
"categories": [
{
"id": "300-3000-0000"
},
{
"id": "300-3000-0025"
},
{
"id": "300-3100-0000"
},
{
"id": "550-5520-0207"
}
],
"contacts": [
{
"phone": [
{
"value": "+31704162400"
}
],
"www": [
{
"value": "http://www.madurodam.nl"
}
],
"email": [
{
"value": "info@madurodam.nl"
}
]
}
],
"scoring": {
"queryScore": 1.0,
"fieldScore": {
"placeName": 1.0
}
}
}
]
}

View File

@@ -0,0 +1,60 @@
import AbstractProvider, {
EndpointArgument,
LatLng,
ParseArgument,
SearchResult,
} from './provider';
export interface RequestResult {
items: RawResult[];
}
export interface RawResult {
title: string;
id: string;
resultType: string;
address: {
label: string;
countryCode: string;
countryName: string;
state: string;
county: string;
city: string;
district: string;
street: string;
postalCode: string;
houseNumber: string;
};
position: LatLng;
access: LatLng[];
categories: { id: string }[];
contacts: { [key: string]: { value: string }[] }[];
scoring: {
queryScore: number;
fieldScore: {
placeName: number;
};
};
}
export default class HereProvider extends AbstractProvider<
RequestResult,
RawResult
> {
searchUrl = 'https://geocode.search.hereapi.com/v1/geocode';
endpoint({ query }: EndpointArgument): string {
const params = typeof query === 'string' ? { q: query } : query;
return this.getUrl(this.searchUrl, params);
}
parse(response: ParseArgument<RequestResult>): SearchResult<RawResult>[] {
return response.data.items.map((r) => ({
x: r.position.lng,
y: r.position.lat,
label: r.address.label,
bounds: null,
raw: r,
}));
}
}