使用MySQL在Table中搜索Point in Polygon

时间:2013-03-27 15:36:01

标签: mysql point-in-polygon

我在MySQL 5.5中创建了一个表(cities_border),它有一些边界。

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

该字段为cityID并非唯一。

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

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');

第一个语句集@r = ...只返回一行,我选择它专门用于测试。 它的效果非常好。

我想要做的是搜索整个表格(换句话说,从SQL问题中删除WHERE部分)并找到该点所在的多边形。

2 个答案:

答案 0 :(得分:12)

经过一夜的睡眠后,我找到了以下解决方案。

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个点。

答案 1 :(得分:0)

Pavlos Papanikolaou的解决方案非常出色。就我而言 表格: TestPoly 和列: pol 插入查询

SET @g = 'POLYGON((22.367582117085913 70.71181669186944, 22.225161442616514 70.65582486840117, 22.20736264867434 70.83229276390898, 22.18701840565626 70.9867880031668, 22.22452581029355 71.0918447658621, 22.382709129816103 70.98884793969023, 22.40112042636022 70.94078275414336, 22.411912121843205 70.7849142238699, 22.367582117085913 70.71181669186944))';
INSERT INTO TestPoly (pol) VALUES (ST_GeomFromText(@g))

选择查询

set @p = GeomFromText('POINT(22.4053386588057 70.86240663480157)');
select * FROM TestPoly where ST_Contains(pol, @p);