ST_WITHIN или ST_CONTAINS с POLYGON через IDL или Гринвич - PullRequest
0 голосов
/ 15 ноября 2018

У меня вопрос по пространственным функциям на сервере 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

...