将 DataTable 序列化为 GeoJSON 对象?
Serialize DataTable to GeoJSON object?
我在将数据表转换为 GeoJSON 对象时遇到了问题。
数据表如下所示:
Name Status imageUrl lat lon
Joe Dev markers/Dev.svg 34.21092 -77.59384
Mary Dev markers/Dev.svg 32.49323 -78.43144
GeoJSON 应如下所示:
{
"type" : "FeatureCollection",
"features" : [
{
"type" : "Feature",
"properties" : {
"Name " : "Joe",
"Status" : "Dev",
"imageUrl" : "markers/Dev.svg",
"lat" : 34.21092,
"lon" : -77.59384
},
"geometry" : {
"type" : "Point",
"coordinates" : [ -77.59384, 34.21092 ]
}
},
{
"type" : "Feature",
"properties" : {
"Name " : "Mary",
"Status" : "Dev",
"imageUrl" : "markers/Dev.svg",
"lat" : 32.49323,
"lon" : -78.43144
},
"geometry" : {
"type" : "Point",
"coordinates" : [ -78.43144, 32.49323 ]
}
}
]
}
我一直在到处寻找,但还没有找到解决办法。我一直在使用 NewtonSoft 将 DataTable
序列化为 JSON
对象,但 GeoJSON 是一种复杂得多的格式。
最困难的部分是必须将类别包含在其他类别中。无论如何,这是我尝试过的:
使用 Newtonsoft
,我能够将数据表转换为 JSON。显然,这不是解决方案:
string callback = JsonConvert.SerializeObject(dataTable);
[] resultBytes = Encoding.UTF8.GetBytes(callback);
return new System.IO.MemoryStream(resultBytes);
更进一步,这是我尝试添加一些 geojson 属性的方法:
var envelope = new
{
type = "FeatureCollection",
features = result.Tables[0]
};
string callback = JsonConvert.SerializeObject(envelope);
byte[] resultBytes = Encoding.UTF8.GetBytes(callback);
这个 returns 更接近,但它仍然缺少每个数组中的 {"type": "Feature", "properties"
。
最后,我 post 在这里提出了一个类似的问题,它非常有帮助,但它以实际的 json
而不是 datatable
作为参数,这带来了其他问题的主机,主要是这个 here.
所以我决定从头开始 post 一个问题,询问我如何获取源(常规数据表)并将其转换为 GeoJson
对象,如上面的对象。
感谢任何帮助。
您需要将 dataTable
条记录映射到多维对象结构中。我建议使用 LinQ 这样做。
要迭代数据表,请对数据表对象使用 .AsEnumerable()
。
解决方案: 创建一个函数,将 convert
中的 DataTable
转换为 GeoJSON 字符串。
确保在您的 .cs
文件中导入 System.Linq
namespace
public static string DataTableToGeoJSONString(DataTable dataTable)
{
var envelope = new
{
type = "FeatureCollection",
features = dataTable.AsEnumerable().Select(record => new {
type = "Feature",
properties = new
{
Name = Convert.ToString(record["Name"]),
Status = Convert.ToString(record["Status"]),
imageUrl = Convert.ToString(record["imageUrl"]),
lat = Convert.ToDecimal(record["lat"]),
lon = Convert.ToDecimal(record["lon"])
},
geometry = new
{
type = "Point",
coordinates = new[] {
Convert.ToDecimal(record["lon"]),
Convert.ToDecimal(record["lat"])
}
}
}).ToArray()
};
return JsonConvert.SerializeObject(envelope);
}
然后只需从中取出 JSON 字符串
string geoJson = DataTableToGeoJSONString(dataTable);
请注意,此代码示例使用匿名 classes new {}
。它有效,但我建议使用您必须创建的强类型 class。
这应该以预期的 GeoJSON 格式序列化。
我在将数据表转换为 GeoJSON 对象时遇到了问题。
数据表如下所示:
Name Status imageUrl lat lon
Joe Dev markers/Dev.svg 34.21092 -77.59384
Mary Dev markers/Dev.svg 32.49323 -78.43144
GeoJSON 应如下所示:
{
"type" : "FeatureCollection",
"features" : [
{
"type" : "Feature",
"properties" : {
"Name " : "Joe",
"Status" : "Dev",
"imageUrl" : "markers/Dev.svg",
"lat" : 34.21092,
"lon" : -77.59384
},
"geometry" : {
"type" : "Point",
"coordinates" : [ -77.59384, 34.21092 ]
}
},
{
"type" : "Feature",
"properties" : {
"Name " : "Mary",
"Status" : "Dev",
"imageUrl" : "markers/Dev.svg",
"lat" : 32.49323,
"lon" : -78.43144
},
"geometry" : {
"type" : "Point",
"coordinates" : [ -78.43144, 32.49323 ]
}
}
]
}
我一直在到处寻找,但还没有找到解决办法。我一直在使用 NewtonSoft 将 DataTable
序列化为 JSON
对象,但 GeoJSON 是一种复杂得多的格式。
最困难的部分是必须将类别包含在其他类别中。无论如何,这是我尝试过的:
使用 Newtonsoft
,我能够将数据表转换为 JSON。显然,这不是解决方案:
string callback = JsonConvert.SerializeObject(dataTable);
[] resultBytes = Encoding.UTF8.GetBytes(callback);
return new System.IO.MemoryStream(resultBytes);
更进一步,这是我尝试添加一些 geojson 属性的方法:
var envelope = new
{
type = "FeatureCollection",
features = result.Tables[0]
};
string callback = JsonConvert.SerializeObject(envelope);
byte[] resultBytes = Encoding.UTF8.GetBytes(callback);
这个 returns 更接近,但它仍然缺少每个数组中的 {"type": "Feature", "properties"
。
最后,我 post 在这里提出了一个类似的问题,它非常有帮助,但它以实际的 json
而不是 datatable
作为参数,这带来了其他问题的主机,主要是这个 here.
所以我决定从头开始 post 一个问题,询问我如何获取源(常规数据表)并将其转换为 GeoJson
对象,如上面的对象。
感谢任何帮助。
您需要将 dataTable
条记录映射到多维对象结构中。我建议使用 LinQ 这样做。
要迭代数据表,请对数据表对象使用 .AsEnumerable()
。
解决方案: 创建一个函数,将 convert
中的 DataTable
转换为 GeoJSON 字符串。
确保在您的 .cs
文件中导入 System.Linq
namespace
public static string DataTableToGeoJSONString(DataTable dataTable)
{
var envelope = new
{
type = "FeatureCollection",
features = dataTable.AsEnumerable().Select(record => new {
type = "Feature",
properties = new
{
Name = Convert.ToString(record["Name"]),
Status = Convert.ToString(record["Status"]),
imageUrl = Convert.ToString(record["imageUrl"]),
lat = Convert.ToDecimal(record["lat"]),
lon = Convert.ToDecimal(record["lon"])
},
geometry = new
{
type = "Point",
coordinates = new[] {
Convert.ToDecimal(record["lon"]),
Convert.ToDecimal(record["lat"])
}
}
}).ToArray()
};
return JsonConvert.SerializeObject(envelope);
}
然后只需从中取出 JSON 字符串
string geoJson = DataTableToGeoJSONString(dataTable);
请注意,此代码示例使用匿名 classes new {}
。它有效,但我建议使用您必须创建的强类型 class。
这应该以预期的 GeoJSON 格式序列化。