【发布时间】:2016-08-31 14:58:36
【问题描述】:
我有一个表示道路网络的图形数据结构(节点是道路中的点/交叉点,边是道路)。 Node 对象具有与之关联的纬度和经度。
我正在使用 Accord 的 KDTree 类来查找给定 GPS 坐标附近的节点。由于 Accord 似乎没有将 Haversine 距离作为内置距离函数(我错了吗?),我定义了自己的自定义距离函数,并将其作为额外参数传递给 KDTree.FromData() 方法,如下:
var nodes = graph.Nodes;
//Initialize KD-tree with distance function defined as the cartesian approximate distance (in meters)
Func<double[], double[], double> distanceFunc = (x, y) => DistanceFunctions.ApproximateDistance(x,y);
kdTreeOfNodes = KDTree.FromData<Node>(nodes.Select(x => new double[] { x.Value.Latitude, x.Value.Longitude }).ToArray(), nodes.ToArray(), distanceFunc);
请注意,“ApproximateDistance”被定义为单独类中的静态方法,并且是更正确的Haversine 距离的笛卡尔近似值。
尝试执行最后一行时出现异常。在这一行中,我传入要放入 KDTree(即纬度/经度数组)以及相关节点的数据以及我的自定义距离函数。似乎这个 FromData 构造函数实际上(出于某种原因?)调用了我的 ApproximateDistance 函数,其中数组 [1] 和 [1] 作为两个输入参数,显然引发了异常,因为此方法需要两个二维数组。
我不知道为什么这个构造函数会调用我的 ApproximateDistance 函数(尤其是使用这些奇怪的参数),并且似乎无法使用调试器找出...
【问题讨论】:
-
你得到了什么异常?
-
索引超出范围异常(ApproximateDistance函数需要二维数组,传入一维数组)。
标签: c# geo kdtree accord.net