Wybierz wszystkie punkty w obwiedni

11

Widziałem to pytanie zadane wcześniej, ale odpowiedzi, które próbuję, nie działają.

Chcę sprawdzić wszystkie sposoby OSM, które znajdują się w obwiedni. Dane OSM zostały zaimportowane z domyślnym sferycznym mercatorem. Pytam przy użyciu LAT / LON, stąd transformacja

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

Po uruchomieniu tego pojawia się następujący błąd:

BŁĄD: argument GDZIE musi być typu logicznego, a nie geometrii typu. LINIA 3: GDZIE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...

theartofbeing
źródło
1
Podaj link do starych pytań, które czytałeś i których użyłeś do zbudowania zapytania.
user30184
Twoje współrzędne w ST_MakeEnvelope () nie wyglądają, jakby były w tym formacie, xmin, ymin, xmax, ymax
artwork21
@ artwork21 Używam lat / long w ST_MakeEnvelope. Czy to źle? Czy muszę przekonwertować to na inny format? Myślałem, że właśnie to robi
ST_Transform
1
Przepraszam, musiałem ponownie przeczytać dobre instrukcje, w tym dokument schematu wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways nie zawiera geometrii i jest raczej bezużyteczny dla użytkownika końcowego. To jest dla systemu. Z tej tabeli nie ma szans na tworzenie zapytań do ramek ograniczających. W przypadku tabel takich jak planet_osm_roads jest to możliwe. Nadal planet_osm_roads.geom nie istnieje, ponieważ, jak widać ze schematu, nazywa się planet_osm_roads.way.
user30184,
1
Nie. Powiedziałem, że nie można wykonać zapytania o ramkę ograniczającą z planet_osm_ways, ponieważ ta tabela nie ma żadnych geometrii. Zobacz: id, węzły, tagi, w toku - żaden z nich nie zawiera geometrii. Tabele _line, _point, _polygon i _roads są OK. I starałem się podkreślić, że kolumna geometrii we wszystkich tabelach geometrii jest nazywana „drogą”, a nie „geom” lub czymkolwiek innym.
user30184

Odpowiedzi:

14

Występują trzy problemy ze stwierdzeniem, chociaż komunikat o błędzie sugeruje tylko jego część ... „GDZIE musi być typu boolean” oznacza, że ​​informacja, którą podałeś, GDZIE nie ma wartości logicznej.

  1. ST_MakeEnvelope prosi o jego parametry w następującej kolejności: xmin, ymin, xmax, ymax, srid.

    Podałeś niepoprawnie ymax, ymin, xmax, xmin, srid.

  2. GDZIE należy ocenić, aby uzyskać wartość logiczną:

    Aby ustalić, czy geometria i obwiednia mają jakieś wspólne elementy, GDZIE należy skonstruować w ten sposób: w WHERE geom && envelope_geomprzeciwnym razie można użyć ST_Contains

    Aby ustalić, czy geometria jest zawarta w obwiedni: `WHERE ST_Contains (vel_geom, geom)

    Nie podałeś żadnej metody porównania dla WHERE.

  3. Tabela „planet_osm_ways” nie zawiera żadnej kolumny geometrii, chociaż „planet_osm_roads” zawiera kolumnę geometrii o nazwie „way”.

    Możesz utworzyć kolumnę geometrii w tabeli „planet_osm_ways” z powiązanych planet_osm_nodes.lat i planet_osm_nodes.lon.

Za pomocą „planet_osm_roads” pokazano, jak używać obwiedni względem tabeli z kolumną geometrii:

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

lub zmień to na:

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
źródło