MySQL 8.0 ST_CONTAINS возвращает записи вне многоугольника и пропускает записи внутри многоугольника - PullRequest
0 голосов
/ 22 октября 2019

Я сталкиваюсь с расхождениями при использовании mysql's st_contains. У меня есть таблица зон, в которой есть столбцы latitude и longitude, я просто хочу запросить все записи, которые попадают в полигон.

Когда я делаю это, mysql возвращает записи вне многоугольника и пропускает записи, которые определенно находятся внутри многоугольника. Я смог создать визуал, используя карты Google результатов MySQL для помощи в отладке.

Here is the visual of the records I was able to create using google maps

Ниже приведен SQL-запрос

SELECT *
FROM `zones`
WHERE (ST_CONTAINS(ST_GEOMFROMTEXT('POLYGON((22.43079687220491 89.14206562499999, 33.72385081452048 96.70065937499999, 22.917381576171614 107.77487812499999, 20.796651975524764 108.12644062499999, 17.643461922028166 107.42331562499999, 7.361883956935348 117.26706562499999, 2.1060545562538273 148.54242063498816, -7.365289419995424 171.21820188498816, -25.802453489204527 171.74554563498816, -36.08590711168321 -175.3694333408895, -51.731473033051614 172.21043060460465, -44.34469762328107 138.81199310460465, -34.74750931376504 107.87449310460465, -12.04633897054804 98.73386810460465, 2.804203457833971 93.76073834567285, 16.292162960708847 90.77245709567285, 22.43079687220491 89.14206562499999, 22.43079687220491 89.14206562499999))'), POINT(latitude, longitude))) AND `zones`.`deleted_at` IS NULL

На визуальном изображении показаны записи за пределами предоставленного многоугольника, и отсутствуют записи, которые должны находиться внутри многоугольника.

Например, у меня есть запись зон для Гастингса, Австралия с latitude:-38.3 и longitude:145.216667, которая явно будет в многоугольнике, но mysql никогда не возвращает эту запись. В Новой Зеландии также есть несколько записей.

Граница создается с помощью плагина рисования карт Google.

Это ошибка MySQL или я что-то не так делаю?

1 Ответ

1 голос
/ 22 октября 2019

Я вставил ваше определение многоугольника в визуализатор WKT, и это выглядит очень странно, совсем не так, как вы рисуете здесь.

И я думаю, что это вызвано этими сегментами, а также отсутствующим SRID.

-25.802453489204527 171.74554563498816, -36.08590711168321 -175.3694333408895, -51.7 * * 1002304 060 1002 1002 1002 602 602 602 602 602 2 602 604 602 2 602 604 602 2 2 2 2 2 2 4 100 2 2 2 2 2 2 2 2 2 102 0 2 0 2 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 4 6 4 6 4 6 В 10 000 2 5 2 2 2 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 В* Без явного аргумента SRID MySQL использует SRID 0 - абстрактную, безразмерную, бесконечную, декартову плоскость. https://mysqlserverteam.com/spatial-reference-systems-in-mysql-8-0/

В этом сегменте долгота прыгает с 171 до -175 и обратно, пересекая анти-меридиан. Но с SRID = 0 MySQL ничего не знает об антимеридиане, и это становится длинной линией, охватывающей ~ 346 градусов долготы и пересекающей большую часть изображения, вместо дополнительной короткой линии, охватывающей ~ 14 градусов и пересекающей анти-меридиан.

Вам необходимо предоставить SRID (я думаю, вам нужно 4326), чтобы сообщить MySQL о том, что происходит на Земле. Или как простой обходной путь, если вам не нужен точный многоугольник - замените -175.3694333408895 на 179.9, чтобы избежать пересечения антимеридиана.

...