问题
Here is a handler (ashx) file that generates KMZ files (can generate KML by not using the Ionic compression classes (Ionic = DotNetZip at Codeplex). This handler uses an SQL table to populate the place marks but is a good example of ashx handler use, custom icon use, properly compressing the file, and populating place marks. By using context.Response.OutputStream, this is very efficient within the .NET engine.
<%@ WebHandler Language="VB" Class="YourKML" %>
Imports System
Imports System.Web
Imports System.Web.Configuration
Imports System.Xml
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Types
Imports MySql.Data.MySqlClient
Imports Ionic.Zip
Public Class YourKML : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.AppendHeader("Connection", "close")
'Response.ContentType = "application/vnd.google-earth.kml+xml"
'Response.ContentEncoding = System.Text.Encoding.UTF8
context.Response.ContentType = "application/vnd.google-earth.kmz"
context.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache)
Dim outzip As New ZipOutputStream(context.Response.OutputStream)
outzip.EnableZip64 = Zip64Option.Never
outzip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression
outzip.PutNextEntry("doc.kml")
Dim kmlout As New XmlTextWriter(outzip, System.Text.Encoding.UTF8)
kmlout.WriteStartDocument()
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("kml")
kmlout.WriteAttributeString("xmlns", "http://www.opengis.net/kml/2.2")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("Document")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("name", "doc.kml")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("Style")
kmlout.WriteAttributeString("id", "yoursym")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("IconStyle")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("Icon")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("href", "http://youriconimage")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement()
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("hotSpot")
kmlout.WriteAttributeString("x", "0.5")
kmlout.WriteAttributeString("y", "0.5")
kmlout.WriteAttributeString("xunits", "fraction")
kmlout.WriteAttributeString("yunits", "fraction")
kmlout.WriteEndElement()
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement()
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement()
kmlout.WriteWhitespace(vbCrLf)
PlacesKML(kmlout)
kmlout.WriteEndElement()
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndDocument()
kmlout.Flush()
outzip.Close()
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return True
End Get
End Property
Sub PlacesKML(ByVal kmlout As XmlTextWriter)
Using connection As New SqlConnection(WebConfigurationManager.ConnectionStrings("YourConnectionString").ConnectionString)
connection.Open()
Dim cmd As New SqlCommand("SELECT yourkey, Location FROM yourtable", connection)
Dim positrs As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
Dim curkey As String = ""
Dim comment As StringBuilder = New StringBuilder()
Dim loc As New SqlGeography()
With positrs
While .Read()
Dim yourkey As String = .GetString(.GetOrdinal("yourkey"))
If String.IsNullOrEmpty(yourkey) Then Continue While
If yourkey <> curkey Then
If Not String.IsNullOrEmpty(curkey) Then
kmlout.WriteStartElement("Placemark")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("name", curkey)
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("description")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteCData(comment.ToString())
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement() ' End Description
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("styleUrl", "#yoursym")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("Point")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("coordinates", loc.Long.ToString() & ", " & loc.Lat.ToString() & ", 0")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement() ' End Point
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement() ' End Place Mark
kmlout.WriteWhitespace(vbCrLf)
End If
curkey = yourkey
comment.Length = 0
comment.Append(yourkey)
loc = .GetProviderSpecificValue(.GetOrdinal("Location"))
Else
comment.Append("<br/>").Append(yourkey)
End If
End While
If Not String.IsNullOrEmpty(curkey) Then
kmlout.WriteStartElement("Placemark")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("name", curkey)
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("description")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteCData(comment.ToString())
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement() ' End Description
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("styleUrl", "#yoursym")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteStartElement("Point")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteElementString("coordinates", loc.Long.ToString() & ", " & loc.Lat.ToString() & ", 0")
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement() ' End Point
kmlout.WriteWhitespace(vbCrLf)
kmlout.WriteEndElement() ' End Place Mark
kmlout.WriteWhitespace(vbCrLf)
End If
End With
positrs.Close()
End Using
End Sub
End Class
回答1:
This is an example, not a question. Hopefully it will help others looking to use VB.net and ASP.NET to create kml/kmz files.
回答2:
I have another example strictly using SharpKml.
public void ProcessRequest(HttpContext context)
{
context.Response.AppendHeader("Connection", "close");
context.Response.ContentType = "application/vnd.google-earth.kmz";
context.Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
context.Response.AddHeader("Content-Disposition", "attachment; filename=mykmz.kmz");
Point point = new Point();
point.Coordinate = new Vector(-13.163959, -72.545992);
Placemark placemark = new Placemark();
placemark.Geometry = point;
placemark.Name = "Machu Picchu";
KmlFile kml = KmlFile.Create(placemark, false);
KmzFile kmz = KmzFile.Create(kml);
kmz.Save(context.Response.OutputStream);
}
来源:https://stackoverflow.com/questions/4717605/asp-net-vb-kml-generator