TMapScreen

 

Hierarchy        Properties        Methods        Events

Previous Top Next

 

Unit

MapScr

 

Компонент позволяет ускорить и улучшить визуальные качества (исключение моргания карты) отображения подвижных (мобильных) и стационарных пользовательских объектов на фоне карты. Улучшение отображения пользовательских объектов осуществляется за счет оптимизации перерисовки фоновой карты. В общем случае изображение фоновой карты выводится в окно из внутреннего буфера изображения карты, а не методом отрисовки карты из файла данных.  Чем больше количество пользовательских объектов одновременно отображаются, тем выше коэффициент оптимизации по скорости и качеству отображения по сравнению со стандартным компонентом отображения карты – TMapView.

 

Оптимизация перерисовки карты осуществляется за счет использования двух дополнительных буферов памяти (за все надо платить), а именно: буфер изображения фоновой карты (далее по тексту – буфер карты) и буфер пользовательских объектов вместе с изображением фоновой карты (далее по тексту – буфер образа окна).

 

Максимальный размер окна, в котором отображаются мобильные объекты: ширина – 4096 пикселей, высота – 4096 пискселей. Размер каждого буфера равен ширине окна отображения умноженной на высоту окна отображения и умноженной на  4.

 

Отрисовка (построение изображения) карты для вывода в окно осуществляется по следующему алгоритму:

1.отрисовка изображения фоновой карты в буфер карты и в буфер образа окна (вызывает события отрисовки пользовательских объектов - MapScreen.ScreenRepaint);
2.отрисовка пользовательских объектов (как средствами mapapi, так и средсвами winapi) поверх изображения фоновой карты в буфере образа окна в событии MapScreen. MapScreenUpdate;
3.вывод изображения из буфера образа окна собственно в оконный элемент отображения карты и пользовательских объектов -MapScreen.RepaintWindow;

 

Для перерисовки пользовательских объектов достаточно выполнить следующий алгоритм:

1.стереть изображение пользовательских объектов в буфере образа окна (реально копируется изображение карты из буфера карты) - MapScreen.ClearObjects. Инициировать отрисовку пользовательских объектов поверх изображения фоновой карты в буфере образа окна необходимо самостоятельно. Например, можно вызвать метод перерисовки окна InvalidateRect;
2.отрисовать пользовательские объекты поверх изображения фоновой карты в буфере образа окна;
3.вывести изображения из буфера образа окна собственно в оконный элемент отображения карты и пользовательских объектов - MapScreen.RepaintWindow;

 

Пример кода программы для отрисовки пользовательских объектов:

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 выполнить отрисовку пользовательских объектов.