Sélectionnez le cadre de sélection à l’aide de postGIS?

36

Je souhaite créer une requête pour sélectionner tous les moyens et leurs nœuds existants dans un cadre de sélection à l'aide de postGIS. La boîte englobante doit inclure tous les détails sous forme de commande "--bounding-box" par osmose.

Y'a-t'il un quelconque moyen d'y arriver?

Uriel
la source

Réponses:

36

Pour la documentation sur l'osmose, l'option de commande suivante apparaît :

--bounding-box top=49.5138 left=10.9351 bottom=49.3866 right=11.201

pour PostGIS, vous pouvez utiliser ST_MakeEnvelope (left, bottom, right, top, srid) pour créer un cadre de sélection, puis l' &&opérateur du cadre de sélection pour rechercher l'emplacement des intersections entre ces derniers:

SELECT *
FROM mytable
WHERE mytable.geom && ST_MakeEnvelope(10.9351, 49.3866, 11.201, 49.5138, 4326);

Le SRID 4326 concerne le WGS84 Lat / Long et n'est requis que pour le PostGIS 1.5; il peut être omis pour les versions ultérieures.

Mike T
la source
Merci. la fonction ST_MakeEnvelope nécessite un paramètre supplémentaire, srid. Je ne sais pas quoi mettre là .. aucune idée?
Uriel
1
On dirait que vous utilisez PostGIS 1.5, qui nécessite ce paramètre. Je pense que SRID est ignoré, donc toute valeur peut produire les mêmes résultats. Si vous avez des données lat / long, utilisez généralement un SRID de 4326.
Mike T
1
La plupart des outils actuels vous permettent de choisir le SRID pour les données OSM lorsque vous le chargez. Le SRID OSM par défaut est 3857 (mercator sphérique). Le SRID par défaut pour la plupart des données lat / lon est SRID 4326 (Lat / Lon AKA WGS84). Si vous chargez les données avec le SRID 3857, par exemple, vous devrez effectuer une conversion de LAT / LON WGS84 en 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857). Quelques outils (comme imposm3) actuellement uniquement en charge SRID 3857
Justin Swanhart
Notez que l'opérateur && ne transforme pas les SRID pour vous. Assurez-vous que l'enveloppe que vous créez se trouve dans le même SRID que la géométrie de test, sinon transformez-la vous-même. trac.osgeo.org/postgis/ticket/2320
Nelson
1
&& est plus lent que l'ordinateur avec ST_Intersects
caiohamamura
8

Je pense que cela ressemblera à ceci: Le cadre de sélection dans PostGIS est créé par

ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid>)

La requête utilisera ST_Intersection avec une sous-requête.

SELECT bbox_nodes.id, bbox_nodes.tag, nodes_geom 
FROM (SELECT nodes.id, nodes.tag, 
   ST_Intersection(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )).geom AS nodes_geom
   FROM nodes 
   WHERE ST_Intersects(nodes.the_geom, 
      ST_GeomFromText('POLYGON((ulx uly, urx ury, llx llr, lrx lry, ulx uly))', <srid> )) AS bbox_nodes
WHERE ST_Dimension(bbox_nodes.nodes_geom)=0;

J'ai plus ou moins pris cela dans les pages d'aide de PostGIS
Une deuxième requête, sur la table des chemins, conçue de la même manière que ci-dessus (mais avec ST_Dimension () = 1) devrait donner les chemins.

HTH, Micha

Micha
la source
Salut merci! qu'est-ce que le srid? que dois-je insérer dans <srid>? et ".geom" (ligne 4) il semble être invalide, il devrait être là?
Uriel
Désolé, j'ai raté votre commentaire de la semaine dernière. Le srid est le code du système de référence de coordonnées. Soit 2039 pour Israël. L'addition .geom extrait la partie géométrique d'une "GeometryCollection. Vous avez peut-être raison de dire que ce n'est pas obligatoire ici.
Micha
5

il y a un sujet ici qui ressemble à votre question ici ...

ST_Intersection - (T) Retourne une géométrie qui représente la partie partagée de geomA et geomB. L'implémentation géographique effectue une transformation en géométrie pour effectuer l'intersection, puis redevient WGS84.

1.you peut également obtenir quelques informations ici sur la géométrie Constructing Fonctions.

SELECT ST_AsText(ST_Intersection(
  ST_Buffer('POINT(0 0)', 2),
  ST_Buffer('POINT(3 0)', 2)
));

intersection

Informations 2.Another ici à propos Intersecte Intersection: PostGIS - ST_Intersects, ST_Intersection ...

SELECT b.the_geom As bgeom, p.the_geom As pgeom, 
        ST_Intersection(b.the_geom, p.the_geom) As intersect_bp
    FROM buildings b INNER JOIN parcels p ON ST_Intersection(b,p)
    WHERE ST_Overlaps(b.the_geom, p.the_geom)
    LIMIT 1;

intersection

J'espère que ça t'aide...

Aragon
la source
0

Ceci est un commentaire sur le code de @ Micha.

Les paires de coordonnées pour le POLYGONdoivent suivre un ordre dans le sens horaire (ou anti-horaire): en haut à gauche, en haut à droite, en bas à droite, en bas à gauche, en haut à gauche.

Donc, dans le sens des aiguilles d'une montre, l'appel de fonction devrait être:

ST_GeomFromText('POLYGON((ulx uly, urx ury, lrx lry, llx llr, ulx uly))', <srid>)

Ou dans le sens antihoraire:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
Daishi
la source