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

9
使用C#和ASP.NET MVC 3,我有一个网页来展示一个地图,并想要添加一个由多个纬度和经度坐标组成的折线。通过 Leaflet 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
      }
};

如何在C#或JavaScript中创建类似上述GeoJson并将位置数据添加到“coordinates”部分,然后在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);

你应该尝试使用JSON.NET序列化器,而不是JavaScriptSerializer。此外,如果您像上面那样在控制器内进行序列化,则应返回ContentResult,因为JsonResult也执行序列化。我在下面的答案中添加了一些代码来解释如何操作。 - Asbjørn
2个回答

4

我简单地查看了一下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库来说并不是好兆头。该项目似乎已被放弃。
我们选择使用nettopologysuite中的GeoJSON序列化,我记得它能直接使用。

作为后续,该库现在支持完整的多边形序列化/反序列化。如果您发现任何问题,请在 GitHub 上创建一个 issue,我会尽快解决它。 - Goran Žuri

1

我并没有什么绝对有效的方法,但我相信我至少可以指导你朝正确的方向前进。

如果你正在使用PostGres/PostGIS, 你可以使用ST_AsGeoJson函数直接从数据库返回GeoJson,非常方便。否则,你需要先了解一下JSON.NET,这是ASP MVC的事实标准JSON序列化库。我觉得它有点复杂,我还没有深入研究过,所以无法建议你如何进一步操作,只能让你熟悉一下它。

此外,看起来有一个GeoJson插件可供JSON.NET使用,有Nuget Package和相应的GitHub repo。我个人没有使用过,因此无法确定其稳定性/功能集等等,但无论如何,它可能是一个很好的起点。

希望这有所帮助,我很想听听你最终选择了什么!

GeoJson有特征和几何类,因此只需将ResponseJson传递给它,就应该返回填充了所有数据的FeatureCollection对象。我希望从GeoJosn中获取填充了数据的featureCollection对象。 - Mohit Vashistha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接