【问题标题】:geopandas AttributeError: 'MultiPolygon' object has no attribute 'exterior'geopandas AttributeError:“MultiPolygon”对象没有属性“exterior”
【发布时间】:2017-01-27 11:08:44
【问题描述】:

我有两个 GeoDataFrame。一个是爱荷华州,另一个是预测北美未来 72 小时的降雨。我想创建一个覆盖爱荷华州的降雨预报的 GeoDataFrame。但我得到一个错误。

state_rain = gpd.overlay(NA_rain,iowa,how='intersection')      

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-39-ba8264ed63c2> in <module>()
  3 #ws_usa[['WTRSHD_ID','QPF']].groupby('WTRSHD_ID').max().reset_index()
  4 #state_rain = sjoin(usa_r,usa,how='inner',op='intersects')
----> 5 state_rain = gpd.overlay(usa_r,joined_states,how='intersection')
  6 ws_state = gpd.overlay(ws,joined_states,how='intersection')
  7 #print ws_usa.loc[ws_usa.WTRSHD_ID == 'IA-04']['QPF']

C:\Anaconda2\lib\site-packages\geopandas\tools\overlay.pyc in overlay(df1, df2, how, use_sindex)
 95 
 96     # Collect the interior and exterior rings
---> 97     rings1 = _extract_rings(df1)
 98     rings2 = _extract_rings(df2)
 99     mls1 = MultiLineString(rings1)

C:\Anaconda2\lib\site-packages\geopandas\tools\overlay.pyc in     _extract_rings(df)
 50                 # geom from layer is not valid attempting fix by buffer 0"
 51                 geom = geom.buffer(0)
---> 52             rings.append(geom.exterior)
 53             rings.extend(geom.interiors)
 54 

AttributeError: 'MultiPolygon' object has no attribute 'exterior'

我检查了 type == 'MultiPolygon',但 GeoDataFrame 都不包含任何内容。

print NA_rain[NA_rain.geometry.type == 'MulitPolygon']
print iowa[iowa.geometry.type == 'MultiPolygon']

Empty GeoDataFrame
Columns: [END_TIME, ID, ISSUE_TIME, PRODUCT, QPF, START_TIME, UNITS, VALID_TIME, geometry]
Index: []
Empty GeoDataFrame
Columns: [sid, AFFGEOID, ALAND, AWATER, GEOID, LSAD, NAME, STATEFP, STATENS, STUSPS, geometry]
Index: []

如果我执行以下操作,则交叉点有效。

NA_rain.geometry = NA_rain.geometry.map(lambda x: x.convex_hull)

我的问题是双重的:1.为什么没有任何 MultiPolygons 出现在我的 NA_rain GeoDataFrame 中,以及 2.除了将每个多边形变成一个凸包外,这会破坏多边形的详细轮廓,您建议如何处理 MultiPolygon问题。

【问题讨论】:

  • 通过在geom.buffer(0)前后打印几何来调试它
  • 第一个问题:至少在你的 sn-p 中,你的相等性检查是NA_rain.geometry.type == 'MulitPolygon',而不是NA_rain.geometry.type == 'MultiPolygon'。这只是一个转录错误,还是NA_rain 确实有MultiPolygon 条目?
  • @O.D.P 你能用一小部分数据复制这个问题吗(你可以在这里分享吗?)。如果无法访问数据,很难知道可能出了什么问题

标签: python pandas polygon shapely geopandas


【解决方案1】:

我同意@jdmcbr。我怀疑NA_rain 中的至少一个功能是 MultiPolygon,由于您显示的条件拼写错误(MulitPolygon 而不是MultiPolygon),因此没有被检测到。

如果您的数据框有 MultiPolygons,您可以将它们全部转换为 Polygons。一个肮脏的方法是将list() 函数传递给每个MultiPolygon,然后分解成多行:

geom = NA_rain.pop('geometry')
geom = geom.apply(lambda x: list(x) if isinstance(x, MultiPolygon) else x).explode())
NA_rain = NA_rain.join(geom, how='inner')

请注意,第 3 行中的连接复制了 MultiPolygon 的所有多边形的数据框的其他属性,包括要素标识符,您可能希望稍后根据您的任务进行更改。

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 2021-04-08
    • 1970-01-01
    • 2012-12-01
    • 2021-04-19
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多