У меня вопрос по пространственным функциям на сервере MySQL 8.0.13.
Я пытаюсь определить, содержит ли полигон точку, используя функцию ST_Contains.
В моих тестах оба сферических объекта (многоугольник и точка) определены с помощью SGID 4326 (проекция WGS84).
Северо-восточная четверть земного полигона:
SELECT (ST_Contains (
ST_GeomFromText ('POLYGON ((0 0,0 180,90 180,90 0,0 0))', 4326),
ST_GeomFromText ('POINT (10 10)', 4326)
))
... возвращает 1: ОК, точка содержится в многоугольнике.
Полигон во Франции, пересекая Гринвичский меридиан
SELECT (ST_Contains (
ST_GeomFromText ('POLYGON ((41 -6,41 10,5,51,5 10,5,51,5 -6,41 -6))', 4326),
ST_GeomFromText ('POINT (45 2)', 4326)
))
... возвращает 1: ОК, точка содержится в многоугольнике.
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((41 -6,41 10.5,51.5 10.5,51.5 -6,41 -6))',4326),
ST_GeomFromText( 'POINT(45 -2)',4326 )
))
... возвращает 1: ОК, точка содержится в многоугольнике.
Полигон в Тихом океане, пересекающий Международную линию даты:
SELECT (ST_Contains (
ST_GeomFromText ('POLYGON ((- 45 100, -45 -100,45 -100, 45 100, -45 100))', 4326),
ST_GeomFromText ('POINT (0 179)', 4326)
))
... возвращает 1: ОК, точка содержится в многоугольнике.
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((-45 100,-45 -100,45 -100, 45 100, -45 100))',4326),
ST_GeomFromText( 'POINT(0 -179)',4326 )
))
... возвращает 1: ОК, точка содержится в многоугольнике.
Мир по часовой стрелке: SW, SE, NE, NW, SW
SELECT (ST_Contains (
ST_GeomFromText ('POLYGON ((- 90 -180, -90 180,90 180,90 -180, -90 -180))', 4326),
ST_GeomFromText ('POINT (0 0)', 4326)
))
... возвращает 0. KO, точка не обнаружена как часть многоугольника.
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((-90 -180,-90 180,90 180,90 -180,-90 -180))',0),
ST_GeomFromText( 'POINT(0 0)',0)
))
... возвращает 1: ОК, точка содержится в многоугольнике.
SELECT (ST_Contains(
ST_GeomFromText( 'POLYGON((-89.99 -180,-89.99 180,89.99 180,89.99 -180,-89.99 -180))',0),
ST_GeomFromText( 'POINT(0 0)',0)
))
... возвращает 1: ОК, точка содержится в многоугольнике.
Я думаю, что POLYGON ((- 90 -180, -90 180,90 180,90 -180, -90 -180)) не имеет значения, используя пространственные координаты WGS84; все точки, используемые в этом многоугольнике, являются северными | южными полюсами!
При использовании плоской проекции (SGID 0) это работает хорошо.
Я также пытался уменьшить широты, чтобы избежать использования полюсов; с 89,99 ° вместо 90 ° это тоже работает.
Мой вопрос заключается в том, есть ли обходной путь / другое решение для определения «многоугольника» с полной землей (с использованием широт 90 °), чтобы я мог использовать общий запрос SQL, который работает во всех случаях.
Christophe