Виберіть усі точки в обмежувальному полі


11

Я бачив це запитання раніше, але відповіді, які я намагаюся, не працюють.

Я хочу запитати всі способи OSM, які знаходяться в обмежувальному полі. Дані OSM були імпортовані за замовчуванням сферичним меркатором. Я запитую за допомогою LAT / LON, отже, перетворення

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

Коли я запускаю це, я отримую таку помилку:

ПОМИЛКА: аргумент WHERE повинен бути тип булевим, а не вводити геометрію LINE 3: WHERE ST_Transform (ST_MakeEnvelope (37.808264, 37.804339, -12 ...


1
Дайте посилання на старі запитання, які ви читали та використовували для створення запиту.
користувач30184

Ваш порядок координат у ST_MakeEnvelope () не схожий на такий формат, xmin, ymin, xmax, ymax
artwork21

@ artwork21 Я використовую lat / long в ST_MakeEnvelope. Це неправильно? Чи потрібно конвертувати це в інший формат? Я думав , що це те , що робить ST_Transform
theartofbeing

1
Вибачте, мені довелося знову прочитати чудові посібники, включаючи документ із схемою wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways не містить геометрії і є досить марною для кінцевого споживача. Це для системи. Немає шансів робити запити обмежувальної коробки з цієї таблиці. З такими таблицями, як planet_osm_roads це можливо. Досі planet_osm_roads.geom не існує, тому що, як ви бачите зі схеми, вона називається planet_osm_roads.way.
користувач30184

1
Ні. Я сказав, що ви не можете робити запит на обмеження поля від planet_osm_ways, оскільки ця таблиця не має геометрії. Дивіться: id, вузли, теги, очікує на розгляд - жоден з них не містить геометрії. Таблиці _line, _point, _polygon та _roads добре. І я намагався підкреслити, що стовпчик геометрії у всіх таблицях геометрії названий як «спосіб», а не як «гео» або що-небудь ще.
користувач30184

Відповіді:


14

У вас є три проблеми з вашим твердженням, хоча повідомлення про помилку натякає лише на його частину ... "WHERE повинно бути тип булевим" означає, що інформація, яку ви надали WHERE, не оцінює для булевого результату.

  1. ST_MakeEnvelope просить його параметри в наступному порядку: xmin, ymin, xmax, ymax, srid.

    Ви неправильно подали номер ymax, ymin, xmax, xmin, srid.

  2. ДЕ слід оцінювати як булева:

    Щоб визначити, чи має геометрія та конверт будь-які спільні елементи, WHERE має бути побудовано так: WHERE geom && envelope_geomінакше можна використовувати ST_Contains

    Щоб визначити, чи міститься геометрія в конверті: `WHERE ST_Contains (envelope_geom, geom)

    Ви не надали жодного методу порівняння для WHERE.

  3. Таблиця "planet_osm_ways" не містить жодного стовпця з геометрією, хоча "planet_osm_roads" містить стовпчик геометрії з назвою "шлях".

    Ви можете створити стовпчик геометрії в таблиці 'planet_osm_ways' з пов’язаних planet_osm_nodes.lat та planet_osm_nodes.lon.

Використовуючи "planet_osm_roads", це показує, як використовувати обмежувальне поле проти таблиці з стовпцем геометрії:

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

або змінити це на це:

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.