Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Vovik
Зарегистрирован: 04.05.2008 Сообщения: 57
|
Добавлено: Ср Дек 03, 2008 4:26 am Заголовок сообщения: Редактировать растр |
|
|
Люди, кто нибудь знает способ как из MI редактировать растровую таблицу (собственно сам растр)? Можно, конечно, открыть растровую таблицу начертить, инструментами MI, то что надо и все это растеризовать используя меню Файл-Экспорт окна, но это долго и не совсем то что надо. Подскажите кто знает, как написать подходящуюю утилиту или программку с ипользованием интегрированной картографии на (на MB или VB) и т.п. для решения вышепоставленной задачи |
|
Вернуться к началу |
|
|
Alex_Y
Зарегистрирован: 28.11.2008 Сообщения: 122
|
Добавлено: Ср Дек 03, 2008 7:35 am Заголовок сообщения: |
|
|
Насколько я знаю в МИ этого сделать нельзя
а в чем проблема, грузи растр в графичечкий редактор (если в VB, то в тот же TImage) там меняй что хочешь, а потом в МИ обнови окно, он тебе сам подгрузит обновление |
|
Вернуться к началу |
|
|
Vovik
Зарегистрирован: 04.05.2008 Сообщения: 57
|
Добавлено: Ср Дек 03, 2008 10:47 am Заголовок сообщения: Re: Редактировать растр |
|
|
Извиняюсь. Что такое TImage в VB?
Очень сильно хочется например при работе с картой в MI (в частности с пятисоткой), используя, скажем так инструмент "Ластик", подтереть что то на растре прямо в MI. Мечта!
Так вот как сделать этот самый "Ластик". Бьюсь но никак не могу.
Собственно это мне нужно не для этого "Ластика", а для того что по долгу службы я часто вношу изменения в растры масштаба 1/500 (дом снесли, дом построилии и т.п.) К примеру:
У меня есть "старый растр" планшет масштаба 1/500 зарегистрированный как растровая таблица в MI в проекции план-схема и приносят мне новый растр но не весь планшет а только его фрагмент и мне нужно перенести (наложить) этот фрагмент на "старый" Для этого я сканирую принесенный растр, в Easy Trace его обрабатываю, накладываю на "старый", объеденяю оба растра и только потом итоговый регистрирую под именем "старого" |
|
Вернуться к началу |
|
|
Alex_Y
Зарегистрирован: 28.11.2008 Сообщения: 122
|
Добавлено: Чт Дек 04, 2008 11:00 am Заголовок сообщения: |
|
|
TImage это компонент для работы с растровыми изображениями, это в делфи, но думаю в vb есть аналог
стразу на окне карты ... тут не так все просто, хотя и решаемо. проще тот вариант который я предложил
объясню подробней.
пишешь приложение (делфи, vb, другой язык высокого уровня) которое в отдельном окне открывает твой раст как картинку, в этом приложении делаешь инструменты какие надо, там ластик и прочее. при закрытии этого окна сохраняешь измененный растр. В МИ, при обновлении окна карты, обновится и растр. Т.к. ты его поменял (неважно где в своей дополнительной программе или в том же стандартном паинте) МИ загрузит новый вариант и отобразит его в окне. А вызывать это твое приложение можешь уже и из MB и через интегрированную картографию.
Чтобы понять о чем я, попробуй одновременно открыть В МИ растр и его же в любом графическом редакторе. В редакторе изменить растр (стереть что-то или нарисовать), сохранить его, и в МИ ладошкой сдвинуть карту. У тебя нарисуется растр с твоими последними изменениями. Главное не менять размер этого растра, иначе его регистрация в МИ полетит! |
|
Вернуться к началу |
|
|
Vovik
Зарегистрирован: 04.05.2008 Сообщения: 57
|
Добавлено: Пт Дек 05, 2008 5:02 am Заголовок сообщения: |
|
|
Дорогой друг я так и делаю сейчас, т.е во внешнем графическом редакторе (пусть даже своего изготовления) Редактировать растр не проблема.
Часто приходится накладывать растры, но беда в том что часто бывает накладываемый "новый" растр, как правило фрагмент, по качеству значительно хуже чем "старый", что соответственно портит карту. Как, правило, съемку делают всякие там ООО или ЧП где копировальное оборудование просто плохое и в результате качество этого фрагмента то же плохое.
К примеру надо нанести на пятисотку вновь построенный дом с сетями для этого
Если «новый» растр хороший:
1.1 Сканирую «новый» растр
1.2 Обрабатываю во внешнем графическом редакторе
1.3 Трансформирую «новый» растр в EaseTrace
1.4 Совмещаю «старый» и «новый» растр в EaseTrace
1.5 Сохраняю итоговый растр под именем «старого»
1.6 Регистрирую в MI
Если «новый» растр плохой:
2.1 Сканирую «новый» растр
2.2 Обрабатываю во внешнем графическом редакторе
2.3 Трансформирую «новый» растр в EaseTrace
2.4 Во внешнем графическом редакторе кое что стираю в «старом» растре
2.5 Регистрирую «новый» растр в MI и накладываю его по верх "старого" как новый слой
2.6 Инструментами MI вношу изменения (по сути обвожу) в косметическом слое
2.7 Убираю слой «нового» растра
2.8 Экспортирую окно в графический файл, т.е получаю «новый» фрагмент растра
2.9 Повторяю пункты 1.4, 1.5 и 1.6
Как видишь долго и муторно.
Хочу так:
1. Сканирую «новый» растр
3. Трансформирую «новый» растр в EaseTrace
4. Регистрирую «новый» растр в MI и накладываю его по верх "старого" как новый слой
5. Инструментами которые хочу сделать вношу изменения в «старый» растр (стираю черчу и т.п.) прямо в MI
6. Убираю слой «нового» растра
и готово |
|
Вернуться к началу |
|
|
Alex_Y
Зарегистрирован: 28.11.2008 Сообщения: 122
|
Добавлено: Пт Дек 05, 2008 10:41 am Заголовок сообщения: |
|
|
я тогда не совсем понимаю зачем тут вообще мапинфо если работа ведется только с растрами? проще это все тогда в кореле делать, там и наложить растры можно и прозрачным сделать и стереть и нарисовать. Мапинфо работает с растрами только как с подложкой и ориентирована на работу с векторными картами и геоинформацией.
Можно конечно из МИ взять изображение окна, потом средствами интегрированной картографии рассчитать где это место на самом растре и поместить на растр. Только это помоему, извините, все равно что аппендицит через ж.. удалять. Ни кого не хочу обидеть, но для такой задачи МИ не лучший вариант. |
|
Вернуться к началу |
|
|
Vovik
Зарегистрирован: 04.05.2008 Сообщения: 57
|
Добавлено: Пт Дек 05, 2008 11:31 am Заголовок сообщения: |
|
|
Растры в MI у меня точно как подожка. Основная информация у меня векторная. Просто хочу сделать работу с MI максимально комфортной даже если это через ж... но пусть это делает машина, она железная и не понимает через ж.. это или по человечески. Важен конечный результат.
Если не затруднит может есть какие нибудь иходники (ведь ты писал "средствами интегрированной картографии рассчитать где это место на самом растре и поместить на растр") |
|
Вернуться к началу |
|
|
Alex_Y
Зарегистрирован: 28.11.2008 Сообщения: 122
|
Добавлено: Вс Дек 07, 2008 8:53 am Заголовок сообщения: |
|
|
Потратил целых два часа своего свободного времени на то чтобы реализовать интрумент "ластик". Сделал самым простым способом, без интегрированной картографии, только mapbasic и dll, написанная на делфи, увы, vb не знаю. Программа максимально упрощена и показывает только технологию работы. Если нужны скомпилированные файлы, могу выслать на мыло.
Работает только с первым попавшимся растром, а формате bmp, в проекции план-схема. Должна по идее и в других работать, но не проверял.
---------------- rubber.mb ----------------
include "mapbasic.def"
include "icons.def"
Declare Sub Main
Declare Sub EndHandler
Declare Sub EndProgram
Declare Sub RollbackCosmetic
Declare Sub DrawRubber
Declare Sub CancelChanges
Declare Sub SaveChanges
Declare Sub OpenRaster Lib "rubber.dll" (ByVal RFileName As String, ByVal MinX, ByVal MinY, ByVal MaxX, ByVal MaxY As Float)
Declare Sub CloseRaster Lib "rubber.dll"
Declare Sub SaveRaster Lib "rubber.dll" (ByVal RFileName As String)
Declare Sub DrawRect Lib "rubber.dll" (ByVal X1, ByVal Y1, ByVal X2, ByVal Y2 As Float, ByVal PenColor, ByVal BrushColor As Integer)
Dim RFileName As String ' Имя файла растра
Dim RBoundMinX, RBoundMinY As Float ' Географические размеры
Dim RboundMaxX, RBoundMaxY As Float ' растра
Define RubberSize 50 ' Размар ластика
Sub Main
Dim i As Integer
' Создаем панель инструментов
Create ButtonPad "Инструменты" As
ToolButton HelpMsg " Ластик \n Ластик "
Cursor MI_CURSOR_CROSSHAIR DrawMode DM_CUSTOM_POINT
Calling DrawRubber Icon MI_ICON_RECT
PushButton HelpMsg " Отменить исправления \n Отменить исправления "
Calling CancelChanges Icon MI_ICON_UNDO
PushButton HelpMsg " Сохранить исправления\ \n Сохранить исправления "
Calling SaveChanges Icon MI_ICON_SAVE_FILE
PushButton HelpMsg " Выход \n Выход "
Calling EndProgram Icon MI_ICON_LETTERS_E
' Ищем первый попавшийся растр
RFileName = ""
for i = 1 to NumTables()
if TableInfo(i, TAB_INFO_TYPE) = TAB_TYPE_IMAGE then
Set CoordSys Table TableInfo(i, TAB_INFO_NAME)
RFileName = TableInfo(i, TAB_INFO_TABFILE)
RFileName = Mid$(RFileName, 1, Len(RFileName)-3)+"bmp"
RBoundMinX = TableInfo(i, TAB_INFO_MINX)
RBoundMinY = TableInfo(i, TAB_INFO_MINY)
RBoundMaxX = TableInfo(i, TAB_INFO_MAXX)
RBoundMaxY = TableInfo(i, TAB_INFO_MAXY)
Exit For
end if
next
' Если не нашли, то выходим
if Len(RFileName) = 0 then
Note "Нет растра"
Call EndProgram
end if
' Открыть растр для редактирования
Call OpenRaster(RFileName, RBoundMinX, RBoundMinY, RBoundMaxX, RBoundMaxY)
End Sub
Sub EndHandler
' Восстановить косметический слой
Call RollbackCosmetic
' Закрыть раст
Call CloseRaster
End Sub
Sub EndProgram
End Program
End Sub
Sub RollbackCosmetic
' Восстановить косметический слой
if FrontWindow() > 0 then
Rollback Table WindowInfo(FrontWindow(), WIN_INFO_TABLE)
end if
End Sub
Sub DrawRubber
Dim R As Object
Dim X, Y As Float
' Получить координаты ластика
X = CommandInfo(CMD_INFO_X)
Y = CommandInfo(CMD_INFO_Y)
' Отрисовка ластика на растре в памяти
Call DrawRect(X-RubberSize, Y-RubberSize, X+RubberSize, Y+RubberSize, WHITE, WHITE)
' Создание Ластика
Create Rect Into Variable R
(X-RubberSize, Y-RubberSize)(X+RubberSize, Y+RubberSize)
Pen(1, 2, WHITE)
Brush(2, WHITE, WHITE)
' Вставка ластика в косметический слой
Insert Into WindowInfo(FrontWindow(), WIN_INFO_TABLE)
(obj) Values(R)
End Sub
Sub CancelChanges
' Восстановить косметический слой
Call RollbackCosmetic
' Закрыть раст
Call CloseRaster
' Открыть растр для редактирования
Call OpenRaster(RFileName, RBoundMinX, RBoundMinY, RBoundMaxX, RBoundMaxY)
End Sub
Sub SaveChanges
' Сохранить изменения в растре
Call SaveRaster(RFileName)
' Восстановить косметический слой
Call RollbackCosmetic
End Sub
---------------- rubber.dpr ----------------
library rubber;
uses Graphics;
var bmp : TBitmap; // Растр
RBoundMinX, RBoundMinY, // Географические размеры
RboundMaxX, RBoundMaxY : Real; // растра
procedure OpenRaster(const RFileName : PChar; const MinX, MinY, MaxX, MaxY : Real); stdCall;
begin
// Загружаем растр в память
bmp := TBitmap.Create;
bmp.LoadFromFile(RFileName);
// Получаем географическую область растра
RBoundMinX := MinX; RBoundMinY := MinY;
RboundMaxX := MaxX; RBoundMaxY := MaxY;
end;
procedure CloseRaster; stdCall;
begin
// Закрываем растр
if Assigned(bmp) then
begin
bmp.Free; bmp := nil;
end;
end;
procedure SaveRaster(const RFileName : PChar); stdCall;
begin
// Сохраняем изменения растра
if Assigned(bmp) then bmp.SaveToFile(RFileName);
end;
procedure DrawRect(X1, Y1, X2, Y2 : Real; const PenColor, BrushColor : Integer); stdCall;
var kX, kY : Real;
begin
// Убираем географическое смещение координат
X1 := X1-RBoundMinX; X2 := X2-RBoundMinX;
Y1 := Y1-RBoundMinY; Y2 := Y2-RBoundMinY;
// Рассчитываем коэффициенты перехода от географических координат растра к пиксельным
kX := (RBoundMaxX-RBoundMinX)/bmp.Width;
kY := (RBoundMaxY-RBoundMinY)/bmp.Height;
// Рисуем прямоугольник на растре
bmp.Canvas.Pen.Color := PenColor;
bmp.Canvas.Brush.Color := BrushColor;
bmp.Canvas.Rectangle(Round(X1/kX), bmp.Height-Round(Y1/kY),
Round(X2/kX), bmp.Height-Round(Y2/kY));
end;
exports
OpenRaster, CloseRaster, SaveRaster, DrawRect;
begin
end. |
|
Вернуться к началу |
|
|
Vovik
Зарегистрирован: 04.05.2008 Сообщения: 57
|
Добавлено: Вт Дек 09, 2008 5:52 am Заголовок сообщения: |
|
|
Спасибо дорогой друг!
Опробовал все прекрасно. Правда Delphi я не знаю но придется поучиться малость.
Правда подложка у меня из Tif растров.
А не льзя ли так для этих растров ? |
|
Вернуться к началу |
|
|
Alex_Y
Зарегистрирован: 28.11.2008 Сообщения: 122
|
Добавлено: Вт Дек 09, 2008 6:39 am Заголовок сообщения: |
|
|
надо искать компонент для делфи, для работы с тифами
есть неплохой компонент, GraphicEx называется, вроде он работает с тифами
пиши в том что знаешь, главное чтобы оно длл умело создавать :) |
|
Вернуться к началу |
|
|
Vovik
Зарегистрирован: 04.05.2008 Сообщения: 57
|
Добавлено: Ср Дек 10, 2008 9:07 am Заголовок сообщения: |
|
|
Дорогой друг!
Скачал GraphicEx а приладить не могу. Помоги пожалуйста! |
|
Вернуться к началу |
|
|
Alex_Y
Зарегистрирован: 28.11.2008 Сообщения: 122
|
Добавлено: Ср Дек 10, 2008 10:44 am Заголовок сообщения: |
|
|
сам не пользовался
добавляешь GraphicEx в секцию uses
в коде что-то типа
var bmp : TBitmap;
pic : TPicture;
begin
pic := TPicture.Create;
bmp := TBitmap.Create;
try
pic.LoadFromFile(Name);
if not (pic.Graphic is TBitmap) then
begin
with bmp do
begin
PixelFormat := pf24Bit;
Width := pic.Width; Height := pic.Height;
Canvas.Draw(0, 0, pic.Graphic);
end;
pic.Bitmap.Assign(bmp);
// тут работаем так как я писал, с полученным битмапом
// Сохраняем в нужном формате, не помню как
// скорее всего pic.SaveToFile(Name);
end;
finally
bmp.Free; pic.Free;
end; |
|
Вернуться к началу |
|
|
Alisa_67
Зарегистрирован: 10.05.2012 Сообщения: 5
|
Добавлено: Чт Май 10, 2012 4:43 pm Заголовок сообщения: HELP! |
|
|
Пожалуйста помогите, мне очень нужно реализовать посредством mapbasic подстройку растрового изображения, туплю в стправочнике никак не могу найти подходящий оператор....оч нужно для диплома...времени совсем чуть осталось |
|
Вернуться к началу |
|
|
Нестеров Валерий
Зарегистрирован: 21.03.2006 Сообщения: 492
|
Добавлено: Чт Май 10, 2012 4:58 pm Заголовок сообщения: |
|
|
а что значит подстроить? _________________ Жизнь прекрасна!i |
|
Вернуться к началу |
|
|
Андрей Могильный
Зарегистрирован: 21.03.2006 Сообщения: 864
|
Добавлено: Чт Май 10, 2012 6:25 pm Заголовок сообщения: |
|
|
Видимо привязать? |
|
Вернуться к началу |
|
|
|