mirror of
https://github.com/a-nyx/maputnik-with-pmtiles.git
synced 2024-12-28 17:31:14 +01:00
Updated openlayers.
openlayers^4.4.2 -> ol^4.6.4 ol-mapbox-style^1.0.1 -> ol-mapbox-style^2.10.1 Fixes #246
This commit is contained in:
parent
df3a42acce
commit
8915bbfeb4
3 changed files with 168 additions and 964 deletions
1012
package-lock.json
generated
1012
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -37,8 +37,8 @@
|
||||||
"mapbox-gl-inspect": "^1.2.6",
|
"mapbox-gl-inspect": "^1.2.6",
|
||||||
"maputnik-design": "github:maputnik/design",
|
"maputnik-design": "github:maputnik/design",
|
||||||
"mousetrap": "^1.6.1",
|
"mousetrap": "^1.6.1",
|
||||||
"ol-mapbox-style": "^1.0.1",
|
"ol-mapbox-style": "^2.10.1",
|
||||||
"openlayers": "^4.4.2",
|
"ol": "^4.6.4",
|
||||||
"prop-types": "^15.6.0",
|
"prop-types": "^15.6.0",
|
||||||
"react": "16.0.0",
|
"react": "16.0.0",
|
||||||
"react-addons-pure-render-mixin": "^15.6.2",
|
"react-addons-pure-render-mixin": "^15.6.2",
|
||||||
|
|
|
@ -3,66 +3,8 @@ import PropTypes from 'prop-types'
|
||||||
import style from '../../libs/style.js'
|
import style from '../../libs/style.js'
|
||||||
import isEqual from 'lodash.isequal'
|
import isEqual from 'lodash.isequal'
|
||||||
import { loadJSON } from '../../libs/urlopen'
|
import { loadJSON } from '../../libs/urlopen'
|
||||||
import 'openlayers/dist/ol.css'
|
import 'ol/ol.css'
|
||||||
|
|
||||||
function suitableVectorSource(mapStyle) {
|
|
||||||
const sources = Object.keys(mapStyle.sources)
|
|
||||||
.map(sourceId => {
|
|
||||||
return {
|
|
||||||
id: sourceId,
|
|
||||||
source: mapStyle.sources[sourceId]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.filter(({source}) => (source.type === 'vector' || source.type === 'geojson'))
|
|
||||||
return sources[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
function toVectorLayer(source, tilegrid, cb) {
|
|
||||||
function newMVTLayer(tileUrl) {
|
|
||||||
const ol = require('openlayers')
|
|
||||||
return new ol.layer.VectorTile({
|
|
||||||
source: new ol.source.VectorTile({
|
|
||||||
format: new ol.format.MVT(),
|
|
||||||
tileGrid: tilegrid,
|
|
||||||
tilePixelRatio: 8,
|
|
||||||
url: tileUrl
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function newGeoJSONLayer(sourceUrl) {
|
|
||||||
const ol = require('openlayers')
|
|
||||||
return new ol.layer.Vector({
|
|
||||||
source: new ol.source.Vector({
|
|
||||||
format: new ol.format.GeoJSON(),
|
|
||||||
url: sourceUrl
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
if (source.type === 'vector') {
|
|
||||||
if(!source.tiles) {
|
|
||||||
sourceFromTileJSON(source.url, tileSource => {
|
|
||||||
cb(newMVTLayer(tileSource.tiles[0]))
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
cb(newMVTLayer(source.tiles[0]))
|
|
||||||
}
|
|
||||||
} else if (source.type === 'geojson') {
|
|
||||||
cb(newGeoJSONLayer(source.data))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function sourceFromTileJSON(url, cb) {
|
|
||||||
loadJSON(url, null, tilejson => {
|
|
||||||
if(!tilejson) return
|
|
||||||
cb({
|
|
||||||
type: 'vector',
|
|
||||||
tiles: tilejson.tiles,
|
|
||||||
minzoom: tilejson.minzoom,
|
|
||||||
maxzoom: tilejson.maxzoom,
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
class OpenLayers3Map extends React.Component {
|
class OpenLayers3Map extends React.Component {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
|
@ -79,49 +21,17 @@ class OpenLayers3Map extends React.Component {
|
||||||
|
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props)
|
super(props)
|
||||||
this.tilegrid = null
|
|
||||||
this.resolutions = null
|
|
||||||
this.layer = null
|
|
||||||
this.map = null
|
this.map = null
|
||||||
}
|
}
|
||||||
|
|
||||||
updateStyle(newMapStyle) {
|
updateStyle(newMapStyle) {
|
||||||
const oldSource = suitableVectorSource(this.props.mapStyle)
|
const olms = require('ol-mapbox-style');
|
||||||
const newSource = suitableVectorSource(newMapStyle)
|
const styleFunc = olms.apply(this.map, newMapStyle)
|
||||||
const resolutions = this.resolutions
|
|
||||||
|
|
||||||
function setStyleFunc(map, layer) {
|
|
||||||
const olms = require('ol-mapbox-style')
|
|
||||||
const styleFunc = olms.getStyleFunction(newMapStyle, newSource.id, resolutions)
|
|
||||||
layer.setStyle(styleFunc)
|
|
||||||
//NOTE: We need to mark the source as changed in order
|
|
||||||
//to trigger a rerender
|
|
||||||
layer.getSource().changed()
|
|
||||||
map.render()
|
|
||||||
}
|
|
||||||
|
|
||||||
if(newSource) {
|
|
||||||
if(this.layer && !isEqual(oldSource, newSource)) {
|
|
||||||
this.map.removeLayer(this.layer)
|
|
||||||
this.layer = null
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!this.layer) {
|
|
||||||
var self = this
|
|
||||||
toVectorLayer(newSource.source, this.tilegrid, vectorLayer => {
|
|
||||||
self.layer = vectorLayer
|
|
||||||
self.map.addLayer(self.layer)
|
|
||||||
setStyleFunc(self.map, self.layer)
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
setStyleFunc(this.map, this.layer)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps) {
|
componentWillReceiveProps(nextProps) {
|
||||||
require.ensure(["openlayers", "ol-mapbox-style"], () => {
|
require.ensure(["ol", "ol-mapbox-style"], () => {
|
||||||
if(!this.map || !this.resolutions) return
|
if(!this.map) return
|
||||||
this.updateStyle(nextProps.mapStyle)
|
this.updateStyle(nextProps.mapStyle)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -129,24 +39,22 @@ class OpenLayers3Map extends React.Component {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
//Load OpenLayers dynamically once we need it
|
//Load OpenLayers dynamically once we need it
|
||||||
//TODO: Make this more convenient
|
//TODO: Make this more convenient
|
||||||
require.ensure(["openlayers", "ol-mapbox-style"], ()=> {
|
require.ensure(["ol", "ol/map", "ol/view", "ol/control/zoom", "ol-mapbox-style"], ()=> {
|
||||||
console.log('Loaded OpenLayers3 renderer')
|
console.log('Loaded OpenLayers3 renderer')
|
||||||
|
|
||||||
const ol = require('openlayers')
|
const olMap = require('ol/map').default
|
||||||
const olms = require('ol-mapbox-style')
|
const olView = require('ol/view').default
|
||||||
|
const olZoom = require('ol/control/zoom').default
|
||||||
|
|
||||||
this.tilegrid = ol.tilegrid.createXYZ({tileSize: 512, maxZoom: 22})
|
const map = new olMap({
|
||||||
this.resolutions = this.tilegrid.getResolutions()
|
|
||||||
|
|
||||||
const map = new ol.Map({
|
|
||||||
target: this.container,
|
target: this.container,
|
||||||
layers: [],
|
layers: [],
|
||||||
view: new ol.View({
|
view: new olView({
|
||||||
zoom: 2,
|
zoom: 2,
|
||||||
center: [52.5, -78.4]
|
center: [52.5, -78.4]
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
map.addControl(new ol.control.Zoom())
|
map.addControl(new olZoom())
|
||||||
this.map = map
|
this.map = map
|
||||||
this.updateStyle(this.props.mapStyle)
|
this.updateStyle(this.props.mapStyle)
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue