private _createTileRenderables()

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,
		}
	}