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自体を介してルートを計算します。これにも非常に時間がかかります。どういうわけか、メソッドではなくウェイポイントが問題のようCalculateです

編集:

MapPoint は既にバックグラウンドでルートを計算しているようです。Calculate を呼び出す前に数秒待つと、ミリ秒以内に終了します。

4

1 に答える 1

1

毎回アプリケーションをスプールするだけでなく、COM インターフェイスがオーバーヘッドを追加することに注意してください。多くはありませんが、注意が必要です。

また、MapPoint 2010 の読み込みには 1 ~ 2 秒かかることに気付きました。これは、以前のバージョンよりも長くなっています。

Marc が指摘するように、MapPoint はルートを表示する必要がないため、マップ表示の大部分を非表示にすると、約 30% の速度向上が得られます。

最後に、ルートの計算は、ウェイポイントの場所と道路の密度/複雑さによって大きく異なります。1 つのルートの計算には 0.5 秒かかる場合がありますが、他の同様の長さのルートでは 2 ~ 3 秒かかります。

最後に、最後に :-) 、MapPoint の多くの側面は、API の使用ではなく、人間のユーザー向けに最適化されています。たとえば、ガベージ コレクションは、その最適化においてバッチ API 指向ではなく、間違いなく人間指向です。(ガベージ コレクターがこの種の作業に十分な頻度で呼び出されないため、MapPoint は大量のバッチ API を使用すると速度が低下します)

于 2011-02-01T16:50:11.023 に答える