forked from MapComplete/MapComplete
		
	Various fixes
This commit is contained in:
		
							parent
							
								
									18044ff22b
								
							
						
					
					
						commit
						07fd8f404a
					
				
					 14 changed files with 154 additions and 60 deletions
				
			
		|  | @ -24,7 +24,6 @@ import {GeoOperations} from "../Logic/GeoOperations"; | |||
| import SimpleMetaTaggers from "../Logic/SimpleMetaTagger"; | ||||
| import FilteringFeatureSource from "../Logic/FeatureSource/Sources/FilteringFeatureSource"; | ||||
| import Loc from "../Models/Loc"; | ||||
| 
 | ||||
| ScriptUtils.fixUtils() | ||||
| 
 | ||||
| 
 | ||||
|  | @ -181,6 +180,23 @@ function loadAllTiles(targetdir: string, r: TileRange, theme: LayoutConfig, extr | |||
| function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relationsTracker: RelationsTracker, targetdir: string, pointsOnlyLayers: string[]) { | ||||
|     const skippedLayers = new Set<string>() | ||||
| 
 | ||||
|     const indexedFeatures : Map<string, any> = new Map<string, any>() | ||||
|     let indexisBuilt = false; | ||||
|     function buildIndex(){ | ||||
|         for (const ff of allFeatures.features.data) { | ||||
|             const f = ff.feature | ||||
|             indexedFeatures.set(f.properties.id, f) | ||||
|         } | ||||
|         indexisBuilt = true; | ||||
|     } | ||||
|      | ||||
|     function getFeatureById(id){ | ||||
|         if(!indexisBuilt){ | ||||
|             buildIndex() | ||||
|         } | ||||
|         return indexedFeatures.get(id) | ||||
|     } | ||||
|      | ||||
|     async function handleLayer(source: FeatureSourceForLayer) { | ||||
|         const layer = source.layer.layerDef; | ||||
|         const targetZoomLevel = layer.source.geojsonZoomLevel ?? 0 | ||||
|  | @ -199,7 +215,8 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations | |||
|                 memberships: relationsTracker, | ||||
|                 getFeaturesWithin: _ => { | ||||
|                     return [allFeatures.features.data.map(f => f.feature)] | ||||
|                 } | ||||
|                 }, | ||||
|                 getFeatureById: getFeatureById | ||||
|             }, | ||||
|             layer, | ||||
|             { | ||||
|  | @ -237,6 +254,7 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations | |||
|                     new UIEventSource<any>(undefined) | ||||
|                     ) | ||||
| 
 | ||||
|                 console.log("Tile "+layer.id+"."+tileIndex+" contains "+filteredTile.features.data.length+" features after filtering ("+tile.features.data.length+") features before") | ||||
|                 if (filteredTile.features.data.length === 0) { | ||||
|                     return | ||||
|                 } | ||||
|  | @ -252,7 +270,7 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations | |||
|                     const calculatedTagKeys = tile.layer.layerDef.calculatedTags.map(ct => ct[0]) | ||||
|                     featureCount++ | ||||
|                     for (const calculatedTagKey of calculatedTagKeys) { | ||||
|                         const strict =  feature.feature.properties[calculatedTagKey] | ||||
|                         const strict = feature.feature.properties[calculatedTagKey] | ||||
|                         feature.feature.properties[calculatedTagKey] =strict | ||||
|                         strictlyCalculated ++; | ||||
|                         if(strictlyCalculated % 100 === 0){ | ||||
|  | @ -292,7 +310,18 @@ function sliceToTiles(allFeatures: FeatureSource, theme: LayoutConfig, relations | |||
| 
 | ||||
|         // And, if needed, to create a points-only layer
 | ||||
|         if (pointsOnlyLayers.indexOf(layer.id) >= 0) { | ||||
|             const features = source.features.data.map(f => f.feature) | ||||
| 
 | ||||
|             const filtered = new FilteringFeatureSource({ | ||||
|                     locationControl:  new UIEventSource<Loc>(undefined), | ||||
|                     allElements: undefined, | ||||
|                     selectedElement: new UIEventSource<any>(undefined) | ||||
|                 }, | ||||
|                 Tiles.tile_index(0,0,0), | ||||
|                 source, | ||||
|                 new UIEventSource<any>(undefined) | ||||
|             ) | ||||
|             const features = filtered.features.data.map(f => f.feature) | ||||
|              | ||||
|             const points = features.map(feature => GeoOperations.centerpoint(feature)) | ||||
|             console.log("Writing points overview for ", layerId) | ||||
|             const targetPath = targetdir + "_" + layerId + "_points.geojson" | ||||
|  | @ -325,7 +354,7 @@ async function main(args: string[]) { | |||
| 
 | ||||
|     console.log("Cache builder started with args ", args.join(", ")) | ||||
|     if (args.length < 6) { | ||||
|         console.error("Expected arguments are: theme zoomlevel targetdirectory lat0 lon0 lat1 lon1 [--generate-point-overview layer-name,layer-name,...]\n" + | ||||
|         console.error("Expected arguments are: theme zoomlevel targetdirectory lat0 lon0 lat1 lon1 [--generate-point-overview layer-name,layer-name,...] [--force-zoom-level z] \n" + | ||||
|             "Note: a new directory named <theme> will be created in targetdirectory") | ||||
|         return; | ||||
|     } | ||||
|  | @ -343,10 +372,7 @@ async function main(args: string[]) { | |||
|     const lat1 = Number(args[5]) | ||||
|     const lon1 = Number(args[6]) | ||||
| 
 | ||||
|     let generatePointLayersFor = [] | ||||
|     if (args[7] == "--generate-point-overview") { | ||||
|         generatePointLayersFor = args[8].split(",") | ||||
|     } | ||||
|     | ||||
| 
 | ||||
| 
 | ||||
|     const tileRange = Tiles.TileRangeBetween(zoomlevel, lat0, lon0, lat1, lon1) | ||||
|  | @ -365,6 +391,32 @@ async function main(args: string[]) { | |||
|         console.error("The theme " + theme + " was not found; try one of ", keys); | ||||
|         return | ||||
|     } | ||||
| 
 | ||||
|     let generatePointLayersFor = [] | ||||
|     if (args[7] == "--generate-point-overview") { | ||||
|         if(args[8] === undefined){ | ||||
|             throw "--generate-point-overview needs a list of layers to generate the overview for (or * for all)" | ||||
|         }else if (args[8] === '*'){ | ||||
|             generatePointLayersFor = theme.layers.map(l => l.id) | ||||
|         }else{ | ||||
|             generatePointLayersFor = args[8].split(",") | ||||
|         } | ||||
|         console.log("Also generating a point overview for layers ", generatePointLayersFor.join(",")) | ||||
|     } | ||||
|     { | ||||
|          | ||||
|     const index = args.indexOf("--force-zoom-level") | ||||
|     if(index >= 0){ | ||||
|         const forcedZoomLevel = Number(args[index + 1]) | ||||
|         for (const layer of theme.layers) { | ||||
|             layer.source.geojsonSource = "https://127.0.0.1/cache_{layer}_{z}_{x}_{y}.geojson" | ||||
|             layer.source.isOsmCacheLayer = true | ||||
|             layer.source.geojsonZoomLevel = forcedZoomLevel | ||||
|         } | ||||
|     } | ||||
|     } | ||||
|      | ||||
|      | ||||
|     const relationTracker = new RelationsTracker() | ||||
| 
 | ||||
|     let failed = 0; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue