PythonCartopy:如何解决“多边形对象错误”

问题描述

运行脚本时出现此错误。 有办法纠正吗?

预先感谢

File "/usr/local/lib/python3.8/dist-packages/cartopy/mpl/geoaxes.py",line 718,in add_geometries
    feature = cartopy.feature.ShapelyFeature(geoms,crs,**kwargs)
  File "/usr/local/lib/python3.8/dist-packages/cartopy/feature/__init__.py",line 221,in __init__
    self._geoms = tuple(geometries)
TypeError: 'polygon' object is not iterable

这里安装了一些python软件包

cartopy==0.18.0
Shapely==1.7.1
matplotlib==3.1.2
scipy==1.3.3
seaborn==0.9.0






def area(ax,iso,clr) :
    shp = shpreader.natural_earth(resolution='10m',category='cultural',name='admin_0_countries')
    reader = shpreader.Reader(shp)
    for n in reader.records() :
        if n.attributes['ADM0_A3'] == iso: 
            ax.add_geometries(n.geometry,ccrs.PlateCarree(),facecolor=clr,alpha = 1.00,linewidth =0.15,edgecolor = "black",label=n.attributes['ADM0_A3']) 
    return ax

iso3 = ['CMR']

解决方法

代替这些行:

if n.attributes['ADM0_A3'] == iso: 
  ax.add_geometries(n.geometry,ccrs.PlateCarree(),facecolor=clr,alpha = 1.00,linewidth =0.15,edgecolor = "black",label=n.attributes['ADM0_A3']) 

放入这些行。在这里,我们添加了异常处理,然后尝试将'Polygon'对象转换为不会产生错误的'MultiPolygon'对象:

try:
  ax.add_geometries(n.geometry,label=n.attributes['ADM0_A3']) 
except Exception as e:
  #print(e)
  import shapely.wkt as wkt
  from shapely.geometry import MultiPolygon
  list_str_polygons = [str(n.geometry)]
  c = MultiPolygon(map(wkt.loads,list_str_polygons))
  ax.add_geometries(c,label=n.attributes['ADM0_A3']) 
,

方法 add_geometries 将一组形状作为输入。来自documentation

add_geometries(geoms,crs,**kwargs)[source]

将给定的匀称几何图形(在给定的 crs 中)添加到轴。 参数:

  • geoms – 一组匀称的几何图形。
  • crs – 定义了所提供几何的 cartopy CRS。

在绘制单个国家/地区时,您需要提供一个包含单个项目(您要绘制的国家/地区)的可迭代(列表)才能使其工作:

ax.add_geometries(
    [n.geometry],alpha=1.00,linewidth=0.15,edgecolor="black",label=n.attributes['ADM0_A3'])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...