如何最好地在一组纬度/经度坐标上执行道路范围搜索

时间:2009-01-14 23:35:21

标签: geometry gis geospatial latitude-longitude proximity

从中可以找到坐标集的最佳方法 在给定指定宽度的情况下,大约5,00位于点的路径内。   例如,飞机在多个航点之后。

是否有一种很好的方法可以按照与路线相同的顺序对它们进行排序。

计算速度比准确性更重要,因为我正在研究 提出建议清单。

从我看过的情况来看,我认为这不是直截了当的,问题是 有点宽泛,但欢迎任何建议/指针,例如:

  1. 存储纬度/经度或使用球面坐标的最佳方法
  2. 在坐标集中添加其他聚类信息
  3. 可以使用某种变换来简化范围检查
  4. 订购积分的最佳方式是什么
  5. 这是一种比在几个等距离上进行圆形/方形检查更好的方法 沿着小路点。

4 个答案:

答案 0 :(得分:2)

您可以做很多优化:

  • 将您的点拆分为固定大小的图块,这样您就不必检查每个点(首先确定您所在的图块,以便跳过其他图块中的所有点)。

  • 计算到每个点的距离时,通常使用毕达哥拉斯来获得距离。但是如果你只想知道哪个点最接近,你可以省略平方根,这是一个昂贵的操作(参见下面的示例代码)。

  • 使用一些平面投影而不是使用lat / lon,或者通过假设地球是平坦的来近似计算的距离。对于小距离(直到几公里),这通常足够准确,并且比使用WGS84坐标更快更容易。 您可能必须转换所有坐标,但预先计算将在运行时节省大量的cpu周期。

-

 // delphi code that would iterate through a set of points to find the index
 // of the point that is the closest to the provided x/y
 function TMatcher.GetIndexOfClosest(X,Y:Double):Integer;
 var
  i : Integer;
  Closest:Double;
  Distance:Double;
begin
  Closest:= MaxInt;
  Result := -1;
  for i:=0 to high(Points) do
  begin
    // taking the square root is not needed here!
    Distance :=Sqr(X-Points[I].X)+Sqr(Y-Points[I].Y);

    if Distance < Closest then
    begin
      Closest := Distance;
      Result := i;
    end; 
  end;
end;

答案 1 :(得分:1)

我假设你知道如何计算点和路径之间的距离。纬度/经度是简单的(x,y)数据,但是使用小数数据而不仅仅是整数。

对于计算每个点到路径的距离,5,000个数据点确实不是那么糟糕,但是如果你想扩展,某种关系数据结构(如四叉树)将是存储点的最佳选择。这样,您可以立即丢弃远离您路径的点。

答案 2 :(得分:1)

当遇到这类问题时,我会使用PostGIS。将数据导入数据库,然后使用空间SQL函数在轨道上创建缓冲区并选择位于缓冲区内的点。比自己编码要快得多。

PostGIS(和PostgreSQL)易于在Windows / OSX / Linux上安装。他们有很好的文档,Google上的快速会话可以找到大多数问题的答案。

答案 3 :(得分:0)

 Best way to store lat / long, or use spherical coordinates

你想储存什么?您要搜索的路径或点?如果它的路径,那么它基本上是某种类型的列表,因为点是有序的。根据您将如何/如何操纵路径,这将决定您的数据结构。

  

在坐标集中添加其他聚类信息

您想要存储哪些信息?例如,如果您选择链接列表作为数据结构,则可以拥有包含所需信息的类对象的链接列表。

  

可以使用某种变换来简化范围检查

您可以将Lat / Long转换为UTM或任何其他坐标系。两点之间的范围仍然相同。

  

订购积分的最佳方法是什么

如果您要存储路径,则订单很重要 - 如第N-1点 - > N - >; N + 1,依此类推......