您的位置:首页 > 移动开发 > Objective-C

编译GDAL支持ArcObjects

2015-03-23 22:59 357 查看
编译GDAL支持ArcObjects。

首先修改nmake.opt文件中对应的ArcObjects,修改后的如下所示:

#uncomment to use ArcObjects
ARCOBJECTS_ENABLED = YES
ARCOBJECTS_PLUGIN = YES
ARCOBJECTS_SDK = C:\Program Files (x86)\ArcGIS\Desktop10.2\com
ARCOBJECTS_INC = $(ARCOBJECTS_SDK)\..\include


然后打开VS的命令行,cd到ArcObjects的目录,如F:\Work\GDAL\gdal-1.11.2\ogr\ogrsf_frmts\arcobjects。然后输入nmake /f makefive.vc plugin后回车输出如下图所示。




可以看到有很多错误,提示找不到olb文件,打开ogr_ao.h文件发现在46~48行,#import的时候指定的olb路径为写死的,将这几个路径改为自己的电脑中ArcGIS的安装目录即可,如下所示:

// ArcGIS COM Includes
#import "C:\Program Files (x86)\ArcGIS\com\esriSystem.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE"), rename("min", "esrimin"), rename("max", "esrimax")
#import "C:\Program Files (x86)\ArcGIS\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, named_guids, exclude("ISegment")
#import "C:\Program Files (x86)\ArcGIS\com\esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "C:\Program Files (x86)\ArcGIS\com\esriDataSourcesGDB.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids


修改后的为:

// ArcGIS COM Includes
#import "C:\Program Files (x86)\ArcGIS\Desktop10.2\com\esriSystem.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, exclude("OLE_COLOR", "OLE_HANDLE", "VARTYPE"), rename("min", "esrimin"), rename("max", "esrimax")
#import "C:\Program Files (x86)\ArcGIS\Desktop10.2\com\esriGeometry.olb" raw_interfaces_only, raw_native_types, named_guids, exclude("ISegment")
#import "C:\Program Files (x86)\ArcGIS\Desktop10.2\com\esriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "C:\Program Files (x86)\ArcGIS\Desktop10.2\com\esriDataSourcesGDB.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids


保存后,再次运行nmake编译命令即可。输出如下图所示:




从上图中可以看出,又有一些错误信息,根据错误信息的提示,打开文件aoutils.cpp并定位到378~380和394~396行处,原始代码如下图所示:




通过查看olb文件导入的tlh文件可以发现,此处是用来判断ArcGIS产品的类型,在文件esrisystem.tlh中发现产品类型定义如下:

enum __declspec(uuid("06870014-a87e-48f0-81e4-41eb502e7470"))
esriLicenseProductCode
{
    esriLicenseProductCodeEngine = 10,
    esriLicenseProductCodeEngineGeoDB = 20,
    esriLicenseProductCodeArcServer = 30,
    esriLicenseProductCodeBasic = 40,
    esriLicenseProductCodeStandard = 50,
    esriLicenseProductCodeAdvanced = 60
};


从上面生成的代码可以发现,确实没有代码里面的esriLicenseProductCodeArcView、esriLicenseProductCodeArcEditor和esriLicenseProductCodeArcInfo这三个产品,原因应该是GDAL中ArcObjects的驱动写的时候使用ArcGIS早期的版本,而目前使用的10.0以后的版本发生了变化导致,而GDAL库中的代码没有做相应的调整导致。所以将上面三个分别改为esriLicenseProductCodeBasic、esriLicenseProductCodeStandard和esriLicenseProductCodeAdvanced 。保存后再次进行编译即可编译成功,提示信息如下图所示。




同时在源码文件夹下会生成一个ogr_ao.dll的插件文件,将该dll放入gdal的插件目录即可使用ArcObjects驱动。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: