Mysql从测试点到多边形的距离

时间:2012-06-19 11:34:05

标签: mysql polygon distance point between

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

所以插入是这样的:

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

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

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

1 个答案:

答案 0 :(得分:0)

MBR系列功能(如MBRContains)不适合您要做的事情;他们只测试边界矩形包含。

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

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

试试这个:从您的观点创建一个ST_Overlaps,这是一个与您的不确定性大小相同的正方形。您可以将此方块视为“模糊”点。 (您也可以使用八边形或其他近似圆形代替矩形,但您的查询速度会变慢。)

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

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

如果没有完全包含模糊点的多边形,则模糊点可能会或可能不会与至少一个多边形的边界重叠。使用Area(Intersection(Polygon, FuzzyPoint))查找这些多边形。

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

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

如果您获得多次点击,则会产生歧义 - 您的模糊点靠近多个多边形的边界。

这是很难理清的。您可以减小模糊点的大小,然后再试一次。这个MIGHT只产生一个多边形结果。但是,你可以欺骗自己认为你的观点比这更准确。

MySQL没有几何运算符{{1}}。如果确实如此,您可以选择与模糊点交叉面积最大的多边形,这将是一个很好的消除歧义。但它仍然会像你的观点一样不准确。

也许你的应用程序应该处理“太靠近A,B和C边界的结果类别”。