forked from MapComplete/MapComplete
		
	Add clipping to generateCache
This commit is contained in:
		
							parent
							
								
									f7f0ccdb7d
								
							
						
					
					
						commit
						509b237d02
					
				
					 3 changed files with 177 additions and 90 deletions
				
			
		|  | @ -24,6 +24,9 @@ import { GeoOperations } from "../Logic/GeoOperations" | |||
| import SimpleMetaTaggers from "../Logic/SimpleMetaTagger" | ||||
| import FilteringFeatureSource from "../Logic/FeatureSource/Sources/FilteringFeatureSource" | ||||
| import Loc from "../Models/Loc" | ||||
| import { Feature } from "geojson" | ||||
| import { BBox } from "../Logic/BBox" | ||||
| import { bboxClip } from "@turf/turf" | ||||
| 
 | ||||
| ScriptUtils.fixUtils() | ||||
| 
 | ||||
|  | @ -232,7 +235,8 @@ function sliceToTiles( | |||
|     theme: LayoutConfig, | ||||
|     relationsTracker: RelationsTracker, | ||||
|     targetdir: string, | ||||
|     pointsOnlyLayers: string[] | ||||
|     pointsOnlyLayers: string[], | ||||
|     clip: boolean | ||||
| ) { | ||||
|     const skippedLayers = new Set<string>() | ||||
| 
 | ||||
|  | @ -310,6 +314,7 @@ function sliceToTiles( | |||
|             maxFeatureCount: undefined, | ||||
|             registerTile: (tile) => { | ||||
|                 const tileIndex = tile.tileIndex | ||||
|                 const bbox = BBox.fromTileIndex(tileIndex).asGeoJson({}) | ||||
|                 console.log("Got tile:", tileIndex, tile.layer.layerDef.id) | ||||
|                 if (tile.features.data.length === 0) { | ||||
|                     return | ||||
|  | @ -343,9 +348,9 @@ function sliceToTiles( | |||
|                 } | ||||
|                 let strictlyCalculated = 0 | ||||
|                 let featureCount = 0 | ||||
|                 for (const feature of filteredTile.features.data) { | ||||
|                 let features: Feature[] = filteredTile.features.data.map((f) => f.feature) | ||||
|                 for (const feature of features) { | ||||
|                     // Some cleanup
 | ||||
|                     delete feature.feature["bbox"] | ||||
| 
 | ||||
|                     if (tile.layer.layerDef.calculatedTags !== undefined) { | ||||
|                         // Evaluate all the calculated tags strictly
 | ||||
|  | @ -353,7 +358,7 @@ function sliceToTiles( | |||
|                             (ct) => ct[0] | ||||
|                         ) | ||||
|                         featureCount++ | ||||
|                         const props = feature.feature.properties | ||||
|                         const props = feature.properties | ||||
|                         for (const calculatedTagKey of calculatedTagKeys) { | ||||
|                             const strict = props[calculatedTagKey] | ||||
| 
 | ||||
|  | @ -379,7 +384,16 @@ function sliceToTiles( | |||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                     delete feature["bbox"] | ||||
|                 } | ||||
| 
 | ||||
|                 if (clip) { | ||||
|                     console.log("Clipping features") | ||||
|                     features = [].concat( | ||||
|                         ...features.map((f: Feature) => GeoOperations.clipWith(<any>f, bbox)) | ||||
|                     ) | ||||
|                 } | ||||
| 
 | ||||
|                 // Lets save this tile!
 | ||||
|                 const [z, x, y] = Tiles.tile_from_index(tileIndex) | ||||
|                 // console.log("Writing tile ", z, x, y, layerId)
 | ||||
|  | @ -391,7 +405,7 @@ function sliceToTiles( | |||
|                     JSON.stringify( | ||||
|                         { | ||||
|                             type: "FeatureCollection", | ||||
|                             features: filteredTile.features.data.map((f) => f.feature), | ||||
|                             features, | ||||
|                         }, | ||||
|                         null, | ||||
|                         " " | ||||
|  | @ -476,8 +490,9 @@ export 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,...] [--force-zoom-level z] \n" + | ||||
|                 "Note: a new directory named <theme> will be created in targetdirectory" | ||||
|             "Expected arguments are: theme zoomlevel targetdirectory lat0 lon0 lat1 lon1 [--generate-point-overview layer-name,layer-name,...] [--force-zoom-level z] [--clip]" + | ||||
|                 "--force-zoom-level causes non-cached-layers to be donwnloaded\n" + | ||||
|                 "--clip will erase parts of the feature falling outside of the bounding box" | ||||
|         ) | ||||
|         return | ||||
|     } | ||||
|  | @ -494,6 +509,7 @@ export async function main(args: string[]) { | |||
|     const lon0 = Number(args[4]) | ||||
|     const lat1 = Number(args[5]) | ||||
|     const lon1 = Number(args[6]) | ||||
|     const clip = args.indexOf("--clip") >= 0 | ||||
| 
 | ||||
|     if (isNaN(lat0)) { | ||||
|         throw "The first number (a latitude) is not a valid number" | ||||
|  | @ -570,7 +586,7 @@ export async function main(args: string[]) { | |||
| 
 | ||||
|     const extraFeatures = await downloadExtraData(theme) | ||||
|     const allFeaturesSource = loadAllTiles(targetdir, tileRange, theme, extraFeatures) | ||||
|     sliceToTiles(allFeaturesSource, theme, relationTracker, targetdir, generatePointLayersFor) | ||||
|     sliceToTiles(allFeaturesSource, theme, relationTracker, targetdir, generatePointLayersFor, clip) | ||||
| } | ||||
| 
 | ||||
| let args = [...process.argv] | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue