PostGIS kullanarak sınırlayıcı kutu seçilsin mi?


36

PostGIS kullanarak bir sınırlama kutusunda bulunan tüm yolları ve düğümlerini seçmek için bir sorgu oluşturmak istiyorum. Sınırlama kutusu osmosis "- sınırlama kutusu" komutunun alacağı tüm ayrıntıları içerecektir.

Bunu yapmanın bir yolu var mı?

Yanıtlar:


36

Osmoz dökümanları için komut seçeneğini görüyorum :

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

PostGIS için bir sınırlama kutusu oluşturmak üzere ST_MakeEnvelope (sol, alt, sağ, üst, srid) , ardından sınırlama kutularının kesiştiği yeri bulmak için &&sınırlama kutusu operatörünü kullanabilirsiniz:

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

SRID 4326, WGS84 Lat / Long içindir ve sadece PostGIS 1.5 için gereklidir; sonraki sürümler için çıkarılabilir.


Teşekkürler. ST_MakeEnvelope işlevi bir parametreye daha ihtiyaç duyar, srid. Oraya ne koyacağımı bilmiyorum .. herhangi bir fikir?
uriel

1
Bu parametreyi gerektiren PostGIS 1.5 kullanıyormuşsunuz gibi görünüyor. SRID'nin göz ardı edildiğini düşünüyorum, bu nedenle herhangi bir değer aynı sonuçları verebilir. Uzun / uzun verileriniz varsa, genellikle 4326 SRID kullanın.
Mike T

1
Bugünlerde çoğu araç, yüklediğinizde OSM verileri için SRID'yi seçmenize izin verir. Varsayılan OSM SRID 3857'dir (küresel merkatör). En lat / lon verisi için varsayılan SRID, SRID 4326'dır (Lat / Lon AKA WGS84). Verileri SRID 3857 ile yüklerseniz, örneğin, LAT / LON WGS84 ile 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) ürününe dönüşüm yapmanız gerekir. sadece para birimi desteği SRID 3857
Justin Swanhart

&& işlecinin sizin için SRID'leri dönüştürmediğini unutmayın. Yaptığınız Zarf'ın test geometrisi ile aynı SRID'de olduğundan emin olun veya başka bir şekilde kendiniz dönüştürün. trac.osgeo.org/postgis/ticket/2320
Nelson

1
&& operatörü, ST_Intersects’ten daha yavaş bir şekilde hesaplamada yavaştır
caiohamamura

8

Bunun gibi bir şey olacağını düşünüyorum: PostGIS'deki sınırlama kutusu tarafından oluşturulur.

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

Sorgu bir alt sorgu ile ST_Intersection kullanır.

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;

Bunu PostGIS yardım sayfalarından aşağı yukarı aldım
. Yukarıdaki tabloya benzer şekilde tasarlanan ikinci bir sorgu (ancak ST_Dimension () = 1 ile) yollarını bulmalı.

HTH, Micha


Merhaba teşekkürler! Ne srid? <srid> 'de hangi omuz eklemem gerekiyor? ve ".geom" (satır 4) geçersiz görünüyor, orada olmalı?
uriel

Üzgünüz, yorumunuzu geçen hafta kaçırdım. Srid, Koordinat Referans Sistemi kodudur. yani İsrail için 2039. .Geom ilavesi, bir "GeometryCollection'ın Geometri bölümünü çıkarır. Burada gerekmediği konusunda haklı olabilirsin.
Micha

4

Burada sorunuza benzer bir konu var ...

ST_Iersersection - (T) geomA ve geomB'nin paylaşılan kısmını temsil eden bir geometri döndürür. Coğrafya uygulaması, kesişimi yapmak için geometriye dönüşür ve ardından tekrar WGS84'e dönüşür.

1. Ayrıca Geometri Yapma İşlevleri hakkında da bilgi edinebilirsiniz .

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

kesişim

2.Another bilgiler burada kesiştirir Kesişme hakkında: 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;

kesişim

umarım sana yardımcı olur ...


0

Bu, @ Micha'nın koduna yapılan bir yorum.

Bunun için koordinat çiftleri POLYGONsaat yönünde (ya da saatin tersi yönünde) bir sıra izlemelidir: üst sol, üst sağ, alt sağ, alt sol, tekrar üst sol.

Bu nedenle, saat yönünde, işlev çağrısı şöyle olmalıdır:

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

Veya saat yönünün tersine:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
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.