Python x GIS-Grundlagen (1)

Warum Python verwenden?

Es braucht Zeit, um eine große Menge räumlicher Daten nur mit GIS zu verarbeiten </ b>, und ich hatte das Bedürfnis nach Codeverarbeitung, um mit meiner Forschung fortzufahren. Darüber hinaus führen die in QGIS vorhandenen Plug-Ins keine ausreichende Netzwerkanalyse und grafische Vereinfachung durch, und die umfangreiche Bibliothek von Python ist ein wirksames Mittel.

Dieses Mal werde ich Automatisierung von GIS-Prozessen, das von der Universität Helsinki bereitgestellt wird, als Studienmaterial verwenden. Es besteht aus 7 Wochen und Sie können insbesondere etwas über die Visualisierung mit GeoPnadas und Matplotlib lernen. Darüber hinaus werden jede Woche Hausaufgaben (Übungsfragen) für Schüler gegeben, und dieser Artikel enthält hauptsächlich Beispiele für Antworten. Teil 1: Woche1-Woche2 Teil 2: Woche 3 - Woche 4 Teil 3: Woche 5 - Woche 6 (Woche 7 hat keine Probleme) Teil 4 (im Bau): Endgültige Aufgabe

Das Folgende ist ein Teil des Inhalts der wöchentlichen Unterrichtsmaterialien.

Woche Inhalt
Week1 Punkt,Linie,Polygone zeichnen
Week2 Einführung in Geopandas,CRS-Einstellungen,Entfernungsberechnung
Week3 Räumliche Kopplung,Nachbarpunktanalyse
Week4 Raumkopplung 2,Datenebenen
Week5 Statische / dynamische Kartenzeichnung,
Week6 OSM-Analyse,Netzwerkanalyse
Week7 QGIS-Plug-In

Week 1

1-1 Erstellen einer Funktion zum Erstellen von Punkten, Linien und Polygonen

Als Bedingung für das Problem sind einige Anforderungen erforderlich, damit die Funktion ordnungsgemäß funktioniert.

from shapely.geometry import Point, LineString, Polygon

#Punkt
def create_point_geom(x, y):
    point = Point(x, y)
    return point

#Nimmt eine Zeilenliste als Argument
def create_line_geom(points):
    assert type(points)=="list", "Input should be a list!"
    assert len(points)>=2, "LineString object requires at least two Points!"
    line = LineString([points[0], points[1]])
    return line

#Nimmt eine Polygonliste als Argument
def create_poly_geom(coords):
    assert type(coords) is list, "Input should be a list!"
    assert len(coords)>=3, "Polygon object requires at least three Points!"
    for i in coords:
        assert type(i) is tuple, "All list values should be coordinate tuples!"
    poly = Polygon(coords)
    return poly

1-2 Erfassung von Schwerpunkt, Polygonfläche und Entfernung

Die assert-Anweisung ist nicht wesentlich, daher werden einige Teile weggelassen.

#Schwerpunkt Argument ist Punkt oder Linie oder Polygon
def get_centroid(gem):
    assert type(gem) == 'shapely',  "Input should be a Shapely geometry!"
    assert gem.geom_type in ['Point', 'LineString', 'Polygon'], "Input should be a Shapely geometry!"
    centroid = gem.centroid
    return centroid
#Bereich
def get_area(poly):
    return poly.area
#Entfernung
def get_length(geom):
    if geom.geom_type == 'LineString':
        return geom.length
    elif geom.geom_type == 'Polygon':
        return geom.exterior.length

1-3 Erfassung und Anzeige von Textdaten

Dies ist eine einfache Datenverarbeitungsübung, bei der Daten aus Helsinki verschoben werden. from_x, from_y geben den Startpunkt an, to_x, to_y geben den Ankunftspunkt an, und das Ziel besteht darin, die aus diesen Daten zurückgelegte Gesamtstrecke zu erhalten.

import pandas as pd

#Daten gelesen
data = pd.read_table("data/travelTimes_2015_Helsinki.txt", sep=";",)
data = data[['from_x','from_y', 'to_x', 'to_y', 'total_route_time',]]
#Erstellung von Koordinatendaten
orig_points = []
dest_points = []
from shapely.geometry import Point
for index, row in data.iterrows():
    orig = Point(row['from_x'], row['from_y'])
    dest = Point(row['to_x'], row['to_y'])
    orig_points.append(orig)
    dest_points.append(dest)
#Eine bewegliche Linie erstellen
from shapely.geometry import LineString
lines = []
for orig, dest in zip(orig_points, dest_points):
    line = LineString([orig, dest])
    lines.append(line)
#Holen Sie sich die gesamte Reisedistanz
total_length = 0
for line in lines:
    total_length += line.length

