Gdal 之 dxf轉geojson (附加坐標轉換)


問題產生

  • 公司的webgis平台需要對接cad數據,因為很多客戶的數據是使用cad產生的。
  • 繪制cad時采用的坐標系不盡相同,有的bj54 有的xian80 有的cgcs 2000 ,再修改一下北(東)向加常數、中央經。
  • webgis采用cesium開發,坐標系框架為 wgs84

思路

  • gdal 讀取dxf文件,循環遍歷feature (dwg支持很弱,最好封裝成只支持dxf)
  • gdal 坐標轉換
  • gdal 將feature存入geojson

code

這里只記錄一下demo,沒有對坐標參數,dto等進行封裝

GdalBase.ConfigureAll();
Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");//支持中文路徑
Gdal.SetConfigOption("DXF_ENCODING", "UTF-8");

//創建北京54坐標系
var bj54 = new SpatialReference("");
bj54.ImportFromEPSG(4214);//4214
var clong = 121 + 35 / 60.0;
bj54.SetTM(0, clong, 2.0, 50825, -342129); //設置投影參數
bj54.SetTOWGS84(-143.309, -238.731, -83.562, -3.49779, 4.016604, -3.591758, -4.44782521); //設置七參數

var wgs84 = new SpatialReference("");
wgs84.ImportFromEPSG(4326);
var wgs84Geo = wgs84.CloneGeogCS();

//創建轉換
var coordinateTransformation = new CoordinateTransformation(bj54, wgs84Geo);

//讀取文件轉化為DataSource
var ds = Ogr.Open(filePath, 0);
if (ds == null)
{
    Console.WriteLine("打開文件失敗");
    return;
}

var extfile = "test.geojson";
if (File.Exists(extfile))
    File.Delete(extfile);

//獲取geojson驅動
var geojsonDriver = Ogr.GetDriverByName("GeoJSON");
var geojsonDataSource = geojsonDriver.CreateDataSource(extfile, null);
var geojsonLayer = geojsonDataSource.CreateLayer("JZD", wgs84Geo, wkbGeometryType.wkbUnknown, null);

//讀取第一個圖層,這個圖層不是cad中的layer
var oLayer = ds.GetLayerByIndex(0);
if (oLayer == null)
{
    Console.WriteLine("layer 獲取失敗");
    return;
}

//設置cad layer 篩選
//oLayer.SetAttributeFilter("Layer = \'JZD\'");

Feature feature;
while ((feature = oLayer.GetNextFeature()) != null)
{
    //獲取空間屬性
    var geometry = feature.GetGeometryRef();

    //轉換
    geometry.Transform(coordinateTransformation);

    //注意,轉換為后時 緯度 經度的順序 ,如果需要經度在前,需要交換xy
    geometry.SwapXY();
    geometry.CloseRings();
    var ret = geojsonLayer.CreateFeature(feature);
}


免責聲明!

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



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