2017-02-22 4 views
1

Je travaille sur l'apprentissage en utilisant des données géospatiales dans les bibliothèques de mappage Python de base, et c'est la première fois que je travaille avec Shapely/Polygons/Basemap/etc.Dessin de polygones remplis sur le fond de carte throws __getitem__ error

J'ai un ensemble de polygones qui décrivent les quartiers dans une zone donnée. Si je veux juste les dessiner clairement, la fonction ci-dessous fait le tour (mymap est juste un objet basemap, hood_map est une collection de quartiers et leurs polygones associés):

def drawNeighborhoods(mymap,hood_map): 
    for hood in hood_map.neighborhoods: 
     lon,lat = hood.polygon.exterior.coords.xy 
     x,y = mymap(lon,lat) 
     mymap.plot(x,y,'-k',color='lightgrey') 

Cela fonctionne bien et je reçois le contour de chaque quartier sur la carte. Cependant, je veux maintenant ombrer les quartiers en fonction des données externes que j'ai pour chaque quartier (par exemple blanc s'il n'y a pas de pizzerias, rouge s'il y a plus de 100 pizzerias, etc.). Pour ce faire, je crée une palette de couleurs, une barre de couleurs, etc.

cmap = cm.get_cmap('Reds') 
norm = Normalize(vmin=0, vmax=max(number_of_pizza_joints)) 
cb = ColorbarBase(ax, cmap=cmap, norm=norm) 

Puis-je faire cela (d'après de cet exemple https://gist.github.com/urschrei/6436526):

def drawNeighborhoods(mymap,hood_map): 
    patches = [] 
    for hood in hood_map.neighborhoods: 
     color = cmap(norm(hood.number_of_pizza_joints)) 
     lon,lat = hood.polygon.exterior.coords.xy 
     x,y = mymap(lon,lat) 
     poly = Polygon(zip(x,y)) 
     patches.append(PolygonPatch(poly,fc=color, ec='#555555', alpha=0.5, zorder=4)) 
    ax.add_collection(PatchCollection(patches, match_original=True)) 

Ici, je reçois une erreur qui est:

Traceback (most recent call last): 
    File "colorHoodsByPizza.py", line 103, in <module> 
    drawNeighborhoods(mymap,hood_map) 
    File "colorHoodsByPizza.py", line 52, in drawNeighborhoods 
    patches.append(PolygonPatch(poly,fc='#cc00cc', ec='#555555', alpha=0.5, zorder=4)) 
    File "/Users/zach/anaconda2/lib/python2.7/site-packages/descartes/patch.py", line 87, in PolygonPatch 
    return PathPatch(PolygonPath(polygon), **kwargs) 
    File "/Users/zach/anaconda2/lib/python2.7/site-packages/descartes/patch.py", line 53, in PolygonPath 
    ptype = polygon["type"] 
TypeError: 'Polygon' object has no attribute '__getitem__' 

Je pense que le getitem erreur est probable parce que polygone ["type"] n'existe pas, et il devrait être polygon.type; cependant c'est dans une bibliothèque pré-faite 'descartes' donc je suis confus quant à savoir pourquoi cette erreur est à venir. J'ai essayé de chercher autour de cette erreur se produisant dans les descartes, mais ne peux pas trouver de pistes; donc je suppose que je fais quelque chose de stupide. Des idées?

+0

Dans la documentation de descrates il y a un autre appel pour cette fonction: '# Tournez le formulaire dict GeoJSON-ish du polygone de n ° 1 dans un patch geo = polygone .__ geo_interface__ Patch = PolygonPatch (géo, facecolor = '#cccccc', edgecolor = '# 999999') ax.add_patch (patch) ' –

+0

Vérifiez simplement ses exemples. Les appels sont un peu différents. Je ne sais pas si l'auteur attend la contribution donnée –

+0

Salut @PiotrKamoda, Merci pour la contribution. Cela est vrai pour les objets GeoJSON, mais pour les polygones shapely/matplotlib, l'appel devrait être suffisant sans cette conversion. Voir les exemples ici: https://bitbucket.org/sgillies/descartes/src/4333a49e7339eeeb277c8fa7346b175597a8951c/examples/patches.py?at=default&fileviewer=file-view-default – Zach

Répondre

1

Pour l'enregistrement, j'ai résolu ce problème après beaucoup d'essais et d'erreurs. Il s'avère que l'ordre d'importation est important. Dans ce cas, j'importais Shapely via une autre importation (import A, dans A.py est importé bien). Descartes n'était pas, pour une raison quelconque, capable d'interagir avec l'importation de l'importation. Donc, en mettant l'importation shapely explicitement dans ma chaîne avant toutes les autres importations de bien fait, cela fonctionne.