Viac

GeoPandas: vráti zemepisnú šírku a dĺžku ťažiska

GeoPandas: vráti zemepisnú šírku a dĺžku ťažiska


Chcel by som vrátiťlatalonaleboXarz bodového objektu v nasledujúcej sérii, pretože ich plánujem prepojiť s API, ktoré som postavil a ktoré spája OSM a NetworkX. Centroidy budú pridané ako nové uzly pre analýzu siete.

gp.GeoSeries (zones.centroid) .xagp.GeoSeries (zones.centroid). yako je uvedené v dokumente zvýšiťAttributeError: Objekt „GeoSeries“ nemá žiadny atribút „x“chyba.

Trochu upravovať veci a tlačiťzoznam (gp.GeoSeries (zones.centroid))vráťte tisíce tvarovaných bodov nasledujúceho formátu:

[… , , , , , , , ]

Kód, ktorý používam, je nasledujúci:

importovať geopandy ako zóny gp = gp.GeoDataFrame.from_file (shp_file) pre index, riadok v zones.iterrows (): tlačový index, gp.GeoSeries (zones.centroid) # výsledok: # 9700022,00 BOD (-122,8196050489696 54,00617624128658) # 9700023,00 (-122,7474362519174 53,99998921974029) # 9700100,00 BOD (-121,4904983300892 53,98447191612864) # 9700101,00 BOD (-122,5513619751679 5379 73917900500 1700 539 739179009005000000000000000000000000000000000000000000000000 ...

Ako môžem vrátiťXarz objektu GeoPandas POINT?


Ostatné ponecháme nižšie, ale hlavnou vecou bol správny prístup k geometrii. Ak iterujeme cez riadky, napr.pre index, riadok v zónach. šírky ():môžete jednoducho použiťriadok.geometria.centroid.xariadok.geometria.centroid.y. Geometria je špeciálny stĺpec zahrnutý v GeoDataFrame, takže každý riadok má atribút geometrie.
Pristupujete k tomuto atribútu, ktorý obsahuje aurastenýpredmet. Tourastenýobjekt bude mať atribút,ťažiskoktorý zasa obsahuje aurastená.geometria.Bod, ktorý má atribútyXar, konečne vám poskytne požadované vlastnosti.


(Táto časť bola pôvodnou snahou dostať sa na x, y pomocoumapuaurastená.geometria.Bod.)
Budem predpokladať, že chcete zoznam (x, y) n -tíc? Vytvorte funkciu rýchleho prístupu pre atribúty x a y na aBoda používaťmapu.

Upraviť: Dobre, prišli sme na to, že k geometrii v GeoDataFrame máte pravdepodobne nesprávny prístup. Geometria je stĺpec vo vašom GeoDataFrame, ktorý sám vytvára sériu. Volanieťažiskov tomto stĺpci by vám mala poskytnúť novú GeoSériu iba týchto centroidov. Mám podozrenie, že spôsob, akým ste postupovali vo veciach, bol ťažiskom každého vrcholu v každom polygóne. Stále to nemôžem otestovať, pretože teraz nemôžem nainštalovať GeoPandas.

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

alebo ak chcete dva oddelené zoznamy súradníc x a y

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

Alternatívne by ste mali byť tiež schopní používaťzóny.geometria.centroidnamiestozóny ['geometria']. ťažisko. Tak či onak, myslím, že volaniezóny.centroidmôže vracať GeoDataFrame namiesto GeoSeries, čo vám poskytne neočakávaný výstup, keď ho zabalíte do iného GeoSeries.


Sám som na tento problém narazil. Ak chceteXarako samostatné stĺpce GeoDataFrame to potom funguje dobre:

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

Počnúc GeoPandas 0.3.0 môžete použiť poskytnutýXarvlastnosti namiesto:

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

Od GeoPandas 0.3.0 to bolo jednoduchšie.

Teraz máte prístupXarzurastené Bodyvo vnútri ageopandy GeoSeriespoužitímyour_GeoDataFrame.geometry.xayour_GeoDataFrame.geometry.y

(Poznámka: Používam python 3.6.1, nie som si istý správaním v 2.7, ospravedlňujeme sa)

Zdroj na github


Riešenie na extrakciu stredového bodu (zemepisnej šírky a dĺžky) z mnohouholníka a viacnásobného mnohouholníka.

importovať geopandy ako gpd df = gpd.read_file (cesta + 'df.geojson') #Nájsť stredový bod df ['Center_point'] = df ['geometry']. ťažisko #Extrahovať zemepisnú šírku a dĺžku od stredového bodu df ["lat. "] = df.Center_point.map (lambda p: px) df [" long "] = df.Center_point.map (lambda p: py)

Stretol som sa s podobným problémom, iba pomocou polygónových geometrií a zistil som, že toto riešenie pre mňa funguje dobre, pretože používa Python-3.6, takže nemusí fungovať pre Python-2.7.

importovať geopandy ako zóny gpd = gpd.read_file ('file_to_read.shp') pre i v rozsahu (0, len (zóny)): zones.loc [i, 'centroid_lon'] = zones.geometry.centroid.x.iloc [ i] zones.loc [i, 'centroid_lat'] = zones.geometry.centroid.y.iloc [i]

ak chcete iba početnú skupinu ťažníc:

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

alebo ako dátový rámec s ďalšími stĺpcami (napríklad s názvom):

pd.DataFrame (np.vstack ([df.name, df.centroid.x, df.centroid.y]). T, stĺpce = ['meno', 'x', 'y'])

napr.

geometria názvu 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) ). Pole T # ([[[0,5, 0,5], # [2,5, 0,5]])

Tu je rýchly prehľad

df = pd.read_csv ('data/hospitals.csv') df.columns # 'Vlastníctvo', 'Lat', 'Long' from shapely.geometry import Point df ['geometry'] = df.apply (lambda row: Point (riadok. dlhý, riadok. neskorý), os = 1)

Potom znova vytvorte dátový rámec pomocou geopand

gdf = gpd.DataFrame (df) # vytvára geodata s bodovou geometriou