如何将存储在 DataTable 中的多边形信息解析为 JSON 文件?
How to parse polygon information stored in a DataTable into a JSON File?
我有一个数据 table 包含与城市相关的信息以及存储为多边形的边界。
我编写了以下函数将数据转换为 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"])
关于如何将数组的数组存储到坐标变量中有什么建议吗?
请注意,record["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
Fiddle: https://dotnetfiddle.net/mAJgfz
请记住,这是假设您的数据是完美的。我强烈建议您花时间设置一些条件语句以确保:
- outerArray变量可以解析为JArray
- 在声明 innerArray
之前 outerArray 中有超过 0 个项目
- innerArray 变量 可以 转换为 JArray
- itemArray 变量 可以 转换为 JArray
- itemArray 变量中有超过 1 个项目,然后将它们设置为 PointF
的 X/Y 值
- itemArray 的值可以 转换为 Single
我有一个数据 table 包含与城市相关的信息以及存储为多边形的边界。 我编写了以下函数将数据转换为 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"])
关于如何将数组的数组存储到坐标变量中有什么建议吗? 请注意,record["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
Fiddle: https://dotnetfiddle.net/mAJgfz
请记住,这是假设您的数据是完美的。我强烈建议您花时间设置一些条件语句以确保:
- outerArray变量可以解析为JArray
- 在声明 innerArray 之前 outerArray 中有超过 0 个项目
- innerArray 变量 可以 转换为 JArray
- itemArray 变量 可以 转换为 JArray
- itemArray 变量中有超过 1 个项目,然后将它们设置为 PointF 的 X/Y 值
- itemArray 的值可以 转换为 Single