簡體   English   中英

如何返回KML內容

[英]How to return a KML content

我正在嘗試烹飪連接到數據庫的網絡api,獲取一些地理數據,然后返回將由網頁使用​​的KML內容(在Google Maps 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”的響應正文; 字符集= UTF-8' 。

我想念什么?

不幸的是,正如此答案所述,即使我設法即時創建KML內容,它也不會顯示在地圖上,因為該URL必須由Google公開訪問(出於緩存目的)。 我必須改變方法。

首先嘗試一下,我想知道任何對象的序列化是否存在問題:

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

這對我有用...

    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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM