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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了