Как получить ближайшую точку от многоугольника, который на самом деле находится внутри многоугольника в Postgis - PullRequest
2 голосов
/ 21 июня 2019

Я пытаюсь очистить некоторые геопространственные данные, которые у меня есть в базе данных PostGIS.Из-за некоторых неточностей в процессе геокодирования некоторые точки, которые должны находиться в границах определенной области, отображаются очень близко, но за пределами ограничительного полигона указанной области.

Мой первый подход состоял в том, чтобыиспользовать функцию ST_ClosestPoint в PostGIS, но безуспешно.Проблема в том, что эта функция возвращает ближайшую точку ON для геометрии A в геометрию B (https://postgis.net/docs/ST_ClosestPoint.html). Однако ON не означает IN, поскольку, если я запускаю следующий запрос, он спрашивает, находится ли ближайшая точка ON A (многоугольник).) к B (точка) содержится в A:

SELECT  ST_Contains(
            ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),
                ST_ClosestPoint(
                    ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),
                    ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20)
                    )
                ) As ptwkt;

Возвращает значение false, что означает, что ближайшая точка вообще не содержится в A. Я хочу указать точку внутри многоугольника (содержится вв этом многоугольнике), который находится ближе всего к другой точке. Я хочу этого, потому что остальная часть моего кода проверяет, находятся ли точки в их соответствующих областях. Если бы это можно было решить с помощью запроса PostGIS, это было бы идеально.

1 Ответ

0 голосов
/ 24 июня 2019

Решение, которое я нашел, состоит в том, чтобы «сжать» исходный многоугольник с помощью ST_Buffer с отрицательным радиусом, а затем получить ближайшую точку между моей начальной точкой - уменьшенный многоугольник.Ближайшая точка к сжатому многоугольнику находится внутри исходного многоугольника.

SELECT  ST_Contains(
            ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),
                ST_ClosestPoint(
                    ST_Buffer(ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'), -5),
                    ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20)
                    )
                ) As ptwkt;

Теперь возвращается true.

...