爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4723|回复: 6

[其他] surfer求教

[复制链接]

新浪微博达人勋

发表于 2017-4-15 10:17:19 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
C#调用surfer时如何生成自定义图例,有没人写过相关的内容希望可以参考下
QQ图片20170415102155.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-16 08:56:00 | 显示全部楼层
谢谢分享 楼主
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-17 08:49:49 | 显示全部楼层
可以可以
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2018-7-18 17:44:04 | 显示全部楼层
如何在C#实现自定义啊,我没有看懂这个
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-19 10:47:09 | 显示全部楼层
自定义图例,论坛高手 Holz 曾经有篇帖子,找不到。不过他在自己的一篇“用 Surfer 创建热度图或密度图”中用到了自定义图例,他用的是 VB 语言,用 C# 等语言的朋友可以参考。他的其他文章,也在这个链接里面,好好阅读,将受益匪浅。https://holz.gitbooks.io/surferc ... map-densitymap.html
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-19 11:05:58 | 显示全部楼层
本帖最后由 chengxf 于 2018-7-19 11:10 编辑
药草 发表于 2018-7-18 17:44
如何在C#实现自定义啊,我没有看懂这个

我曾经写过自定义图例的 Pascal 代码,可惜不是 C# 的,这段代码放出来给你参考。注释写得较详细,主要是怕我自己忘了。
      if CBox_PostScaleYes.Checked then case RG_Legend.ItemIndex of             //需要显示图例
        0:Begin            //选择了水平显示图例
          xInc1 := SEdit_xInc1.Value;                                           //图例符号和图例说明之间的间距为 0.5cm
          xInc2 := SEdit_xInc2.Value;                                           //图例之间的间距为 1.0cm
          x := P_MapFrame.Left + P_MapFrame.Width * 0.5;                        //地图中心的 X 坐标
          y := P_MapFrame.Top - P_MapFrame.Height - 0.5;                        //地图下方 0.5cm 处的 Y 坐标
          //先写图例的标题
          LegendTitle := P_Shapes.AddText(x,y,RzEdit_PostTitle.Text);           //创建一个文本对象,图例的标题
          LegendTitle.Font.Face := cBox_PostTitle.SelectedFont.Name;            //图例标题用中文字体
          LegendTitle.Font.Size := SEdit_PostTitle.AsInteger;                   //图例标题字号(文字大小)
          LegendTitle.Font.HAlign := 1;                                         //水平靠左对齐
          LegendTitle.Font.VAlign := 4;                                         //垂直居中对齐
          W := LegendTitle.width + xInc1;                                       //整个图例内所有对象的宽度总和,首先这里的宽度起码是标题的宽度
          //产生自制图例的符号和标注
          NumPostBin := ClassesPostMapLayer.NumClasses;                         //分类散点图的分类数,决定数组长度
          LegendSym := VarArrayCreate([1,NumPostBin], varVariant);              //确定一维数组的长度,共有 NumPostBin 个符号元素
          LegendLab := VarArrayCreate([1,NumPostBin], varVariant);              //同上,共有 NumPostBin 个标注元素
          for I := 1 to NumPostBin do Begin                                     //做循环,设置各个元素的属性
            LegendSym := P_Shapes.AddSymbol(x,y);                                        //在位置 x,y 添加一个符号对象
            LegendSym.Marker.Set := ClassesPostMapLayer.BinSymbol.Set;                //符号集
            LegendSym.Marker.Index := ClassesPostMapLayer.BinSymbol.Index;            //所选择的符号
            LegendSym.Marker.Size := ClassesPostMapLayer.BinSymbol.Size;              //符号的大小
            LegendSym.Marker.LineColorRGBA.Color := ClassesPostMapLayer.BinSymbol.LineColor;    //符号边线的颜色
            LegendSym.Marker.FillColorRGBA.Color := ClassesPostMapLayer.BinSymbol.FillColor;    //符号填充的颜色
            w := w + LegendSym.Marker.Size + xInc1;                                                //累计符号所占宽度
            txtStr := FormatFloat('0.00',ClassesPostMapLayer.BinLowerLimit);
            txtStr := txtStr + ' - ' + FormatFloat('0.00',ClassesPostMapLayer.BinUpperLimit);   //图例的标注文字,用'分组下限-分组上限'方式
            LegendLab := P_Shapes.AddText(x,y,txtStr);                       //在位置 x,y 添加一个文字对象
            LegendLab.Font.Face := FontStr;                                  //图例标注的字体
            LegendLab.Font.Size := SEdit_LegendLabFontSize.AsInteger;        //图例标注的字号
            LegendLab.Font.HAlign := 1;                                      //图例标注的水平对齐方式:左齐
            LegendLab.Font.VAlign := 4;                                      //图例标注的垂直对齐方式:居中
            w := w + LegendLab.Width + xInc2;                                //标注文字所占宽度累计进去
          End;
          //确定图例标题的位置,左边界X的位置,Y的位置已经确定
          x := P_MapFrame.Left + (P_MapFrame.width - W)/2;                      //确定整个图例的最左边界
          LegendTitle.Left := x;                                                //首先显示图例的标题
          x := x + LegendTitle.Width + xInc1;                                   //移到标题加一个间隔的位置
          for I := 1 to NumPostBin do Begin                                     //做循环,摆放每一个符号和标注
            LegendSym.Left := x;
            x := x + LegendSym.Width + xInc1;
            LegendLab.Left := x;
            x := x + LegendLab.Width + xInc2;
          End;
        end;
        1:Begin            //选择了传统的垂直显示图例
          ClassesPostMapLayer.ShowLegend := True;                               //决定要显示图例
          PostLegend := ClassesPostMapLayer.Legend;                             //在分类散点图中创建一个图例
          PostLegend.Title := RzEdit_PostTitle.Text;                            //图例的标题
          PostLegend.TitleFont.Face := cBox_PostTitle.SelectedFont.Name;        //标题的字体
          PostLegend.TitleFont.Size := SEdit_PostTitle.AsInteger;               //标题的字号
          PostLegend.TitleFont.Bold := Bold_PostTitle.Checked;                  //标题是否粗体
          PostLegend.Top := P_MapFrame.Top - P_MapFrame.Height - 0.4;           //图例左上角图纸坐标: Y 值
          PostLegend.Left := P_MapFrame.Left + 0.2;                             //图例左上角图纸坐标: X 值
          PostLegend.FrameFill.Pattern := 'Solid';
          R_Color := ScaleFillColor.SelectedColor and $FF;                      //获得所选颜色的 R 值
          G_Color := (ScaleFillColor.SelectedColor and $FF00) shr 8;            //获得所选颜色的 G 值
          B_Color := (ScaleFillColor.SelectedColor and $FF0000) shr 16;         //获得所选颜色的 B 值
          PostLegend.FrameFill.ForeColorRGBA.Color := RGB(R_Color, G_Color, B_Color);           //填充颜色
          R_Color := ScaleLineColor.SelectedColor and $FF;                      //获得所选颜色的 R 值
          G_Color := (ScaleLineColor.SelectedColor and $FF00) shr 8;            //获得所选颜色的 G 值
          B_Color := (ScaleLineColor.SelectedColor and $FF0000) shr 16;         //获得所选颜色的 B 值
          PostLegend.FrameLine.ForeColorRGBA.Color := RGB(R_Color, G_Color, B_Color);           //边框线条颜色
          PostLegend.FrameStyle := 3;                                           //边框类型:1-没有,2-矩形,3-圆角矩形
          PostLegend.FrameLine.Width := 0.03;                                   //边框线条宽度
        End;
      End;
    End;
图片在哪儿呢?找到了再上。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-23 14:53:36 | 显示全部楼层
chengxf 发表于 2018-7-19 11:05
我曾经写过自定义图例的 Pascal 代码,可惜不是 C# 的,这段代码放出来给你参考。注释写得较详细,主要是 ...

感谢老师,我先看一下这个
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表