Выберите ограничивающий прямоугольник с помощью postGIS?

36

Я хочу создать запрос, чтобы выбрать все пути и их узлы, которые существуют в ограничивающей рамке, используя postGIS. Ограничительная рамка должна содержать все детали, которые получит команда osmosis «--bounding-box».

Есть ли способ сделать это?

Уриэль
источник

Ответы:

36

Для документации по осмосу я вижу опцию команды :

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

для PostGIS вы можете использовать ST_MakeEnvelope (left, bottom, right, top, srid), чтобы построить ограничивающий прямоугольник, затем &&оператор ограничивающего прямоугольника, чтобы найти, где ограничивающие прямоугольники пересекаются:

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

SRID 4326 предназначен для WGS84 Lat / Long и требуется только для PostGIS 1.5; это может быть опущено для более поздних версий.

Майк Т
источник
Спасибо. функция ST_MakeEnvelope нуждается в еще одном параметре, srid. Я не знаю, что там поставить .. есть идеи?
Уриэль
1
Похоже, вы используете PostGIS 1.5, который требует этот параметр. Я думаю, что SRID игнорируется, поэтому любое значение может дать те же результаты. Если у вас есть данные широты и долготы, обычно используйте SRID 4326.
Майк Т
1
Большинство инструментов в эти дни позволяют вам выбирать SRID для данных OSM при загрузке. По умолчанию OSID SRID - 3857 (сферический меркатор). SRID по умолчанию для большинства данных широта / долгота - SRID 4326 (широта / долгота AKA WGS84). Например, если вы загружаете данные с SRID 3857, вам придется выполнить преобразование из LAT / LON WGS84 в 3857: ST_Transform (ST_MakeEnvelope (LON1, LAT1, LON2, LAT2, 4326), 3857) Некоторые инструменты (например, imposm3) в настоящее время только поддержка SRID 3857
Джастин Суонхарт
Обратите внимание, что оператор && не преобразовывает SRID для вас. Убедитесь, что созданный вами конверт находится в том же SRID, что и тестовая геометрия, либо трансформируйте его самостоятельно. trac.osgeo.org/postgis/ticket/2320
Нельсон
1
Оператор && вычислительно медленнее чем ST_Intersects
caiohamamura
8

Я думаю, что это будет примерно так: ограничительная рамка в PostGIS создается

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

Запрос будет использовать ST_Intersection с подзапросом.

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;

Я более или менее воспользовался этим на страницах справки PostGIS
. Второй запрос в таблице путей, разработанный аналогично приведенному выше (но с ST_Dimension () = 1), должен найти пути.

HTH, Миха

Миха
источник
Привет спасибо! что за срид? что мне нужно вставить в <srid>? и ".geom" (строка 4) кажется недействительным, он должен быть там?
Уриэль
Извините, я пропустил ваш комментарий с прошлой недели. Srid - это код системы координат. т.е. 2039 для Израиля. Дополнение .geom извлекает часть Geometry из «GeometryCollection». Возможно, вы правы, что здесь это не требуется.
Миха
5

здесь есть тема, которая похожа на ваш вопрос здесь ...

ST_Intersection - (T) Возвращает геометрию, которая представляет общую часть geomA и geomB. Реализация географии выполняет преобразование в геометрию, чтобы выполнить пересечение, а затем преобразовывается обратно в WGS84.

1.you также можете получить некоторую информацию здесь о геометрии построения функций.

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

пересечение

2.Another информации здесь о пересекающем Пересечении: 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;

пересечение

я надеюсь, что это поможет вам ...

Арагон
источник
0

Это комментарий к коду @ Миха.

Пары координат для POLYGONдолжны следовать по часовой стрелке (или против часовой стрелки): верхний левый, верхний правый, нижний правый, нижний левый, снова верхний левый.

Итак, по часовой стрелке вызов функции должен быть:

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

Или против часовой стрелки:

ST_GeomFromText('POLYGON((ulx uly, llx llr, lrx lry, urx ury, ulx uly))', <srid>)
Дайси
источник