Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Масштаб карты

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
Радченко Андрей



Зарегистрирован: 01.09.2005
Сообщения: 7
Откуда: г.Курган

СообщениеДобавлено: Чт 01 Сен 2005 09:26    Заголовок сообщения: Масштаб карты Ответить с цитатой

ГИС ИнГЕО 4.3.
Делаю IngeoApp.MainWindow.MapWindow.Navigator.FitWorldBounds(xmin,ymin,xmax,ymax,infitAlwaysScale);
Как узнать масштаб после этой операции?
Какое свойство какого объекта за него отвечает?
У IIngeoProjection есть свойство ZoomScale - средний масштаб проекции, но он у меня всегда 0. Где же спрятан масштаб, подскажите, пожалуйста, что-то не могу найти.
И еще вопросик вдогонку. Можно или нельзя у объекта поменять слой?
Я так понял, что нельзя, но, может быть, все-таки можно? Smile
Буду очень благодарен за информацию.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
andreichernov



Зарегистрирован: 14.02.2005
Сообщения: 209
Откуда: Самара

СообщениеДобавлено: Чт 01 Сен 2005 10:51    Заголовок сообщения: смена слоя у объекта Ответить с цитатой

По-моему Сергей Попов уже задавал этот вопрос - отвечаю обоим.
1) сохранить данные по объекту (id,графику, семантику и линки) во внутренних массивах.
2) удалить исходный объект,
3) создать новый объект
aMapObjects.AddObjectWithID(aDestLayerID, aObjectID),
4) добавить туда все сохраненные данные из внутренних структур.
При этом надо иметь таблицу соответствия между стилями и семантическими полями. То есть хоршо будет работать,
если структуры исходного и приемного слоев похожи.
Но реально ЭТО НЕ ЛОЖИТСЯ ПОД КОНЦЕПЦИЮ Ингео.
В частности, если в дальнейшем копировать данные через обменный формат, будут ошибки типа "Невозможно выполнить импорт , исходный и импортируемый объект находятся в разных слоях".
Настоятельно рекомендую идентифицировать объект по реестровому номеру, записанному в сем поле, например типа GUID.
Эти реестровые номера записывать скриптами, откликаясь на сообщение "после создания объекта", тем более что в новом Ингео с нашей подачи сделана возможность автозапуска скриптов и права доступа на них.
Все внешние ссылки (Forein Key) делать на этот реестровый номер.
Тогда при копировании между слоями смена ID - нормально, ничего не потеряешь.
В частности, такая концепция внешних единых идентификаторов, позволяет нам принимать обновления адресного плана, сделанные в Мапинфо (там реестровые номера формируются скриптом Мапбейсика) с сохранением всего оформления Ингео (дополнительные формы подписей и пр.).
С уважением,
Андрей Чернов,
ЗАО "Самара-Информспутник".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Азаматов Азамат Хадисович



Зарегистрирован: 17.02.2005
Сообщения: 100
Откуда: г. Учалы, Респ. Башкортостан

СообщениеДобавлено: Пт 02 Сен 2005 09:04    Заголовок сообщения: Re: Масштаб карты Ответить с цитатой

Радченко Андрей писал(а):
ГИС ИнГЕО 4.3.
У IIngeoProjection есть свойство ZoomScale - средний масштаб проекции, но он у меня всегда 0. Где же спрятан масштаб, подскажите, пожалуйста, что-то не могу найти.

Масштаб обычно от 0 до 1 т.е. если на экране
масштаб 1:5000, то в программных интерфейсах отображается значение
1/5000=0,0002
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Радченко Андрей



Зарегистрирован: 01.09.2005
Сообщения: 7
Откуда: г.Курган

СообщениеДобавлено: Пт 02 Сен 2005 12:29    Заголовок сообщения: Re: Масштаб карты Ответить с цитатой

Азаматов Азамат Хадисович писал(а):
Масштаб обычно от 0 до 1 т.е. если на экране масштаб 1:5000, то в программных интерфейсах отображается значение 1/5000=0,0002

А я его замечательно округлял, поэтому считал, что он всегда 0. Smile
Спасибо, разобрался с масштабами.
И со слоями объекта тоже вроде бы все понятно.
Всем спасибо за ответы. Cool
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Радченко Андрей



Зарегистрирован: 01.09.2005
Сообщения: 7
Откуда: г.Курган

СообщениеДобавлено: Пн 12 Сен 2005 14:20    Заголовок сообщения: Ответить с цитатой

А вот еще возник вопрос.
Проект в Дельфи, компонента IngeoMapX.
Нужно нарисовать в окне карты что-то свое (объект, не хранящийся в базе ИнГЕО).
Хотя бы тупо какой-нибудь прямоугольник поверх карты.
Как это сделать? Shocked
Вроде бы у IIngeoPaintSurface есть свойства Pen и Brush, а методов для рисования нету (или я их не нашел). В аддоне можно было бы использовать M2MapView - DrawPolyline, DrawPoligon. А как это сделать во внешнем приложении? Буду очень рад подсказкам.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Азаматов Азамат Хадисович



