Dado un punto geográfico definido (lat, lon) , estoy tratando de encontrar en qué polígono se encuentra este punto. Supongo que iterar sobre todos los polígonos no es eficiente. ¿Hay alguna función o biblioteca disponible para NodeJS que haga esto?
const polygon = getPolygonFromPoint(FeatureCollection, x, y);No hay polígonos superpuestos, en realidad estoy usando esto para detectar en qué distrito de un determinado país se encuentra un punto de coordenadas GPS definido.
Para un punto simple en la prueba de polígono, puede verificar el turf que tiene un booleanPointInPolygon . Turf funciona en el nodo, pero debe verificar las diferencias entre v5 y v6+ sobre cómo usar npm en consecuencia. Los puntos deben serlong/lat (no lat/long) y el polígono se puede extraer fácilmente de la geometría de la entidad de su colección de entidades.
Para un caso de uso más complejo en el que tiene muchos puntos y muchos polígonos dentro de los cuales ubicarlos, debe considerar usar rbush .
Tenga en cuenta que la biblioteca rbush construye un árbol r a partir de los cuadros delimitadores de los polígonos y no de los polígonos en sí, por lo que el uso de un árbol r es solo una forma de reducir enormemente la cantidad de polígonos que necesita probar con booleanPointInPolygon .
Código de ejemplo para rbush :
const RBush = require("rbush"); const turfBbox = require("@turf/bbox").default; const geo = {} // your feature collection... const maxEntriesPerNode = 50; // check the doco const tree = new RBush(maxEntriesPerNode); const bbox2Object = (keys, bbox) => ["minX", "minY", "maxX", "maxY"].reduce((o, k, i) => ({...o, [k]: bbox[i]}), {}) // create rtree from feature collection geo.features.forEach(feature => { const leaf = bbox2Object(bboxKeys, turfBbox(feature)); // use bbox of feature leaf["id"] = feature.properties.SOME_ID; // add some custom properties tree.insert(leaf); }); // test a random point from your data const [x, y] = [123, 456]; // should be long, lat const test = tree.search({minX: x, minY: y, maxX: x, maxY: y}); // test should have an array of leaves per the tree.insert above A continuación, puede realizar la prueba booleanPointInPolygon en este conjunto reducido de polígonos.
Lo implementé con la polygon-lookup la biblioteca.
const PolygonLookup = require('polygon-lookup') const featureCollection = { type: 'FeatureCollection', features: [{ type: 'Feature', properties: { id: 'bar' }, geometry: { type: 'Polygon', coordinates: [ [ [ 0, 1 ], [ 2, 1 ], [ 3, 4 ], [ 1, 5 ] ] ] } }] } var lookup = new PolygonLookup(featureCollection) var poly = lookup.search(1, 2) console.log(poly.properties.id) // bar