Selezionare il rettangolo di selezione usando postGIS?


36

Voglio creare una query per selezionare tutti i modi e i loro nodi che esistono all'interno di un riquadro di selezione utilizzando postGIS. Il riquadro di delimitazione deve includere tutti i dettagli man mano che viene recuperato il comando "--bounding-box" dell'osmosi.

C'è un modo per farlo?

Risposte:


36

Per i documenti di osmosi, vedo l'opzione di comando :

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

per PostGIS è possibile utilizzare ST_MakeEnvelope (sinistra, in basso, a destra, in alto, srid) per creare un rettangolo di selezione, quindi l' &&operatore del rettangolo di selezione per trovare dove si intersecano i rettangoli :

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

SRID 4326 è per WGS84 Lat / Long ed è richiesto solo per PostGIS 1.5; può essere omesso per le versioni successive.


Grazie. la funzione ST_MakeEnvelope richiede un altro parametro, srid. Non so cosa mettere lì ... qualche idea?
Ururi

1
Sembra che tu stia usando PostGIS 1.5, che richiede quel parametro. Penso che SRID sia ignorato, quindi qualsiasi valore potrebbe produrre gli stessi risultati. Se hai dati lat / long, generalmente usa un SRID di 4326.
Mike T

1
La maggior parte degli strumenti in questi giorni ti consente di scegliere il SRID per i dati OSM quando lo carichi. Il SRID OSM predefinito è 3857 (mercator sferico). L'SRID predefinito per la maggior parte dei dati lat / lon è SRID 4326 (Lat / Lon AKA WGS84). Se si caricano i dati con SRID 3857, ad esempio, sarà necessario eseguire una conversione da LAT / LON WGS84 in 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) Alcuni strumenti (come imposm3) attualmente supporta solo SRID 3857
Justin Swanhart il

Nota che l'operatore && non trasforma gli SRID per te. Assicurarsi che la busta creata sia nello stesso SRID della geometria di prova, oppure trasformarla da soli. trac.osgeo.org/postgis/ticket/2320
Nelson,

1
L'operatore && è più lento dal punto di vista computazionale di ST_Intersects
caiohamamura,

8

Penso che sarà qualcosa del genere: il riquadro di selezione in PostGIS è stato creato da

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

La query utilizzerà ST_Intersection con una sottoquery.

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;

Ho più o meno preso questo dalle pagine di aiuto di PostGIS.
Una seconda query, sulla tabella dei modi, progettata in modo simile a quanto sopra (ma con ST_Dimension () = 1) dovrebbe trovare la soluzione.

HTH, Micha


Ciao grazie! che srido? quale shoul devo inserire in <srid>? e ".geom" (linea 4) sembra non essere valido, dovrebbe essere lì?
uriel

Scusa, ho perso il tuo commento della scorsa settimana. Lo srid è il codice del sistema di riferimento di coordinate. cioè 2039 per Israele. L'aggiunta .geom estrae la parte Geometry di un "GeometryCollection. Potresti aver ragione che non è richiesto qui.
Micha,

5

c'è un argomento qui simile alla tua domanda qui ...

ST_Intersection - (T) Restituisce una geometria che rappresenta la porzione condivisa di geomA e geomB. L'implementazione geografica fa una trasformazione in geometria per eseguire l'intersezione e quindi tornare a WGS84.

1.You può anche ottenere alcune informazioni qui sulle funzioni di costruzione della geometria.

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

intersezione

2. Altre informazioni qui sull'intersezione di Intersects: 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;

intersezione

spero che ti aiuti ...


0

Questo è un commento sul codice di @ Micha.

Le coppie di coordinate per il POLYGONdovrebbero seguire un ordine orario (o antiorario): in alto a sinistra, in alto a destra, in basso a destra, in basso a sinistra, in alto a sinistra di nuovo.

Quindi, in senso orario, la chiamata di funzione dovrebbe essere:

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

O in senso antiorario:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.