編譯GDAL支持ArcObjects

編譯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後回車輸出如下圖所示。
nmake編譯輸出信息
可以看到有很多錯誤,提示找不到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編譯命令即可。輸出如下圖所示:
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驅動。

發佈了154 篇原創文章 · 獲贊 96 · 訪問量 125萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章