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

时间:2009-06-04 19:37:23

标签: c# asp.net kml

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

1 个答案:

答案 0 :(得分:10)

我建议你考虑使用HTTP Handler而不是ASP.NET页面。它将更清洁,更高效。只需在项目中添加“Generic Handler”类型的新项目,并考虑将代码移动到其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
    4. 设置,KML字段变为有效
    5. 单击OK,将您带回主IIS管理器窗口
  3. 网站

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

      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应该在文件中看到以下内容
      5. \

        <?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位置树的多个文件夹中。