mirror of
https://github.com/a-nyx/maputnik-with-pmtiles.git
synced 2024-11-10 07:47:46 +01:00
Layer watcher figures out possible fields
This commit is contained in:
parent
ec39f03449
commit
461a001552
2 changed files with 44 additions and 2 deletions
|
@ -22,6 +22,8 @@
|
||||||
"color": "^1.0.3",
|
"color": "^1.0.3",
|
||||||
"file-saver": "^1.3.2",
|
"file-saver": "^1.3.2",
|
||||||
"immutable": "^3.8.1",
|
"immutable": "^3.8.1",
|
||||||
|
"lodash.throttle": "^4.1.1",
|
||||||
|
"lodash.topairs": "^4.3.0",
|
||||||
"mapbox-gl": "^0.28.0",
|
"mapbox-gl": "^0.28.0",
|
||||||
"mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#e85407a377510acb647161de6be6357ab4f606dd",
|
"mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#e85407a377510acb647161de6be6357ab4f606dd",
|
||||||
"ol-mapbox-style": "0.0.11",
|
"ol-mapbox-style": "0.0.11",
|
||||||
|
|
|
@ -1,26 +1,66 @@
|
||||||
import Immutable from 'immutable'
|
import Immutable from 'immutable'
|
||||||
|
import throttle from 'lodash.throttle'
|
||||||
|
import entries from 'lodash.topairs'
|
||||||
|
|
||||||
/** Listens to map events to build up a store of available vector
|
/** Listens to map events to build up a store of available vector
|
||||||
* layers contained in the tiles */
|
* layers contained in the tiles */
|
||||||
export default class LayerWatcher {
|
export default class LayerWatcher {
|
||||||
constructor() {
|
constructor() {
|
||||||
this._sources = {}
|
this._sources = {}
|
||||||
|
this._vectorLayers = {}
|
||||||
|
this._map= null
|
||||||
|
|
||||||
|
// Since we scan over all features we want to avoid this as much as
|
||||||
|
// possible and only do it after a batch of data has loaded because
|
||||||
|
// we only care eventuall about knowing the fields in the vector layers
|
||||||
|
this.throttledAnalyzeVectorLayerFields = throttle(this.analyzeVectorLayerFields, 5000)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set the map as soon as the map is initialized */
|
/** Set the map as soon as the map is initialized */
|
||||||
set map(m) {
|
set map(m) {
|
||||||
|
|
||||||
|
this._map = m
|
||||||
//TODO: At some point we need to unsubscribe when new map is set
|
//TODO: At some point we need to unsubscribe when new map is set
|
||||||
m.on('data', (e) => {
|
this._map.on('data', (e) => {
|
||||||
if(e.dataType !== 'tile') return
|
if(e.dataType !== 'tile') return
|
||||||
|
|
||||||
this._sources[e.source.id] = e.source.vectorLayerIds
|
this._sources[e.source.id] = e.source.vectorLayerIds
|
||||||
|
this.throttledAnalyzeVectorLayerFields()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
analyzeVectorLayerFields() {
|
||||||
|
Object.keys(this._sources).forEach(sourceId => {
|
||||||
|
this._sources[sourceId].forEach(vectorLayerId => {
|
||||||
|
const knownProperties = this._vectorLayers[vectorLayerId] || {}
|
||||||
|
const params = { sourceLayer: vectorLayerId }
|
||||||
|
this._map.querySourceFeatures(sourceId, params).forEach(feature => {
|
||||||
|
Object.keys(feature.properties).forEach(propertyName => {
|
||||||
|
const knownPropertyValues = knownProperties[propertyName] || {}
|
||||||
|
knownPropertyValues[feature.properties[propertyName]] = {}
|
||||||
|
knownProperties[propertyName] = knownPropertyValues
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
this._vectorLayers[vectorLayerId] = knownProperties
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(this.vectorLayers.toJSON())
|
||||||
|
}
|
||||||
|
|
||||||
/** Access all known sources and their vector tile ids */
|
/** Access all known sources and their vector tile ids */
|
||||||
get sources() {
|
get sources() {
|
||||||
console.log(this._sources)
|
|
||||||
return Immutable.Map(Object.keys(this._sources).map(key => {
|
return Immutable.Map(Object.keys(this._sources).map(key => {
|
||||||
return [key, Immutable.Set(this._sources[key])]
|
return [key, Immutable.Set(this._sources[key])]
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get vectorLayers() {
|
||||||
|
return Immutable.Map(entries(this._vectorLayers).map(([key, layer]) => {
|
||||||
|
return [key, Immutable.Map(entries(layer).map(([propId, values]) => {
|
||||||
|
return [propId, Immutable.Set(Object.keys(values))]
|
||||||
|
}))]
|
||||||
|
}))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue