 |
www.integro.ru ЦСИ ИНТЕГРО
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Вт 06 Ноя 2012 13:30 Заголовок сообщения: paintxml |
|
|
требуется из определенного слоя получить снимок прямоугольной области(к примеру координата верхнего угла (1,4) ширина и высота прямоугольника соответственно по 200).как это осуществить с помощью данной функции? |
|
Вернуться к началу |
|
 |
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Вт 06 Ноя 2012 14:57 Заголовок сообщения: |
|
|
доп инфо по paintXML см тут
"C:\Program Files\Integro\InGeo\IngeoIntfs.chm"
Код: | option explicit
sub SaveToFile (fn, cx, cy, scale)
dim iImg, cont
dim pXML
set iImg = application.CreateObject (inocImage, null)
with iImg
.Width = 300
.Height = 300
.ResolutionX = 120
.ResolutionY = 120
.TransparentColor = 0
End With
with iImg.Surface
.Navigator.YMirror = false
.Navigator.XAngle = 0
.Navigator.Navigate cx, cy, scale
end with
pXML = "<paint> <project oid='"+Application.ActiveProjectView.Project.ID+"'/> </paint>"
application.activedb.paintXML iImg.Surface, pXML
set cont = application.activedb.MapObjects.GetObject(application.Selection.IDs(0)).Shapes.item(0).Contour
iImg.Surface.Brush.BackColor = &h00FF00
iImg.Surface.Brush.Style = 0
iImg.Surface.Pen.Color = &h0000FF
iImg.Surface.Pen.WidthInMM = 0.2
iImg.Surface.PaintContour cont
iImg.SaveToFile fn
end sub
sub run
SaveToFile "d:\t.bmp", 47300, 45200, 1/2000
end sub |
_________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Вт 06 Ноя 2012 17:31 Заголовок сообщения: |
|
|
Код: |
IInImage image = (IInImage)ingeo.CreateObject(TIngeoObjectClass.inocImage, null);
XmlDocument paintXmlDoc = new XmlDocument();
paintXmlDoc.LoadXml("<paint/>");
//XmlElement prjElem = paintXmlDoc.CreateElement("project");
//prjElem.SetAttribute("oid", ingeo.ActiveProjectView.Project.ID);
//paintXmlDoc.DocumentElement.AppendChild(prjElem);
foreach (IIngeoMapView mapview in ingeo.ActiveProjectView.MapViews)
{
if ((mapview.Visible) && (mapview.Map.ID != "0001000003EB"))
{
XmlElement mapElem = paintXmlDoc.CreateElement("map");
mapElem.SetAttribute("oid", mapview.Map.ID);
paintXmlDoc.DocumentElement.AppendChild(mapElem);
}
}
XmlElement elem2;
XmlElement elem = paintXmlDoc.CreateElement("conture");
elem2 = paintXmlDoc.CreateElement("point");
elem2.SetAttribute("x", "12");
elem2.SetAttribute("y", "23");
elem.AppendChild(elem2);
elem2 = paintXmlDoc.CreateElement("point");
elem2.SetAttribute("x", "120");
elem2.SetAttribute("y", "230");
elem.AppendChild(elem2);
paintXmlDoc.DocumentElement.AppendChild(elem);
ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
image.SaveToFile(filename);
|
получается сохранить картинку,но не ту что надо.что ни так? |
|
Вернуться к началу |
|
 |
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Вт 06 Ноя 2012 18:05 Заголовок сообщения: |
|
|
Ответ зависит от того, что вы пытались сохранить и что получилось при сохранении.
код вроде правильный (опять же, что конкретно вам надо не ясно, поэтому эта оценка приблизительна)
т.к. вам таки удалось сохранить изображение, то весь вопрос в том, соответствуют ли ваши желания вашему коду  _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Вт 06 Ноя 2012 19:21 Заголовок сообщения: |
|
|
мне нужно сохранить в файл определенную прямоугольную область карты.
К пример из слоя test сохранить в файл прямоугольную картинку(верхний левый угол координата 23,23 ширина 100 высота 100) при маштабе равном 10.
Помогите |
|
Вернуться к началу |
|
 |
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Вт 06 Ноя 2012 19:41 Заголовок сообщения: |
|
|
см код выше, в частности, это
Код: | with iImg
.Width = 300
.Height = 300
.ResolutionX = 120
.ResolutionY = 120
.TransparentColor = 0
End With
with iImg.Surface
.Navigator.YMirror = false
.Navigator.XAngle = 0
.Navigator.Navigate cx, cy, scale
end with
|
_________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Ср 07 Ноя 2012 19:14 Заголовок сообщения: |
|
|
более менее разобрался. подскажите как определить
.Width = ?
.Height = ?
если известны:маштаб,координаты середины!(cx, cy, scale ) |
|
Вернуться к началу |
|
 |
