TMapScreenHierarchy Properties Methods Events |
Unit MapScr
Компонент позволяет ускорить и улучшить визуальные качества (исключение моргания карты) отображения подвижных (мобильных) и стационарных пользовательских объектов на фоне карты. Улучшение отображения пользовательских объектов осуществляется за счет оптимизации перерисовки фоновой карты. В общем случае изображение фоновой карты выводится в окно из внутреннего буфера изображения карты, а не методом отрисовки карты из файла данных. Чем больше количество пользовательских объектов одновременно отображаются, тем выше коэффициент оптимизации по скорости и качеству отображения по сравнению со стандартным компонентом отображения карты – TMapView.
Оптимизация перерисовки карты осуществляется за счет использования двух дополнительных буферов памяти (за все надо платить), а именно: буфер изображения фоновой карты (далее по тексту – буфер карты) и буфер пользовательских объектов вместе с изображением фоновой карты (далее по тексту – буфер образа окна).
Максимальный размер окна, в котором отображаются мобильные объекты: ширина – 4096 пикселей, высота – 4096 пискселей. Размер каждого буфера равен ширине окна отображения умноженной на высоту окна отображения и умноженной на 4.
Отрисовка (построение изображения) карты для вывода в окно осуществляется по следующему алгоритму:
Для перерисовки пользовательских объектов достаточно выполнить следующий алгоритм:
Пример кода программы для отрисовки пользовательских объектов: const ObjSize = 25; // половина размера кортинки подвижного объекта var ArrMetric : array [1 .. 1000, 1 .. 2] of double; // массив координат перемещения мобильного объекта в метрах ... // Отрисовать мобильный объект по номеру точки (aPointNumber) procedure frmMain.PaintObjectByPointNumber(aPointNumber: integer); var aCrossLeft, aCrossTop : integer; dx, dy : double; begin // очистим пользовательские объекты в буфере экрана MapScreen.ClearObjects(nil);
// определим новое местоположение объекта в окне в пикселах по координатам из массива ArrMetric dx := ArrMetric[aPointNumber, 1]; dy := ArrMetric[aPointNumber, 2]; MapScreen.ConvertMetric(dX, dY, PP_PLANE, PP_PICTURE); aCrossLeft := trunc(dx - MapScreen.MapLeft); aCrossTop := trunc(dy - MapScreen.MapTop);
// обновим координат мобильного объекта MapPoint.PlaceInp := PP_PLANE; MapPoint.SetPoint(ArrMetric[aPointNumber, 1], ArrMetric[aPointNumber, 2]); mobilObj.Metric.Update(0, 1, MapPoint.Point); // выполним отрисовку пользовательских объектов поверх изображения фоновой карты в буфере образа окна mobilObj.PaintObjectUp;
// определим область перерисовки окна CrossRect := Rect(aCrossLeft - ObjSize, acrossTop - ObjSize, acrossLeft + ObjSize, acrossTop + ObjSize);
// вызовем метод перерисовки InvalidateRect(MapScreen.Handle, @CrossRect, false);
// выведем изображение карты и мобильного объекта из буфера в окно MapScreen.RepaintWindow; end; ...
Для своей работы компонент использует библиотеку gisscrn.dll, которая загружается динамически. Пример использования компонента можно посмотреть в \examp\delphi5\trafic2\traffic.dpr.
В общем случае, для использования компонента, необходимо при возниконовении события OnMapScreenUpdate выполнить отрисовку пользовательских объектов. |