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

Geometry 如何最好地在一组纬度/经度坐标上执行道路范围搜索,geometry,gis,geospatial,latitude-longitude,proximity,Geometry,Gis,Geospatial,Latitude Longitude,Proximity,从中找到坐标集的最佳方法是什么 大约5,00,位于给定宽度的点路径内。 沿着几个航路点飞行的飞机 是否有一种好方法可以按照与路线相同的顺序对它们进行排序 计算速度比准确度更重要,因为我在看 提出一系列建议 从我所看到的来看,我认为这并不简单,问题是 有点宽泛,但欢迎提出任何建议/建议,例如: 存储lat/long或使用球坐标的最佳方法 在坐标集中有额外的聚类信息 是否可以使用某种变换来简化范围检查 点积分的最佳方式是什么 这是一种比在几个等距点上进行圆形/方形检查更好的方法吗 沿着路径的点。我假

从中找到坐标集的最佳方法是什么 大约5,00,位于给定宽度的点路径内。 沿着几个航路点飞行的飞机

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

计算速度比准确度更重要,因为我在看 提出一系列建议

从我所看到的来看,我认为这并不简单,问题是 有点宽泛,但欢迎提出任何建议/建议,例如:

  • 存储lat/long或使用球坐标的最佳方法
  • 在坐标集中有额外的聚类信息
  • 是否可以使用某种变换来简化范围检查
  • 点积分的最佳方式是什么
  • 这是一种比在几个等距点上进行圆形/方形检查更好的方法吗
    沿着路径的点。

    我假设您知道如何计算点与路径之间的距离。纬度/经度是简单的(x,y)数据,尽管是分数数据,而不仅仅是整数

    计算每个点到路径的距离时,5000个数据点实际上并不是那么糟糕,但是如果您希望缩放,某种关系数据结构(如四叉树)将是存储这些点的最佳选择。这样,您可以立即丢弃距离路径很远的点

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

    在坐标集中有额外的聚类信息

    你想储存什么信息?例如,如果您选择了一个链表作为数据结构,则可以有一个包含所需信息的类对象的链表

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

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

    点积分的最佳方式是什么


    如果要存储路径,则顺序很重要-如点N-1->N->N+1,等等…

    可以进行许多优化:

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

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

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

    -

    //迭代一组点以查找索引的delphi代码
    //最接近所提供x/y的点的
    函数TMatcher.GetIndexOfClosest(X,Y:Double):整数;
    变量
    i:整数;
    最接近:双倍;
    距离:双倍;
    开始
    最近:=MaxInt;
    结果:=-1;
    对于i:=0到高(点)do
    开始
    //这里不需要求平方根!
    距离:=Sqr(X点[I].X)+Sqr(Y点[I].Y);
    如果距离<最近,则
    开始
    最近:=距离;
    结果:=i;
    结束;
    结束;
    结束;
    
    当遇到此类问题时,我会使用。将数据导入数据库,然后使用spatial SQL函数在轨迹上创建缓冲区,并选择缓冲区内的点。比自己编写代码快得多

    PostGIS(和)易于在Windows/OSX/Linux上安装。他们有很好的文档,并且在谷歌上进行了一次快速的讨论,找到了大多数问题的答案

     Best way to store lat / long, or use spherical coordinates
    
     // 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;