Wechat: yu389741| Email: gisdqy@163.com

Shop:https://www.giserdqy.com/shop

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

以上过程参考http://blog.csdn.net/ivan_ljf/article/details/9187057#1536434-tqq-1-75020-f8c9cac2a0242f174d762b8bdff0e1f6


PS:如果你不想自己编译,可以去网盘下载;http://pan.baidu.com/s/1jGr50cI

7.新建一个窗体应用程序,添加对以上带_csharp的dllgdal19.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