Ein Programm zur Umwandlung des numerischen Höhenmodells des National Land Research Institute in PNG mit Python, das vom Hobby () meines Vorgesetzten während meines vorherigen Jobs erstellt wurde.
Es ist eine Verschwendung, es einzuschlafen, also überlasse ich es dem nächsten Lernenden
Der folgende Code ist natürlich nicht der "beste Code"!
Außerdem bin ich kein Spezialist für Python, also schreibe ich, während ich denke: "Ich würde mich freuen, wenn jemand es umgestalten würde."
* Nachtrag (14.02.2020) Dieser Code ist schlecht, weil er im ersten Jahr von mir geschrieben wurde. Bitte seien Sie vorsichtig.
Ich möchte die numerischen Höhendaten des National Land Research Institute abrufen und mit Python
ein Graustufenbild erstellen
Wir werden eine PNG-Datei für jede Datendatei generieren
Im folgenden Qiita-Artikel finden Sie eine Erläuterung der XML-Datei, die gelöscht werden kann, da sie sehr einfach zu verstehen ist.
https://qiita.com/tobira-code/items/43a23362f356198adce2
Oder besser gesagt, mit diesem Artikel muss ich keinen neuen Artikel schreiben ...
Wählen Sie sofort ein beliebiges Netz von der Download-Seite des National Land Research Institute aus und holen Sie es sich.
https://fgd.gsi.go.jp/download/menu.php
Klicken Sie unter "Grundlegende Karteninformationen Numerisches Höhenmodell" auf die Schaltfläche "Zur Dateiauswahl wechseln", um zum Download-Bildschirm zu springen.
Zum Herunterladen der Daten ist eine Registrierung der Mitgliedschaft erforderlich!
Dieses Mal verwenden wir die Daten der "Geländekarten-Konturlinie" von "10 m Maschenweite". Wählen Sie daher das Optionsfeld und das Kontrollkästchen auf der linken Seite als solches aus und klicken Sie auf ein beliebiges Netz.
Dekomprimieren Sie aus der abgelegten Zip-Datei die Datei "FG-GML-0000-0-dem10b-yyyymmdd.xml" und legen Sie sie in einem geeigneten Verzeichnis ab.
Damit ist die Datenaufbereitung abgeschlossen.
Der Code ist unten.
import os
import re
import sys
import numpy as np
from PIL import Image
import xml.etree.ElementTree as ET
#XML-Dateieingabe
DATA = sys.argv[1]
tree = ET.parse(DATA)
root = tree.getroot()
namespace = {
'xml': 'http://fgd.gsi.go.jp/spec/2008/FGD_GMLSchema',
'gml': 'http://www.opengis.net/gml/3.2'
}
dem = root.find('xml:DEM', namespace)
#Maschennummer
mesh = dem.find('xml:mesh', namespace).text
#Anzahl der angeordneten Zellen(Der tatsächliche Wert wird um 1 erhöht)
high = dem.find('./xml:coverage/gml:gridDomain/gml:Grid/gml:limits/gml:GridEnvelope/gml:high', namespace).text.split(' ')
highX = int(high[0]) + 1
highY = int(high[1]) + 1
#Bildgrößeneinstellung(Die Anzahl der Daten==Anzahl der Pixel)
imgSize = highX * highY
#Array von Höhendaten
dem_text = dem.find('./xml:coverage/gml:rangeSet/gml:DataBlock/gml:tupleList', namespace).text
data = re.findall(',(.*)\n', dem_text)
dataNp = np.empty(imgSize)
for i in range(len(data)):
if(data[i] == "-9999.00"):
dataNp[i] = 0
else:
dataNp[i] = float(data[i])
#Datenstartkoordinaten
startPoint = dem.find('./xml:coverage/gml:coverageFunction/gml:GridFunction/gml:startPoint', namespace).text.split(' ')
startPointX = int(startPoint[0])
startPointY = int(startPoint[1])
startPosition = startPointY * highX + startPointX
##Starten Sie die Bilderzeugung
#Wenn die Anzahl der Daten nicht ausreicht(Wenn über und unter dem Bild Leerzeichen vorhanden sind)
if(len(dataNp) < imgSize):
add = []
#Wenn die Daten am unteren Rand des Bildes nicht ausreichen
if(startPosition == 0):
for i in range(imgSize - len(dataNp)):
add.append(0)
dataNp.extend(add)
#Wenn die Daten oben und unten im Bild nicht ausreichen
else:
for i in range(startPosition):
add.append(0)
dataNp[0:0] = add
add = []
for i in range(imgSize - len(dataNp) - len(add)):
add.append(0)
dataNp.extend(add)
#8-Bit-Ganzzahlkonvertierung von Daten
dataNp = (dataNp / 15).astype(np.uint8) #Teilen Sie dataNp durch 15, um den höchsten Punkt des Berges Fuji bei 255 zu erreichen
data = dataNp.reshape(highY, highX)
#Abbildung numerischer Höhendaten
pilImg = Image.fromarray(np.uint8(data))
pilImg = pilImg.resize((int(highX), int(highY)), Image.LANCZOS) # NEAREST
canvas = Image.new('RGB', (highX, highY), (0, 0, 0))
canvas.paste(pilImg, (0, 0))
canvas.save('dem.png', 'PNG', quality=100)
Die Ausführung ist mit Python .py-Datei .xml-Datei span> in Ordnung.
Mit der obigen Methode können Sie die erste Netznummer, die Anzahl der Zellenarrays, die Höhendaten usw. abrufen. Sie können mit einem regulären Ausdruck danach suchen, indem Sie die Schleife wie drehen.
Für mich bevorzuge ich die Suche durch Drehen der Schleife, daher empfehle ich es, weil es einfacher ist, aber dann werde ich diesen Artikel behandeln ...
Es tut mir leid für die magische Gorigori-Nummer, aber es ist irgendwie nervig, also lasse ich es so wie es ist.
Im numerischen Höhenmodell wird die Höhe jedes Punktes mit Ausnahme der Wasseroberfläche als numerischer Wert gespeichert (obwohl ich nicht weiß, ob dies für alle DEMs der Fall ist). Der Punkt oben auf dem Fuji sollte in einer XML-Datei wie 3776.0 gespeichert werden.
Wenn dieser Wert direkt in ein Graustufen-PNG-Bild konvertiert wird, wird das Schwarzweißbild durch einen Wert von 0 bis 255 dargestellt, sodass alle Gebiete mit einer Höhe von 255 m oder höher vollständig weiß sind. Um dies zu verhindern, wird der obige Code durch Teilen durch 15 angepasst, um 255 oder weniger basierend auf der Höhe von 3770 m auf dem Gipfel des Fuji zu erhalten.
Wenn Sie also den Berg Hakodate, der eine Höhe von 333 m hat, von 0 bis 255 anstelle des Gipfels des Berges Fuji ausdrücken möchten, sollten Sie ihn durch 1,3 teilen.
Hier scheint es einfach zu sein, den Maximalwert der XML-Datei zu überprüfen und den Wert festzulegen, der automatisch geteilt wird.
So wurde es, als ich Hakodate zu PNG konvertierte.
Die Höhe der Stadt ist fast 0, und ich habe oft das Gefühl, dass die Höhe des Berges Hakodate plötzlich steigt.
Ist es nicht unangenehm?
Also werde ich das nächste Mal einen Artikel schreiben, der mehrere Dateien liest, sie nach der Maschennummer sortiert und ein großes Bild macht.
Dies gibt Ihnen ein ziemlich interessantes Bild.
Ich denke, dieser Artikel sollte in naher Zukunft überprüft und neu geschrieben werden, um das Verständnis zu erleichtern. .. .. (Vielleicht nicht)
Recommended Posts