Вибрати обмежувальне поле за допомогою postGIS?


36

Я хочу створити запит для вибору всіх способів та їх вузлів, які існують у обмежувальному вікні, використовуючи postGIS. Обмежувальне поле повинно містити всі деталі, оскільки команда осмосу "- bounding-box" буде завантажена.

Чи можна це зробити?

Відповіді:


36

Для документів з осмосу я бачу варіант команди :

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

для PostGIS ви можете використовувати ST_MakeEnvelope (ліворуч, знизу, праворуч, верх, сітка) для побудови обмежувальної коробки, а потім &&оператора обмежувального поля, щоб знайти, де перетинаються обмежувальні коробки:

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 даних під час завантаження. За замовчуванням OSM SRID - 3857 (сферичний меркатор). SRID для більшості даних Lat / lon за замовчуванням - SRID 4326 (Lat / Lon 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, Micha


Привіт, спасибі! яка сіра? що мені потрібно вставити в <srid>? і ".geom" (рядок 4), здається, недійсний, він повинен бути там?
уріель

Вибачте, я пропустив ваш коментар з минулого тижня. Srid - це код системи координатної системи. тобто 2039 рік для Ізраїлю. Додавання .geom витягує частину геометрії «GeometryCollection Можливо , ви маєте рацію , що це тут не потрібно ..
Micha

5

тут є тема, яка схожа на ваше запитання тут ...

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

1.Ви також можете отримати тут інформацію про геометричні функції побудови.

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

перехрестя

2.Друга інформація тут про перехрестя перехрестя: 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

Це коментар до коду @ Micha.

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