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

16

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

1个回答

11

我建议你考虑使用HTTP Handler而不是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
    (谷歌的说明仅适用于Apache)
    1. 在 DEV 服务器上打开 Internet Information Services (IIS) Manager
    2. 导航到您的 DEV 站点
    3. 右键单击 KML 文件夹并选择 属性
    4. 单击 HTTP 标头 选项卡
    5. 单击 MIME 类型 按钮
    6. 点击 New
    7. 输入以下内容:
      • Extension: .kml
      • MIME Type: application/vnd.google-earth.kml+xml
    8. 单击 OK 按钮两次以返回 HTTP Headers 选项卡
  2. KML 文件夹设置为 ASP.NET 应用程序(根据您的服务器设置情况可能是可选的)
    1. 单击 目录 选项卡
    2. 单击 Create 按钮
    3. Application name 字段变为活动状态,并带有设置 KML
    4. 单击 OK 按钮,将您带回到主 IIS Manager 窗口

网站

  1. 打开 VS2008:
    1. 文件 >> 新建网站
    2. 选择:
      • 空网站
      • 语言:C#
      • 位置:\\myDevServer\...\InetPub\KML\
  2. Solution Explorer
    1. 右键单击网站
    2. 选择 New Item
    3. Visual Studio 安装模板 窗口中选择 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. 应该会弹出一个窗口询问是否打开保存生成的KML文件。
  3. 如果您选择打开,则应该会启动GoogleEarth并缩放到佛罗里达州东部的图钉位置。
  4. 如果您选择保存,则应该会在文件中看到以下内容:

\

<?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效果非常好。 但是,我认为对于更大的KML文件来说,XMLDocument看起来更加有前途,因为您可以在将其推送给用户之前在内存中操纵它。例如,如果您希望同一点出现在Google Earth位置树中的多个文件夹中。


我会研究使用HTTP处理程序,谢谢。你有喜欢的、具体的例子吗?假设我最终采用我现在拥有的东西,你能指引我去上面第二个答案吗?我的背景大多是Perl编程,我很难理解如何将代码与浏览器请求的实际页面集成。 - Sukotto
哦...注释不保留垂直空格 :-( - Sukotto
你不需要一个例子。只需右键单击项目->添加新项->通用处理程序。它会为您创建一个模板。将上面的Page_Load中的代码复制并粘贴到ProcessRequest方法中。您唯一需要更改的是在方法开头添加“var Response = context.Response”。我找到了一个:https://dev59.com/sXNA5IYBdhLWcg3wrPyq#873228 - Mehrdad Afshari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接