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