Pilih semua poin dalam kotak pembatas

11

Saya telah melihat pertanyaan ini diajukan sebelumnya, tetapi jawaban yang saya coba tidak berfungsi.

Saya mencari untuk menanyakan semua Cara OSM yang ada di dalam kotak pembatas. Data OSM diimpor dengan mercator bola standar. Saya meminta menggunakan LAT / LON karenanya transformasi

SELECT *
FROM planet_osm_ways
WHERE ST_Transform(
  ST_MakeEnvelope(37.808264, 37.804339, -122.275244, -122.271189, 
  4326),3857
);

Ketika saya menjalankan ini saya mendapatkan kesalahan berikut:

GALAT: argumen WHERE harus berupa tipe boolean, bukan tipe geometri LINE 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...

theartofbeing
sumber
1
Berikan tautan ke pertanyaan lama yang telah Anda baca dan gunakan untuk membangun kueri Anda.
user30184
Pesanan koordinat Anda di ST_MakeEnvelope () tidak terlihat seperti dalam format ini, xmin, ymin, xmax, ymax
artwork21
@ artwork21 Saya menggunakan lat / long di ST_MakeEnvelope. Apakah itu salah? Apakah saya perlu mengonversikan ini ke format lain? Saya pikir itulah yang dilakukan ST_Transform
theartofbeing
1
Maaf, saya harus membaca manual yang baik termasuk dokumen skema lagi wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways tidak mengandung geometri dan agak tidak berguna bagi pengguna akhir. Ini untuk sistem. Tidak ada peluang untuk membuat kueri kotak pembatas dari tabel itu. Dengan tabel seperti planet_osm_roads dimungkinkan. Masih planet_osm_roads.geom tidak ada, karena seperti yang Anda lihat dari skema, ia bernama planet_osm_roads.way.
user30184
1
Tidak. Saya bilang Anda tidak bisa melakukan lompatan kueri kotak dari planet_osm_ways karena tabel itu tidak memiliki geometri. Lihat: id, node, tag, tertunda - tidak ada yang mengandung geometri. Tabel _line, _point, _polygon, dan _roads tidak masalah. Dan saya mencoba untuk menekankan bahwa kolom geometri di semua tabel geometri dinamai sebagai "cara", bukan sebagai "geom" atau apa pun.
user30184

Jawaban:

14

Anda memiliki tiga masalah dengan pernyataan Anda meskipun pesan kesalahan hanya mengisyaratkan sebagian saja ... "WHERE must be type boolean" berarti bahwa informasi yang Anda berikan WHERE tidak mengevaluasi hasil boolean.

  1. ST_MakeEnvelope meminta parameter dalam urutan ini: xmin, ymin, xmax, ymax, srid.

    Anda salah masuk ymax, ymin, xmax, xmin, srid.

  2. DIMANA harus mengevaluasi ke boolean:

    Untuk menentukan apakah geometri dan amplop memiliki elemen yang sama , WHERE harus dibuat seperti: WHERE geom && envelope_geomjika tidak, Anda dapat menggunakan ST_Contains

    Untuk menentukan apakah geometri terdapat di dalam amplop: `WHERE ST_Contains (envelope_geom, geom)

    Anda tidak memberikan metode perbandingan apa pun untuk WHERE.

  3. Tabel 'planet_osm_ways' tidak mengandung kolom geometri apa pun, meskipun 'planet_osm_roads' memang mengandung kolom geometri bernama 'way'.

    Anda dapat membuat kolom geometri di tabel 'planet_osm_ways' dari planet_osm_nodes.lat dan planet_osm_nodes.lon yang terkait.

Menggunakan 'planet_osm_roads', ini menunjukkan cara menggunakan kotak pembatas pada tabel dengan kolom geometri:

SELECT *
FROM planet_osm_roads
WHERE planet_osm_roads.way && ST_Transform(
  ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
  4326),3857
);

atau ubah ke ini:

SELECT *
FROM planet_osm_roads
WHERE ST_Contains(
    ST_Transform(
        ST_MakeEnvelope(-122.271189, 37.804339, -122.275244, 37.808264, 
        4326)
        ,3857)
    ,planet_osm_roads.way);
kttii
sumber