• 编译GDAL支持ArcObjects


    编译GDAL支持ArcObjects。
    首先修改nmake.opt文件中对应的ArcObjects,修改后的如下所示:

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

    然后打开VS的命令行,cd到ArcObjects的目录,如F:WorkGDALgdal-1.11.2ogrogrsf_frmtsarcobjects。然后输入nmake /f makefive.vc plugin后回车输出如下图所示。
    nmake编译输出信息
    可以看到有很多错误,提示找不到olb文件,打开ogr_ao.h文件发现在46~48行,#import的时候指定的olb路径为写死的,将这几个路径改为自己的电脑中ArcGIS的安装目录即可,如下所示:

    // ArcGIS COM Includes
    #import "C:Program Files (x86)ArcGIScomesriSystem.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)ArcGIScomesriGeometry.olb" raw_interfaces_only, raw_native_types, named_guids, exclude("ISegment")
    #import "C:Program Files (x86)ArcGIScomesriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
    #import "C:Program Files (x86)ArcGIScomesriDataSourcesGDB.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids

    修改后的为:

    // ArcGIS COM Includes
    #import "C:Program Files (x86)ArcGISDesktop10.2comesriSystem.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)ArcGISDesktop10.2comesriGeometry.olb" raw_interfaces_only, raw_native_types, named_guids, exclude("ISegment")
    #import "C:Program Files (x86)ArcGISDesktop10.2comesriGeoDatabase.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
    #import "C:Program Files (x86)ArcGISDesktop10.2comesriDataSourcesGDB.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids

    保存后,再次运行nmake编译命令即可。输出如下图所示:
    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驱动。

  • 相关阅读:
    Delphi程序结构
    SQL存储过程解密 Encrypted object is not transferable, and script can not be generated

    在河南呢
    还在河南,写随笔吧
    HAVING
    mIRC
    关于CAP理论
    开篇
    移动信息系统
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313909.html
Copyright © 2020-2023  润新知