Vairāk

GeoPandas: atdot latus un garu centra punktu

GeoPandas: atdot latus un garu centra punktu


Es gribētu atgrieztlatunlonvaixunyno punktu objekta nākamajā sērijā, jo es plānoju tos saistīt ar manu izveidoto API, kas savieno OSM un NetworkX. Centroīdi tiks pievienoti kā jauni mezgli tīkla analīzei.

gp.GeoSeries (zone.centroid) .x, ungp.GeoSeries (zone.centroid) .ykā norādīts dokumentos paaugstinātAttributeError: “GeoSeries” objektam nav atribūta “x”kļūda.

Nedaudz mainot lietas un drukājotsaraksts (gp.GeoSeries (zone.centroid))atdod tūkstošiem formālu punktu šādā formātā:

[… , , , , , , , ]

Kods, ko izmantoju, ir šāds:

importēt ģeopandas kā gp zonas = gp.GeoDataFrame.from_file (shp_file) indeksam, rindas zonās.iterrows (): drukas indekss, gp.GeoSeries (zone.centroid) # result: # 9700022.00 POINT (-122.8196050489696 54.00617624128600) (-122.7474362519174 53.99998921974029) # 9700100.00 PUNKTS (-121.4904983300892 53.98447191612864) # 9700101.00 PUNKTS (-122.5513619751679 53.73999791511078) # 9700102.00 POINT

Kā es varu atgrieztxunyno GeoPandas POINT objekta?


Pārējo atstājot zemāk, bet galvenais bija pareizi piekļūt ģeometrijai. Ja atkārto vairāk nekā rindas, piem.indeksam rindas zonās .iterrows ():jūs varat vienkārši izmantotrow.geometry.centroid.xunrow.geometry.centroid.y. Ģeometrija ir īpaša kolonna, kas iekļauta GeoDataFrame, tāpēc katrā rindā ir ģeometrijas atribūts.
Jūs piekļūstat šim atribūtam, kurā irformīgsobjekts. Tasformīgsobjektam būs atribūts,centrālaiskas savukārt satur aformīgs.ģeometrija.Punkts, kurai ir atribūtixuny, beidzot dodot jums vēlamos īpašumus.


(Šī daļa bija sākotnējais mēģinājums nokļūt x, y arkarteunformīgs.ģeometrija.Punkts.)
Es pieņemu, ka vēlaties (x, y) kartotēku sarakstu? Izveidojiet ātrās piekļuves funkciju x un y atribūtiem aPunktsun izmantotkarte.

Rediģēt: Labi, sapratu, ka, iespējams, nepareizi piekļūstat GeoDataFrame ģeometrijai. Ģeometrija ir kolonna jūsu GeoDataFrame, kas pati rada sēriju. Zvanacentrālaisšajā kolonnā ir jānorāda jauna GeoSeries tikai no šiem centrālajiem. Man ir aizdomas, ka tas, kā jūs rīkojāties, bija katra daudzstūra katra virsotnes centrālais punkts. Joprojām nevaru to pārbaudīt, jo šobrīd nevaru instalēt GeoPandas.

def getXY (pt): atgriešanās (pt.x, pt.y) centroidseries = zonas ['ģeometrija']. centroid centroidlist = karte (getXY, centroidseries)

vai ja vēlaties divus atsevišķus x un y koordinātu sarakstus

def getXY (pt): atgriešanās (pt.x, pt.y) centroidseries = zonas ['ģeometrija']. centroid x, y = [saraksts (t) for t in zip (*karte (getXY, centroidseries))]

Alternatīvi jums vajadzētu būt iespējai arī izmantotzonas.ģeometrija.centrotā vietāzonas ['ģeometrija']. centroid. Jebkurā gadījumā es domāju, ka zvanuzonas.centroiespējams, atgriezīs GeoDataFrame, nevis GeoSeries, nodrošinot negaidītu rezultātu, iesaiņojot to citā GeoSeries.


Pati saskāros ar šo problēmu. Ja jūs vēlaties ,.xunykā atsevišķas GeoDataFrame kolonnas, tad tas darbojas labi:

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

Sākot ar GeoPandas 0.3.0, varat izmantot piedāvātoxunyīpašumi:

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

Tas ir kļuvis vieglāk, izmantojot GeoPandas 0.3.0.

Tagad varat piekļūtxunynoformāli punktiiekšpusē aģeopandas GeoSeriesizmantojotyour_GeoDataFrame.geometry.xunyour_GeoDataFrame.geometry.y

(Piezīme: es izmantoju python 3.6.1, neesmu pārliecināts par 2.7 uzvedību, atvainojiet)

Avots vietnē github


Risinājums centra punkta (platuma un garuma) iegūšanai no daudzstūra un daudzstūra.

importēt ģeopandas kā gpd df = gpd.read_file (ceļš + 'df.geojson') #Atrodiet centra punktu df ['Center_point'] = df ['ģeometrija']. centroid #Izvelciet lat un lon no centra punkta df ["lat "] = df.Center_point.map (lambda p: px) df [" long "] = df.Center_point.map (lambda p: py)

Es saskāros ar līdzīgu problēmu, tikai izmantojot daudzstūra ģeometriju, un atklāju, ka šis risinājums man labi darbojās, ņemiet vērā, ka tas izmanto Python-3.6, tāpēc tas var nedarboties Python-2.7.

importēt ģeopandas kā gpd zonas = gpd.read_file ('file_to_read.shp') i diapazonā (0, len (zone)): zone.loc [i, 'centroid_lon'] = zone.geometry.centroid.x.iloc [ i] zone.loc [i, 'centroid_lat'] = zonas.geometry.centroid.y.iloc [i]

ja vēlaties tikai virkni centraīdu:

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

vai kā datu rāmis ar papildu kolonnām (piemēram, nosaukums):

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

piem.

vārda ģeometrija 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 # masīvs ([[0.5, 0.5], # [2.5, 0.5]])

Lūk, ātrs

df = pd.read_csv ('data/hospitals.csv') df.column # 'Ownership', 'Lat', 'Long' no shapely.geometry importēšanas punkts df ['geometry'] = df.apply (lambda rinda: punkts (rinda.Gara, rinda.Lat), ass = 1)

Pēc tam atkārtoti izveidojiet datu rāmi, izmantojot ģeopandas

gdf = gpd.DataFrame (df) # izveido ģeodatu rāmi ar punkta ģeometriju

Skatīties video: Lielie nodokļu parādnieki valstij ir parādā 142 miljonus latu