title: ASP.NET VB KML Generator
body: <p>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.</p>
  
  <pre><code>&lt;%@ WebHandler Language="VB" Class="YourKML" %&gt;
  
  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 &lt;&gt; 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() &amp; ", " &amp; loc.Lat.ToString() &amp; ", 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("&lt;br/&gt;").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() &amp; ", " &amp; loc.Lat.ToString() &amp; ", 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
  </code></pre>