win10、vs2015配置GDAL2.4.1
首先,安装好vs15(其他版本也可以),下载好gdal安装包,可以去官网下载需要的版本, 但是我在配置最新版3.0.2的时候出现了错误,所以选择了之前的版本2.4.1(原因就没有去看了),这里我选择的是 zip 格式。
1、解压文件
将下载好的gdal解压到自定义目录,比如我的是D:\software\gdal241
2、修改解压文件目录下的 makefile.opt 文件
- 进入解压后的目录,找到nmake.opt文件并打开,打开方式选择Editplus、vs等都可,我选择vs打开;
- 找到57行(也可能是附近几行),修改 GDAL_HOME = “C:\warmerda\bld” 内容为你解压的文件夹路径;
- 将191行(也可能是附近几行)中 #WIN64=YES去掉前面的 “#”;
- 点击保存后关闭文件。
3、编译
在搜索中输入cmd后回车,选择VS2015 ×64 本机工具命令提示符。
- 输入cd D:\software\gdal241 ,回车;cd后面是你gdal解压的文件路径,按照你自己的路径输入。这样就进入到gdal路径里面了,我们在这个路径下操作。
- 输入第一个命令: nmake -f makefile.vc ,输入完成后回车,如下图2-1,等待编译完成,这需要等待几分钟,完成后如图2-2;
图2-1
图2-2
3. 键入第二个命令: nmake /f makefile.vc install , 输入完成后回车,如下图3-1,等待编译完成,这需要等待几分钟,完成后如图3-2;
图3-1
图3-2
- 键入第三个命令: nmake /f makefile.vc devinstal ,输入完成后回车,如下图4-1,等待编译完成,这需要等待几分钟,完成后如图4-2;
图4-1
图4-2
4、在VS2015中配置
- 编译完成,关闭cmd窗口。进入到vs中,创建一个空项目,为了避免调试的错误,提前设置这个为×64;
- 然后点击新建的项目,右键 -> 属性 按着下图配置,在包含目录添加gdal文件中的include文件夹路径、库目录中添加lib文件夹路径;
- 进入链接器->常规->附加库目录,添加lib文件夹路径;
- 进入链接器->输入->附加依赖项,添加gdal_i.lib,点击确定。
5、测试
将D:\software\gdal241\bin 下的gdal204.dll 复制,粘贴到刚才新建的vs项目的debug/bin 下 ,注意生成解决方案平台与放入的目录平台一致。如我的都是: Debug/x64。
至此,gdal已经配置完成,写一段代码测试一下看看是否成功了!
我参照博客案例中代码进行测试,运行结果会在D盘下生成一个newShp.shp。
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include <ogrsf_frmts.h>
#include <gdal_priv.h>
#include <ogr_geometry.h>
#include <iostream>
//生成shp文件
int main()
{
const char *pszDriverName = "ESRI Shapefile";
GDALDriver *poDriver;
CPLSetConfigOption("SHAPE_ENCODING", "UTF-8"); //避免乱码
GDALAllRegister();
poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName);
if (poDriver == NULL)
{
printf("%s driver not available.\n", pszDriverName);
return 0;
}
GDALDataset *poDS;
poDS = poDriver->Create("d:/newShp.shp", 0, 0, 0, GDT_Unknown, NULL); //创建shp文件
if (poDS == NULL)
{
printf("Creation of output file failed.\n");
return 0;
}
OGRLayer *poLayer;
poLayer = poDS->CreateLayer("point_out", NULL, wkbPoint, NULL);
if (poLayer == NULL)
{
printf("Layer creation failed.\n");
return 0;
}
OGRFieldDefn idField("ID", OFTReal);
OGRFieldDefn firstField("NAME", OFTInteger);
OGRFieldDefn secondField("X", OFTReal);
OGRFieldDefn thirdField("Y", OFTString);
idField.SetWidth(32);
firstField.SetWidth(32);
secondField.SetWidth(32);
poLayer->CreateField(&idField);
poLayer->CreateField(&firstField);
poLayer->CreateField(&secondField);
poLayer->CreateField(&thirdField);
int x, y;
int a = 10, b = 100;
for (int i = 1; i <= 10; i++)
{
OGRFeature *poFeature;
poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());
poFeature->SetField("ID", i);
poFeature->SetField("NAME", i);
x = (rand() % (b - a)) + a;
y = (rand() % (b - a)) + a;
poFeature->SetField("X", x);
poFeature->SetField("Y", "你好,弟中弟");
OGRPoint pt;
pt.setX(x);
pt.setY(y);
poFeature->SetGeometry(&pt);
if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
{
printf("Failed to create feature in shapefile.\n");
return 0;
}
OGRFeature::DestroyFeature(poFeature);
}
GDALClose(poDS);
return 1;
}
查看运行结果: