10

我在 MySQL 5.5 中创建了一个包含一些边界的表 (municipal_border)。

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

字段 urbanID 不是唯一的。

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

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 = ... 只返回一行,我专门选择它进行测试。它工作得很好。

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

4

2 回答 2

22

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

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

它适用于已实现ST_ 前缀功能的 MySQL 5.6.1。尽管我没有从经典方法(X 射线算法)中获得任何测量结果,但我相信这相当快。在 2700 个多边形中定位一个点需要 0.17 秒,其中一些多边形的点数远远超过 1,500 个。

于 2013-03-28T13:46:44.890 回答
4

Pavlos Papanikolaou 的解决方案很棒。就我而言,表:TestPoly和列:pol Insert Query

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);
于 2019-03-14T05:23:16.460 回答