1、 下载源码
下载GDAL源码gdal213.zip,解压。建议解压两次,分别重命名文件夹为gdal-2.1.3-32和gdal-2.1.3-64,以便不同的文件夹编译不同的版本,防止混乱。
2、 编译xerces
Ø 下载xerces-c-3.1.4源码,解压c盘根目录。
Ø 打开C:\xerces-c-3.1.4\projects\Win32\VC10\xerces-all\xerces-all.sln编译生成32位和64位release版的lib与dll,分别在C:\xerces-c-3.1.4\Build\Win32\VC10\Release与C:\xerces-c-3.1.4\Build\Win64\VC10\Release路径下。
3、 安装ArcSDE的SDK
解压ArcSDE10SDK.iso,安装ArcSDE10SDK的32位版本和64位版本,本例分别对应安装在C:\ArcGIS\arcsde32与C:\ArcGIS\arcsde64路径。
4、 nmake.opt修改
Ø 32位执行执行如下步骤
1) 搜索定位“MSVC_VER=1500”,改为“MSVC_VER=1600”
2) 搜索定位“GDAL_HOME”,建议改为“GDAL_HOME = "C:\warmerda\bld32"”以示区分。
3) 搜索定位“XERCES_DIR”,删除“#”符号反注释,设置相关路径,与步骤2对应:
XERCES_DIR= C:\xerces-c-3.1.4
XERCES_INCLUDE= -I$(XERCES_DIR)/src -I$(XERCES_DIR)/src/xercesc
XERCES_LIB = $(XERCES_DIR)/Build/Win32/VC10/Release/xerces-c_3.lib
4) 搜索定位“SDE_ENABLED”,删除“#”符号反注释,设置路径和文件名,与步骤3对应:
SDE_ENABLED= YES
SDE_VERSION=100
SDE_PLUGIN= YES
SDE_SDK= C:\ArcGIS\arcsde32
SDE_INC= $(SDE_SDK)\include
SDE_LIB= $(SDE_SDK)\lib\pe.lib \
$(SDE_SDK)\lib\sde.lib $(SDE_SDK)\lib\sg.lib
Ø 对于64位执行如下步骤
1) 搜索定位“MSVC_VER=1500”,改为“MSVC_VER=1600”。
2) 搜索定位“GDAL_HOME”,建议改为“GDAL_HOME ="C:\warmerda\bld64"”以示区分。
3) 搜索定位“SYM_PREFIX=_”,将其改为“SYM_PREFIX=”。
4) 搜索定位“#WIN64=YES”,改为“WIN64=YES”。
5) 搜索定位“XERCES_DIR”,删除“#”符号反注释,设置相关路径,与步骤2对应,如下:
XERCES_DIR= C:\xerces-c-3.1.4
XERCES_INCLUDE= -I$(XERCES_DIR)/src -I$(XERCES_DIR)/src/xercesc
XERCES_LIB= $(XERCES_DIR)/Build/Win64/VC10/Release/xerces-c_3.lib
5) 搜索定位“SDE_ENABLED”,删除“#”符号反注释,设置路径和文件名,与步骤3对应:
SDE_ENABLED= YES
SDE_VERSION=100
SDE_PLUGIN= YES
SDE_SDK= C:\ArcGIS\arcsde64
SDE_INC= $(SDE_SDK)\include
SDE_LIB= $(SDE_SDK)\lib\pe.lib \
$(SDE_SDK)\lib\sde.lib$(SDE_SDK)\lib\sg.lib
5、 makefile.vc修改(只针对64位)
找到如下语句:
!IF$(MSVC_VER) < 1500
VB6_SAFEARRAYSYM= /INCLUDE:_vbSafeArrayToPtr@16
!ENDIF
BASE_INCLUDE= /INCLUDE:_GDALSimpleImageWarp@36 \
/INCLUDE:_GDALReprojectImage@48 \
/INCLUDE:_GDALComputeMedianCutPCT@32\
/INCLUDE:_GDALDitherRGB2PCT@28 \
/INCLUDE:_OCTNewCoordinateTransformation@8$(VB6_SAFEARRAYSYM)
修改为:
!IF$(MSVC_VER) < 1500
VB6_SAFEARRAYSYM= /INCLUDE:_vbSafeArrayToPtr
!ENDIF
BASE_INCLUDE= /INCLUDE:_GDALSimpleImageWarp \
/INCLUDE:_GDALReprojectImage \
/INCLUDE:_GDALComputeMedianCutPCT \
/INCLUDE:_GDALDitherRGB2PCT \
/INCLUDE:_OCTNewCoordinateTransformation$(VB6_SAFEARRAYSYM)
即删除@和后面的数字,有相关Link错误的,都需要删除。
6、 源码修改
1) GDAL_HOME\frmts\gdalallregister.cpp中,GDALAllRegister()函数的第一行添加以下语句,解决中文路径问题:
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
2) GDAL_HOME\ogr\ogrsf_frmts\generic\ogrregisterall.cpp中,OGRRegisterAll()函数第一行添加以下语句,解决中文路径问题:
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
3) GDAL_HOME\ogr\swq.cpp文件中,swq_identify_field函数中,将以下语句:
constchar* pszDot = strchr(field_token, '.');
if(pszDot && strchr(pszDot+1, '.') == NULL )
改为:
constchar* pszDot = strrchr(field_token, '.');
if(pszDot && strrchr(pszDot+1, '.') == NULL )
4) GDAL_HOME\ogr\ogrsf_frmts\sde\ogrsdelayer.cpp文件中,将以下语句:
char*pszUTF8 = CPLRecodeFromWChar((const wchar_t*)pszTempStringUTF16, CPL_ENC_UTF16,CPL_ENC_UTF8);
poFeat->SetField(i, pszUTF8 );
CPLFree(pszUTF8 );
修改为:
char*pszText = new char[(poFieldDef->GetWidth()+1) * sizeof(SE_WCHAR )];
memset(pszText,0, (poFieldDef->GetWidth()+1) * sizeof(SE_WCHAR ));
WideCharToMultiByte(CP_ACP,0, (WCHAR*)(pszTempStringUTF16), (poFieldDef->GetWidth()+1) *sizeof(SE_WCHAR ), pszText, (poFieldDef->GetWidth()+1) * sizeof(SE_WCHAR ),0, 0);
poFeat->SetField(i, pszText );
delete[]pszText;
pszText= NULL;
同时在最顶端添加“#include <windows.h>“,一定要放在最上面,否则编译会产生windef.h中的各种类型错误。
5) GDAL_HOME\ogr\ogrsf_frmts\gml\gmlreader.cpp文件中的SetFeaturePropertyDirectly函数前,添加以下功能函数:
std::stringConvertUtf8ToGBK(const char* strUtf8)
{
int len = MultiByteToWideChar(CP_UTF8,0, (LPCTSTR)strUtf8, -1, NULL,0);
wchar_t * wszGBK = new wchar_t[len];
//ZeroMemory(wszGBK, wcslen(wszGBK));
memset(wszGBK, 0, len *sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8,-1, wszGBK, len);
len = WideCharToMultiByte(CP_ACP, 0,wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, (len + 1) * sizeof(char));
WideCharToMultiByte (CP_ACP, 0, wszGBK,-1, szGBK, len, NULL,NULL);
std::string strTemp(szGBK);
delete []szGBK; szGBK = NULL;
delete []wszGBK; wszGBK = NULL;
return strTemp;
}
在poFeature->SetPropertyDirectly(iProperty, pszValue );前,添加代码:
std::stringstrTemp = ConvertUtf8ToGBK(pszValue);
ZeroMemory(pszValue,strlen(pszValue));
strcpy(pszValue,strTemp.c_str());
在顶端添加头文件“#include<Windows.h>”与“#include <string>“。
7、 执行编译
Ø 对于32位,启动“VisualStudio 命令提示(2010)“。
Ø 对于64位,启动“VisualStudio x64 Win64 命令提示(2010)“。
Ø 注意,每次修改nmake.opt重新编译时,务必首先执行nmake /f makefile.vc clean清除,否则会产生链接错误。
以下对32/64位均相同
1) cd GDAL_HOME 定位到GDAL根路径
2) nmake /fmakefile.vc 编译
3) nmake /fmakefile.vc install 安装
4) nmake /fmakefile.vc devinstall 开发版本安装
8、 使用
Ø 对于32位,GDAL安装结果在C:\warmerda\bld32文件夹下。将C:\xerces-c-3.1.4\Build\Win32\VC10\Release路径下的xerces-c_3_1.dll放在C:\warmerda\bld32\bin目录下。
Ø 对于64位,GDAL安装结果在C:\warmerda\bld64文件夹下。将C:\xerces-c-3.1.4\Build\Win64\VC10\Release路径下的xerces-c_3_1.dll放在C:\warmerda\bld32\bin目录下。