如何解析多边形信息存储在一个数据表到JSON文件?



我有一个数据表,其中包含与城市相关的信息以及存储为多边形的边界。我编写了以下函数将数据转换为JSON文件。

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",
coordinates = new [] { 
(record["Coordinates"])
}   
},

})
};
return JsonConvert.SerializeObject(cityData);
}

我理解多边形是数组的数组,因此下面的代码语句不起作用

type = "Polygon",
coordinates = new [] { 
(record["Coordinates"])

关于如何将数组的数组存储到坐标变量的任何建议?请注意,记录["Coordinates"]以以下格式存储坐标信息:

[[[23.444,44.444],[24.444,45.222],...]]]

看一下这个例子。它执行以下操作:

  1. 将文本解析为数组
  2. 从数组中获取第一项并将该项从通用令牌强制转换为数组
  3. 从步骤2
  4. 循环遍历数组中的每个项
  5. 将当前迭代项从泛型令牌强制转换为数组
  6. 创建一个新的PointF,并根据步骤4
  7. 中当前迭代数组的值将其添加到集合中
Private Function ParseCoordinates(json As String) As IEnumerable(Of PointF)
Dim outerArray As JArray = JArray.Parse(json)
Dim innerArray As JArray = DirectCast(outerArray.Item(0), JArray)
Dim points As New List(Of PointF)()
For Each item As JToken In innerArray
Dim itemArray As JArray = DirectCast(item, JArray)
points.Add(New PointF(itemArray.Item(0).Value(Of Single)(), itemArray.Item(1).Value(Of Single)()))
Next
Return points
End Function

小提琴:https://dotnetfiddle.net/mAJgfz

请记住,这假定您的数据是完美的。我强烈建议您花时间设置一些条件语句,以确保:

  1. outerArray变量可以是解析为JArray
  2. 在声明innerArray
  3. 之前outerArray中有超过0个条目innerArray变量可以是转换为JArrayitemArray变量可以是转换为JArray
  4. 在将itemArray变量设置为PointF
  5. 的X/Y值之前,itemArray变量中有多个项itemArray的值可以是强制转换为单个

相关内容

最新更新