c#实现json转kml、kmz、shp格式 | 您所在的位置:网站首页 › dwg转为kml › c#实现json转kml、kmz、shp格式 |
1.背景
最近要做一个地理空间数据不同格式之间的转换功能,在网上找了很多类库,因为我是在netcore中使用,所以找到两个比较好用的类库,第一个就是aspose.gis,但是收费的,就放弃这个了,第二个就是gdal类库,是免费的。最后选择的免费的gdal类库。 2.实现原理借助gdal类库,通过获取不同空间数据格式的驱动对不同格式的数据进行处理和转换(不同格式之间的互转也是类似)。在netcore中使用需要下载gdal.core类库和Gdal.Core.WindowsRuntime(windows版本)或者Gdal.Core.LinuxRuntime(linux版本)。 最终就是要实现数据的导入和导出功能: 1.数据导入:将不同格式的空间数据坐标信息入库,并将数据对应的坐标系转换成84坐标系(本篇不细讲导入),如下图: 2.数据导出:将数据库中的坐标信息导出成不同格式的文件,并将坐标系转换成对应选中的坐标系,如下图: 直接上干货: 需要注意的就是kml和kmz两个驱动名一样的时候会当成是kml解析 /// /// 将json转换为其他格式的文件 /// /// json的文件 /// 要转换成的目标格式 /// public static ExportJsonToFileDto JsonToFile(string filePath, string foramt) { try { //注册Gdal Gdal.AllRegister(); //注册Ogr Ogr.RegisterAll(); //属性支持中文 Gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8"); //支持中文路径 Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); DataSource ds = Ogr.Open(filePath, 0); if (ds == null)//打开失败 //返回的模型 return new ExportJsonToFileDto() { Result = false }; ; //获取驱动名 var layerName = GetDriverName(foramt); var dv = Ogr.GetDriverByName(layerName); var outPutPath = Path.Combine(Address, "json"); if (!Directory.Exists(outPutPath)) { Directory.CreateDirectory(outPutPath); } var fileName = $"{Guid.NewGuid()}.{foramt}"; outPutPath = Path.Combine(outPutPath, fileName); //属性值使用utf-8编码,要不然会乱码 string[] options = { "ENCODING=UTF-8" }; var result = dv.CopyDataSource(ds, outPutPath, options ); result.Dispose();//这是为了释放当前的gdal,同时可以补全转换后的json少括号的问题 dv.Dispose(); ds.Dispose(); return new ExportJsonToFileDto() { Result = true, FileName = fileName, FilePath = outPutPath }; } catch (Exception ex) { //写日志,可以记录一下错误信息 return new ExportJsonToFileDto() { Result = false }; } } /// /// 通过不同的数据格式获取对应的驱动类型 /// /// /// public static string GetDriverName(string fileFormat) { //if (string.IsNullOrWhiteSpace(fileFormat) return ""; var format = fileFormat.ToLower(); var layerName = ""; switch (fileFormat) { case "shp": layerName = "ESRI Shapefile"; break; case "geojson": case "json": layerName = "GeoJSON"; break; case "kml": layerName = "KML"; break; case "kmz": layerName = "LIBKML"; break; case "dxf": layerName = "dxf"; break; case "gpx": layerName = "GPX"; break; default: layerName = "PCIDSK"; break; } return layerName; } 4.特别说明(1)在一些稍微复杂的情况下,导出kml是正常的,但是导出kmz会有问题,针对这个问题,想了一种解决办法,就是先用gdal库导出成kml,然后把kml组织成kmz需要的格式文件即可(可以通过zip格式转成kmz)。 (2)针对通过kml间接导出的kmz文件,在导入kmz时,有时会拿不到空间数据,针对这个问题,也是要通过解压kmz的形式,提取当中的kml文件,然后直接导入kml文件即可拿到相应的空间数据。 |
CopyRight 2018-2019 实验室设备网 版权所有 |