Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden

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.

Was Sie tun möchten

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 ...

Daten vorbereiten

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 in Ordnung.

Ergänzung

Suche nach verschiedenen Daten

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 ...

"DataNp / 15", das in der zweiten Hälfte erscheint

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.

Endlich

So wurde es, als ich Hakodate zu PNG konvertierte.

ichimai

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

Versuchen Sie, die Höhendaten des National Land Research Institute mit Python abzubilden
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
Versuchen Sie, den kürzesten Weg mit Python + NetworkX + Social Data zu lösen
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
So schneiden Sie den unteren rechten Teil des Bildes mit Python OpenCV
Holen Sie sich Bilder von OpenStreetMap und Geographical Institute Map mit Python + py-staticmaps
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
Holen Sie sich Bilder von OpenStreetMap und Geographical Institute Map mit Python + staticmap
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Versuchen Sie, das Programmier-Herausforderungsbuch mit Python3 zu lösen
So kratzen Sie Bilddaten von Flickr mit Python
Konvertieren Sie das Bild in .zip mit Python in PDF
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
Versuchen Sie, die Position eines Objekts auf dem Schreibtisch (reales Koordinatensystem) anhand des Kamerabilds mit Python + OpenCV zu messen
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Versuchen Sie, die verstümmelten Zeichen im angehängten Dateinamen mit Python zu entschlüsseln
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
Versuchen Sie, Facebook mit Python zu betreiben
Versuchen Sie, das Bild mit opencv2 zu verwischen
Versuchen Sie, in die Datenbank zu importieren, indem Sie ShapeFile mit numerischen Informationen zum nationalen Land mit Python bearbeiten
Versuchen Sie, die Nährstoffe von Cornflakes zu visualisieren, die M-1-Champion Milkboy mit Python sagte
Speichern Sie das Ergebnis des Crawls mit Scrapy im Google Data Store
Praktische Übung zur Datenanalyse mit Python ~ 2016 New Coder Survey Edition ~
Erste Python ② Versuchen Sie, Code zu schreiben, während Sie die Funktionen von Python untersuchen
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Geben Sie den Inhalt von ~ .xlsx im Ordner mit Python in HTML aus
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
Berücksichtigen Sie die Verarbeitungsgeschwindigkeit, um den Bildpuffer mit numpy.ndarray zu verschieben
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Versuchen Sie, CloudWatch-Metriken mit der Python-Datenquelle re: dash abzurufen
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Versuchen Sie, die Position des Senders aus dem Funkwellenausbreitungsmodell mit Python [Wi-Fi, Beacon] zu berechnen.
Grundlagen der binärisierten Bildverarbeitung durch Python
Versuchen Sie, sich mit Python bei qiita anzumelden
HTML-Mail mit Bild zum Senden mit Python
Versuchen Sie, mit Binärdaten in Python zu arbeiten
Überprüfen Sie die Existenz der Datei mit Python
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Konvertieren Sie Excel-Daten mit Python in JSON
[Python] Probieren Sie pydash der Python-Version von lodash aus
Versuchen Sie, mit Pandas in ordentliche Daten umzuwandeln
Python Amateur versucht die Liste zusammenzufassen ①
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Empfehlung von Altair! Datenvisualisierung mit Python
Versuchen Sie, ein Bild mit Entfremdung zu erzeugen
[Einführung in Data Scientist] Grundlagen von Python ♬
Der Weg zum Kompilieren zu Python 3 mit Thrift
Beispiel für die Wavelet-Konvertierung von Bildern in Python