2012-06-19 129 views
1

我已经使用几何类型字段将一些地图区域存储到表中。Mysql从测试点到多边形的距离

因此,刀片是这样的:

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

但有时候,用户位置并不完美,所以我认为它更好地了解哪个区域最接近用户位置。

这是我没有任何想法的部分...我发现一些查询来获得两点之间的距离,但不是一个点和多边形。

回答

0

MBR系列函数(如MBRContains)不适合您正在尝试做的事情;他们只测试包围矩形。

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

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

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

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

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

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

如果你只有一个,你就完成了 - 你的模糊点接近一个多边形的边界。

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

如果您获得多于一个命中,则会产生歧义 - 您的模糊点位于多个多边形的边界附近。

这是难以理清的情况。您可以减小模糊点的大小并重试。这可能只产生一个多边形结果。但是,你可以欺骗自己,认为你的观点比这样做更准确。

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

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

+0

感谢您的信息,我会牢记在心。 – Biwu

+0

带PostGIS扩展的PostgreSQL比MySQL有更复杂的这类处理功能。 –