[英]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.