Ajax调用从ASP.NET MVC控制器获取GeoJson数据



使用ASP.NET MVC 3和C#,我有一个网页来显示地图,我想在地图上添加一条由多个纬度和经度坐标组成的折线。使用传单JavaScript库,您可以添加GeoJson层。我想从C#中的数据库中获取经度和纬度坐标,并将坐标列表传递给JavaScript,以创建GeoJson或作为GeoJson

下面是我想要创建的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);

但我不知道如何将这个GeoJSONLinseString对象从C#传递到JavaScript。我无法使用Json这样通过:

return Json(data, JsonRequestBehavior.AllowGet);

只简单地看了一下GeoJSON.NET,它使用了JSON.NET。因此,在返回结果时,您需要使用JSON.NET序列化程序(.NET中的JSON序列化程序不知道JSON.NET属性。)要做到这一点,您只需序列化并返回这样的ContentResult(尚未测试):

var line = new GeoJSON.Net.Geometry.LineString(coordinates);
string json = JsonConvert.SerializeObject(line);
return Content(json, "application/json");

或者更好的是,您可以使用自定义的JSON.NET ActionResult。

顺便说一句,似乎存在多边形序列化不符合GeoJSON规范的问题——不确定这是否也会影响多段线。但事实上,这一问题一年来一直没有得到解决,这对GeoJSON库来说并不好。这个项目似乎被放弃了。

我们选择在netopologysuite中使用GeoJSON序列化,我记得它直接开箱即用。

我真的没有什么灵丹妙药,但我相信我至少可以为你指明正确的方向。

如果你碰巧使用PostGres/PostGIS,你可以使用ST_AsGeoJson函数直接从数据库返回GeoJson,这很方便。否则,您将希望从研究JSON.NET开始,这是ASPMVC的实际标准JSON序列化库。我发现它有点全面,我还没有深入研究它,以建议你如何超越一点熟悉。

此外,似乎有一个用于JSON.NET的GeoJson插件,它有一个Nuget包和相应的GitHub repo。我个人没有使用过它,所以我不能确切地保证它的稳定性/功能集等,但无论如何,它可能是一个很好的起点。

希望这能有所帮助,我很想听听你最终会做什么!

最新更新