我以shapefile格式从US Census下载了地图。它具有我需要的所有必需信息,但由于某种原因,我需要一个特定的地图给我这个错误:
Traceback (most recent call last):
File "C:/Users/Leb/Desktop/Python/Kaggle/mapp.py", line 17, in <module>
shp_info = m.readshapefile('gis/cb_2014_us_state_5m', 'states', drawbounds=True)
File "C:\Program Files\Python 3.5\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 2162, in readshapefile
raise ValueError('readshapefile can only handle 2D shape types')
ValueError: readshapefile can only handle 2D shape types
更具体地说,these文件集给了我错误。如您所见,我下载了5m
分辨率shapefile。
这是我用来执行命令的代码:
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap as Basemap
m = Basemap(llcrnrlon=-119, llcrnrlat=22, urcrnrlon=-64, urcrnrlat=49,
projection='lcc', lat_1=33, lat_2=45, lon_0=-95)
shp_info = m.readshapefile('gis/cb_2014_us_state_5m', 'states', drawbounds=True)
问题:
Fiona
进行转换?还是ArcGIS
?为了
将其更改为正确的格式。basemap
?答案 0 :(得分:1)
问题是这些cb_文件是形状为3D的PolygonZ对象的列表,而readhapefile需要它们是2D Polygon对象,即使Z维度都是0,就像这些cb_*
文件的情况一样。你可以convert them by stripping the Z dimension。
我开始使用geopandas作为底图和其他实用程序的包装器,这就是我转换它们的方式:
def convert_3D_2D(geometry):
'''
Takes a GeoSeries of Multi/Polygons and returns a list of Multi/Polygons
'''
import geopandas as gp
new_geo = []
for p in geometry:
if p.has_z:
if p.geom_type == 'Polygon':
lines = [xy[:2] for xy in list(p.exterior.coords)]
new_p = Polygon(lines)
new_geo.append(new_p)
elif p.geom_type == 'MultiPolygon':
new_multi_p = []
for ap in p:
lines = [xy[:2] for xy in list(ap.exterior.coords)]
new_p = Polygon(lines)
new_multi_p.append(new_p)
new_geo.append(MultiPolygon(new_multi_p))
return new_geo
import geopandas as gp
some_df = gp.from_file('your_cb_file.shp')
some_df.geometry = convert_3D_2D(cbsa.geometry)
使用pip install geopandas
安装GeoPandas。我认为应该是它!