【问题标题】:How to return a KML content如何返回 KML 内容
【发布时间】:2014-05-28 15:19:24
【问题描述】:

我正在尝试制作一个连接到我的数据库的 web api,获取一些地理数据,然后返回一个网页将使用的 KML 内容(在谷歌地图 iframe/div 上显示信息)。

我正在使用sharpKML(我不知道这是否是正确的选择):

public class KmlController : ApiController
{
    public HttpResponseMessage Get()
    {
        Point point = new Point();
        point.Coordinate = new Vector(37.42052549, -122.0816695);

        Placemark placemark = new Placemark();
        placemark.Name = "Somewhere";
        placemark.Geometry = point;

        Kml kml = new Kml();
        kml.Feature = placemark;

        return Request.CreateResponse(HttpStatusCode.OK, kml, new XmlMediaTypeFormatter(), "application/vnd.google-earth.kml+xml");
    }
}

但是当我打电话给http://something.on.my.lan/api/kml 时,我得到了这个异常:

System.InvalidOperationException: “ObjectContent`1”类型无法序列化内容类型“application/vnd.google-earth.kml+xml”的响应正文; charset=utf-8'。

我错过了什么?

解决方案

不幸的是,正如this 回答中所说,即使我设法动态创建 KML 内容,它也不会显示在地图上,因为该 URL 必须由 Google 公开访问(用于缓存目的)。我必须改变方法。

【问题讨论】:

  • 奇怪的是,您正在对方法本身进行序列化。媒体格式化程序在 Global.asax 类的注册方法中设置。我猜你的格式化程序有冲突
  • 您建议如何执行此操作?我尝试 als 返回一个 Kml 对象,但自己没有管理序列化,但没有运气(类似的例外):“'ObjectContent`1' 类型无法序列化内容类型'application/xml; charset = utf-8'的响应主体。”

标签: c# asp.net-mvc-4 asp.net-web-api kml sharpkml


【解决方案1】:

先试试这个,不知道是不是任何对象的序列化有问题:

private string SerializeObject<T>(this T toSerialize)
{
    XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
    StringWriter textWriter = new StringWriter();

    xmlSerializer.Serialize(textWriter, toSerialize);
    return textWriter.ToString();
}


public class KmlController : ApiController
{
    public string Get()
    {
        Point point = new Point();
        point.Coordinate = new Vector(37.42052549, -122.0816695);

        Placemark placemark = new Placemark();
        placemark.Name = "Somewhere";
        placemark.Geometry = point;

        Kml kml = new Kml();
        kml.Feature = placemark;

        return SerializeObject<Kml>(kml);;
    }
}

如果失败,我建议您参考序列化文档,以便找到未正确序列化的对象。

http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx

【讨论】:

  • 是的,它失败了:异常详细信息已本地化,翻译它说:“SharpKml.Dom.Kml”类型的反射错误。
  • 这很可能意味着您的对象之一不是 [Serializable]
  • 我开始认为&lt;xml&gt; 中的&lt;kml&gt; 标记具有不同的XML 命名空间,导致序列化程序失败...
  • Xml 格式化程序使用的默认序列化程序是DataContractSerializer,因此您可以先检查使用该序列化程序对您的类型进行序列化以排除任何序列化问题
  • 如果我使用 SharpKml 特定的序列化程序,我会得到一个好的 KML 字符串: var serializer = new Serializer();序列化器。序列化(kml); var xml = 序列化程序.Xml;
【解决方案2】:

这对我有用...

    public static byte[] SerializeKml(this KmlFile kml)
    {
        var serializer = new Serializer(); 
        serializer.Serialize(kml.Root); 
        var str = serializer.Xml;

        var bytes = new byte[str.Length * sizeof(char)];
        Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

    public ActionResult GetKml()
    {
        Placemark placemark = new Placemark
        {
            Geometry = new Point { Coordinate = new Vector(-13.163959, -72.545992) },
            Name = "Machu Picchu",
        };

        var kml = KmlFile.Create(placemark, false);
        var fcResult = new FileContentResult(kml.SerializeKml(), "application/vnd.google-earth.kml+xml") { FileDownloadName = "MachuPicchu.kml" };
        return fcResult;
    }

【讨论】:

    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 2015-10-31
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多