如何将DataTable中存储的多边形数据解析转换为GeoJSON文件
问题原因分析
你当前代码的问题在于对coordinates的赋值逻辑和数据类型不匹配:
- GeoJSON的Polygon类型要求coordinates字段本身就是三层嵌套数组(结构为
[[[lng,lat],[lng,lat],...]],分别对应「多边形环集合-单环坐标序列-单点经纬度」三层结构) - 你现有代码写的
new [] { (record["Coordinates"]) }会给原有数据额外多嵌套一层数组,导致结构错误;同时如果record["Coordinates"]存的是字符串格式的坐标,还需要先做类型转换。
解决方法
分两种场景处理:
场景1:record["Coordinates"]已经是double[][][]/List<List<List<double>>>类型
直接赋值即可,不需要额外套数组层,修改geometry部分代码即可:
geometry = new { type = "Polygon", coordinates = record["Coordinates"] // 直接赋值,不用包new [] }
场景2:record["Coordinates"]存的是JSON格式的坐标字符串
先将字符串反序列化为符合要求的三维锯齿数组,再赋值:
geometry = new { type = "Polygon", coordinates = JsonConvert.DeserializeObject<double[][][]>(Convert.ToString(record["Coordinates"])) }
修改后的完整函数
public static string DataTableToGeoJSONString(DataTable dataTable) { var cityData = new { type = "FeatureCollection", features = dataTable.AsEnumerable().Select(record => new { type = "Feature", id = Convert.ToString(record["Id"]), properties = new { name = Convert.ToString(record["Name"]), density = Convert.ToInt32(record["NumCri"]) }, geometry = new { type = "Polygon", // 这里根据你的实际存储类型二选一即可 // 情况1:已经是数组类型 // coordinates = record["Coordinates"] // 情况2:是字符串类型 coordinates = JsonConvert.DeserializeObject<double[][][]>(Convert.ToString(record["Coordinates"])) }, }) }; return JsonConvert.SerializeObject(cityData); }
内容的提问来源于stack exchange,提问作者RAK
相关产品推荐
相关产品推荐

