python - 在 basemap 上绘制填充多边形会引发 __getitem__ 错误

标签 python polygon matplotlib-basemap shapely descartes

我正在学习如何在基础 Python 映射库中使用地理空间数据,这是我第一次使用 Shapely/Polygons/Basemap/etc。

我有一组描述给定区域中的邻域的多边形。如果我只是想简单地绘制它们,下面的函数就可以解决问题(mymap 只是一个 Basemap 对象,hood_map 是邻域及其关联多边形的集合):

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

这很有效,我可以在 map 上看到每个社区的轮廓。但是,我现在想根据每个社区的外部数据对社区进行着色(例如,如果没有比萨饼店,则为白色;如果有 100 多个比萨店,则为红色,等等)。为此,我创建了一个颜色图、颜色条等,如下所示。

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

然后我这样做(基于此示例 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))

在这里,我收到一个错误:

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__'

我的猜测是getitem错误很可能是因为polygon["type"]不存在,它应该是polygon.type;然而,这是在预制库“笛卡尔”中,所以我很困惑为什么会出现这个错误。我尝试搜索笛卡尔中发生的此错误,但找不到任何线索;所以我认为我在做一些愚蠢的事情。有什么见解吗?

最佳答案

根据记录,我经过多次尝试和错误后解决了这个问题。事实证明,进口订单很重要。在本例中,我通过另一个导入导入 Shapely(导入 A;A.py 内部是导入 shapely)。无论出于何种原因,笛卡尔都无法与导入中的导入进行交互。因此,通过在任何其他 shapely 导入之前明确地将 import shapely 放入我的链中,它就可以工作。

关于python - 在 basemap 上绘制填充多边形会引发 __getitem__ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394953/

相关文章:

python - Enthought Canopy Mayavi 字体大小错误

python - OrderedDict 跳过具有 NaN 值的条目

json - Swift:指向多边形?如何检查用户的位置是否在 Geo-JSON 多边形内?

python - 无法在 basemap Python中找到shapefile

python - basemap 在经纬度之间画线

多处理中共享dict()中的python共享Queue()

python - 预计 : Is there any way to prevent input overrun while using pexpect?

algorithm - 用最大数量的网格正方形填充多边形

silverlight - 如何为多边形制作动画? (读取 : Animate the contour to change shape)

python - plt.savefig() : ValueError: All values in the dash list must be positive