Week2 Lernen Sie eine Bibliothek namens Geopandas, eine Erweiterung von Pandas. Wie Pandas ist es sehr einfach zu bedienen und die Raummanipulation ist einfach.

2-1 Konvertierung von Koordinatendaten in GeoDataFrame

import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Polygon

#Zu verwendende Daten koordinieren
longitudes = [29.99671173095703, 31.58196258544922, 27.738052368164062, 26.50013542175293, 26.652359008789062, 25.921663284301758, 22.90027618408203, 23.257217407226562,
           23.335693359375, 22.87444305419922, 23.08465003967285, 22.565473556518555, 21.452774047851562, 21.66388702392578, 21.065969467163086, 21.67659568786621,
           21.496871948242188, 22.339998245239258, 22.288192749023438, 24.539581298828125, 25.444232940673828, 25.303749084472656, 24.669166564941406, 24.689163208007812,
           24.174999237060547, 23.68471908569336, 24.000761032104492, 23.57332992553711, 23.76513671875, 23.430830001831055, 23.6597900390625, 20.580928802490234, 21.320831298828125,
           22.398330688476562, 23.97638702392578, 24.934917449951172, 25.7611083984375, 25.95930290222168, 26.476804733276367, 27.91069221496582, 29.1027774810791, 29.29846954345703,
           28.4355525970459, 28.817358016967773, 28.459857940673828, 30.028610229492188, 29.075136184692383, 30.13492774963379, 29.818885803222656, 29.640830993652344, 30.57735824584961,
           29.99671173095703]
latitudes = [63.748023986816406, 62.90789794921875, 60.511383056640625, 60.44499588012695, 60.646385192871094, 60.243743896484375, 59.806800842285156, 59.91944122314453,
           60.02395248413086, 60.14555358886719, 60.3452033996582, 60.211936950683594, 60.56249237060547, 61.54027557373047, 62.59798049926758, 63.02013397216797,
           63.20353698730469, 63.27652359008789, 63.525691986083984, 64.79915618896484, 64.9533920288086, 65.51513671875, 65.65470886230469, 65.89610290527344, 65.79151916503906,
           66.26332092285156, 66.80228424072266, 67.1570053100586, 67.4168701171875, 67.47978210449219, 67.94589233398438, 69.060302734375, 69.32611083984375, 68.71110534667969,
           68.83248901367188, 68.580810546875, 68.98916625976562, 69.68568420410156, 69.9363784790039, 70.08860778808594, 69.70597076416016, 69.48533630371094, 68.90263366699219,
           68.84700012207031, 68.53485107421875, 67.69471740722656, 66.90360260009766, 65.70887756347656, 65.6533203125, 64.92096710205078, 64.22373962402344, 63.748023986816406]
#Polygonisierung
coordpairs = list(zip(longitudes, latitudes))
poly = Polygon(coordpairs)
#Erstellen eines GeoDataFrame
geo = gpd.GeoDataFrame(index=[0], columns=['geometry'])
geo['geometry'] = poly
#Illustriert
import matplotlib.pyplot as plt
geo.plot()
#Speichern Sie die shp-Datei
fp = 'polygon.shp'
geo.to_file(fp)

2-2 Darstellung der in csv gespeicherten Koordinatendaten

Das hasserfüllte CRS ist hier. Die Apply-Funktion funktioniert gut mit Pandas und kann mit Funktionscode verarbeitet werden.

#Bibliothek
import pandas as pd
from shapely.geometry import Point, LineString, Polygon
from pyproj import CRS
import matplotlib.pyplot as plt
#Lesen Sie CSV
data = pd.read_csv('data/some_posts.csv')
#Punktdatenerstellung
data = pd.read_csv('data/some_posts.csv')
make_point = lambda row:Point(row['lat'],row['lon'])
data['geometry'] = data.apply(make_point, axis=1)

#Die Konvertierung in GeoDataFrame-Geometrie und Koordinatensystem muss angegeben werden.
geo = gpd.GeoDataFrame(data, geometry='geometry',crs=CRS.from_epsg(4326).to_wkt())

#Handlung
geo.plot()

2-3 Berechnung der Fahrstrecke

Berechnen Sie die von jedem Benutzer zurückgelegte Entfernung aus den auf SNS veröffentlichten Koordinatendaten. Die Konvertierung des Koordinatensystems wird angezeigt. Beachten Sie jedoch die folgenden Punkte. CRS ist überall ein Ärgernis. .. ..

  • Da GeoDataFrame-Daten nicht nur durch Definieren des Koordinatensystems (z. B. Data.crs = CRS.from_espg (4276)) konvertiert werden, ist eine Konvertierung des Koordinatensystems (z. B. Data = data.to_crs (epsg = 4276)) erforderlich. -Wenn das Koordinatensystem von GeoDataFrame nicht definiert ist, definieren Sie das Koordinatensystem, bevor Sie das Koordinatensystem konvertieren.

