Денис Вицко написал:
Цитата |
---|
Получается, речь не про то, как выгрузить изображение карты, а про то, как это изображение вставить в лист A4, сохранив пропорции.Масштаб карты тут не при чем, как и габариты рамки, по которой формируется картинка.Рамкой выбираете интересующую местность на карте, получаете картинку. |
Спасибо, Денис
посмотрю указанные Вами методы.
рамка - это действительно, выбор объектов на карте. рамка задается в метрах.
картинка должна вписаться в лист отчета.
если я буду масштабировать уже готовую картинку - она искажается.
в SaveFrameToEmfEx я указываю делать снимок качеством cVT_SCREEN, и в emf лежит объект bitblt (bitmap), а не векторная карта.
в отчете картинка печатается без autosize. подгонка к размерам листа отключена. т.е. картинка печатается как есть в emf.
факты
имеется рамка с известным размером = 200х200 в метрах (координаты углов в метрах)
ожидается картинка с размером = 1060х1020 в пикселях
задача:сделать снимок карты по заданной рамке в минимальном масштабе (максимальное увеличение).
найти такой масштаб карты, при котором будет создана картинка с заданными размерами чтобы отобразилась карта в пределах рамки.
сейчас рамка фиксирована и равна 200х200м
при масштабе карты 1:1000 получается картинка размером 1060х1020 пикселей
снимок карты получается строго по рамке.все замечательно.
когда размеры рамки не 200х200, я перехожу на карту в масштаб 1:1000 и у меня карта отображается не по рамке.
мне нужно найти такой масштаб карты, при котором карта отобразится в пределах рамки (по максимому), а потом сделать снимок карты. и конечная картинка должна быть размером 1060х1020.
я пока не понял почему размер картинки формируется как 1060х1020. я ведь не указываю размеры картинки при вызове SaveFrameToEmfEx
получается что это размер окна просмотра карты в MapView? но я когда создаю фоновый MapView не задаю ему свойство Align=alClient размеры clientrect тоже не указываю.
// создаем новый объект просмотра карты
if fUseNewMapView
then fMapView:= TMapView.Create( NIL)
else fMapView:= aMapViewMain;
try
if fUseNewMapView then begin
DoLog( 'Используется новый объек MapView.');
// кладем его на подложку главного экрана
fMapView.Parent := aMapViewMain.Parent;
// скрываем объект
fMapView.Visible := FALSE;
// перенаправляем MapView либо на локальную карту, либо на сервер
if ASSIGNED( fMapGisServerNew) then begin
DoLog( 'Используется подключение к гис-серверу через fMapGisServerNew.');
fMapGisServerNew.MapView := fMapView;
// открываем карту, указанную при подключении к гис-серверу
fMapView.MapOpen( fMapGisServerMapAlias, TRUE);
end else begin
if ASSIGNED( fMapGisServer) then begin
DoLog( 'Используется подключение к гис-серверу через fMapGisServer.');
// перенаправляем тек.объект работы с картой
// на указанный гис-сервер
fMapGisServer.MapView := fMapView;
// открываем карту, указанную при подключении к гис-серверу
fMapView.MapOpen( fMapGisServerMapAlias, TRUE);
end else begin
DoLog( 'Используется локальная карта: "%s".', [ aMapViewMain.MapFileName]);
// открываем такуюже карту
fMapView.MapFileName := aMapViewMain.MapFileName;
end;
end;
// подключаемся к карте
// открываем карту в новом контроле
fMapView.MapView := true;
fMapView.ViewType := aMapViewMain.ViewType;//cVT_SCREEN;//cVT_PRINTRST;
fMapView.Repaint;
end;
// выставляем указанный масштаб карты
fMapView.ViewScale := aMapScale; //=1000 - указывается при вызов этого кода // формируем снимок карты
// создаем новый объект рамки в новом контроле отображения карты
fMapFrameRect:= TGTK_MapFrameRect.Create( fMapView);
try
// импортируем описание рамки и создаем объект рамки на временном
// контроле просмотра карты
fMapFrameRect.SetMRect( aMFrameRect);
// делаем снимок карты в рамке
Result := fMapFrameRect.CaptureImage( SELF.FileNameEMF, aMapBorder);
fMapFrameRect.CaptureImage:
function TGTK_MapFrameRect.CaptureImage( const aFileNameEMF: string;
aBorder: boolean = FALSE): Boolean;
Var
parm: TMETAFILEBUILDPARMEX;
NameEmf: string;
begin
{ здесь сохраняется картинка под текущей рамкой }
Result := FALSE;
if ( LENGTH( aFileNameEMF) <= 0)
then Exit;
if NOT Active
then Exit;
FillChar( parm, SizeOf(TMETAFILEBUILDPARMEX), 0);
parm.Frame := MRect; // <--- это вызов fMapFrameRect.SetMRect( aMFrameRect); , т.е. здесь указываются координаты рамки aMFrameRectи все!
parm.Scale := MapView.ViewScale;
parm.VisualType:= cVT_SCREEN;
// VisualType:= cVT_PRINT;
if aBorder
then parm.Border := 1
else parm.Border := 0;
parm.DontClip := 0;
parm.Black := 0;
// parm.Intensity := 70;
// Сохранение в файл Emf
Result := ( MapView.SaveFrameToEmfEx( aFileNameEMF, parm) <> 0);
end;
я не делаю вызовов, которые Вы посоветовали - подстроить масштаб карты под clientrect просмотра карты.
откуда размер картинки 1060х1020?я пока чего-то не понимаю.
просьба вывести меня из этого состояния.