爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8489|回复: 14

(交作业)关于将DEM高程数据用MeteoInfoC开发显示

[复制链接]

新浪微博达人勋

发表于 2012-12-18 14:51:43 | 显示全部楼层 |阅读模式

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

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

x
  1. private void tsmiDEM_Click(object sender, EventArgs e)
  2.         {
  3.             Gdal.AllRegister();
  4.             OSGeo.GDAL.Dataset ds = Gdal.Open(@"E:\课题\抚顺市GIS数据\FS_DEM_100.img", Access.GA_ReadOnly);
  5.             int x = ds.RasterXSize;
  6.             int y = ds.RasterYSize;
  7.             Band demband = ds.GetRasterBand(1);

  8.             double[] gt = new double[6];
  9.             ds.GetGeoTransform(gt);

  10.             double nodatavalue;
  11.             int hasval;
  12.             demband.GetNoDataValue(out nodatavalue, out hasval);    // 获取没有数据的点的值

  13.             double[] databuf = new double[x * y];
  14.             demband.ReadRaster(0, 0, ds.RasterXSize, ds.RasterYSize, databuf, ds.RasterXSize, ds.RasterYSize, 0, 0); // 读取数据到缓冲区中

  15.             double min;
  16.             demband.GetMinimum(out min, out hasval);
  17.             double max;
  18.             demband.GetMaximum(out max, out hasval);

  19.             double[,] grid = new double[y, x];

  20.             for (int i = 0; i < y; i++)
  21.             {
  22.                 for (int j = 0; j < x; j++)
  23.                 {
  24.                     if (databuf[i * x + j] == nodatavalue)
  25.                     {
  26.                         grid[i, j] = 256;
  27.                     }
  28.                     else
  29.                     {
  30.                         grid[i, j] = Math.Round((databuf[i * x + j] - min) / (max - min) * 255 + 1, 0);
  31.                     }
  32.                 }
  33.             }

  34.             double xstart = Math.Round(gt[0], 5);
  35.             double xdelt = Math.Round(gt[1], 5);
  36.             double ystart = Math.Round(gt[3] + gt[5] * y, 5);
  37.             double ydelt = Math.Round(gt[5] * (-1), 5);
  38.             GridData dem_grid = new GridData(xstart, xdelt, x, ystart, ydelt, y);
  39.             dem_grid.Data = grid;

  40.             RasterLayer alayer = new RasterLayer();
  41.             string File = Application.StartupPath + "\\Map\\I-01.pal";
  42.             alayer = DrawMeteoData.CreateRasterLayer(dem_grid, "ss", File);
  43.             alayer.Visible = true;
  44.             layersLegend1.ActiveMapFrame.AddLayer(alayer);
  45.             layersLegend1.ActiveMapFrame.MoveLayer(alayer.Handle, 1);

  46.             //加入掩膜
  47.             MaskOut ma = new MaskOut(mapMain);
  48.             ma.MaskLayer = "抚顺地区";
  49.             ma.SetMaskLayer = true;
  50.             mapMain.MaskOut = ma;
  51.             mapMain.PaintLayers();

  52.             //显示范围
  53.             mapMain.ZoomToExtent(124.000000, 125.000000, 41.200000, 42.500000);
  54.         }
前些日子想自己利用MeteoInfoC写一个小程序,里面需要用到DEM数据,由于MeteoInfoC里面没有自带的读取模块,经自己的实验,现在利用MeteoInfoC+GDAL联合编程,终于可以在小程序里面显示DEM数据了,现提交作业,供大家交流!
疑问:1、使用了新版的MeteoInfoC,但在建立GridData dem_grid = new GridData(xstart, xdelt, x, ystart, ydelt, y);其中ydelt必须为正值,不然建立图层时会提示数据超界,不知为何?
2、生成的RasterLayer有没有匹配的图例,用原始的三种图例太长了!
DEM显示.png

评分

参与人数 1金钱 +15 贡献 +5 收起 理由
mofangbao + 15 + 5

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-12-18 15:45:24 | 显示全部楼层
如果有一部分示例代码会更好,当然,这些都是自己辛苦劳动来的,拿出来分享也是有难度的~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-18 16:13:27 | 显示全部楼层
很好的工作,GDAL的数据读取能力超强,可以弥补MeteoInfo对传统GIS栅格数据支持不足的弱点。

ydelt需要正值,程序就是这么设置的。

