2

我刚刚尝试使用 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(),但我忘记了。

有人知道如何加快计算速度吗?

问候哇哇

编辑: 我刚刚尝试过:通过代码添加航点,但通过 MapPoint 本身计算路线。这也需要很长时间。不知何故,Waypoint 似乎是问题所在,而不是Calculate方法

编辑:

看起来 MapPoint 已经在后台计算了路线。如果我在调用计算之前等待几秒钟,它会在几毫秒内完成。

4

1 回答 1

1

除了每次都在后台处理应用程序之外,请记住 COM 接口会增加一些开销。不多,但这是需要注意的。

我还注意到 MapPoint 2010 需要一两秒才能加载 - 比早期版本更长。

正如 Marc 所指出的,隐藏大部分地图显示可导致大约 30% 的加速,因为 MapPoint 不必显示路线。

最后,路线计算因航点位置和道路密度/复杂性而有很大差异。计算一条路线可能需要 0.5 秒,但其他地方类似长度的路线需要 2-3 秒。

最后,最后 :-),MapPoint 的许多方面都针对人类用户而不是 API 使用进行了优化。例如,垃圾收集绝对是面向人的,而不是面向批处理 API 的优化。(MapPoint 会因大量批处理 API 的使用而减慢速度,因为垃圾收集器对于此类工作的调用频率不够高)

于 2011-02-01T16:50:11.023 回答