Post

Replies

Boosts

Views

Activity

Efficiently searching a LARGE GeoJson file to see if it contains a point
I have a 200mb geojson file containing the speed limits of a country. In short the file has polygons that encompass different areas with each polygon having a given speed limit value. I am creating a naviagation app that needs to query this geojson file to get the speed limit the user is in. My current approach is somwhat of a linear search so whilst working induces lag and massive peformance hits to the program. My current implementation: func findSpeedLimit(location: CLLocationCoordinate2D, geoJSON: GeoJSON) -> Int? { // Decode the GeoJSON data into a FeatureCollection object guard case let .featureCollection(featureCollection) = geoJSON else { print("Error: GeoJSON data is not a FeatureCollection") return nil } // Create a Point object from the location coordinates let point = Point(x: location.longitude, y: location.latitude) //print("Looking for speed limit at location: \(location.latitude), \(location.longitude)") // Loop through the features in the feature collection for (index, feature) in featureCollection.features.enumerated() { // Check if the feature has a geometry and properties guard let geometry = feature.geometry, let properties = feature.properties else { print("Feature \(index) has no geometry or properties") continue } do { // Check if the geometry contains the point if try geometry.contains(point) { // Check if the properties have a speedLimitZoneValue key if let speedLimit = properties["speedLimitZoneValue"] { let speedLimitString = String(describing: speedLimit) if let number = Int(speedLimitString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) { //print (number) //print("Speed limit found for feature \(index): \(number) km/h") return number } } else { print("Feature \(index) has no 'speedLimitZoneValue' property") } } else { //print("Feature \(index) does not contain the point") } } catch { print("Error checking if geometry contains point: \(error)") } } return nil } I tried using a GKRtree but wasent able to get it to work in this context. Any ideas?
4
1
693
Apr ’23