几何查询中的MySQL

几何查询中的MySQL,mysql,Mysql,为什么这个查询返回3个国家,而它应该返回一个。 它返回: 1.法国 2.德国(正确的一个) 3.美国 我的国家边界数据是否有缺陷,或者这些几何函数是否存在一些技巧 MySQL还不能检查多边形中的一个点。它将检查您的点是否在([minX,maxX],[minY,maxY])范围内。另外,我在MySQL文档中没有看到 注 目前,MySQL没有按照规范实现这些功能。那些被实现的函数返回与相应的基于MBR的函数相同的结果。这包括以下列表中除Distance()和Related()之外的函数 这些功能可以

为什么这个查询返回3个国家,而它应该返回一个。 它返回: 1.法国 2.德国(正确的一个) 3.美国


我的国家边界数据是否有缺陷,或者这些几何函数是否存在一些技巧

MySQL还不能检查多边形中的一个点。它将检查您的点是否在([minX,maxX],[minY,maxY])范围内。另外,我在MySQL文档中没有看到

目前,MySQL没有按照规范实现这些功能。那些被实现的函数返回与相应的基于MBR的函数相同的结果。这包括以下列表中除Distance()和Related()之外的函数

这些功能可以在未来的版本中实现,并完全支持空间分析,而不仅仅是基于MBR的支持

我使用了一种算法,如果直线不长,它在极地以外的区域可以非常精确。否则,您将需要求解球面三角形

简单的实现如下所示:

SELECT `NAME` FROM world_boundaries 
WHERE Within(GeomFromText('POINT(8.5929098 50.0286713)'), ogc_geom);
选择多边形内点的查询:

create table point (x int, y int...) /* int values (int(lat * 10^6)) for better performance */
create table poly (x1 int, y1 int, x2 int, y2 int...) /* temporary table for 1 poly only */
从点、多边形中选择点\u id
式中((y=y1)或(y=y2))和((x=x1)或(x=x2))
按点分组\u id
具有总和(x1*(y2-y1)*符号(y2-y1)

在奔腾2.5Ghz上,在0.06秒内,与40条线的多边形相比,可计算20000点。:)

我添加了用于解决类似问题的方法。希望这有帮助。有没有任何php算法可以使用几何mysql数据并检查一个点是否在给定的多段线内?您可以扩展我为多个多边形提供的算法。将这项工作交给MySQL比用PHP计算要好,但无论如何,您可以看到我链接的文章,并用PHP重新编写这段代码。
select point_id from point, poly
where ((y<y2 and y>=y1) or (y<y1 and y>=y2)) and ((x<x2 and x>=x1) or (x<x1 and x>=x2))
group by point_id
having sum(x1*(y2-y1)*sign(y2-y1) < x*(y2-y1)*sign(y2-y1) - (y-y1)*(x2-x1)) % 2