Geometry 如何最好地在一组纬度/经度坐标上执行道路范围搜索
从中找到坐标集的最佳方法是什么 大约5,00,位于给定宽度的点路径内。 沿着几个航路点飞行的飞机 是否有一种好方法可以按照与路线相同的顺序对它们进行排序 计算速度比准确度更重要,因为我在看 提出一系列建议 从我所看到的来看,我认为这并不简单,问题是 有点宽泛,但欢迎提出任何建议/建议,例如:Geometry 如何最好地在一组纬度/经度坐标上执行道路范围搜索,geometry,gis,geospatial,latitude-longitude,proximity,Geometry,Gis,Geospatial,Latitude Longitude,Proximity,从中找到坐标集的最佳方法是什么 大约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;