Sınırlama kutusundaki tüm noktaları seçme


11

Bu sorunun daha önce sorulduğunu gördüm, ama denediğim cevaplar çalışmıyor.

Bir sınırlayıcı kutu içinde olan tüm OSM yolları sorgulamak arıyorum. OSM verileri varsayılan küresel mercator ile içe aktarıldı. Ben dönüşümü LAT / LON kullanarak sorgulama

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

Bunu çalıştırdığımda aşağıdaki hatayı alıyorum:

HATA: WHERE argümanı boolean türü olmalı, geometri türü değil LINE 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...


1
Sorgunuzu oluşturmak için okuduğunuz ve kullandığınız eski soruların bağlantısını verin.
user30184

ST_MakeEnvelope () içindeki koordinat siparişiniz bu biçimde görünmüyor, xmin, ymin, xmax, ymax
artwork21

@ artwork21 ST_MakeEnvelope içinde enlem / boylam kullanıyorum. Yanlış mı? Bunu farklı bir biçime dönüştürmem gerekiyor mu? ST_Transform'un bunu yaptığını sanıyordum
theartofbeing

1
Maalesef, wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways şema belgesi de dahil olmak üzere iyi kılavuzları okumak zorunda kaldım . Planet_osm_ways geometri içermez ve son kullanıcı için işe yaramaz. Sistem içindir. Bu tablodan sınırlayıcı kutu sorguları yapma şansı yok. Planet_osm_roads gibi tablolarla mümkündür. Hala planet_osm_roads.geom mevcut değildir, çünkü şemadan gördüğünüz gibi buna planet_osm_roads.way adı verilir.
user30184

1
Hayır. Planet_osm_ways'ten sınırlayıcı kutu sorgusu yapamayacağınızı söyledim çünkü bu tablonun herhangi bir geometrisi yok. Bakınız: id, düğümler, etiketler, beklemede - hiçbiri geometri içermiyor. Tablolar _line, _point, _polygon ve _roads yolunda. Ve tüm geometri tablolarındaki geometri sütununun "geom" ya da başka bir şey olarak değil, "way" olarak adlandırıldığını vurgulamaya çalıştım.
user30184

Yanıtlar:


14

Hata iletisinin yalnızca bir kısmını ima etmesine rağmen ifadenizle ilgili üç sorununuz var ... "NEREDE boolean türü olmalıdır?", WHERE'ye verdiğiniz bilgilerin boole sonucunu değerlendirmediği anlamına gelir.

  1. ST_MakeEnvelope bu sırada onun parametreleri sorar: xmin, ymin, xmax, ymax, srid.

    Yanlış geçtiniz ymax, ymin, xmax, xmin, srid.

  2. Boole için NEREDE değerlendirme yapmalıdır:

    Bir geometrinin ve zarfın ortak unsurları olup olmadığını belirlemek için WHERE şöyle inşa edilmelidir: WHERE geom && envelope_geomaksi takdirde ST_Contains kullanabilirsiniz

    Geometrinin zarfın içinde olup olmadığını belirlemek için: `WHERE ST_Contains (zarf_geom, geom)

    İçin herhangi bir karşılaştırma yöntemi sağlamadınız WHERE.

  3. 'Planet_osm_ways' tablosu herhangi bir geometri sütunu içermez, ancak 'planet_osm_roads' 'way' adlı bir geometri sütunu içermez.

    İlgili planet_osm_nodes.lat ve planet_osm_nodes.lon'dan 'planet_osm_ways' tablosunda bir geometri sütunu oluşturabilirsiniz.

'Planet_osm_roads' kullanarak, bir sınırlama kutusunun geometri sütunu olan bir tabloya nasıl kullanılacağını gösterir:

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

veya bunu şu şekilde değiştirin:

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.