GeoPandas:剪切 shapefile 后绘图出错
GeoPandas: Error plotting after clipping shapefile
我对绘制哥德堡市(瑞典哥德堡英语)的数据很感兴趣。我从瑞典的 shapefile 开始,然后剪裁它们以集中我在哥德堡的学习。
# Extracting Göteborg boundary
boundary = adm_2.loc[(adm_2["NAME_2"] == "Göteborg")].copy()
boundary
>>
ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 TYPE_2 ENGTYPE_2 NL_NAME_2 VARNAME_2 geometry
246 222 SWE Sweden 21 Västra Götaland 247 Göteborg Kommuner Municipality None None MULTIPOLYGON (((12.09368 57.67838, 12.09466 57...
# Clipping the shapefiles
roads = geopandas.clip(roads_sweden, boundary)
buildings = geopandas.clip(buildings_sweden, boundary)
#roads.shape #(9747, 7)
#roads_sweden.shape #(148403, 7)
#buildings.shape #(1163, 4)
#buildings_sweden.shape #(15253, 4)
如果我绘制所有道路,即 roads_sweden。我有所有瑞典行的情节。然而,当试图只绘制哥德堡的道路时,我得到了错误:
IndexError: 数组的索引太多: 数组是一维的,但有 2 个索引
虽然它们看起来一样,但我不明白为什么。我什至尝试重置索引,但这似乎无关。
对于我正在使用的情节:
fig, ax = plt.subplots(figsize=(12, 10), facecolor='white', edgecolor='k')
boundary.plot(ax=ax, facecolor= "white", edgecolor="black", linewidth=.5)
roads.plot(ax=ax)
buildings.plot(ax=ax)
即使单独完成,即 roads.plot(),我也会收到错误。 roads_sweden.plot() 总是工作正常。
下面是一些数据预览
roads_sweden.head()
>>
osm_id name ref type oneway maxspeed geometry
0 1240 Klensmedsvägen None unclassified 0 0 LINESTRING (17.99027 59.29686, 17.99182 59.296...
1 1241 Hyvelvägen None residential 0 0 LINESTRING (17.99273 59.29666, 17.99212 59.295...
2 1242 Spikvägen None residential 0 0 LINESTRING (17.99353 59.29640, 17.99299 59.295...
3 1243 Bultvägen None residential 0 0 LINESTRING (17.99439 59.29617, 17.99385 59.295...
4 1245 Tångvägen None residential 0 0 LINESTRING (17.99691 59.29512, 17.99637 59.294...
roads.head()
>>
osm_id name ref type oneway maxspeed geometry
0 3846609 None None motorway_link 1 0 LINESTRING (12.09100 57.67369, 12.09090 57.673...
1 4040303 E6 None motorway 0 0 LINESTRING (12.00496 57.84283, 12.00525 57.841...
2 4040436 None None motorway_link 1 0 LINESTRING (12.00643 57.79800, 12.00560 57.796...
3 4040439 None E 20 motorway 1 0 LINESTRING (11.99463 57.71530, 11.99492 57.715...
4 4040441 None E 20 motorway 1 0 LINESTRING (11.99520 57.71580, 11.99434 57.71536)
数据源
行政区域(见区域2):https://www.diva-gis.org/datadown
道路和建筑物:https://mapcruzin.com/free-sweden-arcgis-maps-shapefiles.htm
我将问题追溯到索引为 125779
的道路,它具有这些坐标:[(11.8892841, 57.6579022), (11.8892841, 57.6579022)]
,所以它基本上是一个点。裁剪时,此几何图形将转换为“LINESTRING EMPTY”。也许它应该将这个空行转换为相应的点,但无论如何我想应该在 geopandas 的计划中进行修复以忽略这些空行而不是引发这样一个不清楚的错误(随时提交问题 https://github.com/geopandas/geopandas/issues ).
同时,您可以通过仅选择非空几何来绘制数据:
roads.loc[~roads.geometry.is_empty].plot(ax=ax)
我对绘制哥德堡市(瑞典哥德堡英语)的数据很感兴趣。我从瑞典的 shapefile 开始,然后剪裁它们以集中我在哥德堡的学习。
# Extracting Göteborg boundary
boundary = adm_2.loc[(adm_2["NAME_2"] == "Göteborg")].copy()
boundary
>>
ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2 TYPE_2 ENGTYPE_2 NL_NAME_2 VARNAME_2 geometry
246 222 SWE Sweden 21 Västra Götaland 247 Göteborg Kommuner Municipality None None MULTIPOLYGON (((12.09368 57.67838, 12.09466 57...
# Clipping the shapefiles
roads = geopandas.clip(roads_sweden, boundary)
buildings = geopandas.clip(buildings_sweden, boundary)
#roads.shape #(9747, 7)
#roads_sweden.shape #(148403, 7)
#buildings.shape #(1163, 4)
#buildings_sweden.shape #(15253, 4)
如果我绘制所有道路,即 roads_sweden。我有所有瑞典行的情节。然而,当试图只绘制哥德堡的道路时,我得到了错误:
IndexError: 数组的索引太多: 数组是一维的,但有 2 个索引
虽然它们看起来一样,但我不明白为什么。我什至尝试重置索引,但这似乎无关。
对于我正在使用的情节:
fig, ax = plt.subplots(figsize=(12, 10), facecolor='white', edgecolor='k')
boundary.plot(ax=ax, facecolor= "white", edgecolor="black", linewidth=.5)
roads.plot(ax=ax)
buildings.plot(ax=ax)
即使单独完成,即 roads.plot(),我也会收到错误。 roads_sweden.plot() 总是工作正常。
下面是一些数据预览
roads_sweden.head()
>>
osm_id name ref type oneway maxspeed geometry
0 1240 Klensmedsvägen None unclassified 0 0 LINESTRING (17.99027 59.29686, 17.99182 59.296...
1 1241 Hyvelvägen None residential 0 0 LINESTRING (17.99273 59.29666, 17.99212 59.295...
2 1242 Spikvägen None residential 0 0 LINESTRING (17.99353 59.29640, 17.99299 59.295...
3 1243 Bultvägen None residential 0 0 LINESTRING (17.99439 59.29617, 17.99385 59.295...
4 1245 Tångvägen None residential 0 0 LINESTRING (17.99691 59.29512, 17.99637 59.294...
roads.head()
>>
osm_id name ref type oneway maxspeed geometry
0 3846609 None None motorway_link 1 0 LINESTRING (12.09100 57.67369, 12.09090 57.673...
1 4040303 E6 None motorway 0 0 LINESTRING (12.00496 57.84283, 12.00525 57.841...
2 4040436 None None motorway_link 1 0 LINESTRING (12.00643 57.79800, 12.00560 57.796...
3 4040439 None E 20 motorway 1 0 LINESTRING (11.99463 57.71530, 11.99492 57.715...
4 4040441 None E 20 motorway 1 0 LINESTRING (11.99520 57.71580, 11.99434 57.71536)
数据源
行政区域(见区域2):https://www.diva-gis.org/datadown
道路和建筑物:https://mapcruzin.com/free-sweden-arcgis-maps-shapefiles.htm
我将问题追溯到索引为 125779
的道路,它具有这些坐标:[(11.8892841, 57.6579022), (11.8892841, 57.6579022)]
,所以它基本上是一个点。裁剪时,此几何图形将转换为“LINESTRING EMPTY”。也许它应该将这个空行转换为相应的点,但无论如何我想应该在 geopandas 的计划中进行修复以忽略这些空行而不是引发这样一个不清楚的错误(随时提交问题 https://github.com/geopandas/geopandas/issues ).
同时,您可以通过仅选择非空几何来绘制数据:
roads.loc[~roads.geometry.is_empty].plot(ax=ax)