Mehr

GeoPandas: Geben Sie Lat und Long eines Schwerpunktpunktes zurück

GeoPandas: Geben Sie Lat und Long eines Schwerpunktpunktes zurück


Ich möchte die zurückgebenlatundlonoderxundjaaus dem Punktobjekt in der folgenden Serie, da ich vorhabe, sie mit einer von mir erstellten API zu verknüpfen, die OSM und NetworkX verbindet. Die Schwerpunkte werden als neue Knoten für die Netzwerkanalyse hinzugefügt.

gp.GeoSeries(zones.centroid).x, undgp.GeoSeries(zones.centroid).ywie in docs beschrieben erhöhenAttributeError: 'GeoSeries'-Objekt hat kein Attribut 'x'Error.

Etwas ändern und druckenlist(gp.GeoSeries(zones.centroid))geben Tausende von formschönen Punkten des folgenden Formats zurück:

[… , , , , , , , ]

Der Code den ich verwende ist folgender:

import geopandas als gp zone = gp.GeoDataFrame.from_file(shp_file) für index, zeile in zone.iterrows(): print index, gp.GeoSeries(zones.centroid) # result: # 9700022.00 POINT (-122.8196050489696 54.0617624128658) # 9700023.00 POINT (-122.7474362519174 53.99998921974029) # 9700100.00 PUNKT (-121.4904983300892 53.98447191612864) # 9700101.00 PUNKT (-122.5513619751679 53.73999791511078) # 9700102.00 PUNKT (-123.0624037191615 53.62317549643.006422)

Wie kann ich die zurückgebenxundjavom GeoPandas POINT-Objekt?


Den Rest ließen wir unten, aber die Hauptsache war der richtige Zugriff auf die Geometrie. Beim Iterieren über Zeilen, z.B.für Index, Zeile in zone.iterrows():du kannst einfach verwendenZeilengeometrie.Schwerpunkt.xundzeile.geometrie.centroid.y. Geometrie ist eine spezielle Spalte, die in einem GeoDataFrame enthalten ist, sodass jede Zeile ein Geometrieattribut hat.
Sie greifen auf dieses Attribut zu, das a . enthältformschönObjekt. DassformschönObjekt wird ein Attribut haben,Schwerpunktdas wiederum enthält aformschöne.geometrie.Punkt, die Attribute hatxundja, um Ihnen endlich die gewünschten Eigenschaften zu geben.


(Dieser Teil war der ursprüngliche Versuch, mit x,y zu kommenKarteundformschöne.geometrie.Punkt.)
Ich nehme an, Sie möchten eine Liste von (x, y)-Tupeln? Erstellen Sie eine Schnellzugriffsfunktion für die x- und y-Attribute auf aPunktund verwendenKarte.

Bearbeiten: Okay, habe herausgefunden, dass Sie möglicherweise falsch auf die Geometrie im GeoDataFrame zugreifen. Geometrie ist eine Spalte in Ihrem GeoDataFrame, die selbst eine Reihe erzeugt. BerufungSchwerpunktin dieser Spalte sollten Sie eine neue GeoSeries mit nur diesen Schwerpunkten erhalten. Ich vermute, Sie haben den Schwerpunkt jedes Scheitelpunkts in jedem Polygon genommen. Kann dies immer noch nicht testen, da ich GeoPandas gerade nicht installieren kann.

def getXY(pt): return (pt.x, pt.y) centroidseries = Zonen['geometry'].centroid centroidlist = map(getXY, centroidseries)

oder wenn Sie zwei separate Listen mit x- und y-Koordinaten haben möchten

def getXY(pt): return (pt.x, pt.y) centroidseries = Zonen['geometry'].centroid x,y = [list(t) für t in zip(*map(getXY, centroidseries))]

Alternativ sollten Sie auch in der Lage sein,Zonen.Geometrie.SchwerpunktanstattZonen['Geometrie'].centroid. So oder so, ich denke, ich rufe anZonen.centroidgeben möglicherweise einen GeoDataFrame anstelle einer GeoSeries zurück, wodurch Sie die unerwartete Ausgabe erhalten, wenn Sie ihn in eine andere GeoSeries einschließen.


Bin selbst auf dieses Problem gestoßen. Wenn du das willstxundjaals separate GeoDataFrame-Spalten, dann funktioniert das gut:

gdf["x"] = gdf.centroid.map(lambda p: p.x) gdf["y"] = gdf.centroid.map(lambda p: p.y)

Ab GeoPandas 0.3.0 können Sie die mitgeliefertenxundjaEigenschaften stattdessen:

gdf["x"] = gdf.centroid.x gdf["y"] = gdf.centroid.y

Dies ist ab GeoPandas 0.3.0 einfacher geworden.

Sie können jetzt zugreifenxundjavonformschöne Punktein einemGeopandas GeoSeriesmityour_GeoDataFrame.geometry.xundyour_GeoDataFrame.geometry.y

(Hinweis: Ich verwende Python 3.6.1, bin mir über das Verhalten in 2.7 nicht sicher, sorry)

Quelle auf github


Die Lösung zum Extrahieren des Mittelpunkts (Breiten- und Längengrad) aus dem Polygon und Multi-Polygon.

import geopandas als gpd df = gpd.read_file(path + 'df.geojson') #Finde den Mittelpunkt df['Center_point'] = df['geometry'].centroid #Extrahiere lat und lon vom Mittelpunkt df["lat "] = df.Center_point.map(lambda p: px) df["long"] = df.Center_point.map(lambda p: py)

Ich bin auf ein ähnliches Problem gestoßen, nur mit Polygongeometrien und fand, dass diese Lösung für mich gut funktioniert hat, wohlgemerkt, es verwendet Python-3.6, daher funktioniert es möglicherweise nicht für Python-2.7.

import geopandas als gpd zone = gpd.read_file('file_to_read.shp') für i in range(0,len(zones)): zone.loc[i,'centroid_lon'] = zone.geometry.centroid.x.iloc[ i] zone.loc[i,'centroid_lat'] = zone.geometry.centroid.y.iloc[i]

Wenn Sie nur ein numpy-Array von Schwerpunkten möchten:

Schwerpunkte = np.vstack([df.centroid.x, df.centroid.y]).T

oder als Datenrahmen mit zusätzlichen Spalten (d. h. Name zum Beispiel):

pd.DataFrame(np.vstack([df.name, df.centroid.x, df.centroid.y]).T, column=['name', 'x', 'y'])

Ex.

Name Geometrie 0 1 POLYGON ((0.00000 1.00000, 0.00000 0.00000, 1… 1 2 POLYGON ((2.00000 1.00000, 2.00000 0.00000, 3… # ==> # np.vstack([df.centroid.x, df.centroid.y] ).T # Array([[0.5, 0.5], # [2.5, 0.5]])

Hier ist eine schnelle

df = pd.read_csv('data/hospitals.csv') df.columns # 'Ownership', 'Lat', 'Long' from shapely.geometry import Point df['geometry'] = df.apply(lambda row: Point (Zeile.Lange,Zeile.Lat),Achse=1)

Erstellen Sie dann den Datenrahmen neu mit Geopandas

gdf = gpd.DataFrame(df) # erstellt Geodataframe mit Punktgeometrie

Schau das Video: Quick and easy understanding latitude longitude with TOP TIPS and GPS coordinates position