Dans PostGIS, Comment puis-je trouver tous les points à l'intérieur d'un polygone?
J'utilise PostgreSQL avec l'extension GIS pour stocker des données cartographiques, avec OpenLayers,GeoServer etc. Compte tenu d'un polygone, par exemple d'un quartier, je dois trouver tous les points LAT/LONG stockés dans une certaine table (par exemple feux de signalisation, restaurants) qui sont à l'intérieur du polygone. Alternativement donné un ensemble de polygones je voudrais trouver l'ensemble de points à l'intérieur de chaque polygone (comme un groupe par requête, plutôt que d'itérer au-dessus de chaque polygone).
est-ce que ces fonctions sont quelque chose dont j'ai besoin pour programme, ou la fonctionnalité est-elle disponible (en tant que SQL étendu)? Veuillez fournir des précisions.
aussi pour les données 2D simples que j'Ai, Ai-je réellement besoin de L'extension GIS (la licence GPL est une limitation) ou PostgreSQL suffira-t-il?
Merci!
3 réponses
dans PostGIS vous pouvez utiliser l'opérateur bounding box pour trouver des candidats, ce qui est très efficace car il utilise des index GiST. Ensuite, si des correspondances strictes sont nécessaires, utilisez l'opérateur contains.
quelque Chose comme
SELECT
points,neighborhood_name from points_table,neighborhood
WHERE
neighborhood_poly && points /* Uses GiST index with the polygon's bounding box */
AND
ST_Contains(neighborhood_poly,points); /* Uses exact matching */
si c'est nécessaire, dépend de vos besoins. Pour que cela fonctionne, vous devez certainement PostGIS et GEOS installés. Mais, si la correspondance de la boîte de limite est suffisante, vous pouvez le coder simplement dans SQL n'ayant pas besoin de PostGIS.
si correspond exactement sont nécessaires, contient des algorithmes sont accessibles au public, mais pour les mettre en œuvre efficacement nécessite un certain effort de mise en œuvre dans une bibliothèque qui serait alors appelé à partir de SQL (tout comme GEOS).
je crois ST_Contains automatiquement réécrit la requête à utiliser le GiST-indexé de la boîte englobante, il note:
"Cet appel de fonction sera automatiquement inclure une boîte englobante comparaison fera usage de tous les index disponible sur les géométries. Éviter index utiliser, utiliser la fonction _ST_Contains."
ST_Contains résoudrait votre problème.
SELECT
polygon.gid, points.x, points.y
FROM
polygons LEFT JOIN points
ON st_contains(polygon.geom, points.geom)
WHERE
polygon.gid=your_id