2013-03-27 43 views
4

我在MySQL 5.5中创建了一个表格(municipal_border),它包含一些边界。使用MySQL在多边形中搜索表格

CREATE TABLE `municipal_border` (
    `boundary` polygon NOT NULL, 
    `municipalID` int(10) NOT NULL, 
) ENGINE=InnoDB 

该fieldID不是唯一的。

我正在使用下面的代码来测试一个点是否属于一个多边形。

set @r = (SELECT municipal_border.boundary FROM municipal_border WHERE municipalID=9001); 
set @p = GeomFromText('POINT(24.1621 41.0548)'); 
select if(contains(@r, @p), 'yes', 'no'); 

第一条语句set @r = ...只返回一行,我专门选择了它来进行测试。 它工作得很好。

我想要做的是搜索整个表(擦除,换句话说,WHERE部分从SQL问题),并在其中找到多边形点是英寸

回答

8

一个晚上的睡眠,我发现后以下解决方案。

set @p = GeomFromText('POINT(23.923739342824817 38.224714465253733)'); 
select municipalID FROM ecovis.municipal_border 
where ST_Contains(municipal_border.boundary, @p); 

它正在为MySQL 5.6.1工作,其中ST_ prefix函数已经实现。 虽然我没有从经典方法(X射线算法)的任何测量,我相信这是相当快的。它需要0.17秒来定位2700个多边形中的一个点,而某些多边形的点数超过1,500个点。

+0

它看起来并不像5.5可用,你有没有尝试过任何解决方法?目前我被困在5.5中。 – 2014-09-04 17:55:49

+0

不,我没有执行其他任何事情,因为我对ST_函数非常满意。 在我的笔记我有这个[链接](http://assemblysys.com/php-point-in-polygon-algorithm/)这可能是一个替代。 – 2014-09-11 19:00:16