2016-08-11 16 views
6

Mevcut şekil dosyası verildiğinde here: Haritadaki her bir çokgen (ilçe) etiketlemek istiyorum. GeoPandas ile bu mümkün mü?GeoPandas Etiket Çokgenler

import geopandas as gpd 
import matplotlib.pyplot as plt 
%matplotlib inline 

shpfile=<Path to unzipped .shp file referenced and linked above> 
c=gpd.read_file(shpfile) 
c=c.loc[c['GEOID'].isin(['26161','26093','26049','26091','26075','26125','26163','26099','26115','26065'])] 
c.plot() 

Şimdiden teşekkürler!

cevap

11

c['geometry'], shapely.geometry.polygon.Polygon nesnelerinden oluşan bir seridir. Bir yöntem

geometrik nesnenin içinde olması sağlanır bir ucuza bilgisayarlı nokta verir o representative_point() yoktur Shapely docs itibaren

In [23]: type(c.ix[23, 'geometry']) 
Out[23]: shapely.geometry.polygon.Polygon 

kontrol ederek doğrulayabilirsiniz.

Çokgen nesnelerini etiketlemeniz gereken durumlar için ideal olan sesler! Daha sonra Şimdi her poligon nesnesine (her ilçe) ait koordinatlar bir dizi var ki

c['coords'] = c['geometry'].apply(lambda x: x.representative_point().coords[:]) 
c['coords'] = [coords[0] for coords in c['coords']] 

gibi, geopandasdataframe için 'coords' yeni bir sütun oluşturabilir, sizin dataframe yineleme ederek arsa açıklama olabilir burada

c.plot() 
for idx, row in c.iterrows(): 
    plt.annotate(s=row['NAME'], xy=row['coords'], 
       horizontalalignment='center') 

enter image description here

+0

@Fantastic! Teşekkürler. –

8

döngü gerek yok, sen içeren açıklama nasıl olduğunu geçerlidir:

ax = df.plot() 
df.apply(lambda x: ax.annotate(s=x.NAME, xy=x.geometry.centroid.coords[0], ha='center'),axis=1); 
+0

Zarif ve basit. –

+1

Bir yazım hatası yaptınız mı: 'xy = x.coords'? – dmvianna

+0

Kabul edilen cevap benim için çalıştı, ama bu değil. Bu örnekte 'name' ve 'geometry 'olan iki tane ilgi alanım var. Uygulandığında, bunların üzerine döngü yapılır ve baskılara göre, veri satırını satır başına almıyorsa, sütuna göre sütun gibidir. – h4k1m