Вопрос

Этот вопрос предназначен для экспертов по геопространственным расширениям 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)'));

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

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

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

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

Это было полезно?

Решение

ОБНОВЛЯТЬ:Надеюсь, этот ответ устарел в 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 еще нет.Подробнее здесь.).Если вам нужна более точная геопространственная геометрия на данный момент, лучшим выбором на стороне открытого исходного кода является ПостГИС.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top