2012-06-19 7 views
1

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

Так вставки, как это:

INSERT INTO zones (zoneName, coords) VALUES ('name', 
PolygonFromText('POLYGON((
41.11396418691335 1.2562662363052368, 
41.11370552595821 1.2560248374938965, 
41.11851079510035 1.2459397315979004, 
41.11880984984478 1.2461864948272705, 
41.11396418691335 1.2562662363052368))')); 

Тогда у меня есть положение пользователя, и мне нужно знать, если он находится внутри некоторой зоны. Это хорошо работает с этим:

SELECT id 
    FROM zones 
WHERE MBRContains(coords,GeomFromText('POINT(41.117783 1.260590)')) 

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

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

ответ

0

Функции функций 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».

+0

Спасибо за информацию, я буду помнить об этом. – Biwu

+0

PostgreSQL с расширением PostGIS имеет гораздо более сложный набор функций для такого вида обработки, как MySQL. –

Смежные вопросы