GDAL11.1讀取shp數據中文亂碼的解決方案


項目中有個shp有1W多數據,需要計算出每個斑塊的面積,使用ESRI.ArcGIS.SpatialStatisticsTools.CalculateAreas出現如下C++調用錯誤

當然,這種錯誤不是我這種不會C++的能解決的。

后來使用了IArea接口遍歷獲取面積,速度太慢,被客戶BS了。后來在一朋友建議下用gdal,效率妥妥的,1W+數據不到1秒就讀完了。中間遇到了一個問題,使用了GDAL11.1版本,代碼如下:

//注冊所有格式
OSGeo.OGR.Ogr.RegisterAll();
// 支持中文路徑
 OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
 // 屬性表字段支持中文 
OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", "");

  

OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");能讀取到數據,但后面獲取的字段值是亂碼(一個黑色的菱形,里面一個?)...
OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");讀出來的數據直接為空....

后面百度,bing,看到了這個大神的回答
http://ask.csdn.net/questions/168732
 [DllImport("gdal111.dll", EntryPoint = "OGR_F_GetFieldAsString")]
  public extern static System.IntPtr OGR_F_GetFieldAsString(HandleRef handle, int i);

  這樣暴力的能讀取了,不過我在使用時候出現了另外一個錯誤:對 PInvoke 函數“xxxxx”的調用導致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標簽名不匹配。請檢查 PInvoke 簽名的調用約定和參數與非托管的目標簽名是否匹配。

解決方案如下,將上面的代碼改為這樣:

 [DllImport("gdal111.dll", EntryPoint = "OGR_F_GetFieldAsString", CallingConvention = CallingConvention.Cdecl)]
public extern static System.IntPtr OGR_F_GetFieldAsString(HandleRef handle, int i);

  

后面調用就成功了,測試能正確的讀取出中文屬性。

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM