2009-03-24 5 views
2

Я разместил этот вопрос на форуме MapXtreme, но так как никто никогда не отвечает на вопросы, я надеюсь, что у кого-то есть некоторый опыт работы с этим продуктом (mapxtreme - это ГИС-SDK, сделанный людьми, которые сделать MapInfo)Как создать растровое изображение из стилей MapXtreme

Я работаю на приложение MapXtreme Desktop и нам нужны растровые изображения наших стилей особенности

Я пытался два пути, но все это я получаю серый растровый с темным X.

здесь код, который я использовал оба способа, находится в коде, но один закомментирован:

public static Bitmap GetStyleBitmap(Style style) 
    { 
     var bm = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     var rect = new System.Drawing.Rectangle(0, 0, 16, 16); 
     var ss = new StyleSample(); 
     ss.Bounds = rect; 
     if (style is CompositeStyle) 
     { 
      ss.ApplyAreaStyle(((CompositeStyle)style).AreaStyle); 
      ss.ApplyLineStyle(((CompositeStyle)style).LineStyle); 
     } 
     if (style is AreaStyle) 
     { 
      ss.ApplyAreaStyle((AreaStyle)style); 
     } 
     if (style is SimpleLineStyle) 
     { 
      ss.ApplyLineStyle((SimpleLineStyle)style); 
     } 

     //using MapExport 
     var me = new MapExport(ss.Map); 
     var image = me.Export(); 
     return new Bitmap(image); 

     //using StyleSample.DrawToBitmap 
     //ss.DrawToBitmap(bm, rect); 
     //return bm; 
    } 

ТИА

ответ

0

После ожидания ответа - и пытается бесчисленное множество других способов - все без толку, я решил делать все это «вручную», то есть я просто смотрю в объект стиля получить цвет его и нарисуйте растровое изображение, соответствующее типу слоя (линия или многоугольник).

Он не обрабатывает каждый случай, а также не обрабатывает стили линий или внутренние цвета, но пока он служит моим целям.

вот код, который делает это.

public static Bitmap GetStyleBitmap(FeatureLayer fl) 
    { 
     Feature f = GetFirstFeature(fl); 
     if (f == null) return null; 

     var style = f.Style; 
     Color c; 
     var bm = new Bitmap(16, 16, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
     PointF[] poly = new PointF[] 
     { 
      new PointF(2,5), 
      new PointF(5,2), 
      new PointF(14,7), 
      new PointF(14,14), 
      new PointF(2,14), 
      new PointF(2,4) 
     }; 

     SimpleLineStyle line = null; 
     if (style is CompositeStyle) 
      line = ((CompositeStyle)style).AreaStyle.Border as SimpleLineStyle; 
     if (style is AreaStyle) 
      line = ((AreaStyle)style).Border as SimpleLineStyle; 

     if (line != null) 
     { 
      c = line.Color; 

      using (var gr = Graphics.FromImage(bm)) 
      { 
       gr.DrawPolygon(new Pen(c, 2), poly); 
      } 
      return bm; 
     } 

     line = style as SimpleLineStyle; 

     if (line != null) 
     { 
      c = line.Color; 

      using (var gr = Graphics.FromImage(bm)) 
      { 
       gr.DrawLine(new Pen(c, 2), new PointF(2,2), new PointF(14,14)); 
      } 
     } 
     return bm; 
    } 
0

Первый код уже почти сработал. Я немного подделал его немного, чтобы исправить это. Я протестировал его для композитного стиля, который содержит простой стиль в нем.

/// <summary> 
    /// Creates an icon for the specified style. 
    /// </summary> 
    /// <param name="style">The style.</param> 
    /// <returns></returns> 
    private static Bitmap CreateStyleIcon(Style style) 
    { 
     const int iconSize = 16; //the size of the icon 
     System.Drawing.Rectangle iconArea = new System.Drawing.Rectangle(0, 0, iconSize, iconSize); //a rectangle area for the icon 
     StyleSample ss = new StyleSample { Bounds = iconArea }; 
     if (style is CompositeStyle) 
     { 
      CompositeStyle compsiteStyle = style as CompositeStyle; 
      if (compsiteStyle.AreaStyle != null) //do we have an area style? 
      { 
       ss.ApplyAreaStyle(compsiteStyle.AreaStyle); 
      } 
      if (compsiteStyle.LineStyle != null) //do we have an LineStyle style? 
      { 
       ss.ApplyLineStyle(compsiteStyle.LineStyle); 
      } 
      if (compsiteStyle.SymbolStyle != null) //do we have an SymbolStyle style? 
      { 
       ss.ApplySymbol(compsiteStyle.SymbolStyle); 
      } 
     } 
     if (style is AreaStyle) 
     { 
      ss.ApplyAreaStyle((AreaStyle)style); 
     } 
     if (style is BaseLineStyle) 
     { 
      ss.ApplyLineStyle((BaseLineStyle)style); 
     } 

     //draw the bitmap 
     Bitmap iconBitmap = new Bitmap(iconSize, iconSize, System.Drawing.Imaging.PixelFormat.Format32bppArgb);//the bitmap to draw the icon to 
     ss.DrawToBitmap(iconBitmap, iconArea); 
     return iconBitmap; 
    }