'use strict' // import $ from 'jquery'; import mapBoxGL from 'mapbox-gl' import Events from '../../_events' const MapBoxDriver = (($) => { class MapBoxDriver { getName () { return 'MapBoxDriver' } init ($el, config = []) { const ui = this mapBoxGL.accessToken = config.key ui.map = new mapBoxGL.Map({ container: $el.find('.mapAPI-map')[0], center: config.center ? config.center : [0, 0], // hash: true, style: config.style ? config.style : 'mapbox://styles/mapbox/streets-v9', localIdeographFontFamily: config['font-family'], zoom: config.mapZoom ? config.mapZoom : 10, attributionControl: false, antialias: true, accessToken: config.key, }) .addControl( new mapBoxGL.AttributionControl({ compact: true, }) ) .addControl(new mapBoxGL.NavigationControl(), 'top-right') .addControl( new mapBoxGL.GeolocateControl({ positionOptions: { enableHighAccuracy: true, }, trackUserLocation: true, }), 'bottom-right' ) .addControl( new mapBoxGL.ScaleControl({ maxWidth: 80, unit: 'metric', }), 'top-left' ) .addControl(new mapBoxGL.FullscreenControl()) ui.map.on('load', (e) => { $el.trigger(Events.MAPAPILOADED) }) ui.popup = new mapBoxGL.Popup({ closeOnClick: false, className: 'popup', }) } addMarker (crds, config) { const ui = this // create a DOM el for the marker const $el = $( `
${config.icon}
` ) $el.on('click', (e) => { ui.popup.setLngLat(crds).setHTML(config.content).addTo(ui.map) if (config.flyToMarker) { ui.map.flyTo({ center: crds, zoom: 17, }) } $(e.currentTarget).trigger(Events.MAPMARKERCLICK) }) // add marker to map const marker = new mapBoxGL.Marker($el[0]).setLngLat(crds).addTo(ui.map) return marker } addGeoJson (config) { const ui = this // Insert the layer beneath any symbol layer. /* if (config['3d']) { const layers = Map.getStyle().layers; let labelLayerId; for (let i = 0; i < layers.length; i++) { if (layers[i].type === 'symbol' && layers[i].layout['text-field']) { labelLayerId = layers[i].id; break; } } Map.addLayer({ 'id': '3d-buildings', 'source': 'composite', 'source-layer': 'building', 'filter': ['==', 'extrude', 'true'], 'type': 'fill-extrusion',flyToBounds 'minzoom': 15, 'paint': { 'fill-extrusion-color': '#aaa', // use an 'interpolate' expression to add a smooth transition effect to the // buildings as the user zooms in 'fill-extrusion-height': [ "interpolate", ["linear"], ["zoom"], 15, 0, 15.05, ["get", "height"], ], 'fill-extrusion-base': [ "interpolate", ["linear"], ["zoom"], 15, 0, 15.05, ["get", "min_height"], ], 'fill-extrusion-opacity': .6, }, }, labelLayerId); } */ const firstMarker = config.geojson.features[0].geometry.coordinates // Map.setCenter(firstMarker); const bounds = new mapBoxGL.LngLatBounds(firstMarker, firstMarker) // add markers to map config.geojson.features.forEach((marker) => { const id = marker.id const crds = marker.geometry.coordinates const content = marker.properties.content ui.addMarker(crds, { id, content, icon: marker.icon, flyToMarker: config.flyToMarker, }) bounds.extend(crds) }) ui.map.fitBounds(bounds, { padding: 30, }) ui.popup.on('close', (e) => { if (config.flyToBounds) { ui.map.fitBounds(bounds, { padding: 30, }) } $(e.currentTarget).trigger(Events.MAPPOPUPCLOSE) }) } getMap () { const ui = this return ui.map } getPopup () { const ui = this return ui.popup } } return MapBoxDriver })($) export default MapBoxDriver