Pilih kotak pembatas menggunakan postGIS?

36

Saya ingin membuat kueri untuk memilih semua cara dan simpulnya yang ada di dalam kotak pembatas menggunakan postGIS. Kotak terikat harus mencakup semua detail sebagai perintah osmosis "--bounding-box" akan diambil.

Apakah ada cara untuk melakukan itu?

uriel
sumber

Jawaban:

36

Untuk dokumen osmosis, saya melihat opsi perintah :

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

untuk PostGIS Anda dapat menggunakan ST_MakeEnvelope (kiri, bawah, kanan, atas, srid) untuk membangun kotak pembatas, kemudian &&operator kotak pembatas untuk menemukan di mana kotak pembatas berpotongan:

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

SRID 4326 untuk WGS84 Lat / Panjang, dan hanya diperlukan untuk PostGIS 1.5; itu dapat dihilangkan untuk versi yang lebih baru.

Mike T
sumber
Terima kasih. fungsi ST_MakeEnvelope membutuhkan satu parameter lagi, srid. Saya tidak tahu harus meletakkan apa di sana .. ada ide?
uriel
1
Sepertinya Anda menggunakan PostGIS 1.5, yang memerlukan parameter itu. Saya pikir SRID diabaikan, jadi nilai apa pun mungkin menghasilkan hasil yang sama. Jika Anda memiliki data lat / panjang, umumnya gunakan SRID dari 4326.
Mike T
1
Sebagian besar alat hari ini memungkinkan Anda membiarkan Anda memilih SRID untuk data OSM ketika Anda memuatnya. OSM SRID default adalah 3857 (spherical mercator). SRID default untuk sebagian besar data lat / lon adalah SRID 4326 (Lat / Lon AKA WGS84). Jika Anda memuat data dengan SRID 3857, misalnya, Anda harus melakukan konversi dari LAT / LON WGS84 ke 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) Beberapa alat (seperti imposm3) saat ini hanya mendukung SRID 3857
Justin Swanhart
Perhatikan bahwa operator && tidak mengubah SRID untuk Anda. Pastikan Amplop yang Anda buat berada dalam SRID yang sama dengan geometri tes, atau ubah sendiri. trac.osgeo.org/postgis/ticket/2320
Nelson
1
&& operator lebih lambat komputasi daripada ST_Intersects
caiohamamura
8

Saya pikir ini akan menjadi seperti ini: Kotak pembatas di PostGIS dibuat oleh

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

Kueri akan menggunakan ST_Intersection dengan subquery.

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;

Saya kurang lebih mengambil ini dari halaman bantuan PostGIS
Permintaan kedua, pada tabel cara, dirancang mirip dengan di atas (tetapi dengan ST_Dimension () = 1) harus mendapatkan cara.

HTH, Micha

Micha
sumber
Hai terima kasih! apa srid? apa yang harus saya masukkan di <srid>? dan ".geom" (baris 4) tampaknya tidak valid, seharusnya ada di sana?
uriel
Maaf, saya melewatkan komentar Anda dari minggu lalu. Rid adalah kode Sistem Referensi Koordinat. yaitu 2039 untuk Israel. Penambahan .geom mengekstrak bagian Geometry dari "GeometryCollection. Anda mungkin benar bahwa itu tidak diperlukan di sini.
Micha
5

ada topik di sini yang mirip dengan pertanyaan Anda di sini ...

ST_Intersection - (T) Mengembalikan geometri yang mewakili porsi bersama geomA dan geomB. Implementasi geografi melakukan transformasi ke geometri untuk melakukan persimpangan dan kemudian mengubah kembali ke WGS84.

1.Anda juga dapat memperoleh beberapa informasi di sini tentang Fungsi Membangun Geometri.

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

persimpangan

2.Informasi lain di sini tentang Intersect 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;

persimpangan

Saya harap ini membantu Anda ...

Aragon
sumber
0

Ini adalah komentar pada kode @ Micha.

Pasangan koordinat untuk POLYGONharus mengikuti urutan searah jarum jam (atau berlawanan arah jarum jam): kiri atas, kanan atas, kanan bawah, kiri bawah, kiri atas lagi.

Jadi, searah jarum jam, panggilan fungsi harus:

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

Atau berlawanan arah jarum jam:

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