Benutzer:Plozessor/scripts/denkmalatlas-import

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Dieses Skript importiert die Daten bayerischer Baudenkmäler aus dem Denkmalatlas in eine TSV-Datei und eine Powershell-Variable. Es sollte unter Powershell 7 ausgeführt werden.
Man benötigt außerdem die Dateien gebiete.txt und denkmalkreise.csv sowie eine Version von cs2cs.exe (siehe Kommentare im Skript).

# Dieses Skript importiert die Daten bayerischer Baudenkmäler aus dem Denkmalatlas in eine Powershell-Variable.
# Die Variable wird als DenkmalDetails_<datum>.xml sowie im TSV-Format als DenkmalDetails_<datum>.tsv exportiert
#
# Pfad zu cs2cs.exe festlegen (für Konvertierung der Koordinaten erforderlich)
# Wird z. B. mit QGIS installiert
$cspfad = "C:\Program Files\QGIS 3.28.2\bin\cs2cs"

# Liste relevanter Gebietsnummern importieren
# Die Textdatei muss pro Zeile einen amtlichen Gemeindeschlüssel (z. B. "461000" für Bamberg) enthalten
# Der Gemeindeschlüssel "ABBCCC" ist auch in den Denkmalnummern als "D-A-BB-CCC..." enthalten
$gebiete = Get-Content .\gebiete.txt

# Liste von Startpunkten importieren
# Die CSV-Datei muss die Spalten "ost", "nord" (jeweils UTM32-Koordinaten) und "radius" (in Kilometern um die Koordinaten) enthalten
# Andere Spalten werden ignoriert
# Die Kreise dürfen nicht zu groß sein, da maximal 20.000 Objekte mit einer Suche gefunden werden können
$kreise = Import-Csv .\denkmalkreise.csv

# Denkmäler um die Koordinaten ermitteln
$alle = @()
$ProgressPreference = 'SilentlyContinue'
$kreise | ForEach-Object {
    $url = 'https://geoportal.bayern.de/denkmalatlas/denkmalservice/v1/denkmal/preview/bykoord/' + $_.ost + '/' + $_.nord + '?buffer=' + $_.radius + '000&limit=20000'
    $url    
    $result = Invoke-WebRequest $url
    $data = ConvertFrom-Json $result.content
    $alle += $data
}
$ProgressPreference = 'Continue'

# Nur Denkmäler mit einem relevanten Gebietsschlüssel auswählen
$imgebiet = $alle | Where-Object { $_.aktennummer.replace("D", "").replace("-", "").substring(0, 6) -in $gebiete }
# Eindeutige KOIDs dieser Gebiete ermitteln
$koids = $imgebiet.koid | Sort-Object -Unique

# Details herunterladen
$details = New-Object System.Collections.ArrayList
$ProgressPreference = 'SilentlyContinue'
$total = $koids.count
$count = 0
$koids | ForEach-Object {
    $ProgressPreference = 'SilentlyContinue'
    $url = 'https://geoportal.bayern.de/denkmalatlas/denkmalservice/v1/denkmal/detail/bykoidandobjtyp/' + $_ + '/bau'
    $result = Invoke-WebRequest $url
    $ProgressPreference = 'Continue'
    $data = ConvertFrom-Json $result.content
    # Zeilenumbrüche durch Leerzeichen ersetzen
    $data.beschreibung = $data.beschreibung -replace "\n", " " -replace ("  ", " ")
    $details += $data
    $count ++
    Write-Progress -Activity "Retrieving data" -PercentComplete (($count / $total) * 100) -Status "$count/$total"
}

# Fehlende Objekte noch einmal versuchen
$found = $details.koid
$rest = $koids | Where-Object { $_ -notin $found }
$rest | ForEach-Object {
    $ProgressPreference = 'SilentlyContinue'
    $url = 'https://geoportal.bayern.de/denkmalatlas/denkmalservice/v1/denkmal/detail/bykoidandobjtyp/' + $_ + '/bau'
    $ProgressPreference = 'Continue'
    $result = Invoke-WebRequest $url
    $data = ConvertFrom-Json $result.content
    $data.beschreibung = $data.beschreibung -replace "\n", " " -replace ("  ", " ")
    $details += $data
}

# Koordinaten mit cs2cs.exe von UTM32 zu WGS84 konvertieren
$details | ForEach-Object {
    [string]$_.east_utm + " " + [string]$_.north_utm 
} | Out-File utm32.tmp -Encoding ascii
& $cspfad +init=epsg:32632 +to +init=epsg:4326 utm32.tmp -f %.6f >wgs84.tmp
$wgs = Import-Csv wgs84.tmp -Delimiter " " -Header @('wgs84', 'null')

# Konvertierte Koordinaten zu $details hinzufügen
for ($c = 0 ; $c -lt $details.count ; $c++ ) {
    $co = $wgs[$c].wgs84.split("`t")
    $lat = $co[1]
    $lon = $co[0]
    $details[$c] | Add-Member -MemberType NoteProperty -Name latitude -Value $lat
    $details[$c] | Add-Member -MemberType NoteProperty -Name longitude -Value $lon
}

# Dateinamen für Export festlegen
$newdate = Get-Date -Format "yyyy-MM-dd"
$filename = 'DenkmalDetails_' + $newdate + '.tsv'
$filename2 = 'DenkmalDetails_' + $newdate + '.xml'

# Als TSV und Powershell-Objekt exportieren
$details | Export-Csv $filename -Encoding utf8 -Delimiter "`t"
$details | Export-Clixml $filename2