C#应用GDAL通过传入范围获取tif数据的最大高程值及其坐标
2014-01-15 16:15
225 查看
GDAL的安装编译可参考 之前的博文。点击打开链接
此函数可通过传入一个规则范围position="left,top,rigth,bottom",返回这个范围内的最大高程及其坐标和最小高程及其坐标
此函数可通过传入一个规则范围position="left,top,rigth,bottom",返回这个范围内的最大高程及其坐标和最小高程及其坐标
public string GetMultifyElevation(string positions) { positions = "116.0,40.166667,116.25,40.0";//模拟传入的范围(left,top,right,bottom) float dProjX, dProjY , dProjX1, dProjY1; string[] arr = positions.Split(','); dProjX =float.Parse(arr[0]); dProjY = float.Parse(arr[1]); dProjX1 = float.Parse(arr[2]); dProjY1 = float.Parse(arr[3]); string strFilePath = "C:\\webservices\\data\\srtm\\chinaclip.tif";//读取的文件路径 string testPath = "C:\\webservices\\data\\chinaclip.tif";//要写的文件路径 string elvate = ""; Gdal.AllRegister(); Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); //支持中文 Dataset ds = Gdal.Open(strFilePath, Access.GA_ReadOnly); try { Band Band = ds.GetRasterBand(1); //获取图像的尺寸 int width = Band.XSize; int height = Band.YSize; //获取坐标变换系数 double[] adfGeoTransform = new double[6]; ds.GetGeoTransform(adfGeoTransform); //获取行列号 double dTemp = adfGeoTransform[1] * adfGeoTransform[5] - adfGeoTransform[2] * adfGeoTransform[4]; double dCol = 0.0, dRow = 0.0; dCol = (adfGeoTransform[5] * (dProjX - adfGeoTransform[0]) - adfGeoTransform[2] * (dProjY - adfGeoTransform[3])) / dTemp + 0.5; dRow = (adfGeoTransform[1] * (dProjY - adfGeoTransform[3]) - adfGeoTransform[4] * (dProjX - adfGeoTransform[0])) / dTemp + 0.5; int dc = Convert.ToInt32(dCol); int dr = Convert.ToInt32(dRow); dCol = (adfGeoTransform[5] * (dProjX1 - adfGeoTransform[0]) - adfGeoTransform[2] * (dProjY1 - adfGeoTransform[3])) / dTemp + 0.5; dRow = (adfGeoTransform[1] * (dProjY1 - adfGeoTransform[3]) - adfGeoTransform[4] * (dProjX1 - adfGeoTransform[0])) / dTemp + 0.5; int dc1 = Convert.ToInt32(dCol); int dr1 = Convert.ToInt32(dRow); int fx = dc - dc1; int fy = dr - dr1; if (fx < 0) fx = -fx; if (fy < 0) fy = -fy; //获取DEM数值到一维数组 float[] data = new float[fx * fy]; //读取感觉可以去掉 CPLErr err = Band.ReadRaster(dc, dr, fx, fy, data, fx, fy, 0, 0); //裁切 int[] bandmap = { 1 }; DataType DT = DataType.GDT_CFloat32; Dataset dataset = ds.GetDriver().Create(testPath, fx, fy, 1, DT, null); //写入 dataset.WriteRaster(0, 0, fx, fy, data, fx, fy, 1, bandmap, 0, 0, 0); Band bd = dataset.GetRasterBand(1); //获取最小最大值 double[] lim = new double[2]; bd.ComputeRasterMinMax(lim, 1); //最后的ApproxOK设为1,设为0效果一样 float _Min = (float)lim[0]; float _Max = (float)lim[1]; bd.ReadRaster(0, 0, fx, fy, data, fx, fy, 0, 0); int c =0; int x1 = -1, y1 = -1, x2 = -1, y2 = -1; //遍历获取行列值 for (int i = 0; i < fx; i++) { if (x2 != -1 && y2 != -1 && x1 != -1 && y1 != -1) { goto conmehere;//为了提高效率使用goto语句 } for (int j = 0; j < fy; j++) { if (x2 != -1 && y2 != -1 && x1 != -1 && y1 != -1) { goto conmehere; } if (_Min == data[c++]) { x1 = i; y1 = j; } if (_Max == data[c]) { x2 = i; y2 = j; } } } conmehere: //adfGeoTransform[0] 左上角x坐标 //adfGeoTransform[1] 东西方向分辨率 //adfGeoTransform[2] 旋转角度, 0表示图像 "北方朝上" //adfGeoTransform[3] 左上角y坐标 //adfGeoTransform[4] 旋转角度, 0表示图像 "北方朝上" //adfGeoTransform[5] 南北方向分辨率 Band.Dispose(); double geox1 = dProjX + x1 * adfGeoTransform[1] + y1 * adfGeoTransform[2]; double geoy1 = dProjY + x1 * adfGeoTransform[4] + y1 * adfGeoTransform[5]; double geox2 = dProjX + x2 * adfGeoTransform[1] + y2 * adfGeoTransform[2]; double geoy2 = dProjY + x2 * adfGeoTransform[4] + y2 * adfGeoTransform[5]; elvate = geox1 + "," + geoy1 + "," + _Min + ";" + geox2 + "," + geoy2 + "," + _Max; return elvate; } catch { return ""; } }
相关文章推荐
- GDAL获取指定地理坐标像元值、获取指定地理范围影像数据
- 【JavaEE企业应用实战学习记录】struts2实现登录并获取各个范围的数据
- C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
- 【Android应用开发】-(17)获取Google天气预报通过Xml和JSON解析数据
- 关于通过GPS模块获取的坐标数据无法在Google地图上正确标记的问题说明
- 通过服务器获取终端上应用软件更新数据的方法和系统
- C# 通过代理获取url数据
- 通过随机数生成办法,向int num[10][10]的数组 中存入数据并找出数组的最大、最小值及其下标。
- C# 系统应用之通过注册表获取USB使用记录
- C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
- ts实例应用之通过城市的citycode获取天气数据(逻辑)
- C#调用TeeChart显示数据,当放大时,怎样当前图表中获取X轴的最小值和最大值
- (转)在C#中使用WIA获取扫描仪数据(四、通过编程方式扫描图像)
- 关于通过GPS模块获取的坐标数据无法在Google地图上正确标记的问题说明
- 百度api商圈范围图修改获取坐标数据、点是否在区域范围判断、js解析创建excel
- 简单应用:通过经纬度获取Google天气数据
- Android实现通过浏览器点击链接打开本地应用(APP),并获取到传递的数据
- 通过区域坐标获取sqlserver中的geometry 的区域范围内的坐标
- C#通过API获取接收数据窗体控件句柄,并向该句柄发送文本信息
- 通过区域坐标获取sqlserver中的geometry 的区域范围内的坐标