forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			44 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
	
		
			1.7 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]
 | 
						|
        )
 | 
						|
    }
 | 
						|
}
 |