Wybierz obwiednię za pomocą postGIS?

36

Chcę utworzyć zapytanie, aby wybrać wszystkie sposoby i ich węzły, które istnieją w obwiedni za pomocą postGIS. Obwiednia powinna zawierać wszystkie szczegóły, jakie pobierze polecenie osmozy „--bounding-box”.

Czy istnieje jakiś sposób, aby to zrobić?

uriel
źródło

Odpowiedzi:

36

W dokumentach dotyczących osmozy widzę opcję polecenia :

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

dla PostGIS możesz użyć ST_MakeEnvelope (lewy, dolny, prawy, górny, srid), aby zbudować obwiednię, a następnie &&operator obwiedni, aby znaleźć miejsce przecięcia obwiedni:

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

SRID 4326 jest dla WGS84 Lat / Long i jest wymagany tylko dla PostGIS 1.5; można go pominąć w późniejszych wersjach.

Mike T.
źródło
Dzięki. funkcja ST_MakeEnvelope potrzebuje jeszcze jednego parametru, srid. Nie wiem co tam umieścić ... jakiś pomysł?
uriel
1
Wygląda na to, że używasz PostGIS 1.5, który wymaga tego parametru. Myślę, że SRID jest ignorowany, więc każda wartość może dać takie same wyniki. Jeśli masz dane w formacie lat / long, zwykle używaj SRID 4326.
Mike T
1
Obecnie większość narzędzi pozwala ci wybrać SRID dla danych OSM podczas ładowania. Domyślny SRM OSM to 3857 (merkator sferyczny). Domyślny SRID dla większości danych lat / lon to SRID 4326 (Lat / Lon AKA WGS84). Jeśli na przykład załadujesz dane za pomocą SRID 3857, będziesz musiał wykonać konwersję z LAT / LON WGS84 na 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) Niektóre narzędzia (np. Imposm3) obecnie obsługuje tylko SRID 3857
Justin Swanhart
Pamiętaj, że operator && nie przekształca identyfikatorów SRID za Ciebie. Upewnij się, że koperta, którą wykonujesz, ma ten sam SRID co geometria testowa, w przeciwnym razie przekształć ją samodzielnie. trac.osgeo.org/postgis/ticket/2320
Nelson
1
Operator && jest obliczeniowo wolniejszy niż ST_Intersects
caiohamamura,
8

Myślę, że będzie to mniej więcej tak: Obwiednia w PostGIS jest tworzona przez

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

Zapytanie użyje ST_Intersection z podzapytaniem.

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;

Mniej więcej wziąłem to ze stron pomocy PostGIS
Drugie zapytanie, w tabeli sposobów, zaprojektowane podobnie do powyższego (ale z ST_Dimension () = 1), powinno uzyskać odpowiedzi.

HTH, Micha

Micha
źródło
Cześć, dzięki! co za srid? jaki powinienem wstawić w <srid>? i „.geom” (wiersz 4) wydaje się być nieprawidłowy, powinien tam być?
uriel
Przepraszam, przegapiłem twój komentarz z zeszłego tygodnia. Srid to kod systemu odniesienia za pomocą współrzędnych. tj. 2039 dla Izraela. Dodatek .geom wyodrębnia część Geometry z „GeometryCollection. Być może masz rację, że nie jest ona wymagana tutaj.
Micha
5

jest tutaj temat podobny do twojego pytania tutaj ...

ST_Intersection - (T) Zwraca geometrię reprezentującą wspólną część geomA i geomB. Implementacja geograficzna przekształca geometrię w celu wykonania skrzyżowania, a następnie przekształca z powrotem do WGS84.

1. Możesz także uzyskać tutaj informacje o funkcjach budowy geometrii.

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

skrzyżowanie

2.Another informacji tutaj o przecina przecięcia: 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;

skrzyżowanie

Mam nadzieję, że Ci to pomoże...

Aragonia
źródło
0

To jest komentarz do kodu @ Micha.

Pary współrzędnych POLYGONpowinny być zgodne z ruchem wskazówek zegara (lub przeciwnie do ruchu wskazówek zegara): lewy górny, prawy górny, prawy dolny, lewy górny, lewy górny.

Tak więc, zgodnie z ruchem wskazówek zegara, wywołanie funkcji powinno być:

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

Lub przeciwnie do ruchu wskazówek zegara:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
Daishi
źródło