我有两个GeoDataFrame。一个属于爱荷华州,而另一个属于北美未来72小时的预报雨。我想创建一个雨天预报的GeoDataFrame,它覆盖了爱荷华州。但是我得到了一个错误。
origin/iteration5
我检查了类型=='MultiPolygon',但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'
如果我执行以下操作,则交叉点可以正常工作。
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: []
我的问题有两个:1。为什么我的NA_rain GeoDataFrame中没有出现任何MultiPolygons,以及2.除了将每个Polygon转变为凸出多边形的详细轮廓的convex_hull之外,你会如何建议处理MultiPolygon问题。
答案 0 :(得分:0)
我同意@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 的所有多边形的数据帧的其他属性,包括特征标识符,您可能希望稍后根据您的任务进行更改。