2011-02-01 11 views
2

私はちょうどmappoint APIでコード経由で複数のルーティングを試みました。それはすべてうまく動作しますが、いくつかのルートは計算に非常に長い時間がかかります(18.5秒)。 MapPoint自体を使って同じルートを計算すると、2秒未満しかかかりません。MapPoint.Route.Calculate()はアプリ自体の計算よりもずっと遅いのはなぜですか?

上記の例では、私はドイツのウルムとマンハイムの間のルートを計算しました。

私はポップアップ(ない MapPoint.Route.Calculate()を示した経路を計算するための別のMethodeのがあった覚えているが、私はそれを忘れてしまった。

誰もが計算を高速化する方法のアイデアを持っていますか?

挨拶

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); 
     } 
    } 
} 

Wowa

編集:私はちょうどこの試みた :コードを経由してウェイポイントを追加する MapPoint自体を介してROuteを計算します。これはまた極端に長くかかる。どういうわけか、それはウェイポイントと思われる問題ではなく、Calculate Methodeの

EDITです:MapPointのは、すでにバックグラウンドで経路を計算するように見えます

。 Calculateを呼び出す前に数秒待って、ミリ秒単位で終了します。

+0

私はここからメモリから移動します。MapPoint APIを使用してから数年経ちました)、しかし、私はあなたがAPIの指示を抑制することができると信じています。そうすることで大幅に速くなります。 また、マッポイントアプリケーションインスタンスを再利用し、毎回スピンアップしないようにする必要があります。これは遅いです。 –

+0

@Marc Gravell: 'アプリケーションは一度だけ起動しています。私のストップウォッチはCalculte時間だけです。あなたはDirectionspaneを意味しますか? – Wowa

答えて

1

また、アプリケーションを毎回スプールするだけでなく、COMインターフェイスでオーバーヘッドが増えることに注意してください。それほど多くはありませんが、それは何かを知っていることです。

また、MapPoint 2010の読み込みには、以前のバージョンよりも2〜2時間かかることがあります。

Marcが示しているように、MapPointはルートを表示する必要がないため、地図表示の多くを隠すと約30%のスピードアップが可能です。

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

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

+1

申し訳ありません...私は最速の方法に最短の方法を変更することを忘れているので、それはわずか2秒かかった、今再び16-18秒かかります。今私はすべてのplacecategories、シェイプ、マップフィーチャを削除/非表示にします。 – Wowa

+0

いいえ、トラフィック管理はリアルタイムではありません。私は速度のためにアプリ全体を隠します。それで、地図上のルート線のレンダリングに煩わ​​されることはありません(マップビューの変更は新しいルートにズームするので変更されます)。 – winwaed

関連する問題