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.
2 Gedanken zu „Visualisierung von Adresslisten @PowerShell“