如何将存储在 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],...]]]

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

  1. 将文字解析为数组
  2. 从数组中获取第一项并将该项从通用标记转换为数组
  3. 遍历第 2 步中数组中的每一项
  4. 将当前迭代的项目从通用标记转换为数组
  5. 创建一个新的 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

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

  1. outerArray变量可以解析为JArray
  2. 在声明 innerArray
  3. 之前 outerArray 中有超过 0 个项目
  4. innerArray 变量 可以 转换为 JArray
  5. itemArray 变量 可以 转换为 JArray
  6. itemArray 变量中有超过 1 个项目,然后将它们设置为 PointF
  7. 的 X/Y 值
  8. itemArray 的值可以 转换为 Single