日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gdal使用常见问题

發(fā)布時間:2024/3/26 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gdal使用常见问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

????????1. 編譯proj高版本時,會發(fā)現(xiàn)proj.lib庫是靜態(tài)庫,如果不配置環(huán)境變量,會出現(xiàn)以下錯誤:

????????1)報錯

????????2)gdal庫中的OGRCreateCoordinateTransformation方法,創(chuàng)建對象失敗?

解決方法:

????????找到proj.db文件,需要設(shè)置用戶變量。

?????????2. 使用gdal時候,需要設(shè)置環(huán)境變量,必須指定到data文件夾所在路徑;

?????????3. 從gdal2.0升級到gdal3.0在使用上的變化;

????????1)API變化

  • ????????SRS_WKT_WGS84宏定義被替換為SRS_WKT_WGS84_LAT_LONG;
  • ????????空間參考類添加函數(shù)

OSRSetPROJSearchPaths(),
OSRExportToWktEx(),
OSRGetName(),
OSRIsSameEx(),
OSRGetCRSInfoListFromDatabase(),
OSRGetAreaOfUse(),
OSRGetAxisMappingStrategy(),
OSRSetAxisMappingStrategy(),
OSRGetDataAxisToSRSAxisMapping();

  • ????????坐標(biāo)轉(zhuǎn)換類添加函數(shù)

OCTCoordinateTransformationOptionsSetOperation(),?
OCTCoordinateTransformationOptionsSetAreaOfInterest(),
OCTDestroyCoordinateTransformationOptions(),
OCTNewCoordinateTransformationEx(), ???
OCTTransform4D();

  • ????????移除函數(shù)

OSRFixupOrdering(),?
OSRFixup(),
OSRStripCTParms(),
OCTProj4Normalize(),
OCTCleanupProjMutex(),
OPTGetProjectionMethods(),
OPTGetParameterList(),
OPTGetParameterInfo()

????????2)空間參考定義

????????空間參考定義由于GDAL3.0以后的版本依賴的PROJ庫必須是6.0+的版本,而且是必須依賴,不像以前的版本proj庫可以動態(tài)加載,在編譯GDAL是不需要PROJ庫也可以,但是3.0以后的版本就不行了,編譯GDAL的時候必須要有PROJ6.0以上的版本才可以。
????????這樣就會引入一個問題,由于PROJ6里面需要proj.db數(shù)據(jù)庫的支持,這樣的話,在GDAL庫使用的話也需要proj.db的支持,否則定義空間參考時會報錯。proj.db文件默認(rèn)會在proj.dll所在目錄的proj文件夾中找,也可以通過函數(shù)OSRSetPROJSearchPaths()來設(shè)置proj.db的所在目錄。
????????空間參考定義部分,基本上沒有發(fā)生大的變化,如果通過SRS_WKT_WGS84宏來定義WGS84橢球的話,需要改為SRS_WKT_WGS84_LAT_LONG宏來進行定義。

????????3)坐標(biāo)轉(zhuǎn)換

????????坐標(biāo)轉(zhuǎn)換時空間參考的定義必須使用函數(shù)SetAxisMappingStrategy來設(shè)置坐標(biāo)軸對應(yīng)策略,否則坐標(biāo)轉(zhuǎn)換會失敗。下面兩份代碼分別是之前的版本和3.0以后的版本進行坐標(biāo)轉(zhuǎn)換的寫法。

/=====================================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 = 經(jīng)度; 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 = 經(jīng)度; 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文件轉(zhuǎn)化為json - Newline Delimited文件輸出 void parseShpfile2GeojsonFile(char *inFileName, char *outFileName) {GDALAllRegister();// 注冊驅(qū)動CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");// 支持中文路徑 CPLSetConfigOption("SHAPE_ENCODING", "");// 屬性表字段支持中文GDALDataset *poSrcDS = (GDALDataset *)GDALOpenEx(inFileName, GDAL_OF_VECTOR, NULL, NULL, NULL);// 打開文件,讀取數(shù)據(jù)// 判斷是否讀取成功if (poSrcDS == NULL){std::cout << "未能成功讀取!" << std::endl;return;}// json驅(qū)動// gdal必須要用大于等于2.4的版本GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GeoJSONSeq");// 復(fù)制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;//}//釋放內(nèi)存if (poDstDS != NULL)GDALClose((GDALDatasetH)poDstDS);GDALClose((GDALDatasetH)poSrcDS); }

總結(jié)

以上是生活随笔為你收集整理的gdal使用常见问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。