  | 
				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). _________________ С уважением, Михаил Власов. | 
			 
		  | 
	 
	
		| Вернуться к началу | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять приложения в этом форуме Вы можете скачивать файлы в этом форуме
  | 
   
 
		 |