【问题标题】:How do I generate a KML file in ASP.NET?如何在 ASP.NET 中生成 KML 文件?
【发布时间】:2009-06-04 19:37:22
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net kml


    【解决方案1】:

    我建议您考虑使用 HTTP 处理程序而不是 ASP.NET 页面。它将更清洁、更高效。只需将“通用处理程序”类型的新项目添加到您的项目中,并考虑将代码移至其ProcessRequest 方法。不过,一般的方法很好。

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

    Response.AddHeader("Content-Disposition", "attachment; filename=File.kml");
    

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


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

    我是这样做的:

    服务器

    1. 将 .kml mimetype 添加到您希望此“文件”所在的文件夹中。说,\\myDevServer\...\InetPub\KML
      (Google's instructions are only for Apache)
      1. 在您的 DEV 服务器上打开 Internet Information Services (IIS) Manager
      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. Visual Studio installed templates 窗口中选择Generic Handler
      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;
            }
        }
    }
    
    1. 尝试在您喜欢的浏览器中加载您的页面
    2. 应该看到一个弹出窗口,要求您使用opensave 生成的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>
    

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

    【讨论】:

    • 我会考虑使用 HTTP 处理程序谢谢。你有最喜欢的具体例子吗?假设我最终得到了我所拥有的,你会指出我上面的答案#2吗?我的背景主要是 perl hacking,我很难将代码隐藏集成到浏览器要求的实际页面中。
    • hmm... cmets 不保留垂直空格 :-(
    • 你不需要一个例子。只需右键单击项目 -> 添加新项目 -> 通用处理程序。它会为您创建一个模板。将上面 Page_Load 中的代码复制并粘贴到 ProcessRequest 方法中。您唯一需要更改的是在方法的开头添加“var Response = context.Response”。我还是找到了一个:stackoverflow.com/questions/873207/…
    猜你喜欢
    • 2011-06-10
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2023-04-06
    相关资源
    最近更新 更多