目前还没有专门的渐变图例。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-19 08:17:21 | 显示全部楼层
这图不错的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-19 10:31:14 | 显示全部楼层
本帖最后由 luckycomcn 于 2012-12-19 10:35 编辑

其实没有必要将数据转换,GridData本身支持浮点型的数据。
至于色标的话,自己创建一个就可以了。
GDAL库我觉得太大了,之前用了一段时间,后面因为用的东西不多,基本上都自己写了。

创建色标的代码,从脚本移植过来的,自己在用。

  1. //---- 生成等值线值数组
  2.             double[] vals = new double[15] { 5, 10, 15, 25, 40, 55, 100, 200, 300, 400, 500, 600, 700, 800,2000 };
  3.             //---- 生成颜色数组(因为填色的需要,颜色数组要比等值线值数组多一个元素)
  4.             Color[] colors = new Color[vals.Length + 1];
  5.             //---- 通过RGB值给定颜色,Color.FromArgb函数中第一个参数是alpha值(0是完全透明,255是完全不透明)
  6.             //---- 后面三个参数分别是R, G, B值
  7.             colors[0] = Color.FromArgb(255, 204, 255, 204);//5
  8.             colors[1] = Color.FromArgb(255, 191, 252, 189);//10
  9.             colors[2] = Color.FromArgb(255, 180, 247, 176);//15
  10.             colors[3] = Color.FromArgb(255, 169, 245, 162);//25
  11.             colors[4] = Color.FromArgb(255, 158, 242, 150);//40
  12.             colors[5] = Color.FromArgb(255, 145, 237, 135);//55
  13.             colors[6] = Color.FromArgb(255, 135, 235, 124);//100
  14.             colors[7] = Color.FromArgb(255, 123, 232, 111);//200
  15.             colors[8] = Color.FromArgb(255, 108, 227, 98);//300
  16.             colors[9] = Color.FromArgb(255, 97, 224, 85);//400
  17.             colors[10] = Color.FromArgb(255, 85, 219, 72);//500
  18.             colors[11] = Color.FromArgb(255, 71, 217, 47);//600
  19.             colors[12] = Color.FromArgb(255, 55, 212, 47);//700
  20.             colors[13] = Color.FromArgb(255, 39, 209, 33);//800
  21.             colors[14] = Color.FromArgb(255, 14, 204, 14);//2000
  22.             colors[15] = Color.FromArgb(0, 255, 255, 255);//>2000
  23.             //---- 生成图例,前两个参数是上面两个数组,第三个参数是图元类型(枚举类型,本例中是ShapetTypes.Polygon)
  24.             //---- 第4和5参数是最小值和最大值(本例中降水给的范围能包含所有可能数据即可)
  25.             //---- 第6个参数表明图例中是否有无效数据,最后一个参数是无效数据的值
  26.             LegendScheme aLS = LegendManage.CreateGraduatedLegendScheme(vals, colors, sType, 0, 1000, false, -9999.0);


之后用创建RasterLayer的时候这样就可以了
RasterLayer aLayer = MeteoInfoC.Data.MeteoData.DrawMeteoData.CreateRasterLayer(gdata, "ss", als);

评分

参与人数 1金钱 +8 贡献 +2 收起 理由
mofangbao + 8 + 2

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-12-19 13:49:25 | 显示全部楼层
两位的代码都不错
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-12-19 15:50:46 | 显示全部楼层

谢谢,代码非常有用,这样还可以解决在栅格图上显示图例的功能了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-24 23:40:18 | 显示全部楼层
luckycomcn 发表于 2012-12-19 10:31
其实没有必要将数据转换,GridData本身支持浮点型的数据。
至于色标的话,自己创建一个就可以了。
GDAL库 ...

楼主,请问R G B的值是自己调图设定的嘛,怎么设置比较好~?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-25 00:09:39 | 显示全部楼层
爱的侍者 发表于 2012-12-24 23:40
楼主,请问R G B的值是自己调图设定的嘛,怎么设置比较好~?

我不是楼主啊
颜色的话,我一般都是找到现成的图,然后反查RGB值的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-12-25 11:17:31 | 显示全部楼层
luckycomcn 发表于 2012-12-25 00:09
我不是楼主啊
颜色的话,我一般都是找到现成的图,然后反查RGB值的


.............哦 好的 谢谢 luckycomcn
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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