examples/get-started/pure-js/harp.gl/app.js (76 lines of code) (raw):
/* global document */
import {Deck} from '@deck.gl/core';
import {GeoJsonLayer, ArcLayer} from '@deck.gl/layers';
import {GeoCoordinates} from '@here/harp-geoutils';
import {MapView, MapViewUtils} from '@here/harp-mapview';
import {APIFormat, AuthenticationMethod, OmvDataSource} from '@here/harp-omv-datasource';
// Set your API key here
const API_KEY = process.env.HereApiKey; // eslint-disable-line
// source: Natural Earth http://www.naturalearthdata.com/ via geojson.xyz
const AIR_PORTS =
'https://d2ad6b4ur7yvpq.cloudfront.net/naturalearth-3.3.0/ne_10m_airports.geojson';
const INITIAL_VIEW_STATE = {
latitude: 51.47,
longitude: 0.45,
zoom: 4,
bearing: 0,
pitch: 30
};
function updateMapCamera(mapView, viewState) {
const coords = new GeoCoordinates(viewState.latitude, viewState.longitude);
const dist = MapViewUtils.calculateDistanceFromZoomLevel(
{focalLength: mapView.focalLength},
viewState.zoom + 1
);
mapView.lookAt(coords, dist, viewState.pitch, viewState.bearing);
mapView.zoomLevel = viewState.zoom + 1;
}
const map = new MapView({
canvas: document.getElementById('map-canvas'),
theme:
'https://unpkg.com/@here/harp-map-theme@latest/resources/berlin_tilezen_night_reduced.json',
// Match deck.gl's FOV = Math.atan(1/3) * 2 / Math.PI * 180
fovCalculation: {fov: 36.87, type: 'fixed'}
});
const omvDataSource = new OmvDataSource({
baseUrl: 'https://vector.hereapi.com/v2/vectortiles/base/mc',
apiFormat: APIFormat.XYZOMV,
styleSetName: 'tilezen',
authenticationCode: API_KEY,
authenticationMethod: {
method: AuthenticationMethod.QueryString,
name: 'apikey'
}
});
map.addDataSource(omvDataSource);
updateMapCamera(map, INITIAL_VIEW_STATE);
export const deck = new Deck({
canvas: 'deck-canvas',
width: '100%',
height: '100%',
initialViewState: INITIAL_VIEW_STATE,
controller: true,
// Synchronize deck camera and map camer
onViewStateChange: ({viewState}) => updateMapCamera(map, viewState),
onResize: ({width, height}) => map.resize(width, height),
layers: [
new GeoJsonLayer({
id: 'airports',
data: AIR_PORTS,
// Styles
filled: true,
pointRadiusMinPixels: 2,
pointRadiusScale: 2000,
getRadius: f => 11 - f.properties.scalerank,
getFillColor: [200, 0, 80, 180],
// Interactive props
pickable: true,
autoHighlight: true,
onClick: info =>
// eslint-disable-next-line
info.object && alert(`${info.object.properties.name} (${info.object.properties.abbrev})`)
}),
new ArcLayer({
id: 'arcs',
data: AIR_PORTS,
dataTransform: d => d.features.filter(f => f.properties.scalerank < 4),
// Styles
getSourcePosition: f => [-0.4531566, 51.4709959], // London
getTargetPosition: f => f.geometry.coordinates,
getSourceColor: [0, 128, 200],
getTargetColor: [200, 0, 80],
getWidth: 1
})
]
});