APopov
Зарегистрирован: 19.06.2006 Сообщения: 347 Откуда: Самара
|
Добавлено: Ср 07 Ноя 2012 21:18 Заголовок сообщения: |
|
|
Вот есть функция в которой увязаны 4 параметра -
dpi, RealSize_InMetr, pixelSize, scale1to:
Код: | function CalcResolutionDPI(const RealSize_InMetr :double; pixelSize, scale1to:integer):integer;
begin
Result := trunc( (0.0254*pixelSize*scale1to) / RealSize_InMetr );
end; |
из нее можно выразить один из этих четырёх зная три других.
здесь "scale1to" это масштаб вида "2000" (а не "0.0005" // = 1/2000 ) _________________ ОАО "Самара-Информспутник",
инженер-программист Попов Артем |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Чт 08 Ноя 2012 13:24 Заголовок сообщения: |
|
|
Посчитать область карты, попавшую в растр, можно так:
Код: | option explicit
function Get_map_size(size_in_pixels, resolution, scale)
dim size_in_inches, size_in_meters
size_in_inches = size_in_pixels/resolution
size_in_meters = size_in_inches*2.54/100
Get_map_size = size_in_meters/scale
end function
function Get_map_dx_dy( _
width, height, resolution_x, resolution_y, _
scale, x_angle, y_mirror, _
out_dx, out_dy)
dim swap_x_y
swap_x_y = (x_angle <> 0) and y_mirror
if swap_x_y then
out_dy = Get_map_size(width, resolution_x, scale)
out_dx = Get_map_size(height, resolution_y, scale)
else
out_dx = Get_map_size(width, resolution_x, scale)
out_dy = Get_map_size(height, resolution_y, scale)
end if
end function
function Get_map_x1_x2_y1_y2( _
width, height, resolution_x, resolution_y, _
cx, cy, scale, x_angle, y_mirror, _
out_x1, out_x2, out_y1, out_y2)
dim dx, dy
Get_map_dx_dy _
width, height, resolution_x, resolution_y, _
scale, x_angle, y_mirror, _
dx, dy
out_x1 = cx - dx/2
out_x2 = cx + dx/2
out_y1 = cy - dy/2
out_y2 = cy + dy/2
end function
const PI = 3.14
dim x1, x2, y1, y2
Get_map_x1_x2_y1_y2 _
800, 600, 96, 96, _
50.0, 100.0, 1/5000, PI/2, true, _
x1, x2, y1, y2
MsgBox "x: [" & x1 & " .. " & x2 & "]" & vbNewLine & "y: [" & y1 & " .. " & y2 & "]"
' Вывод:
' x: [-346,875 .. 446,875]
' y: [-429,166666666667 .. 629,166666666667]
|
_________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Чт 08 Ноя 2012 13:54 Заголовок сообщения: |
|
|
Посчитать параметры растра для вывода заданного участка карты в заданном масштабе можно так:
Код: | option explicit
sub Get_image_params( _
x1, x2, y1, y2, _
scale, x_angle, y_mirror, _
resolution_x, resolution_y, _
out_width, out_height, out_center_x, out_center_y)
dim swap_x_y, dx, dy
swap_x_y = (x_angle <> 0) and y_mirror
dx = x2 - x1
dy = y2 - y1
out_center_x = (x1 + x2)/2
out_center_y = (y1 + y2)/2
dim width_in_meters, height_in_meters
if swap_x_y then
width_in_meters = dy*scale
height_in_meters = dx*scale
else
width_in_meters = dx*scale
height_in_meters = dy*scale
end if
dim width_in_inches, height_in_inches
width_in_inches = width_in_meters*100/2.54
height_in_inches = height_in_meters*100/2.54
out_width = Round(width_in_inches*resolution_x)
out_height = Round(height_in_inches*resolution_y)
end sub
const PI = 3.14
dim width, height, center_x, center_y
Get_image_params _
-346.875, 446.875, -429.166666666667, 629.166666666667, _
1/5000, PI/2, true, _
96, 96, _
width, height, center_x, center_y
MsgBox "size: [" & width & " x " & height & "]" & vbNewLine & "center: [" & center_x & " x " & center_y & "]"
' Вывод:
' size: [800 x 600]
' center: [50 x 100]
|
_________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Пн 12 Ноя 2012 11:22 Заголовок сообщения: |
|
|
Код: |
while (m < maxY)
{
image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);
image.Height = 256;
image.Width = 256;
image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);
obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
.........
|
ЭТОТ код работает.Но больно медленно.У меня вот такой вопрос,можно ли с помощью метода .PaintXml залить в image весь слой(один раз) а дальше с помощью Surface.Navigator делать навигацию и таскать информацию? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пн 12 Ноя 2012 15:21 Заголовок сообщения: |
|
|
sergey писал(а): | Код: |
while (m < maxY)
{
image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);
image.Height = 256;
image.Width = 256;
image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);
obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
.........
|
ЭТОТ код работает.Но больно медленно.У меня вот такой вопрос,можно ли с помощью метода .PaintXml залить в image весь слой(один раз) а дальше с помощью Surface.Navigator делать навигацию и таскать информацию? |
Я так понимаю, что под "весь слой" вы имеете в виду "всю территорию по километражу".
Если в 256х256, то можно, но мало пользы.
Если в 100500х100500 - не хватит памяти.
Только кусками, кратными 256х256 (кратность выяснять опытным путем). Вытаскивать можно через Image.Surface.DC через WinApi BitBlt. На VBScripte не выйдет, но в вашем примере я наблюдаю C#. Искать в гугле "bitblt c# graphics". _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Пн 12 Ноя 2012 17:23 Заголовок сообщения: |
|
|
Мне просто на мгновение показалось что IInImage это компонент где рисуются карты(canvas как бы).А это у вас синоним system.drawing.bimap с добавленным функционалом.Я правильно понял? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Вт 13 Ноя 2012 08:43 Заголовок сообщения: |
|
|
sergey писал(а): | Мне просто на мгновение показалось что IInImage это компонент где рисуются карты(canvas как бы).А это у вас синоним system.drawing.bimap с добавленным функционалом.Я правильно понял? |
Правильно поняли.
А "компонент где рисуются карты(canvas как бы)" - это IIngeoPaintSurface. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Вт 13 Ноя 2012 10:40 Заголовок сообщения: |
|
|
У меня вот какая идея,а почему бы не сделать следующим образом.
Код: |
//создаем картинку размером 256 на 256,внутри которой находится IIngeoPaintSurface
image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);
image.Height = 256;
image.Width = 256;
тут мы в IIngeoPaintSurface перекидываем то что нужно
obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
//тут проводим навигацию по IIngeoPaintSurface
image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);
//тут мы помещаем результат навигации(видимую область) в картинку размером 256 на 256 и сохраняем
image.SaveToFile(path + @"\" + current_folder + @"\" + po_x.ToString() + "_" + po_y + ".jpg");
|
Но если я делаю так то он сохраняет непонятно что |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Вт 13 Ноя 2012 15:12 Заголовок сообщения: |
|
|
sergey писал(а): | У меня вот какая идея,а почему бы не сделать следующим образом.
Но если я делаю так то он сохраняет непонятно что |
Перед каждым тайлом надо чистить сюрфейс. Иначе карта будет наслаиваться. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Вт 13 Ноя 2012 15:50 Заголовок сообщения: |
|
|
Мне нужно порезать слой на маленькие картинки.
Для этого в цикле я делаю это
Код: |
image = (IInImage)obj.ingeo.CreateObject(TIngeoObjectClass.inocImage, null);
image.Height = 256;
image.Width = 256;
image.Surface.Navigator.Navigate(n + shag_taila / 2, m + shag_taila / 2, current);
image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);
obj.ingeo.ActiveDb.PaintXml(image.Surface, paintXmlDoc.OuterXml);
image.SaveToFile(path + @"\" + current_folder + @"\" + po_x.ToString() + "_" + po_y + ".jpg");
|
Тоесть чтобы получить маленькую картинку я каждый раз создаю объект image и вызываю метод paintxml.эТО ОПТИМАЛЬНЫЙ вариант? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Чт 15 Ноя 2012 13:07 Заголовок сообщения: |
|
|
[quote="sergey"]Мне нужно порезать слой на маленькие картинки.
Для этого в цикле я делаю это
Код: |
image.Surface.Navigator.FitWorldBounds(n, m, n + shag_taila, m + shag_taila, TIngeoNavigatorFitMode.infitNoScale);
|
Это лишнее. Достаточно Navigate. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
sergey
Зарегистрирован: 18.09.2012 Сообщения: 14
|
Добавлено: Чт 15 Ноя 2012 22:18 Заголовок сообщения: |
|
|
возможно ли установить прозрачный цвет у сохраняемой картинки?(к примеру белый цвет у полученного png будет прозрачный) |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пт 16 Ноя 2012 08:33 Заголовок сообщения: |
|
|
sergey писал(а): | возможно ли установить прозрачный цвет у сохраняемой картинки?(к примеру белый цвет у полученного png будет прозрачный) |
1. Заливаете фон IInImage "экзотическим" цветом, например rgb(1, 0, 0).
2. Рисуете поверх PaintXml.
3. Формируете растр.
4. Меняете "экзотический" цвет на прозрачный (какой-нибудь тулзой или библиотекой, например imagemagik). _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
|
|