forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import FeatureSource, { Tiled } from "../../Logic/FeatureSource/FeatureSource"
 | |
| import { Store, UIEventSource } from "../../Logic/UIEventSource"
 | |
| import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
 | |
| import ShowDataLayer from "./ShowDataLayer"
 | |
| import StaticFeatureSource from "../../Logic/FeatureSource/Sources/StaticFeatureSource"
 | |
| import { GeoOperations } from "../../Logic/GeoOperations"
 | |
| import { Tiles } from "../../Models/TileRange"
 | |
| import clusterstyle from "../../assets/layers/cluster_style/cluster_style.json"
 | |
| 
 | |
| export default class ShowTileInfo {
 | |
|     public static readonly styling = new LayerConfig(clusterstyle, "ShowTileInfo", true)
 | |
| 
 | |
|     constructor(
 | |
|         options: {
 | |
|             source: FeatureSource & Tiled
 | |
|             leafletMap: UIEventSource<any>
 | |
|             layer?: LayerConfig
 | |
|             doShowLayer?: UIEventSource<boolean>
 | |
|         },
 | |
|         state
 | |
|     ) {
 | |
|         const source = options.source
 | |
|         const metaFeature: Store<{ feature; freshness: Date }[]> = source.features.map(
 | |
|             (features) => {
 | |
|                 const bbox = source.bbox
 | |
|                 const [z, x, y] = Tiles.tile_from_index(source.tileIndex)
 | |
|                 const box = {
 | |
|                     type: "Feature",
 | |
|                     properties: {
 | |
|                         z: z,
 | |
|                         x: x,
 | |
|                         y: y,
 | |
|                         tileIndex: source.tileIndex,
 | |
|                         source: source.name,
 | |
|                         count: features.length,
 | |
|                         tileId: source.name + "/" + source.tileIndex,
 | |
|                     },
 | |
|                     geometry: {
 | |
|                         type: "Polygon",
 | |
|                         coordinates: [
 | |
|                             [
 | |
|                                 [bbox.minLon, bbox.minLat],
 | |
|                                 [bbox.minLon, bbox.maxLat],
 | |
|                                 [bbox.maxLon, bbox.maxLat],
 | |
|                                 [bbox.maxLon, bbox.minLat],
 | |
|                                 [bbox.minLon, bbox.minLat],
 | |
|                             ],
 | |
|                         ],
 | |
|                     },
 | |
|                 }
 | |
|                 const center = GeoOperations.centerpoint(box)
 | |
|                 return [box, center].map((feature) => ({ feature, freshness: new Date() }))
 | |
|             }
 | |
|         )
 | |
| 
 | |
|         new ShowDataLayer({
 | |
|             layerToShow: ShowTileInfo.styling,
 | |
|             features: new StaticFeatureSource(metaFeature),
 | |
|             leafletMap: options.leafletMap,
 | |
|             doShowLayer: options.doShowLayer,
 | |
|             state,
 | |
|         })
 | |
|     }
 | |
| }
 |