forked from MapComplete/MapComplete
		
	First fully working version
This commit is contained in:
		
							parent
							
								
									995f48b97a
								
							
						
					
					
						commit
						1fa66e50f8
					
				
					 8 changed files with 73 additions and 88 deletions
				
			
		|  | @ -4,12 +4,13 @@ import { BBox } from "../../BBox" | |||
| import { FeatureSource } from "../FeatureSource" | ||||
| import FeatureSourceMerger from "../Sources/FeatureSourceMerger" | ||||
| 
 | ||||
| 
 | ||||
| /*** | ||||
|  * A tiled source which dynamically loads the required tiles at a fixed zoom level. | ||||
|  * A single featureSource will be initialized for every tile in view; which will later be merged into this featureSource | ||||
|  */ | ||||
| export default class DynamicTileSource<Src extends FeatureSource = FeatureSource> extends FeatureSourceMerger<Src> { | ||||
| export default class DynamicTileSource< | ||||
|     Src extends FeatureSource = FeatureSource | ||||
| > extends FeatureSourceMerger<Src> { | ||||
|     /** | ||||
|      * | ||||
|      * @param zoomlevel If {z} is specified in the source, the 'zoomlevel' will be used as zoomlevel to download from | ||||
|  | @ -28,10 +29,12 @@ export default class DynamicTileSource<Src extends FeatureSource = FeatureSource | |||
|         }, | ||||
|         options?: { | ||||
|             isActive?: Store<boolean> | ||||
|         }, | ||||
|             zDiff?: number | ||||
|         } | ||||
|     ) { | ||||
|         super() | ||||
|         const loadedTiles = new Set<number>() | ||||
|         const zDiff = options?.zDiff ?? 0 | ||||
|         const neededTiles: Store<number[]> = Stores.ListStabilized( | ||||
|             mapProperties.bounds | ||||
|                 .mapD( | ||||
|  | @ -43,32 +46,32 @@ export default class DynamicTileSource<Src extends FeatureSource = FeatureSource | |||
|                         if (mapProperties.zoom.data < minzoom) { | ||||
|                             return undefined | ||||
|                         } | ||||
|                         const z = Math.floor(zoomlevel.data) | ||||
|                         const z = Math.floor(zoomlevel.data) + zDiff | ||||
|                         const tileRange = Tiles.TileRangeBetween( | ||||
|                             z, | ||||
|                             bounds.getNorth(), | ||||
|                             bounds.getEast(), | ||||
|                             bounds.getSouth(), | ||||
|                             bounds.getWest(), | ||||
|                             bounds.getWest() | ||||
|                         ) | ||||
|                         if (tileRange.total > 500) { | ||||
|                             console.warn( | ||||
|                                 "Got a really big tilerange, bounds and location might be out of sync", | ||||
|                                 "Got a really big tilerange, bounds and location might be out of sync" | ||||
|                             ) | ||||
|                             return undefined | ||||
|                         } | ||||
| 
 | ||||
|                         const needed = Tiles.MapRange(tileRange, (x, y) => | ||||
|                             Tiles.tile_index(z, x, y), | ||||
|                             Tiles.tile_index(z, x, y) | ||||
|                         ).filter((i) => !loadedTiles.has(i)) | ||||
|                         if (needed.length === 0) { | ||||
|                             return undefined | ||||
|                         } | ||||
|                         return needed | ||||
|                     }, | ||||
|                     [options?.isActive, mapProperties.zoom], | ||||
|                     [options?.isActive, mapProperties.zoom] | ||||
|                 ) | ||||
|                 .stabilized(250), | ||||
|                 .stabilized(250) | ||||
|         ) | ||||
| 
 | ||||
|         neededTiles.addCallbackAndRunD((neededIndexes) => { | ||||
|  | @ -79,5 +82,3 @@ export default class DynamicTileSource<Src extends FeatureSource = FeatureSource | |||
|         }) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -24,12 +24,13 @@ export class SummaryTileSource extends DynamicTileSource { | |||
|         } | ||||
|     ) { | ||||
|         const layersSummed = layers.join("+") | ||||
|         const zDiff = 2 | ||||
|         super( | ||||
|             zoomRounded, | ||||
|             0, // minzoom
 | ||||
|             (tileIndex) => { | ||||
|                 const [z, x, y] = Tiles.tile_from_index(tileIndex) | ||||
|                 const coordinates = Tiles.centerPointOf(z, x, y) | ||||
|                 let coordinates = Tiles.centerPointOf(z, x, y) | ||||
| 
 | ||||
|                 const count = UIEventSource.FromPromiseWithErr( | ||||
|                     Utils.downloadJson(`${cacheserver}/${layersSummed}/${z}/${x}/${y}.json`) | ||||
|  | @ -50,6 +51,21 @@ export class SummaryTileSource extends DynamicTileSource { | |||
|                     if (counts === undefined || counts["total"] === 0) { | ||||
|                         return SummaryTileSource.empty | ||||
|                     } | ||||
|                     const lat = counts["lat"] | ||||
|                     const lon = counts["lon"] | ||||
|                     const total = Utils.numberWithMetrixPrefix(Number(counts["total"])) | ||||
|                     const tileBbox = new BBox(Tiles.tile_bounds_lon_lat(z, x, y)) | ||||
|                     if (!tileBbox.contains([lon, lat])) { | ||||
|                         console.error( | ||||
|                             "Average coordinate is outside of bbox!?", | ||||
|                             lon, | ||||
|                             lat, | ||||
|                             tileBbox, | ||||
|                             counts | ||||
|                         ) | ||||
|                     } else { | ||||
|                         coordinates = [lon, lat] | ||||
|                     } | ||||
|                     return [ | ||||
|                         { | ||||
|                             type: "Feature", | ||||
|  | @ -57,6 +73,7 @@ export class SummaryTileSource extends DynamicTileSource { | |||
|                                 id: "summary_" + tileIndex, | ||||
|                                 summary: "yes", | ||||
|                                 ...counts, | ||||
|                                 total, | ||||
|                                 layers: layersSummed, | ||||
|                             }, | ||||
|                             geometry: { | ||||
|  | @ -69,7 +86,8 @@ export class SummaryTileSource extends DynamicTileSource { | |||
|                 return new StaticFeatureSource( | ||||
|                     features.map( | ||||
|                         (f) => { | ||||
|                             if (z !== zoomRounded.data) { | ||||
|                             console.log("z, zdiff, rounded:", z, zDiff, zoomRounded.data) | ||||
|                             if (z - zDiff !== zoomRounded.data) { | ||||
|                                 return SummaryTileSource.empty | ||||
|                             } | ||||
|                             return f | ||||
|  | @ -79,7 +97,7 @@ export class SummaryTileSource extends DynamicTileSource { | |||
|                 ) | ||||
|             }, | ||||
|             mapProperties, | ||||
|             options | ||||
|             { ...options, zDiff } | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue