forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			35 lines
		
	
	
		
			No EOL
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			No EOL
		
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {Store} from "../../Logic/UIEventSource";
 | |
| import {GeoOperations} from "../../Logic/GeoOperations";
 | |
| import {Feature, Geometry} from "@turf/turf";
 | |
| 
 | |
| export class ImportUtils {
 | |
|     public static partitionFeaturesIfNearby(
 | |
|         toPartitionFeatureCollection: ({ features: Feature<Geometry>[] }),
 | |
|         compareWith: Store<{ features: Feature[] }>,
 | |
|         cutoffDistanceInMeters: Store<number>)
 | |
|         : Store<{ hasNearby: Feature[], noNearby: Feature[] }> {
 | |
|         return compareWith.map(osmData => {
 | |
|             if (osmData?.features === undefined) {
 | |
|                 return undefined
 | |
|             }
 | |
|             if (osmData.features.length === 0) {
 | |
|                 return {noNearby: toPartitionFeatureCollection.features, hasNearby: []}
 | |
|             }
 | |
|             const maxDist = cutoffDistanceInMeters.data
 | |
| 
 | |
|             const hasNearby = []
 | |
|             const noNearby = []
 | |
|             for (const toImportElement of toPartitionFeatureCollection.features) {
 | |
|                 const hasNearbyFeature = osmData.features.some(f =>
 | |
|                     maxDist >= GeoOperations.distanceBetween(<any> toImportElement.geometry.coordinates, GeoOperations.centerpointCoordinates(f)))
 | |
|                 if (hasNearbyFeature) {
 | |
|                     hasNearby.push(toImportElement)
 | |
|                 } else {
 | |
|                     noNearby.push(toImportElement)
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return {hasNearby, noNearby}
 | |
|         }, [cutoffDistanceInMeters]);
 | |
|     }
 | |
| } |