C#使用GDAL计算某点的高程值
1.本人使用的是GDAL1.9.1,可以在http://download.osgeo.org/gdal/下载。
2.下载后解压到你所需要的位置如“C:\gdal-1.9.1”,可以修改以后的安装路径也可以不改,修改编译配置文件夹“C:\gdal-1.9.1\nmake.opt”。
以下是第41至第43行的内容:
!IFNDEF GDAL_HOME
GDAL_HOME = “C:\warmerda\bld”
!ENDIF
默认的情况下,GDAL将会安装到”C:\warmerda\bld”文件夹内
3.使用vs2008或者2010工具中的“visual studio命令提示符”编译,工具在“开始”–>”Microsoftvisual studio”–>visual studio Tools下。
4.打开“Visual Studio 2008 命令提示”工具,键入”cd C:\gdal-1.9.1″,进入源文件所在的文件夹,再键入”nmake /f makefile.vc”命令执行编译,大约需要几分钟。
5.安装文件。
键入“nmake /f makefile.vc install”,执行完毕后,”C:\warmerda\bld“文件夹下增加了bin,data,及html文件夹。
键入“nmake /f makefile.vc devinstall”执行完毕后,”C:\warmerda\bld“文件夹下增加了lib,include文件夹。这两个文件夹主要用于C及C++的开发。
在”C:\warmerda\bld\bin”文件夹内已经生成了gdal19.dll文件,以后重点用到。
6.编译C#源文件。
本过程需要安装swig,可以在网上下个swig然后放在相应的位置如:“C:\gdal-1.9.1\swig“,接下来在“C:\gdal-1.9.1\nmake.opt”文件中搜索“swig”替换相应的swig路径。
键入“cd C:\gdal-1.9.1\swig\csharp”,进入C#源文件所在的文件夹。
键入“nmake /f makefile.vc”,编译完毕后生成8个DLL文件:gdal_csharp.dll、gdalconst_csharp.dll、ogr_csharp.dll、osr_csharp.dll和gdal_wrap.dll、gdalconst_wrap.dll、ogr_wrap.dll、osr_wrap.dll。
PS:如果你不想自己编译,可以去网盘下载;http://pan.baidu.com/s/1jGr50cI。
7.新建一个窗体应用程序,添加对以上带_csharp的dll和gdal19.dll的引用(放在生成的Debug文件夹下即可),主函数如下:
using OSGeo.GDAL;
public int GetData(double dProjX, double dProjY)
{
string strFilePath = "C:\\webservices\\data\\srtm\\chinaclip.tif";
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);
//获取DEM数值到一维数组
float[] data = new float[1 * 1];
CPLErr err = Band.ReadRaster(dc, dr, 1, 1, data, 1, 1, 0, 0);
Band.Dispose();
int elvate = (int)data[0];
return elvate;
}
catch
{
return 1;
}
}
在formload中调用时输入x,y的值即可得到对应的高程值。因为其中有int和float的转换可能造成进度丢失,相应点的高程值可能有所出入,但相差不会太大。
转载自:https://blog.csdn.net/nothing_is_imposible/article/details/17550139