web-dev-qa-db-fra.com

Polygones d'étiquettes GeoPandas

Compte tenu du fichier de forme disponible ici : Je voudrais étiqueter chaque polygone (comté) sur la carte. Est-ce possible avec GeoPandas?

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

Merci d'avance!

20
Dance Party2

c['geometry'] Est une série composée d'objets shapely.geometry.polygon.Polygon. Vous pouvez le vérifier en cochant

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

De la Shapely docs il y a une méthode representative_point() qui

Renvoie un point calculé à moindre coût qui se trouve à l'intérieur de l'objet géométrique.

Cela semble idéal pour une situation dans laquelle vous devez étiqueter les objets polygonaux! Vous pouvez ensuite créer une nouvelle colonne pour votre geopandasdataframe, 'coords' Comme ça

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

Maintenant que vous disposez d'un ensemble de coordonnées se rapportant à chaque objet polygone (chaque comté), vous pouvez annoter votre tracé en itérant dans votre cadre de données

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

enter image description here

32
lanery

pas besoin de boucler, voici comment annoter avec apply:

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