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]);
|
|
}
|
|
} |