Функции функций MBR (например, MBRContains
) не подходят для того, что вы пытаетесь сделать; они только проверяют включение ограничивающего прямоугольника.
Возможно, вы захотите перейти к MySQL 5.6.1 и использовать функции ST_, такие как ST_Contains
. Эти функции фактически проверяют геометрию.
Проблема, с которой вы работаете, может быть определена как неопределенность в позиции вашего POINT
, когда вы идете сравнить ее с вашей коллекцией границ POLYGON
элементов.
Попробуйте создать POLYGON
с вашей точки зрения, это квадрат с размером вашей неопределенности. Вы можете думать об этом квадрате как о «нечеткой» точке. (Вы также можете использовать восьмиугольник или другое приближение круга вместо прямоугольника, но ваша скорость запросов будет замедляться.)
Затем используйте ST_Within, чтобы узнать, есть ли у вас уникальный полигон, который полностью содержит вашу нечеткую точку. Если вы получите только один полигон, все готово.
Если вы получаете несколько полигонов, которые полностью содержат вашу нечеткую точку, это означает, что некоторые из ваших граничных многоугольников перекрывают другие. Вам нужно выяснить, что это означает в вашем проблемном пространстве. Если ваши данные предназначены для правильной структурированной картографической граничной информации, это означает, что у вас есть ошибка данных. (ПРИМЕЧАНИЕ: Это не неслыханно :-)
Если у вас нет полигонов, которые полностью содержат вашу нечеткую точку, то ваша нечеткая точка может пересекать границу, по крайней мере, одного многоугольника или не перекрывать ее. Используйте ST_Overlaps
, чтобы найти эти полигоны.
Если вы получаете только один, все готово - ваша нечеткая точка находится вблизи границы всего одного полигона.
Если вы ничего не получите, вы закончите - ваша нечеткая точка находится вдали от границ всех ваших полигонов.
Если вы получаете более одного удара, у вас есть двусмысленность - ваша нечеткая точка находится вблизи границы более чем одного полигона.
Это трудный случай, чтобы разобраться. Вы можете уменьшить размер нечеткой точки и повторить попытку. Это MIGHT дает только один результат полигона. Но вы могли бы обмануть себя, думая, что ваши очки точнее, чем они, делая это.
У MySQL нет геометрического оператора Area(Intersection(Polygon, FuzzyPoint))
. Если бы это было так, вы могли бы выбрать многоугольник с самой большой площадью пересечения с вашей нечеткой точкой, и это было бы хорошим двусмысленцем.Но это все равно было бы неточно, как положение вашей точки.
Возможно, ваше приложение должно обрабатывать категорию результата «слишком близко к границе A, B и C».
Спасибо за информацию, я буду помнить об этом. – Biwu
PostgreSQL с расширением PostGIS имеет гораздо более сложный набор функций для такого вида обработки, как MySQL. –