我正在尝试提出一种计算总行程的算法,但是我为一家运输公司工作的车辆,他们在全国范围内分布了5个仓库,目前正在开发报告模块,计算车辆的总行程。 这就构成了一次完整的旅程
车辆的运动存储在数据库中,该数据库存储有其所需的纬度和纬度,这里是我提出的算法
软件仓库的经度和纬度存储在数据库中。 下面是我试图解决它的代码,下面的代码是用C#实现的
Telerik.Windows.Controls.Map.Location currentLocation;
Telerik.Windows.Controls.Map.Location previousLocation = new Telerik.Windows.Controls.Map.Location() ;
long loopCounter = 0;
decimal distance = 0;
int tripcounter = 0;
bool isInTrip = false;
while (dr.Read())
{
// get current location
currentLocation = new Telerik.Windows.Controls.Map.Location()
{
Latitude = Convert.ToDouble(dr[0]),
Longitude = Convert.ToDouble(dr[1])
};
//asign the current position to previous postion on first iteration
if (loopCounter == 0)
{
previousLocation = currentLocation;
loopCounter++;
continue;
}
//check whether the current and previous position fall within any of the starting/loading zones
Tuple<bool, bool> posVals = VehicleIsInStartingPoint(currentLocation, previousLocation);
//check if the previous postion was starting zone
if (posVals.Item2)
{
//check if the current postion is not a starting zone then this qualifies as trip
if (!posVals.Item1)
{
isInTrip = true;
}
}
if (isInTrip)
{
tripcounter++;
}
isInTrip = false;
previousLocation = currentLocation;
}
tripcounter = tripcounter / 2;
return tripcounter;
上面的代码在循环内执行它获取当前记录的位置,该位置从数据库创建一个loaction对象,检查它是否第一次进入循环。然后将位置对象存储到2个参考对象,一个是当前位置(表示当前的迭代记录),另一个是previousLocation(表示前一个记录迭代)。 VehicleIsInStartingPoint 方法接受两个参数,它们都是类型loaction,第一个表示当前位置,第二个表示先前位置,方法循环通过库的gps坐标,并检查它是否落在gps坐标的半径范围内仓库。如果落在半径范围内,它对于元组的item1(表示当前位置的item1)记录为true,则同样适用于之前的位置 布尔变量isInTrip用于确定是否应增加行程计数器。 为此,它首先检查先前的位置是否在仓库的半径范围内,如果测试通过它检查当前位置是否不在仓库的范围内,如果是这样,它将变量isInTrip设置为true,那么我们检查变量isInTrip是否为true,以便我们可以增加tripcounter变量。 然后,在循环结束时,我将tripcounter变量除以2,因为行程从仓库到装载和卸载区域并返回到仓库,但是当在工作环境中测试模块时,我的模块与实际数字相比增加了一个行程。 / p>
可以帮助我改进算法或在我的代码中使它更准确吗
提前致谢