MySql Геопространственная ошибка ..? - PullRequest
2 голосов
/ 16 июля 2009

Этот вопрос для экспертов Mysql по геопространственному расширению.

Следующий запрос не соответствует ожидаемому:

create database test_db;

use test_db;

create table test_table (g polygon not null);

insert into test_table (g) values (geomfromtext('Polygon((0 5,5 10,7 8,2 3,0 5))'));
insert into test_table (g) values (geomfromtext('Polygon((2 3,7  8,9 6,4 1,2 3))'));

select

X(PointN(ExteriorRing(g),1)), Y(PointN(ExteriorRing(g),1)),
X(PointN(ExteriorRing(g),2)), Y(PointN(ExteriorRing(g),2)),
X(PointN(ExteriorRing(g),3)), Y(PointN(ExteriorRing(g),3)),
X(PointN(ExteriorRing(g),4)), Y(PointN(ExteriorRing(g),4))

from test_table where MBRContains(g,GeomFromText('Point(3 6)'));

По сути, мы создаем 2 полигона и пытаемся использовать MBRContains, чтобы определить, находится ли точка в одном из двух полигонов.

Удивительно, но возвращает оба полигона! Точка 3,6 должна существовать только в первом вставленном многоугольнике.

Обратите внимание, что оба полигона наклонены (как только вы нарисуете полигоны на листе бумаги, вы увидите)

Почему MySql возвращает оба полигона? Я использую MySql Community Edition 5.1.

1 Ответ

2 голосов
/ 16 июля 2009

ОБНОВЛЕНИЕ : Надеюсь, этот ответ был отменен MySQL: http://forge.mysql.com/wiki/GIS_Functions! Будет оставлено в качестве ссылки для более старых реализаций MBRContains, но новый ответ, объясняющий изменения, будет приветствоваться и должен быть "принят" выше этого.

начать устаревший ответ

Вы используете (по необходимости) минимальные ограничивающие прямоугольники , а не многоугольники как таковые. Для вашего запроса сравниваемая форма эквивалентна:

'POLYGON(0 2,0 10,7 10,7 2,0 2)'

для первой фигуры и:

'POLYGON(2 1,9 1,9 9,2 9,2 1)'

за второе. (3,6) в обоих.

MBR - грубый способ оценки, представьте прямоугольник с вертикальными линиями в min (x) и max (x) и горизонтальными линиями в max (y) и min (y). Эти фигуры легче вычислить в базе данных, MySQL не поддерживает все функции многоугольника. (Область да, линейные линии обычно да, contains пока нет. Подробнее здесь .). Если вам нужна более точная геопространственная геометрия в данный момент, лучший выбор на стороне открытого исходного кода - PostGIS .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...