我有一个图形数据结构,代表着一张路网(节点是道路上的点/交叉口,边是道路)。节点对象与纬度和经度相关联。
我正在使用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函数(特别是使用这些奇怪的参数),并且似乎无法使用调试器找出原因...