Выберите все точки в ограничительной рамке

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 ...

theartofbeing
источник
1
Дайте ссылку на старые вопросы, которые вы читали и использовали для построения вашего запроса.
user30184
Ваш порядок координат в ST_MakeEnvelope () не выглядит так, как будто они в этом формате, xmin, ymin, xmax, ymax
artwork21
@ artwork21 Я использую lat / long в ST_MakeEnvelope. Это неправильно? Нужно ли конвертировать это в другой формат? Я думал, что именно этим занимается
ST_Transform
1
Извините, мне пришлось снова прочитать прекрасные руководства, включая документ схемы. Wiki.openstreetmap.org/wiki/Osm2pgsql/schema#planet_osm_ways . Planet_osm_ways не содержит геометрии и довольно бесполезен для конечного пользователя. Это для системы. Нет шансов сделать ограничивающие прямоугольные запросы из этой таблицы. С таблицами типа planet_osm_roads это возможно. Тем не менее planet_osm_roads.geom не существует, потому что, как видно из схемы, он называется planet_osm_roads.way.
user30184
1
Нет. Я сказал, что вы не можете выполнить ограничивающий прямоугольник из planet_osm_ways, потому что эта таблица не имеет геометрии. Смотрите: id, узлы, теги, ожидающие - ни один из них не содержит геометрии. Таблицы _line, _point, _polygon и _roads в порядке. И я попытался подчеркнуть, что столбец геометрии во всех таблицах геометрии называется «way», а не «geom» или чем-то еще.
user30184

Ответы:

14

У вас три проблемы с вашим утверждением, хотя сообщение об ошибке намекает только на его часть ... «WHERE должно иметь тип boolean» означает, что информация, которую вы передали 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' содержит столбец геометрии с именем 'way'.

    Вы можете создать столбец геометрии в таблице '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);
kttii
источник