我刚尝试使用mappoint api通过代码进行多次路由。它工作得很好,但是一些路线需要极长才能计算(18.5秒)。如果我通过MapPoint本身计算相同的路线,则只需不到2秒。
在上面的例子中,我计算了德国乌尔姆和曼海姆之间的路线。
class CalculateTime : IDisposable
{
MapPoint.Application app;
MapPoint.Map map;
MapPoint.Route route;
public CalculateTime()
{
app = (MapPoint.Application)Activator.CreateInstance(Type.GetTypeFromProgID("mappoint.application"));
map = app.ActiveMap;
route = map.ActiveRoute;
}
public class Place
{
public string City { get; set; }
public string Street { get; set; }
public string Postal { get; set; }
public Place(string City = "", string Street = "", string Postal = "")
{
this.City = City;
this.Street = Street;
this.Postal = Postal;
}
}
public class Place
{
public string City { get; set; }
public string Street { get; set; }
public string Postal { get; set; }
public Place(string City = "", string Street = "", string Postal = "")
{
this.City = City;
this.Street = Street;
this.Postal = Postal;
}
}
public TimeSpan Calculate(Place From, Place To)
{
Stopwatch sw = new Stopwatch();
MapPoint.FindResults frFromCollection = map.FindAddressResults(City: From.City, Street: From.Street, PostalCode: From.Postal);
MapPoint.FindResults frToCollection = map.FindAddressResults(City: To.City, Street: To.Street, PostalCode: To.Postal);
object frFrom = frFromCollection[1];
object frTo = frToCollection[1];
route.Waypoints.Add(frFrom);
route.Waypoints.Add(frTo);
sw.Start();
route.Calculate();
TimeSpan time = new TimeSpan(0, (int)(route.DrivingTime * 24 * 60), 0);
route.Clear();
sw.Stop();
Marshal.ReleaseComObject(frFromCollection);
Marshal.ReleaseComObject(frToCollection);
Marshal.ReleaseComObject(frFrom);
Marshal.ReleaseComObject(frTo);
MessageBox.Show(sw.Elapsed.Seconds + "." + sw.ElapsedMilliseconds);
return time;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~CalculateTime()
{
Dispose(false);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
map.Saved = true;
Marshal.ReleaseComObject(route);
Marshal.ReleaseComObject(map);
app.Quit();
Marshal.ReleaseComObject(app);
}
}
}
我记得有另一种方法来计算显示弹出窗口的路线(不是MapPoint.Route.Calculate()
,但我忘记了。
有人知道如何加快计算速度吗?
电贺 WOWA
修改
我刚试过这个:
通过代码添加航点,但通过MapPoint本身计算ROute。这也需要极长的时间。不知怎的,似乎Waypoint是问题,而不是Calculate
方法
修改
看起来MapPoint已经在后台计算了路线。 如果我在调用计算完成在毫秒内完成之前等待几个secondes。
答案 0 :(得分:1)
每次调整应用程序时,请记住COM接口会增加一些开销。不多,但需要注意的事项。
此外,我注意到MapPoint 2010需要一两秒才能加载 - 比早期版本更长。
正如Marc所说,隐藏大部分地图显示可以带来大约30%的加速,因为MapPoint不必显示路线。
最后,路线计算根据航路点位置和道路密度/复杂程度而有很大差异。一条路线可能需要0.5秒来计算,但其他地方的类似长度路线需要2-3秒。
最后,最后:-),MapPoint的许多方面都针对人类用户而非API使用进行了优化。例如,垃圾收集肯定是以人为本的,而不是在其优化中使用批处理API。 (由于垃圾收集器的调用经常不足以进行此类工作,因此MapPoint将因大量使用批处理API而变慢)