gdal使用常见问题
????????1. 編譯proj高版本時,會發現proj.lib庫是靜態庫,如果不配置環境變量,會出現以下錯誤:
????????1)報錯
????????2)gdal庫中的OGRCreateCoordinateTransformation方法,創建對象失敗?
解決方法:
????????找到proj.db文件,需要設置用戶變量。
?????????2. 使用gdal時候,需要設置環境變量,必須指定到data文件夾所在路徑;
?????????3. 從gdal2.0升級到gdal3.0在使用上的變化;
????????1)API變化
- ????????SRS_WKT_WGS84宏定義被替換為SRS_WKT_WGS84_LAT_LONG;
- ????????空間參考類添加函數
OSRSetPROJSearchPaths(),
OSRExportToWktEx(),
OSRGetName(),
OSRIsSameEx(),
OSRGetCRSInfoListFromDatabase(),
OSRGetAreaOfUse(),
OSRGetAxisMappingStrategy(),
OSRSetAxisMappingStrategy(),
OSRGetDataAxisToSRSAxisMapping();
- ????????坐標轉換類添加函數
OCTCoordinateTransformationOptionsSetOperation(),?
OCTCoordinateTransformationOptionsSetAreaOfInterest(),
OCTDestroyCoordinateTransformationOptions(),
OCTNewCoordinateTransformationEx(), ???
OCTTransform4D();
- ????????移除函數
OSRFixupOrdering(),?
OSRFixup(),
OSRStripCTParms(),
OCTProj4Normalize(),
OCTCleanupProjMutex(),
OPTGetProjectionMethods(),
OPTGetParameterList(),
OPTGetParameterInfo()
????????2)空間參考定義
????????空間參考定義由于GDAL3.0以后的版本依賴的PROJ庫必須是6.0+的版本,而且是必須依賴,不像以前的版本proj庫可以動態加載,在編譯GDAL是不需要PROJ庫也可以,但是3.0以后的版本就不行了,編譯GDAL的時候必須要有PROJ6.0以上的版本才可以。
????????這樣就會引入一個問題,由于PROJ6里面需要proj.db數據庫的支持,這樣的話,在GDAL庫使用的話也需要proj.db的支持,否則定義空間參考時會報錯。proj.db文件默認會在proj.dll所在目錄的proj文件夾中找,也可以通過函數OSRSetPROJSearchPaths()來設置proj.db的所在目錄。
????????空間參考定義部分,基本上沒有發生大的變化,如果通過SRS_WKT_WGS84宏來定義WGS84橢球的話,需要改為SRS_WKT_WGS84_LAT_LONG宏來進行定義。
????????3)坐標轉換
????????坐標轉換時空間參考的定義必須使用函數SetAxisMappingStrategy來設置坐標軸對應策略,否則坐標轉換會失敗。下面兩份代碼分別是之前的版本和3.0以后的版本進行坐標轉換的寫法。
/=====================================gdal2.0++版本=====================================/#include "PCSTransform.h" #include <ogr_spatialref.h>GDALAllRegister(); OGRRegisterAll();OGRSpatialReference mOGRSourceSRS; OGRSpatialReference mOGRTargetSRS; OGRErr err1 = mOGRSourceSRS.importFromEPSG(sourceESPG); OGRErr err2 = mOGRTargetSRS.importFromEPSG(targetESPG); GRCoordinateTransformation *pOGRCT = OGRCreateCoordinateTransformation(&mOGRSourceSRS, &mOGRTargetSRS);double x = 經度; double y = 緯度; double z = 高度; if (pOGRCT == NULL || !pOGRCT->Transform(1, &x, &y, &z)) {std::cout << "Transformation failed" << std::endl; }/=====================================gdal3.0++版本=====================================/ #include "PCSTransform.h" #include <ogr_spatialref.h>GDALAllRegister(); OGRRegisterAll();OGRSpatialReference mOGRSourceSRS; OGRSpatialReference mOGRTargetSRS; OGRErr err1 = mOGRSourceSRS.importFromEPSG(sourceESPG); OGRErr err2 = mOGRTargetSRS.importFromEPSG(targetESPG); mOGRSourceSRS.SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER);//gdal3.0開始需要添加這個 mOGRTargetSRS.SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER);//gdal3.0開始需要添加這個 GRCoordinateTransformation *pOGRCT = OGRCreateCoordinateTransformation(&mOGRSourceSRS, &mOGRTargetSRS);double x = 經度; double y = 緯度; double z = 高度; if (pOGRCT == NULL || !pOGRCT->Transform(1, &x, &y, &z)) {std::cout << "Transformation failed" << std::endl; }????????4. shp另存為geojson - new line delimited 格式文件
????????必須使用gdal2.4以上版本
?GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GeoJSONSeq");
// 將shp文件轉化為json - Newline Delimited文件輸出 void parseShpfile2GeojsonFile(char *inFileName, char *outFileName) {GDALAllRegister();// 注冊驅動CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");// 支持中文路徑 CPLSetConfigOption("SHAPE_ENCODING", "");// 屬性表字段支持中文GDALDataset *poSrcDS = (GDALDataset *)GDALOpenEx(inFileName, GDAL_OF_VECTOR, NULL, NULL, NULL);// 打開文件,讀取數據// 判斷是否讀取成功if (poSrcDS == NULL){std::cout << "未能成功讀取!" << std::endl;return;}// json驅動// gdal必須要用大于等于2.4的版本GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GeoJSONSeq");// 復制shp文件到指定輸出的json文件 GDALDataset* poDstDS = poDriver->CreateCopy(outFileName, poSrcDS, FALSE, NULL, NULL, NULL);//int count = GetGDALDriverManager()->GetDriverCount();//for (size_t i = 0; i < count; i++)//{// std::string s = GetGDALDriverManager()->GetDriver(i)->GetDescription();// std::cout << s << std::endl;//}//釋放內存if (poDstDS != NULL)GDALClose((GDALDatasetH)poDstDS);GDALClose((GDALDatasetH)poSrcDS); }總結
以上是生活随笔為你收集整理的gdal使用常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中fopen的作用,c语言fope
- 下一篇: 如何强制性的卸载IE11浏览器