C#应用GDAL通过传入范围获取tif数据的最大高程值及其坐标
来源:互联网 发布:网易mumu模拟器mac版 编辑:程序博客网 时间:2024/06/05 18:10
GDAL的安装编译可参考 之前的博文。点击打开链接
此函数可通过传入一个规则范围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 ""; } }
0 0
- C#应用GDAL通过传入范围获取tif数据的最大高程值及其坐标
- C#使用GDAL计算某点的高程值
- GDAL获取指定地理坐标像元值、获取指定地理范围影像数据
- 使用GDAL将下载的Google卫星图像转为带坐标的tif
- C#使用GDAL将tif图像转换为jpg、bmp、png和gif格式的图像
- 如何免费下载高程数据并生成TIF文件
- GDAL通过RasterIO读写图像文件,数据集的创建,图像相关信息的获取
- C# ArcGISEngine通过经纬度坐标获取删格像元值
- 获取传入时间所在星期的时间范围
- C#获取鼠标的坐标
- nodejs获取http请求的传入数据
- 车主数据的应用范围
- iOS KVO 通过change值获取 CGPoint 的坐标点
- 腾讯地图画出区域获取该区域的范围坐标
- 获取组件当中某个Drawable所在的坐标范围
- 使用GDAL获取网络数据
- 代码备忘录(1)影像地理坐标的获取以及坐标系之间的转换(基于GDAL)
- C#通过WebService获取JSON数据并快速解析(百度地图坐标转换API为例)
- asp结合javascript,xml,sqlserve…
- 等待代码
- 简单的redis使用说明及性能测试
- Python的常用时间操作
- 开源中国 Maven 库使用帮助
- C#应用GDAL通过传入范围获取tif数据的最大高程值及其坐标
- 前淘宝工程师对12306的解读: 曾嗤之以鼻 现在认为几乎是奇迹
- ANDROID Event Handlers
- ASP.NET MVC 多语言方案
- 高位阶乘计算
- 易景地球使用 培训_入门
- Arrays工具类的使用
- 修改tabbar 背景图标
- HTML5版单机斗地主