import React from 'react' import ol from 'openlayers' import olms from 'ol-mapbox-style' import Map from './Map' import style from '../../libs/style.js' export default class OpenLayers3Map extends Map { constructor(props) { super(props) const tilegrid = ol.tilegrid.createXYZ({tileSize: 512, maxZoom: 22}) this.resolutions = tilegrid.getResolutions() this.layer = new ol.layer.VectorTile({ source: new ol.source.VectorTile({ attributions: '© Mapbox ' + '© ' + 'OpenStreetMap contributors', format: new ol.format.MVT(), tileGrid: tilegrid, tilePixelRatio: 8, url: 'http://osm2vectortiles-0.tileserver.com/v2/{z}/{x}/{y}.pbf' }) }) } componentWillReceiveProps(nextProps) { const jsonStyle = style.toJSON(nextProps.mapStyle) const styleFunc = olms.getStyleFunction(jsonStyle, 'mapbox', this.resolutions) this.layer.setStyle(styleFunc) this.state.map.render() } componentDidMount() { const jsonStyle = style.toJSON(this.props.mapStyle) const styleFunc = olms.getStyleFunction(jsonStyle, 'mapbox', this.resolutions) this.layer.setStyle(styleFunc) const map = new ol.Map({ target: this.container, layers: [this.layer], view: new ol.View({ center: jsonStyle.center, zoom: jsonStyle.zoom, }) }) map.addControl(new ol.control.Zoom()); this.setState({ map }); } }