Visualisierung von Adresslisten @PowerShell

Problemstellung

Basis ist der Artikel Visualisierung von Adresslisten. Die Problemstellung ist die Selbe, nur „aber ich hab doch kein Linux“ kommt nun hinzu. Und weil es schon interessant ist, das selbe Problem auch mal anders zu lösen, nun nochmal in der PowerShell, die unter Windows schon wirklich viel nutzbares mit bringt, was doch eher unter Unix allgemein als Bordmittel bekannt ist. Also gleich ans Eingemachte:

Denken wir Groß – nun in der PowerShell

Als Basis dient wieder die selbe *.csv mit folgendem Inhalt

Gruppe;Name;Beschreibung;Adresse
Macs;Mac1;Nikolaiort;Nikolaiort 1-2 49074 Osnabrück-Innenstadt
Macs;Mac2;Theodor-Heuss-Platz;Theodor-Heuss-Platz 1 49074 Osnabrück-Innenstadt
Macs;Mac3;Pagenstecher;Pagenstecherstr. 72 49090 Osnabrück-Hafen
Macs;Mac4;Hannoversche;Hannoversche Str. 45 49084 Osnabrück-Fledder
Macs;Mac5;Hauptstrasse;Hauptstr. 105 49205 Hasbergen-Gaste
BKing;BKay1;Moserstrasse;Moserserstr. 51 49074 Osnabrück
BKing;BKay2;Pagenstecher;Pagenstecherstr. 50 A 49090 Osnabrück
BKing;BKay2;Hannoversche;Hannoversche Str. 74 49084 Osnabrück

Parse the Line

Auch hier geht es erstmal mit dem Einlesen und dem Parsen los. Hier aber direkt incl. der Sortierung:

$gruppe = @{Expression='Gruppe'; Ascending=$true }
$name   = @{Expression='Name';   Ascending=$true }
$daten  = (Import-Csv -Path ./daten.csv -Delimiter ';') | sort-object -property $gruppe,$name

foreach ($adress in $daten){
    Write-Host "$($adress.Gruppe)/$($adress.Name)/$($adress.Beschreibung)/$($adress.Adresse)"
}

Get the Information

Wie in der Shell werden hier ebenfalls die Daten abgefragt und dieses dann als JSon geparst (wieder erstmal nur einen Einzelschritt):

$adress="Hannoversche+Strasse+74+49084+Osnabrück"
Invoke-WebRequest -Uri 'https://nominatim.openstreetmap.org/search?q='+$adress+'&format=json&polygon=0&addressdetails=0' -OutFile ./ps_output.json

$myJson = Get-Content ./ps_output.json -Raw | ConvertFrom-Json
echo $myJson[0].lat

Write to

Daten holen, verarbeiten und Abfragen klappt nun auch in der PowerShell, beim schreiben ändert sich nichts zur Shell:

#!/bin/bash
echo Irdeng ein txt >> test.txt
echo noch eine Zeile >> test.txt

Die Lösung in der PowerShell

Alle Puzzle-Stücke sind da, nun muss alles nur noch zusammengebracht werden: Erst werden die Daten gelesen, in die Schleife kommt dann gleich auch die Anfrage der Koordinaten und alles zusammen wird in die finale Datei geschrieben.

$infile   = "./daten.csv"
# Outputfilename.kml
$outfile  = "./ps_output.kml"

# Daten lesen und gleich sortieren
$sgruppe  = @{Expression='Gruppe'; Ascending=$true }
$sname    = @{Expression='Name';   Ascending=$true }
$daten    = (Import-Csv -Path $infile -Delimiter ';') | sort-object -property $sgruppe,$sname

# Hilfsgriff für die Gruppen
$groupold = ""

# Header der KML
echo "<?xml version=`"1.0`" encoding=`"UTF-8`"?>" > $outfile
echo "<kml xmlns=`"http://www.opengis.net/kml/2.2`" xmlns:gx=`"http://www.google.com/kml/ext/2.2`">" >> $outfile
echo "    <Document>" >> $outfile
echo "      <name>Lesezeichen</name>" >> $outfile

# nun das Iterieren über die einzelnen Einträge
foreach ($data in $daten){
    # Bei jeder neuen Gruppe (hier mit dem kleinen Kunstgriff)
    echo $data.Gruppe
    if ( $groupold -ne $data.Gruppe ) {
    	# ist das nicht der erste Eintrag : Closetag
    	if ( $groupold -ne "" ) {
    	    echo "      </Folder>" >> $outfile
    	}
        echo "      <Folder>" >> $outfile
        echo "        <name>$($data.Gruppe)</name>" >> $outfile
        echo "        <Style id=`"$($data.Gruppe)`">" >> $outfile
        echo "          <IconStyle id=`"$($data.Gruppe)-icon`">" >> $outfile
        echo "            <Icon>" >> $outfile
        echo "              <href>http://maps.google.com/mapfiles/kml/paddle/red-blank.png</href>" >> $outfile
        echo "              <scale>1.0</scale>" >> $outfile
        echo "            </Icon>" >> $outfile
        echo "          </IconStyle>" >> $outfile
        echo "        </Style>" >> $outfile
        $groupold = $data.Gruppe
    }
    # Bereinigung der Adresse , -> " " und " " in +
    $adress = $data.Adresse.Replace(',',' ').Replace(' ','+')
    
    # Beschaffung der Koordinaten
    # JSon String holen
    $requrl='https://nominatim.openstreetmap.org/search?q='+$adress+'&format=json&polygon=0&addressdetails=0'
    Invoke-WebRequest -Uri $requrl -OutFile ./ps_output.json
    $myJson = Get-Content ./ps_output.json -Raw | ConvertFrom-Json
    
    # JSon parsen und bereinigen
    $lon         = $myJson[0].lon
    $lat         = $myJson[0].lat
    $koordinates = $(echo "$lon,$lat,0")
    echo $koordinates
    
    # bau des Placemarks
    echo "        <Placemark>" >> $outfile
    echo "          <name>$($data.Name)</name>" >> $outfile
    echo "          <description>$($data.Beschreibung)</description>" >> $outfile
    echo "          <styleUrl>#$($data.Gruppe)</styleUrl>" >> $outfile
    echo "          <Point>" >> $outfile
    echo "            <coordinates>$koordinates</coordinates>" >> $outfile
    echo "          </Point>" >> $outfile
    echo "        </Placemark>" >> $outfile
    echo -- $adress
    echo ""
}

# Schließe den Ordner und alles andere
echo "      </Folder>" >> $outfile
echo "  </Document>" >> $outfile
echo "</kml>" >> $outfile

Zum starten einfach in der PowerShell zum Script navigieren und mit ./<name> starten. Am Ende werden allerdings auch hier noch alle Placemarks mit den gleichen, roten Pin dargestellt. Das lässt sich über eine weitere csv-Datei als Datenbank erledigen, oder hier auch gut händisch (den Link im <Icon>-Tag anpassen).
Fazit: Nicht nur mit den Bordmitteln von Unix-Systemen lässt sich vieles machen, sondern seit neuesten eben auch bei Windows.

Ein Gedanke zu „Visualisierung von Adresslisten @PowerShell“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert