Почему MapPoint.Route.Calculate () намного медленнее, чем вычисления в самом приложении? - PullRequest
2 голосов
/ 01 февраля 2011

Я только что попробовал множественную маршрутизацию через код с 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(), но я забыл его.

Кто-нибудь знает, как ускорить расчет?

Greets Wowa

EDIT: Я только что попробовал это: Добавление путевых точек с помощью кода, но вычисление ROute с помощью самой MapPoint. это также занимает очень много времени. Почему-то кажется, что проблема заключается в путевой точке, а не в Calculate методе

EDIT:

Похоже, MapPoint уже рассчитывает маршрут в фоновом режиме. Если я подожду несколько секунд, прежде чем позвонить Рассчитать, он завершен в течение миллисекунд.

1 Ответ

1 голос
/ 01 февраля 2011

Помимо подкачки приложения каждый раз, помните, что интерфейс COM добавляет некоторые накладные расходы.Не много, но это то, что нужно знать.

Также я заметил, что MapPoint 2010 загружается на секунду или две - дольше, чем в более ранних версиях.

Как указывает Марк, скрываетсябольшая часть отображения карты может привести к ускорению примерно на 30%, поскольку MapPoint не нужно отображать маршрут.

Наконец, расчеты маршрута сильно различаются в зависимости от местоположения путевой точки и плотности / сложности дороги.Один маршрут может потребовать 0,5 с для вычисления, но маршрут такой же длины в другом месте занимает 2-3 с.

Наконец, наконец :-), многие аспекты MapPoint оптимизированы для пользователей, а не для использования API.например, сборка мусора определенно ориентирована на человека, а не на пакетный API, ориентированный на ее оптимизацию.(MapPoint будет замедляться при большом количестве пакетного API, поскольку сборщик мусора вызывается недостаточно часто для этого типа работы)

...