На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Вывод пользовательского изображения поверх карты с использованием GDI+

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Вывод пользовательского изображения поверх карты с использованием GDI+
 
Здравствуйте.
Использую компоненты GTK и IDE Delphi.
Возникла необходимость вывода пользовательских изображений поверх карты по определенным координатам.
В событии MapPaintObject пытаюсь вывести картинку поверх карты по определенным географическим координатам. Картинка выводится, однако, в неправильном месте и смещается при изменении масштаба.
Использую следующий код:
Код
procedure TMyForm.MapViewMapPaintObject(Sender: TObject; aCanvas: TCanvas;
  aMapPaintRect: TRect; aLeftPosition, aTopPosition: Integer;
  aMapPaintEventType: TMapPaintEventType);
var Graphics:TGPGraphics;
    Point: TDOUBLEPOINT;
    pic:TGPImage;
    nIStream: IStream;
    rect:TGPRect;
begin
  if not Assigned(znakStream) then Exit;
  Graphics:=TGPGraphics.Create(aCanvas.Handle);
  znakStream.Position:=0;
  nIStream:= TStreamAdapter.Create (znakStream);
  pic:=TGPImage.Create(nIStream);
  //географические координаты для вывода 53.49; 108.06
  Point.X:=DegToRad(53.49);
  Point.Y:=DegToRad(108.06);
  MapView.ConvertMetric(Point.X,Point.Y,PP_GEO,PP_PICTURE);
  rect.X:=Round(Point.X) div 2;
  rect.y:=round(Point.Y) div 2;
  Rect.Width:=60;
  Rect.Height:=60;
  Graphics.DrawImage(pic,rect);
end;
Проблема с координатами вывода, которая усугубляется при масштабировании. Как правильно сделать отрисовку по определенным географическим координатам с учетом масштабирования?
 
Предположу, что проблема тут:
Цитата
Nick0990 написал:
 MapView.ConvertMetric(Point.X,Point.Y,PP_GEO,PP_PICTURE);
 rect.X:=Round(Point.X) div 2;
 rect.y:=round(Point.Y) div 2;

Ошибок, видимо, сразу три.

1.
Обратите внимание, что канва, которую Вы получаете в обработчике события TMapView.OnMapPaintObject (см. описание), имеет начало отсчета уже с учетом смещения карты в окне.
MapView.ConvertMetric при переводе в пиксели вернет значения относительно левого верхнего угла карты (а не окна отображения карты).

2.
Следует иметь в виду, что MapView.ConvertMetric(Point.X, Point.Y, PP_GEO, PP_PICTURE) выполняет перевод из геодезических координат СК карты, что не всегда WGS84, например. Если Вы задаете координаты WGS84, надо использовать PP_GEOWGS84. Для того, чтобы передать координаты в остальных СК и корректно их пересчитывать необходимо знать, что это за СК, установить для карты пользовательскую СК в соответствии с СК исходных координат и тогда можно будет пересчитывать их в пиксели или метры, используя PP_GEO. Иначе будет погрешность - в разных проекциях разная, иногда весьма сильная - особенно к полюсам.

3.
При таком верхнем углу отрисовываемой области где GDI должен нарисовать знак?
Цитата
Nick0990 написал:
 rect.X:=Round(Point.X) div 2;
 rect.y:=round(Point.Y) div 2;
 
Денис Вицко, спасибо за ответ.
Перенес отрисовку в OnMapPaint, и изменил подсчет координат rect. теперь все отрисовывается корректно.
Изменено: Nick0990 - 26.08.2022 12:37:20
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности