从ASP.NET MVC控制器获取GeoJson数据的Ajax调用
在C#中使用ASP.NET MVC 3我有一个网页来显示我想要添加由多个纬度和经度坐标组成的多段线的地图。使用小册子 JavaScript库可以添加GeoJson图层。我想从C#中的数据库获取经度和纬度坐标,并将坐标列表传递给JavaScript以创建GeoJson或GeoJson。从ASP.NET MVC控制器获取GeoJson数据的Ajax调用
这是我希望创建以GeoJSON的示例:
var polyline = {
"type": "Feature",
"geometry": {
"type": "LineString",
"coordinates": [
[-105.00341892242432, 39.75383843460583],
[-105.0008225440979, 39.751891803969535] …
]
},
"properties": {
"popupContent": "This is a polyline of many coordinates.",
"underConstruction": false
}
};
如何创建以GeoJSON类似于上面所示和位置数据添加到“坐标”从C#或JavaScript部然后用它在JavaScript中添加图层这样:
var myLayer = L.geoJson().addTo(map);
myLayer.addData(polyline);
我一直在使用GeoJSON.net起步,并没有想出这个代码:
foreach (Position point in Positions)
{
coordinates.Add(point);
}
GeoJSON.Net.Geometry.LineString line = new GeoJSON.Net.Geometry.LineString(coordinates);
JavaScriptSerializer serializer = new JavaScriptSerializer();
var data = serializer.Serialize(lineString);
但我不知道如何将这个GeoJSON LinseString对象从C#传递给JavaScript。我无法通过使用JSON这样的:
return Json(data, JsonRequestBehavior.AllowGet);
只是简单地看了一下GeoJSON.NET,它使用了JSON.NET,所以当你返回结果时你需要使用JSON.NET序列化程序(JSON序列化程序在.NET中不知道JSON.NET属性)。做到这一点,你可以只序列化和返回一个像这样的ContentResult类型(没有测试):
var line = new GeoJSON.Net.Geometry.LineString(coordinates);
string json = JsonConvert.SerializeObject(line);
return Content(json, "application/json");
或更好的,你可以使用a custom JSON.NET ActionResult。
在附注中,似乎有an issue with serialization of polygons not complying with the GeoJSON specification - 不知道这是否也影响折线。但事实上,这一年还没有确定下来,并不能保证GeoJSON库的良好性。该项目似乎被放弃。
我们选择使用nettopologysuite中的GeoJSON序列化,我记得它是直接使用的。
作为后续工作,该库现在支持完整多边形序列化/反序列化。如果你发现任何问题,只需在GitHub上创建一个问题,我会尽快解决它。 – 2014-06-11 14:27:07
我真的没有一个神奇的子弹,但我相信我至少可以指出你在正确的方向。
如果您碰巧在使用PostGres/PostGIS,您可以使用ST_AsGeoJson函数直接从数据库返回GeoJson,这很方便。否则,您需要查看JSON.NET,这是ASP MVC的事实标准JSON序列化库。我发现它有点全面,而且我还没有深入研究它,可以暗示你如何继续进行,而不仅仅是获得一点熟悉。
此外,它似乎有一个JSON.NET的GeoJson插件,它有一个Nuget Package和相应的GitHub repo。我没有亲自使用它,所以我不能完全保证它的稳定性/功能设置等等,但无论如何它可能是一个很好的起点。
希望这会有所帮助,而且我会有兴趣听到你最终的结果!
GeoJson有要素和几何类,所以只需将ResponseJson传递给应该返回FeatureCollection对象的所有数据。我期待从GeoJosn获得填充的featureCollection对象 – Mohit 2016-06-10 15:57:08
您应该尝试使用JSON.NET序列化器而不是JavaScriptSerializer。另外,如果你像上面那样在控制器内部序列化,你应该返回一个ContentResult,因为JsonResult也会执行序列化。在下面的答案中添加了一些代码,以解释如何。 – 2012-08-03 06:50:55