in packages/layers/xyz-poi-tile/src/POILayer.ts [495:577]
private _createTileRenderables(token, projection, polaris): TilePromise {
const dataType = this.getProps('dataType')
const geojsonFilter = this.getProps('geojsonFilter')
const x = token[0],
y = token[1],
z = token[2]
const requestPending = this.requestManager.request({ x, y, z })
const requestPromise = requestPending.promise
const cacheKey = this._getCacheKey(x, y, z)
const promise = new Promise<TileRenderables>((resolve, reject) => {
requestPromise
.then(async (data) => {
let geojson: any
const emptyTile = {
meshes: [],
layers: [],
}
// parse response to geojson
if (dataType === 'pbf') {
geojson = decode(new Pbf(data))
} else if (dataType === 'geojson') {
geojson = data
} else if (dataType === 'auto') {
if (data.constructor === ArrayBuffer) {
geojson = decode(new Pbf(data))
} else if (typeof data === 'string') {
geojson = JSON.parse(data)
} else if (typeof data === 'object') {
geojson = data
}
} else {
console.error(`Invalid dataType prop value: ${dataType}`)
resolve(emptyTile)
return
}
const filteredGeojson = geojsonFilter ? geojsonFilter(geojson) : undefined
geojson = filteredGeojson ?? geojson
if (
!geojson.type ||
geojson.type !== 'FeatureCollection' ||
!geojson.features ||
!Array.isArray(geojson.features)
) {
// console.warn(
// `POILayer - Tile source is not a valid GeoJSON, skip. Use 'geojsonFilter' to modify the response data if necessary. `
// )
resolve(emptyTile)
return
}
if (geojson.features.length > 0) {
const clusterImage = await this._getClusterImage()
const tile = this._createTileMeshAndMarkers(
geojson,
projection,
polaris,
cacheKey,
clusterImage
)
if (tile) {
resolve(tile)
return
}
}
resolve(emptyTile)
})
.catch((e) => {
reject(e)
})
})
return {
promise,
abort: requestPending.abort,
}
}