Я пытаюсь реализовать таблицу зон с полигоном в одном из своих полей. Я буду использовать это, чтобы позже проверить, содержится ли определенная точка в полигоне.Запрос пространственных данных 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));
Я использую MySQL 5.5 и удивлялся при обновлении до 5.6 поможет мне здесь или там может быть другое решение?
Да, действительно. Но он возвращает зону «Purmerend» –
Не уверен, что у вас такая же проблема, но обновление до 5.6 может помочь, см. Этот ответ: http://stackoverflow.com/a/15902320/3131147 – AdamMc331
Обновление: ST_CONTAINS работает в [this SQL Fiddle] (http://sqlfiddle.com/#!9/81ea2/2) – AdamMc331