0

所以我已经在这个问题上工作了几天。目的是根据用户当前位置 (A Lat/Lon) 生成数据的半径搜索。我想如何通过计算 B Lat/Lon 和 B Lat/Lon(我可以做到)为搜索添加一些智能,然后从半径搜索中删除该三角形内的任何匹配 GPS 点....

我设法达到的最接近的是将B匹配到C,但不匹配到A的点...

这是部分数学和部分 MySQL,因为这是我想用来实现它的最终方法。

有什么想法吗 ?

人族

主图

最终结果

从别处

问:如果要返回结果的唯一半径是 A,为什么 B 和 C 周围有半径?A这只是为了显示每个点的纬度...我添加了一个附加图表来显示如何使用它。

问:B 和 C 实际代表什么(A 是当前位置) A:B 和 C 将是根据用户当前位置、方位和速度计算出的位置(通过数学)。

“测试一个点是否在三角形中很容易——想想三角形边向量和从三角形角到测试点的向量的叉积。内部点在所有三个边内。”

链接 - 三角形内部计算 - http://www.mathworks.com/matlabcentral/fileexchange/22690-inside-triangle/content/inside_triangle.m

4

1 回答 1

2

这个过程有几个步骤。

找到圆的边界框内的点。如果在经度维度上稍微草率,这可以很好地有效地工作,

   SELECT *
     FROM points p
    WHERE p.lat >= alat-radius
      AND p.lat <= alat+radius
      AND p.lon >= alon-radius
      AND p.lon <= alon+radius

接下来,排除三角形内的点。您需要编写一个存储函数来执行三角形包含来处理此问题。

   SELECT *
     FROM points p
    WHERE p.lat >= alat-radius
      AND p.lat <= alat+radius
      AND p.lon >= alon-radius
      AND p.lon <= alon+radius
      AND NOT Inside_Triangle(p.lat, p.lon, alat, alon, blat, blon, clat, clon)

您可以在此处查找进行三角形包含的算法。 如何确定二维点是否在多边形内?

最后,排除半径外的点。

   SELECT *
     FROM points p
    WHERE p.lat >= alat-radius
      AND p.lat <= alat+radius
      AND p.lon >= alon-radius
      AND p.lon <= alon+radius
      AND NOT Inside_Triangle(p.lat, p.lon, alat, alon, blat, blon, clat, clon)
      AND Haversine(p.lat,p.lon,alat,alon) > radius

这是 Haversine 函数的示例。请注意,您必须仔细整理半径单位。 为什么这个 MySQL 存储函数给出的结果与在查询中进行计算不同?

你有它。如何获得包含所需点的结果集。

于 2012-08-20T22:27:04.163 回答