我有一个数据表,其中包含与城市相关的信息以及存储为多边形的边界。我编写了以下函数将数据转换为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],...]]]
看一下这个例子。它执行以下操作:
- 将文本解析为数组
- 从数组中获取第一项并将该项从通用令牌强制转换为数组
- 从步骤2 循环遍历数组中的每个项
- 将当前迭代项从泛型令牌强制转换为数组
- 创建一个新的PointF,并根据步骤4 中当前迭代数组的值将其添加到集合中
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
请记住,这假定您的数据是完美的。我强烈建议您花时间设置一些条件语句,以确保:
- outerArray变量可以是解析为JArray
- 在声明innerArray 之前outerArray中有超过0个条目innerArray变量可以是转换为JArrayitemArray变量可以是转换为JArray
- 在将itemArray变量设置为PointF 的X/Y值之前,itemArray变量中有多个项itemArray的值可以是强制转换为单个