import geopandas as gpd
import pandas as pd
from pyproj import CRS
from shapely.geometry import Point, LineString, Polygon
#Daten gelesen
data = gpd.read_file('Kruger_posts.shp')
#Systemkonvertierung koordinieren
data = data.to_crs(epsg=32735)
#Erstellen Sie eine sich bewegende Linie, indem Sie nach ID klassifizieren(Wenn es nur einen Beitrag gibt, wurde er nicht verschoben,Geben Sie den Wert None ein)
grouped = data.groupby('userid')
movements = gpd.GeoDataFrame(columns=['userid', 'geometry'])
for key, group in grouped:
    group = group.sort_values('timestamp')
    if len(group['geometry'])>=2:
        line = (LineString(list(group['geometry'])))
    else:
        line=None
    movements.at[count, 'userid'] = key
    movements.at[count, 'geometry'] = line
movements.crs = CRS.from_epsg(32735)
#Berechnung der Fahrstrecke
def cal_distance(x):
    if x['geometry'] is None:
        return None
    else:
        return x['geometry'].length
movements['distance'] = movements.apply(cal_distance, axis=1)
#Durchschnittliche Reisedistanz,Maximalwert,Mindestwert
print(mean(movements['distance'])) #138871.14194459998
print(max(movements['distance'].dropna())) #8457917.497356484
print(min(movements['distance'])) #0.0

Recommended Posts

Python x GIS-Grundlagen (1)
Python x GIS-Grundlagen (3)
Grundlagen von Python x GIS (Teil 2)
Python-Grundlagen ①
Grundlagen von Python ①
Grundlagen der Python-Scraping-Grundlagen
# 4 [Python] Grundlagen der Funktionen
Grundlagen von Python: Ausgabe
Python: Grundlagen der Verwendung von Scikit-Learn ①
Python-Grundlagen ⑤
Python-Grundlagen
Python-Grundlagen ④
Python-Grundlagen ③
Python-Grundlagen
Python-Grundlagen
Python-Grundlagen
Python-Grundlagen ③
Python-Grundlagen ②
Paiza Python Primer 5: Grundlagen von Wörterbüchern
Erste Schritte mit Python Grundlagen von Python
Überprüfung der Grundlagen von Python (FizzBuzz)
Informationen zur Grundlagenliste der Python-Grundlagen
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
[Für Anfänger] Grundlagen von Python erklärt durch Java Gold Teil 1
Grundlagen der binärisierten Bildverarbeitung durch Python
QGIS + Python Teil 2
Python: Grundlagen der Bilderkennung mit CNN
Python-Grundlagen: Liste
Python-Grundmemorandum
[Lernnotiz] Grundlagen des Unterrichts mit Python
[Python3] Verstehe die Grundlagen von Beautiful Soup
QGIS + Python Teil 1
# Python-Grundlagen (#matplotlib)
Python CGI-Grundlagen
Python-Grundlagen: Wörterbuch
Ich kannte die Grundlagen von Python nicht
Python Slice Grundlagen
# Python-Grundlagen (Umfang)
# Python-Grundlagen (#Numpy 1/2)
Kopie von Python
# Python-Grundlagen (#Numpy 2/2)
Grundlagen zum Ausführen von NoxPlayer in Python
[Grundlagen der Python-Grundlagen] Warum __name__ == "__main__"
# Python-Grundlagen (Funktionen)
Python: Scraping Teil 1
Grundlagen des Python-Arrays
Grundlagen der Python-Profilerstellung
Python #Numpy Basics
[Python] Kapitel 02-04 Grundlagen des Python-Programms (Informationen zu Kommentaren)
Python-Grundlagen: Funktionen
# Python-Grundlagen (Klasse)
[Python] Kapitel 02-03 Grundlagen von Python-Programmen (Eingabe / Ausgabe)
Zusammenfassung der Python-Grundlagen
[Einführung in Data Scientist] Grundlagen von Python ♬
Lösung Wenn Sie Python 3.6 oder höher verwenden, benötigen Sie die enum34-Bibliothek ebenfalls nicht. Deinstallieren Sie sie daher und verwenden Sie das Standard-Enum-Modul. Enum34 deinstallieren Führen Sie nach der Deinstallation von enum34 erneut `pip install optuna` aus und Sie haben Optuna erfolgreich installiert! Python, pip, Python3, enum, OptunaPython3 Beginn Teil 1
Python: Scraping Teil 2
Einführung von Python
[Python3] Grundlegendes zu Dateivorgängen
[Python] Lesen Sie den Quellcode von Flasche Teil 2
Grundlagen des Lernens mit einem Lehrer Teil 1 - Einfache Regression - (Hinweis)