Imports System

Imports System.Xml
Imports System.Text

Imports System.Collections.Generic

Public Class Test
	Public Shared Sub Main()

        Dim itiner As New KmlManage.Itinerario()
        itiner.SetTitolo("Titolo")
        itiner.SetDescrizione("Descrizione")
        itiner.SetItineraioCodice("ItinerarioCodice")


        Dim posiz As New KmlManage.Posizioni()
        Dim posizione As New KmlManage.Posizione()
        posizione.SetLatitude(37.810453)
        posizione.SetLongitude(-122.410617)
        posiz.AddPosizione(posizione)

        posizione = New KmlManage.Posizione()
        posizione.SetLatitude(36.810453)
        posizione.SetLongitude(-121.410617)
        posiz.AddPosizione(posizione)

        posizione = New KmlManage.Posizione()
        posizione.SetLatitude(35.810453)
        posizione.SetLongitude(-120.410617)
        posiz.AddPosizione(posizione)

        posizione = New KmlManage.Posizione()
        posizione.SetLatitude(34.810453)
        posizione.SetLongitude(-119.410617)
        posiz.AddPosizione(posizione)

        posizione = New KmlManage.Posizione()
        posizione.SetLatitude(33.810453)
        posizione.SetLongitude(-118.410617)
        posiz.AddPosizione(posizione)

        Dim kmlWrite As New KmlManage(itiner, posiz)
        kmlWrite.Generate()

	End Sub
End Class

Public Class KmlManage

    Protected itinerarioWrite As Itinerario
    Protected posizioniWrite As Posizioni

    Public Sub New(itinerario As Itinerario, posizioni As Posizioni)
        Me.itinerarioWrite = itinerario
        Me.posizioniWrite = posizioni
    End Sub

    Public Function Generate() As Boolean
        Dim ret As Boolean = False

        Try

            If IsNothing(itinerarioWrite) Then Throw New Exception("Errore impostazione itinerario")
            If IsNothing(posizioniWrite) Then Throw New Exception("Errore impostazione posizini")

            Dim lista As List(Of Posizione) = posizioniWrite.GetLista()
            If (lista.Count = 0) Then Throw New Exception("Errore numero posizioni")

            Dim nomeFile As String = itinerarioWrite.GetItinerarioCodice()

            Dim idStyle As String = "LineGreenPoly"
            Dim coordinate As String = String.Empty

            Dim defineTypeKml = "http://w...content-available-to-author-only...s.net/kml/2.2"

            For Each posizione As Posizione In lista
                Dim altitude As String = posizione.GetAltitude().ToString().Replace(",", ".")
                If (posizione.GetAltitude() = 0) Then altitude = "0.0"

                Dim line As String = posizione.GetLongitude().ToString().Replace(",", ".")
                line += "," + posizione.GetLatitude().ToString().Replace(",", ".")
                line += "," + altitude
                line += " "

                coordinate += line
            Next

            If (String.IsNullOrEmpty(coordinate)) Then Throw New Exception("Errore coordinate")

            Dim settings As XmlWriterSettings = New XmlWriterSettings()
            settings.Indent = True
            settings.Encoding = New ASCIIEncoding()

            Using writer As XmlWriter = XmlWriter.Create(nomeFile + ".xml", settings)

                writer.WriteStartDocument()
                writer.WriteStartElement("kml")
                writer.WriteAttributeString("xmlns", "kml", Nothing, defineTypeKml)

                writer.WriteStartElement("Document")

                writer.WriteElementString("name", itinerarioWrite.GetTitolo)
                writer.WriteRaw("<description><![CDATA[" + itinerarioWrite.GetDescrizione + "]]></description>")

                writer.WriteStartElement("Style")
                writer.WriteAttributeString("id", idStyle)

                writer.WriteStartElement("LineStyle")
                writer.WriteElementString("color", itinerarioWrite.GetColor)
                writer.WriteElementString("width", itinerarioWrite.GetWidth.ToString())
                writer.WriteEndElement()

                writer.WriteStartElement("PolyStyle")
                writer.WriteElementString("color", itinerarioWrite.GetColor)
                writer.WriteEndElement()

                writer.WriteEndElement()

                writer.WriteStartElement("Folder")

                writer.WriteElementString("name", itinerarioWrite.GetTitolo)

                writer.WriteStartElement("Placemark")

                writer.WriteElementString("styleUrl", "#" + idStyle)
                writer.WriteElementString("name", itinerarioWrite.GetTitolo)
                writer.WriteRaw("<description><![CDATA[" + itinerarioWrite.GetDescrizione + "]]></description>")

                writer.WriteStartElement("LineString") 

                writer.WriteElementString("extrude", "1")
                writer.WriteElementString("tessellate", "1")

                writer.WriteElementString("coordinates", coordinate) ' Lista di tutte le coordinate

                writer.WriteEndElement() 

                writer.WriteEndElement() 
                writer.WriteEndElement() 

                ' End document.
                writer.WriteEndElement()
                writer.WriteEndElement()
                writer.WriteEndDocument()

            End Using

            ret = True

        Catch ex As Exception


        End Try

        Return ret
    End Function

    Public Class Itinerario
        Protected titolo As String
        Protected descrizione As String
        Protected itinerariocodice As String

        Protected color As String = "7f00ffff"
        Protected width As Integer = 4

        Public Function GetWidth() As Integer
            Return Me.width
        End Function

        Public Sub SetWidth(color As Integer)
            Me.width = width
        End Sub

        Public Function GetColor() As String
            Return Me.color
        End Function

        Public Sub SetColor(color As String)
            Me.color = color
        End Sub

        Public Function GetDescrizione() As String
            Return Me.descrizione
        End Function

        Public Function GetTitolo() As String
            Return Me.titolo
        End Function

        Public Function GetItinerarioCodice() As String
            Return Me.itinerariocodice
        End Function

        Public Sub SetTitolo(titolo As String)
            Me.titolo = titolo
        End Sub

        Public Sub SetDescrizione(descrizione As String)
            Me.descrizione = descrizione
        End Sub

        Public Sub SetItineraioCodice(itinerarioCodice As String)
            Me.itinerariocodice = itinerarioCodice
        End Sub
    End Class

    Public Class Posizioni
        Protected lista As New List(Of Posizione)

        Public Function GetLista() As List(Of Posizione)
            Return lista
        End Function

        Public Sub AddPosizione(posizione As Posizione)
            lista.Add(posizione)
        End Sub
    End Class

    Public Class Posizione
        Protected longitude As Double
        Protected latitude As Double
        Protected altitude As Double

        Public Function GetAltitude() As Double
            Return Me.altitude
        End Function

        Public Function GetLatitude() As Double
            Return Me.latitude
        End Function

        Public Function GetLongitude() As Double
            Return Me.longitude
        End Function

        Public Sub SetAltitude(altitude As Double)
            Me.altitude = altitude
        End Sub

        Public Sub SetLongitude(longitude As Double)
            Me.longitude = longitude
        End Sub

        Public Sub SetLatitude(latitude As Double)
            Me.latitude = latitude
        End Sub
    End Class

End Class