Зарегистрирован: 17.02.2005
Сообщения: 100
Откуда: г. Учалы, Респ. Башкортостан

СообщениеДобавлено: Вт 13 Сен 2005 09:48    Заголовок сообщения: Ответить с цитатой

Радченко Андрей писал(а):
А вот еще возник вопрос.
Проект в Дельфи, компонента IngeoMapX.
Нужно нарисовать в окне карты что-то свое (объект, не хранящийся в базе ИнГЕО).
Хотя бы тупо какой-нибудь прямоугольник поверх карты.
Как это сделать? Shocked
Вроде бы у IIngeoPaintSurface есть свойства Pen и Brush, а методов для рисования нету (или я их не нашел). В аддоне можно было бы использовать M2MapView - DrawPolyline, DrawPoligon. А как это сделать во внешнем приложении? Буду очень рад подсказкам.

В IIngeoPaintSurface есть свойство DC. Передаешь его в стандартный TCanvas (свойство Handle) и рисуешь. Для преобразования координат есть методы в IIngeoPaintSurface.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Радченко Андрей



Зарегистрирован: 01.09.2005
Сообщения: 7
Откуда: г.Курган

СообщениеДобавлено: Вт 13 Сен 2005 12:30    Заголовок сообщения: Ответить с цитатой

Азаматов Азамат Хадисович писал(а):

В IIngeoPaintSurface есть свойство DC. Передаешь его в стандартный TCanvas (свойство Handle) и рисуешь. Для преобразования координат есть методы в IIngeoPaintSurface.

Спасибо, все отлично работает! Exclamation Cool
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 13 Сен 2005 18:23    Заголовок сообщения: Ответить с цитатой

Совершенно необязательно использовать элемент GDI Device Context (DC).
Есть много способов рисовать на Surface, минуя прямое обращение к DC.
Способ первый.
Объект IngeoPaintSurface содержит метод PaintContour.
Пример использования на Delphi:
Код:

procedure PaintRect(
  Ingeo: IIngeoApplication;
  Surface: IIngeoPaintSurface;
  WorldX1, WorldY1, WorldX2, WorldY2: Double);
var
  Contour: IIngeoContour;
  Part: IIngeoContourPart;
begin
  Contour := Ingeo.CreateObject(inocContour, Null);
  Part := Contour.Insert(-1);
  Part.Closed := True;
  Part.Insert(-1, WorldX1, WorldY1, 0);
  Part.Insert(-1, WorldX1, WorldY2, 0);
  Part.Insert(-1, WorldX2, WorldY2, 0);
  Part.Insert(-1, WorldX2, WorldY1, 0);
  ... тут настраиваем Surface.Pen
  ... тут настраиваем Surface.Brush
  Surface.PaintContour(Contour, True);
end;

Способ второй.
Можно нарисовать любой пространственный объект или любую форму любого объекта при помощи методов:
IIngeoMapObject.Paint(Surface)
IIngeoShape.Paint(Surface)
Объект будет нарисован используя стили, связанные с контурами объекта. С учетом текущего масштаба. Видимость слоя, которому принадлежит объект, при этом учитываться не будут.
Способ третий.
Можно нарисовать произвольный контур, используя любой стиль, содержащийся в любом слое. Для этого предназначен метод:
IIngeoStyle.PaintContour.
Например, мы можем завести фиктивный слой, содержащий стили, предназначенные для вспомогательного рисования из программных модулей. Допустим один из стилей имеет идентификатор InternalStyleID. Мы можем нарисовать произвольный контур этим стилем при помощи следующего примера:
Код:

const
  InternalStyleId = '...';
procedure PaintContourUsingInternalStyle(
  Db: IIngeoDb;
  Surface: IIngeoPaintSurface;
  Contour: IIngeoContour;);
var
  Style: IIngeoStyle;
begin
  Style := Db.StyleFromId(InternalStyleId);
  Style.PaintContour(Surface, Contour, Null);
end;

Замечу, что указанный способ можно использовать для формирования изображений легенд.
Способ четвертый.
Использовать динамически-создаваемые методы отображения для рисования произвольных контуров.
Пример, приведенный ниже, иллюстрирует эту возможность:
Код:

procedure PaintContourUsingSomeComplexMethod(
  Ingeo: IIngeoApplication;
  Surface: IIngeoSurface;
  Contour: IIngeoContour);
var
  Painter: IIngeoSymbolPainter;
  RectFigure: IInPictureRectFigure;
begin
  Painter := Ingeo.CreateObject(inocPainter, inptSymbol) as IIngeoSymbolPainter;
  RectFigure := Painter.Figures.Add(inftRect) as IInPictureRectFigure;
  ... тут инициализируем RectFigure
  ... теперь аналогичным образом добавляет другие фигуры
  Painter.PaintContour(Surface, Contour, Null); // рисуем
