2015-09-18 3 views
1

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

Я внедрил это, насколько мне известно, но после тестирования я обнаружил, что определенная точка (рядом, но вне полигона) возвращается, когда они этого не делают.

CREATE TABLE `zones` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `geom` geometry NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

INSERT INTO zones (created_at, updated_at, name, `geom`) 
VALUES (NOW(),NOW(), "Purmerend", PolygonFromText('POLYGON(( 
52.37811421553942 4.98779296875, 
52.36637614192118 5.002899169921875, 
52.381467377903476 5.04547119140625, 
52.46688700596046 5.156707763671875, 
52.62306005822956 5.04547119140625, 
52.64223014513886 4.84222412109375, 
52.61555643344044 4.769439697265625, 
52.51287794429004 4.7186279296875, 
52.45684622754481 4.833984375, 
52.37811421553942 4.98779296875))')); 

#1 outside 
SELECT * FROM zones WHERE CONTAINS(geom, POINT(52.306024, 4.913726)); 
#2 **-- false positive --** 
SELECT * FROM zones WHERE CONTAINS(geom, POINT(52.434471, 4.817571)); 
#3 inside 
SELECT * FROM zones WHERE CONTAINS(geom, POINT(52.501924, 4.964426)); 

Graphical representation

Я использую MySQL 5.5 и удивлялся при обновлении до 5.6 поможет мне здесь или там может быть другое решение?

+0

Да, действительно. Но он возвращает зону «Purmerend» –

+0

Не уверен, что у вас такая же проблема, но обновление до 5.6 может помочь, см. Этот ответ: http://stackoverflow.com/a/15902320/3131147 – AdamMc331

+1

Обновление: ST_CONTAINS работает в [this SQL Fiddle] (http://sqlfiddle.com/#!9/81ea2/2) – AdamMc331

ответ

0

MySql 5.5 CONTAINS использует ограниченный прямоугольник при вычислении, если POINT находится внутри POLYGON. MySql 5,6 ST_CONTAINS функция не делает этого и вычисляет положение 2 правильно

McAdam331 доказали: 5.6 ST_CONTAINS works in this [SQL Fiddle][1]

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