【问题标题】:Mysql Distance from test point to a polygonMysql 从测试点到多边形的距离
【发布时间】:2012-06-19 11:34:04
【问题描述】:

我已使用几何类型字段将一些地图区域存储到表中。

所以插入是这样的:

INSERT INTO zones (zoneName, coords) VALUES ('name',
PolygonFromText('POLYGON((
41.11396418691335 1.2562662363052368,
41.11370552595821 1.2560248374938965,
41.11851079510035 1.2459397315979004,
41.11880984984478 1.2461864948272705,
41.11396418691335 1.2562662363052368))'));

然后我有用户位置,我需要知道他是否在某个区域内。这很好用:

SELECT id 
  FROM zones 
 WHERE MBRContains(coords,GeomFromText('POINT(41.117783 1.260590)'))

但有时,用户位置并不完美,所以我认为最好知道哪个区域最接近用户位置。

那是我不知道的部分...我发现了一些查询来获取两点之间的距离,但不是点和多边形。

【问题讨论】:

    标签: mysql polygon distance point between


    【解决方案1】:

    MBR 系列函数(如MBRContains)不适合你想做的事情;他们只测试边界矩形包含。

    您可能希望跳转到 MySQL 5.6.1,并使用 ST_ 函数,例如 ST_Contains。这些函数实际测试几何。

    当您将POINT 与边界POLYGON 项目的集合进行比较时,您正在处理的问题可以定义为不确定性。

    试试这个:从你的点创建一个POLYGON,它是一个与你的不确定性大小相同的正方形。你可以把这个正方形想象成一个“模糊”点。 (您也可以使用八边形或其他更接近圆形的近似值来代替矩形,但您的查询速度会变慢。)

    然后使用 ST_Within 查看您是否有一个完全包含您的模糊点的独特多边形。如果你只得到一个多边形,你就完成了。

    如果您得到多个完全包含您的模糊点的多边形,这意味着您的一些边界多边形与其他多边形重叠。你需要弄清楚这在你的问题空间中意味着什么。如果您的数据旨在成为结构正确的制图边界数据,则意味着您有数据错误。 (注意:这不是闻所未闻的:-)

    如果您没有得到完全包含您的模糊点的多边形,那么您的模糊点可能会或可能不会与至少一个多边形的边界重叠。使用ST_Overlaps 查找这些多边形。

    如果你只得到一个,你就完成了——你的模糊点靠近一个多边形的边界。

    如果你没有得到,你就完成了——你的模糊点远离你所有多边形的边界。

    如果您得到多个命中,则存在歧义——您的模糊点位于多个多边形的边界附近。

    这是很难解决的问题。您可以减小模糊点的大小并重试。这可能只产生一个多边形结果。但是,您可能会欺骗自己,认为您的观点比这样做更准确。

    MySQL 没有几何运算符Area(Intersection(Polygon, FuzzyPoint))。如果是这样,您可以选择与您的模糊点相交面积最大的多边形,这将是一个很好的消歧器。但它仍然和你的观点一样不准确。

    也许您的应用程序应该处理“太靠近 A、B 和 C 的边界而无法确定”的结果类别。

    【讨论】:

    • 带有 PostGIS 扩展的 PostgreSQL 具有比 MySQL 更复杂的处理功能。
    猜你喜欢
    • 2010-10-28
    • 2012-06-14
    • 2021-12-06
    • 2022-08-06
    • 1970-01-01
    • 2016-08-26
    • 2020-05-10
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多