 |
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. Где же спрятан масштаб, подскажите, пожалуйста, что-то не могу найти.
И еще вопросик вдогонку. Можно или нельзя у объекта поменять слой?
Я так понял, что нельзя, но, может быть, все-таки можно?
Буду очень благодарен за информацию. |
|
Вернуться к началу |
|
 |
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 |
|
Вернуться к началу |
|
 |
Радченко Андрей
Зарегистрирован: 01.09.2005 Сообщения: 7 Откуда: г.Курган
|
Добавлено: Пт 02 Сен 2005 12:29 Заголовок сообщения: Re: Масштаб карты |
|
|
Азаматов Азамат Хадисович писал(а): | Масштаб обычно от 0 до 1 т.е. если на экране масштаб 1:5000, то в программных интерфейсах отображается значение 1/5000=0,0002 |
А я его замечательно округлял, поэтому считал, что он всегда 0.
Спасибо, разобрался с масштабами.
И со слоями объекта тоже вроде бы все понятно.
Всем спасибо за ответы.  |
|
Вернуться к началу |
|
 |
Радченко Андрей
Зарегистрирован: 01.09.2005 Сообщения: 7 Откуда: г.Курган
|
Добавлено: Пн 12 Сен 2005 14:20 Заголовок сообщения: |
|
|
А вот еще возник вопрос.
Проект в Дельфи, компонента IngeoMapX.
Нужно нарисовать в окне карты что-то свое (объект, не хранящийся в базе ИнГЕО).
Хотя бы тупо какой-нибудь прямоугольник поверх карты.
Как это сделать?
Вроде бы у IIngeoPaintSurface есть свойства Pen и Brush, а методов для рисования нету (или я их не нашел). В аддоне можно было бы использовать M2MapView - DrawPolyline, DrawPoligon. А как это сделать во внешнем приложении? Буду очень рад подсказкам. |
|
Вернуться к началу |
|
 |
Азаматов Азамат Хадисович
Зарегистрирован: 17.02.2005 Сообщения: 100 Откуда: г. Учалы, Респ. Башкортостан
|
Добавлено: Вт 13 Сен 2005 09:48 Заголовок сообщения: |
|
|
Радченко Андрей писал(а): | А вот еще возник вопрос.
Проект в Дельфи, компонента IngeoMapX.
Нужно нарисовать в окне карты что-то свое (объект, не хранящийся в базе ИнГЕО).
Хотя бы тупо какой-нибудь прямоугольник поверх карты.
Как это сделать?
Вроде бы у IIngeoPaintSurface есть свойства Pen и Brush, а методов для рисования нету (или я их не нашел). В аддоне можно было бы использовать M2MapView - DrawPolyline, DrawPoligon. А как это сделать во внешнем приложении? Буду очень рад подсказкам. |
В IIngeoPaintSurface есть свойство DC. Передаешь его в стандартный TCanvas (свойство Handle) и рисуешь. Для преобразования координат есть методы в IIngeoPaintSurface. |
|
Вернуться к началу |
|
 |
Радченко Андрей
Зарегистрирован: 01.09.2005 Сообщения: 7 Откуда: г.Курган
|
Добавлено: Вт 13 Сен 2005 12:30 Заголовок сообщения: |
|
|
Азаматов Азамат Хадисович писал(а): |
В IIngeoPaintSurface есть свойство DC. Передаешь его в стандартный TCanvas (свойство Handle) и рисуешь. Для преобразования координат есть методы в IIngeoPaintSurface. |
Спасибо, все отлично работает!  |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 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, перестанет работать.
Однако мы гарантируем, что код, использующий способы, приведенные в предыдущем ответе, будет работать во всех последующих версиях ИнГео. |
К сожалению все эти способы не позволяют вывести на экран растр.
А было бы неплохо иметь всего одну функцию позволяющую нанести растр. |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 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" конечно "развязывал" руки.
Вообще задача думаю актуальна для многих, да и перспектива не плоха: задали произвольный растр, положение, произвольный угол поворота, да и прозрачность кое-где не помешала бы, и не надо карту целую создавать (структуру базы излишествами заполнять). |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|