Неверный результат при использовании ST_Intersection с postgis - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь сделать простое пересечение с postgis, но результат, который я получаю, неверен. В начале функции отсутствует сегмент длиной около 7 м.

Вот команда sql, которую я использую для пересечения:

select ST_Intersection(t2.wkb_geometry,
                     t1.wkb_geometry), t2.sde_id as s_sde, t2.mtb_id,
ST_Length(ST_Intersection(t1.wkb_geometry,t2.wkb_geometry))
from
public.mountainbike_pavement_temp2 t1 inner join public.mountainbike_strecken_temp2 t2 on
t1.wkb_geometry && t2.wkb_geometry;

Длина результата должно быть около 187 метров, но результат - всего около 180 метров. Я много пробовал, но не могу найти причину, почему это происходит, и как это исправить.

Когда я делаю это пересечение в ArcGis, все работает как положено.

I пробовал это с postgres 9.6.15 и postgis 2.4

, а также с

postgres 12.1 и postgis 3.0, те же результаты.

Таблицы и данные можно найти здесь:

https://pastebin.com/4vHqRYx5

https://pastebin.com/RAfzXXW6

Имена таблиц: mountainbike_pavement_temp2 publi c .mountainbike_strecken_temp2

Расстояние первых вершин от mountainbike_pavement_temp2 до mountainbike_strecken_temp2 равно 0, рассчитывается с помощью ST_Distance в postgis (см. Комментарий ниже). Поэтому я бы предположил, что есть пересечение.

enter image description here

1 Ответ

2 голосов
/ 19 февраля 2020

Проблема в том, что строки pavement не совсем совпадают со строками strecken. В частности, они содержат вершину POINT ( -43663.049707713886 245429.5072260416 ), которая не l ie на строке strecken. Это означает, что пересечение не включает в себя всю длину линии strecken.

На рисунке ниже это показано (с увеличением точки, чтобы показать разницу). pavement - красный, strecken - синий.

Это может работать в ArcGIS, поскольку при вычислении пересечения может использоваться некоторая привязка heuristi c.

enter image description here

...