end;

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Вт 13 Сен 2005 18:33    Заголовок сообщения: Ответить с цитатой

Важное замечание!
Используйте свойство IIngeoPaintSurface.DC только в самом крайнем случае (если способы, приведенные в предыдущем ответе, не позволяют Вам решить Вашу задачу).
Почему?
Возможно, что в последующих версиях ИнГео подсистема рисования будет использовать "движки", отличные от GDI (например, GDI+ или другие, не связанные с Windows GDI), вполне возможно, что код внешних модулей, ориентирующийся на DC, перестанет работать.
Однако мы гарантируем, что код, использующий способы, приведенные в предыдущем ответе, будет работать во всех последующих версиях ИнГео.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Азаматов Азамат Хадисович



Зарегистрирован: 17.02.2005
Сообщения: 100
Откуда: г. Учалы, Респ. Башкортостан

СообщениеДобавлено: Вт 13 Сен 2005 20:14    Заголовок сообщения: Ответить с цитатой

Михаил Власов писал(а):
Важное замечание!
Используйте свойство IIngeoPaintSurface.DC только в самом крайнем случае (если способы, приведенные в предыдущем ответе, не позволяют Вам решить Вашу задачу).
Почему?
Возможно, что в последующих версиях ИнГео подсистема рисования будет использовать "движки", отличные от GDI (например, GDI+ или другие, не связанные с Windows GDI), вполне возможно, что код внешних модулей, ориентирующийся на DC, перестанет работать.
Однако мы гарантируем, что код, использующий способы, приведенные в предыдущем ответе, будет работать во всех последующих версиях ИнГео.

К сожалению все эти способы не позволяют вывести на экран растр.
А было бы неплохо иметь всего одну функцию позволяющую нанести растр.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Ср 14 Сен 2005 21:39    Заголовок сообщения: Ответить с цитатой

Как вывести растр:
Код:

function GetRasterData(
  Raster: TBitmap): OleVariant;
var
  MemStm: TMemoryStream;
begin
  MemStm := TMemoryStream.Create;
  Raster.SaveToStream(MemStm);
  Result := VarArrayCreate([0, MemStm.Size - 1], varByte);
  Move(MemStm.Memory^, VarArrayLock(Result)^, MemStm.Size);
  VarArrayUnlock(Result);
  MemStm.Free;
end;
 
procedure PaintRaster(
  Ingeo: IIngeoApplication;
  Surface: IIngeoSurface;
  X, Y: Double;
  Raster: TBitmap);
var
  Painter: IIngeoSymbolPainter;
  RasterFigure: IInPicturePictureFigure;
  Contour: IIngeoContour;
begin
  Contour := Ingeo.CreateObject(inocContour, Null) as IIngeoContour;
  Contour.Insert(-1).Insert(-1, X, Y, 0);
  Painter := Ingeo.CreateObject(inocPainter, inptSymbol) as IIngeoSymbolPainter;
  Painter.PictureZoomScale := 0;
  Painter.PaintMethod := inppmSingle;
  RasterFigure := Painter.Figures.Add(inftPicture) as IInPicturePictureFigure;
  RasterFigure.Picture := GetRasterData(Raster);
 
  Painter.PaintContour(Surface, Contour, Null);
end;

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Кузнецов Андрей



Зарегистрирован: 22.04.2005
Сообщения: 28
Откуда: Магнитогорск

СообщениеДобавлено: Пн 19 Сен 2005 15:13    Заголовок сообщения: Ответить с цитатой

Михаил Власов писал(а):
Важное замечание!
Используйте свойство IIngeoPaintSurface.DC только в самом крайнем случае (если способы, приведенные в предыдущем ответе, не позволяют Вам решить Вашу задачу).
Почему?
Возможно, что в последующих версиях ИнГео подсистема рисования будет использовать "движки", отличные от GDI (например, GDI+ или другие, не связанные с Windows GDI), вполне возможно, что код внешних модулей, ориентирующийся на DC, перестанет работать.
Однако мы гарантируем, что код, использующий способы, приведенные в предыдущем ответе, будет работать во всех последующих версиях ИнГео.

Спасибо за предупреждение.
Были планы создавать "аппарат" работы с растрами (основанный на IIngeoPaintSurface.DC).
Но теперь вопрос: если нужно "на лету" делать афинные или билинейные преобразования, да выводить растр в произвольной области отсечения, да с заданной степенью прозрачности, то как быть?
На самом деле все это вовсе не круто. Дело только в том чтобы была возможность получить "картинку" с контекста (буфера, поверхности, как угодно нызывайте), задать область отсечения и "отправить" "туда" "картинку". Здесь "DC" конечно "развязывал" руки.
Вообще задача думаю актуальна для многих, да и перспектива не плоха: задали произвольный растр, положение, произвольный угол поворота, да и прозрачность кое-где не помешала бы, и не надо карту целую создавать (структуру базы излишествами заполнять).
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB