Geografische Datenverarbeitung in Python 3: Lesen und Schreiben von Vektordaten (1)

1. Vektordaten

  Geografische Merkmale mit klaren Grenzen, wie z. B. Städte, können durch Vektordaten gut dargestellt werden. Kontinuierliche Daten (z. B. Höhendaten) funktionieren jedoch nicht. Wenn Sie sich in einem Berggebiet befinden, ist es sehr schwierig, ein Polygon an der Grenze aller Gebiete mit derselben Höhe zu zeichnen. Es können jedoch unterschiedliche Polygone verwendet werden, um unterschiedliche Höhenbereiche zu unterscheiden. Viele Arten von Daten sind sehr gut geeignet, um durch Vektoren dargestellt zu werden. Beispielsweise werden für die Elemente auf einer Straßenkarte Straßen durch Liniensegmente dargestellt, Städte und Landkreise durch Polygone und Städte durch Punkte oder Polygone, abhängig vom Maßstab der Karte. Alle Elemente auf der Karte können durch Punkte, Linien und Polygone ausgedrückt werden.
  Vektordaten eignen sich sehr gut zum Erstellen von Karten, es gibt jedoch einige Mängel. Wenn Sie beispielsweise zeichnen und anzeigen, können Sie durch Vergrößern und Verkleinern einen besseren Anzeigeeffekt erzielen.

Küstenparadoxon Der
  britische Mathematiker Lewis Fry Richardson war der erste, der die Küstenlinie des Landes maß. Der Messvorgang ist jedoch nicht so einfach, da das endgültige Messergebnis vollständig von der ausgewählten Skala abhängt. Zum Beispiel hat eine breite Küste mit mehreren Meerengen eine Straße daneben. Stellen Sie sich vor, Sie fahren diese Straße entlang, messen mit dem Kilometerzähler des Autos die Entfernung, steigen dann aus dem Auto und gehen auf dem Weg zurück, den es gekommen ist. Beim Gehen folgt es jedoch der Randkurve der Meerenge, während die Straße nicht ist. Es ist leicht herauszufinden, dass die Reise weiter ist als das Fahren, da es viele Umwege gibt. Das gleiche Prinzip gilt für die Messung der gesamten Küstenlinie. Wenn Sie in kleineren Schritten messen, können Sie mehr Änderungen messen. Bei der Messung der britischen Küste ist die mit einem 50-Kilometer-Inkrement gemessene Endlänge 600 Kilometer länger als das 100-Kilometer-Inkrement.

  Shapefile ist ein allgemeines Format zum Speichern von Vektordaten. Es ist jedoch keine separate Datei. Zum Speichern von Attributdaten sind mindestens 3 Binärdateien erforderlich, darunter: 1 Masterdatei ( .shp ), 1 Indexdatei ( .shx ), Informationen zur Speichergeometrie und 1 dBASE ( .dbf ). Stellen Sie sicher, dass alle vorhanden sind Drei Dateien werden im selben Ordner gespeichert.
1 Shapefile-Datei  Das andere Format ist GeoJSON. Hierbei handelt es sich um reine Textdateien, die in jedem Texteditor verwendet werden können. Ein GeoJSON enthält nur 1 Datei, in der alle erforderlichen Informationen gespeichert sind.
Beispiel: Online-Karte im Geojson-Datenformat Karte
Fügen Sie hier eine Bildbeschreibung ein
GeoJSON-Dateiformat
manuell zeichnen

2. OGR

  Die einfache OGR-Funktionsbibliothek ist Teil der Geospatial Data Abstraction Library (GDAL), einer sehr beliebten Open Source-Bibliothek zum Lesen und Schreiben von Geodaten. Der OGR-Teil von GDAL hat die Funktion, viele verschiedene Vektordatenformate zu lesen und zu schreiben . OGR können Sie auch schaffen und zu manipulieren die geometrischen Formen von Merkmalen, deren Attributwerte zu bearbeiten, zu filtern Vektordaten basierend auf Attributwerten oder räumlichen Positionen, und es bietet auch die Datenanalyse - Funktionen.
  Die GDAL-Bibliothek wurde ursprünglich in C und C ++ geschrieben, ist jedoch an mehrere andere Sprachen gebunden, einschließlich Python. Obwohl diese Codes nicht in Python umgeschrieben werden, wird sie in Python zur Verwendung der GDAL / OGR-Bibliothek verwendet. Bietet eine Schnittstelle. Wenn Sie GDAL in Python verwenden möchten, müssen Sie daher die GDAL-Bibliothek und die entsprechenden Python-Bindungen installieren.

OGR-Klassenstruktur
  Diese Datenquelle enthält mehrere Unterschichtobjekte, und jede Schicht repräsentiert einen Datensatz in der Datenquelle.Das Shapefile enthält nur einen Datensatz (eine Ebene), Aber SpatiaLite enthält mehrere. Unabhängig davon, wie viele Datensätze sich in einer Datenquelle befinden, wird jeder Datensatz von OGR als Schicht betrachtet.
  Eine Datenquelle besteht aus einer oder mehreren Schichten.
  In der Attributtabelle in Arcgis repräsentiert jede Zeile ein Feature und jede Spalte ein Attributfeld:

Attributtabelle

2.1 ogrinfo

  Es wird verwendet, um die Informationen von Vektordaten auszugeben, die von OGR unterstützt werden. Folgende
  Fehler werden angezeigt :
Fügen Sie hier eine Bildbeschreibung ein
  Lösung : Verschieben Sie ogr_FileGDB.dll im Ordner osgeo \ gdalplugins in den Ordner osgeo.
Handy, Mobiltelefon
  Parameterinformationen anzeigen:
Fügen Sie hier eine Bildbeschreibung ein
  Unterstützte Formate anzeigen (Teil): Hier
Fügen Sie hier eine Bildbeschreibung ein
  erfahren Sie nicht nur, welche Treiber in der OGR-Version enthalten sind, sondern auch, ob jeder Treiber Lese- und Schreibvorgänge unterstützt.
  Sie können Python verwenden, um festzustellen, welche Treiber verfügbar sind, und die interaktive Umgebung (IDLE) zur Erkennung verwenden. Importieren Sie zuerst das OGR-Modul in das osgeo-Paket und verwenden Sie dann ogr.GetDriverByName, um einen bestimmten Treiber zu finden:

>>> from osgeo import ogr
>>> driver = ogr.GetDriverByName('GeoJSON')  # GeoJSON不需要区分大小写
>>> print(driver)
<osgeo.ogr.Driver; proxy of <Swig Object of type 'OGRDriverShadow *' at 0x0000013B3CBE8840> 

  Fehlerdemonstration:

>>> driver = ogr.GetDriverByName('shapefile') # 正确的名字为:Esri shapefile
>>> print(driver)
None

2.2 Pip-Befehl aktualisieren (Ergänzung)

  1. Gewinnen Sie nicht direkt + R und dann cmd, sondern wählen Sie "Start" - "Windows System" - "Eingabeaufforderung" -Klicken Sie mit der rechten Maustaste auf "Als Administrator ausführen"! ! !
python -m pip install --upgrade pip;
  1. Verwenden Sie nach dem Ausführen der Eingabeaufforderung als AdministratorSpiegel herunterladen und aktualisieren!!!
python -m pip install --upgrade pip -i https://pypi.douban.com/simple

Update erfolgreich
延迟 问题 : ReadTimeoutError auslösen (self._pool, None, 'Zeitüberschreitung beim Lesen.')

pip install --index-url https://pypi.douban.com/simple <model>
 
如:pip install --index-url https://pypi.douban.com/simple opencv-python

oder:

pip --default-timeout=100 install -U pip

Spiegel-Download: (schnell, stabil, effektiv im Pro-Test)

  1. Tsinghua-Spiegel: https://pypi.tuna.tsinghua.edu.cn/simple
  2. Ali: http://mirrors.aliyun.com/pypi/simple
  3. Universität für Wissenschaft und Technologie in China: http://pypi.mirrors.ustc.edu.cn/simple
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com numpy

2.3 ospybook 1.0-Python-Visualisierung von geografischen Daten

  1. Vorteil: Es kann Ihnen helfen, Daten zu visualisieren, ohne andere Softwareprogramme zu öffnen
  2. Nachteile: schlechte Interaktivität

Installationsmethode:

  1. Installationspaket: im Ordner ospybook-1.0 (Download-Link: http://manning.com/garrard/?a_aid=geopy&a_bid=c3bae5be )
  2. Suchen Sie zum Installieren das Verzeichnis setup.py und öffnen Sie die auszuführende Befehlszeile:python setup.py build
  3. Führe es nochmals aus:python setup.py installieren

 Geben Sie die Liste der verfügbaren Treiber im ospybook-Modul aus:

>>> import ospybook as pb  #  使用ospybook模块
>>> pb.print_drivers()     #  输出可用的驱动列表
ESRIC (readonly)
FITS (read/write)
PCIDSK (read/write)
netCDF (read/write)
PDS4 (read/write)
VICAR (read/write)
JP2OpenJPEG (readonly)
JPEG2000 (readonly)
PDF (read/write)
MBTiles (read/write)
BAG (read/write)
EEDA (readonly)
OGCAPI (readonly)
DB2ODBC (read/write)
ESRI Shapefile (read/write)
MapInfo File (read/write)

3. Lesen von Vektordaten

  Öffnen Sie ein Dataset im Shapefile-Format von ArcGIS, das ein globales Dataset enthält.
ne_50m_populated_places.shp
Attributdatenblatt
  Ausgabe über Python:

import sys
from osgeo import ogr

fn = r'E:\Google\GIS\osgeopy data\global\ne_50m_populated_places.shp'
ds = ogr.Open(fn, 0) # ds = data source,0:表示以只读模式打开文件,1或True:表示以编辑模式打开
if ds is None:  # 确保shapefile文件不为空,可正常打开
    sys.exit('Could not open {0}.'.format(fn))
lyr = ds.GetLayer(0) # 获取图层索引,从0开始,不提供参数时,默认返回第1个图层

i = 0  # 从数据源中取回第1个图层,并遍历此图层中的前5个要素
for feat in lyr:

    
    pt = feat.geometry() # 获得几何对象
    x = pt.GetX()        # 获得坐标位置
    y = pt.GetY()

    # 获得属性值
    name = feat.GetField('NAME')
    pop = feat.GetField('POP_MAX')
    # pop = feat.GetFieldAsString('POP_MAX')  #  数据转换
    # pop = feat.GetFieldAsInteger('POP_MAX')
    print(name, pt, pop, x, y)
    i += 1
    if i == 5:
        break
del ds  # 删除ds变量,强制关闭文件
Bombo POINT (32.5332995248648 0.583299105614628) 75000 32.533299524864844 0.5832991056146284
Fort Portal POINT (30.2750016159794 0.671004121125236) 42670 30.27500161597942 0.671004121125236
Potenza POINT (15.7989964956403 40.6420021300982) 69060 15.798996495640267 40.642002130098206
Campobasso POINT (14.6559965589219 41.562999118644) 50762 14.655996558921856 41.56299911864397
Aosta POINT (7.31500259570618 45.7370010670723) 34062 7.315002595706176 45.7370010670723

3.1 Zugriff auf bestimmte Elemente

  Methode: Zeigen Sie den spezifischen Versatzwert des Features an, dh die Feature-Nummer (FIDs). Der Offset-Wert beginnt bei 0 und wird verwendet, um die Position des Features in diesem Datensatz anzugeben.
  Holen Sie sich das letzte Feature in der Ebene:

>>> num_features = lyr.GetFeatureCount()
>>> last_feature = lyr.GetFeature(num_features - 1)
>>> print(last_feature.NAME)
Hong Kong

  Aktuelles Element: Verwenden Sie den Funktionsaufruf ResetReading ()

import os
import sys
from osgeo import ogr
data_dir = r'E:\Google chrome\Download\GIS with python\osgeopy-data\osgeopy-data\osgeopy-data-washington\osgeopy-data'

fn = os.path.join(data_dir, 'Washington', 'large_cities.geojson')
ds = ogr.Open(fn, 0)
lyr = ds.GetLayer(0)
print('First loop')
for feat in lyr:
    print(feat.GetField('Name'), feat.GetField('Population'))

print('Second loop')
lyr.ResetReading() # This is the important line.
for feat in lyr:
    pt = feat.geometry()
    print(feat.GetField('Name'), pt.GetX(), pt.GetY())

3.2 Daten anzeigen

3.2.1 Eigenschaften anzeigen

  Verwenden Sie die Funktion print_attributes, um Attributwertinformationen auszugeben:

print_attributes(lyr_or_fn, [n], [fields], [geom], [reset] )
  1. lyr_or_fn kann eine Ebene oder ein Datenquellenpfad sein. Wenn es sich um eine Datenquelle handelt, wird die erste Schicht verwendet.
  2. n ist ein optionaler Wert, mit dem die Anzahl der Ausgabedatensätze festgelegt wird. Alle Werte werden standardmäßig ausgegeben.
  3. Felder ist ein optionaler Wert, mit dem die Liste der im Ausgabeergebnis enthaltenen Attributfelder festgelegt wird, einschließlich standardmäßig aller Felder.
  4. geom ist ein optionaler boolescher Wert, mit dem festgelegt wird, ob der geometrische Feature-Typ ausgegeben werden soll. Der Standardwert ist True.
  5. reset ist ein optionaler boolescher Wert, mit dem festgelegt wird, ob vor der Ausgabe des Werts auf den ersten Datensatz zurückgesetzt werden soll. Der Standardwert ist true.

  Die Namen und Bevölkerungsgruppen der ersten drei Städte in der Ausgabedatei:

>>> import ospybook as pb
>>> fn = r'E:\Google chrome\Download\GIS with python\osgeopy-data\osgeopy-data\osgeopy-data-global\osgeopy-data\global\ne_50m_populated_places.shp'
>>> pb.print_attributes(fn, 3, ['NAME', 'POP_MAX'] )

FID    Geometry                  NAME           POP_MAX    
0      POINT (32.533, 0.583)     Bombo          75000      
1      POINT (30.275, 0.671)     Fort Portal    42670      
2      POINT (15.799, 40.642)    Potenza        69060      
3 of 1249 features

  Mit der Funktion pb.print_attributes () können die Attributinformationen einer kleinen Datenmenge angezeigt werden, nicht jedoch die Informationen großer Datenmengen

3.2.2 Geodaten zeichnen

  ospybook enthält Klassen, die den Datenraum visualisieren können, daher handelt es sich um das Python-Modul matplotlib. Um Daten zu zeichnen und anzuzeigen, müssen Sie eine neue Instanz der VectorPlotter-Klasse erstellen. Im interaktiven Modus werden die Zeichnungsdaten sofort angezeigt. Wenn Sie sich nicht im interaktiven Modus befinden, müssen Sie nach dem Zeichnen der Daten die Zeichenfunktion aufrufen.
  Plotfunktion:

plot(self, geom_or_lyr, [symbol], [name], [kwargs])
  1. geom_or_lyr ist ein Feature-Objekt, eine Ebene oder ein Pfad zu einer Datenquelle. Wenn es sich um eine Datenquelle handelt, wird die erste Ebene in der Datenquelle gezeichnet und angezeigt
  2. symbol ist ein optionaler Wert, mit dem der Symbolstil geometrischer Elemente festgelegt wird
    1. fill = False: hohles Polygon
    2. "Bo": blauer Kreis
    3. "Rs": Quadrat
    4. "B-": Blaue Linie
    5. "R–": gepunktete Linie (jede Einheit ist horizontal)
    6. "G": gepunktete Linie (jede Einheit ist vertikal)
  3. name ist ein optionaler Wert, mit dem ein Name für die Daten festgelegt wird, auf die später zugegriffen werden kann
  4. kwargs ist ein optionaler Wert, der durch Schlüsselwörter angegeben wird. kwargs wird häufig als Abkürzung für eine unbestimmte Anzahl von Schlüsselwortargumenten verwendet

matplotlib

Karte gezeichnet von matplotlib:

>>> import os
>>> os.chdir(r'E:\Google chrome\Download\global') #  更改工作目录,可直接使用该文件夹下的文件名,而不需要从新键入整个目录
>>> from ospybook.vectorplotter import VectorPlotter
>>> vp = VectorPlotter(True)  #  创建一个交互式绘图面板
>>> from matplotlib.pyplot import *     # 此处需要导入matplotlib模块进行绘图
>>> vp.plot('ne_50m_admin_0_countries.shp', fill=False)  # fill参数使文件用空心多边形表示
>>> vp.plot('ne_50m_populated_places.shp', 'bo')  # bo表示蓝色圆圈
>>> vp.draw()

Zeige Ergebnisse:
Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/amyniez/article/details/113061835
Empfohlen
Rangfolge