2009-12-09 11 views
15

J'utilise PostgreSQL avec l'extension GIS pour stocker des données cartographiques, avec OpenLayers, GeoServer, etc. Étant donné un polygone, par ex. d'un quartier, j'ai besoin de trouver tous les points LAT/LONG stockés dans une table (par exemple les feux de circulation, les restaurants) qui se trouvent dans le polygone. Alternativement donné un ensemble de polygones, je voudrais trouver l'ensemble des points dans chaque polygone (comme une requête GROUP BY, plutôt que d'itérer sur chaque polygone).Dans PostGIS, comment trouver tous les points d'un polygone?

Ces fonctions sont-elles quelque chose que j'ai besoin de programmer, ou la fonctionnalité est-elle disponible (en tant que SQL étendu)? S'il vous plaît élaborer.

Pour les données 2D simples, j'ai besoin de l'extension GIS (la licence GPL est une limitation) ou est-ce que PostgreSQL est suffisant?

Merci!

Répondre

11

Dans PostGIS, vous pouvez utiliser l'opérateur de boîte englobante pour rechercher des candidats, ce qui est très efficace car il utilise des index GiST. Ensuite, si des correspondances strictes sont requises, 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 */ 

A propos si cela est nécessaire, dépend de vos besoins. Pour que cela fonctionne, vous avez certainement besoin de PostGIS et de GEOS. Mais, si la correspondance de la boîte englobante est suffisante, vous pouvez la coder simplement en SQL sans avoir besoin de PostGIS. Si des correspondances exactes sont nécessaires, des algorithmes sont disponibles publiquement, mais pour les implémenter efficacement, il faut l'implémenter dans une bibliothèque qui serait alors appelée depuis SQL (comme GEOS).

+1

Voir aussi [ST_DWithin] (http://www.postgis.org/docs/ST_DWithin.html). –

4

Je crois ST_Contains réécrit automatiquement la requête d'utiliser le cadre de sélection indexé GIST, comme il note:

« Cet appel de fonction automatiquement inclure une comparaison du cadre de sélection qui fera usage de tout Les index sont disponibles sur les géométries Pour éviter l'utilisation de l'index , utilisez la fonction _ST_Contains. "

http://postgis.refractions.net/docs/ST_Contains.html

+0

Ceci est plus un commentaire qu'une réponse. – RickyA

+0

C'est une réponse selon la FAQ de SO. – IamIC

2

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