【问题标题】:How can I make a Bitmap from MapXtreme Styles如何从 MapXtreme 样式制作位图
【发布时间】:2010-10-15 08:11:47
【问题描述】:

我已经在 MapXtreme 论坛上发布了这个问题,但由于没有人在那里回答问题,我希望这里有人对这个产品有一些经验(mapxtreme 是制作 MapInfo 的人制作的 GIS SDK)

我正在开发一个 MapXtreme 桌面应用程序,我们需要我们的功能样式的位图

我尝试了两种方法,但我得到的只是一个带有深色 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;
    }

TIA

【问题讨论】:

    标签: c# mapping gis mapxtreme


    【解决方案1】:

    在等待答案之后 - 并尝试了无数其他方法 - 一切都无济于事,我决定“手工”完成这一切,即我只是在样式对象中查看它的颜色并绘制一个适合的位图图层类型(线或多边形)。

    它不能处理所有情况,也不能处理线条样式或内部颜色,但它现在可以满足我的目的。

    这是执行此操作的代码。

        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;
        }
    

    【讨论】:

      【解决方案2】:

      第一个代码已经几乎可以工作了。我只是稍微调整了一下来修复它。 我已经针对其中包含 simplevectorpointstyle 的复合样式对其进行了测试。

          /// <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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-17
        • 2010-11-23
        相关资源
        最近更新 更多