如何在ASP.NET中生成KML文件?

Suk*_*tto 15 c# asp.net kml

如何在不将临时文件写入服务器或依赖第三方库或类的情况下直接生成KML文档并将其返回到浏览器?

Meh*_*ari 10

我建议你考虑使用HTTP Handler而不是ASP.NET页面.它将更清洁,更高效.只需在项目中添加"Generic Handler"类型的新项目,并考虑将代码移动到其ProcessRequest方法中.不过,一般方法都很好.

顺便说一下,除非你明确地将.kml文件映射到ASP.NET处理程序,否则它无论如何都不会运行.我建议使用默认.ashx扩展名并添加Content-DispositionHTTP标头来设置客户端的文件名:

Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
Run Code Online (Sandbox Code Playgroud)

另外,请注意您应该在将任何内容发送到客户端之前设置标题内容,因此您应该移动设置Content-Type并在其他内容之前添加标题.


完整解决方案(来自OP):

我是这样做的:

服务器

  1. 将.kml mimetype添加到您希望此"文件"生效的文件夹中.说,\\myDevServer\...\InetPub\KML
    (Google的说明仅适用于Apache)
    1. Internet Information Services (IIS) Manager在DEV服务器上打开
    2. 导航到您的DEV站点
    3. 右键单击该KML文件夹,然后选择Properties
    4. 单击HTTP Headers选项卡
    5. 单击MIME types按钮
    6. 点击 New
    7. 输入
      • 扩展名:.kml
      • MIME类型:application/vnd.google-earth.kml + xml
    8. 单击OK两次返回HTTP Headers选项卡
  2. KML文件夹设置为ASP.NET应用程序(可能是可选的,具体取决于服务器的设置方式)
    1. 单击Directory选项卡
    2. 单击Create按钮
    3. Application name字段随设置变为活动状态KML
    4. 单击OK,返回主IIS管理器窗口

网站

  1. 打开VS2008:
    1. 文件>>新网站
    2. 选择:
      • Empty Web Site
      • 语言: C#
      • 地点: \\myDevServer\...\InetPub\KML\
  2. Solution Explorer
    1. 右键单击该网站
    2. 选择 New Item
    3. Generic HandlerVisual Studio installed templates窗口中选择
    4. 输入名称(我使用过MelroseVista.ashx)
    5. 选择语言: Visual C#
    6. 点击 OK
  3. 粘贴以下代码

//

using System;
using System.Web;
using System.Xml;

public class Handler : IHttpHandler
{
    public void ProcessRequest( HttpContext context)
    {
        context.Response.ContentType = "application/vnd.google-earth.kml+xml";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=MelroseVista.kml");

        XmlTextWriter kml = new XmlTextWriter(context.Response.OutputStream, System.Text.Encoding.UTF8);

        kml.Formatting = Formatting.Indented;
        kml.Indentation = 3;

        kml.WriteStartDocument();

        kml.WriteStartElement("kml", "http://www.opengis.net/kml/2.2");
        kml.WriteStartElement("Placemark");
        kml.WriteElementString("name", "Melrose Vista   FL");
        kml.WriteElementString("description", "A nice little town");

        kml.WriteStartElement("Point");

        kml.WriteElementString("coordinates", "-80.18451400000000000000,26.08816400000000000000,0");

        kml.WriteEndElement(); // <Point>
        kml.WriteEndElement(); // <Placemark>
        kml.WriteEndDocument(); // <kml>

        kml.Close();

    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 尝试在您喜欢的浏览器中加载您的页面
  2. 应该得到一个弹出窗口询问你open或者save生成的KML文件.
  3. 如果你open这样做,你应该让GoogleEarth自己启动并缩放到佛罗里达州东部的图钉
  4. 如果是save这样,您应该在文件中看到以下内容

\

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
   <Placemark>
      <name>Melrose Vista   FL</name>
      <description>A nice little town</description>
      <Point>
         <coordinates>-80.18451400000000000000,26.08816400000000000000,0</coordinates>
      </Point>
   </Placemark>
</kml>
Run Code Online (Sandbox Code Playgroud)

注意:XmlTextWriter这里工作得很好.但是,XMLDocument对于较大的KML文件,我认为看起来更有希望,因为您可以在将其推送给用户之前在内存中对其进行操作.例如,如果您希望相同的点出现在GoogleEarth位置树的多个文件夹中.