【问题标题】:Search a table for Point in Polygon using MySQL使用 MySQL 在表中搜索 Point in Polygon
【发布时间】:2013-03-27 15:36:01
【问题描述】:

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

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

字段 MunicipalID 不是唯一的。

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

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 部分)并找到该点在哪个多边形中。

【问题讨论】:

    标签: mysql point-in-polygon


    【解决方案1】:

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

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

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

    【讨论】:

    • 这似乎不适用于 5.5,您是否尝试过任何变通方法?我目前卡在 5.5 中。
    • 不,我没有实现其他任何东西,因为我对 ST_ 功能非常满意。在我的笔记中,我有这个link,这可能是一个替代方案。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 2020-10-06
      相关资源
      最近更新 更多