底图 Shapefile 可视化
Basemap Shapefile visualizing
在使用 Basemap 创建了一些地图后,我变得热情起来。我想集成 shapefile 信息,比方说多边形,但是有一些问题。我在这里下载了巴伐利亚村庄的寄宿生:
https://www.arcgis.com/home/item.html?id=b752861d1a08489b9a40337668d4367e
现在我想为雷根斯堡整合一个多边形。我可以用这段代码获取信息,但我遇到了一些问题
#!/usr/bin/env python
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import shapefile
map = Basemap(projection='merc',
resolution='l',
area_thresh=0.01,
llcrnrlon=9.497681, llcrnrlat=47.827908,
urcrnrlon=12.683716, urcrnrlat=50.408517)
map.drawcountries(color="gray")
map.fillcontinents(color='#c8dfb0', lake_color='#53BEFD')
map.drawmapboundary(color='black', linewidth=0.5, fill_color='#53BEFD')
sf = shapefile.Reader("BY_Gemeinden/BY_Gemeinden_WM.shp")
shapes = sf.shapes()
records = sf.records()
for record, shape in zip(records, shapes):
if record[3] == "Regensburg":
print(shape.shapeType)
lons, lates = zip(*shape.points)
print(record)
print(lons)
print(lates)
plt.savefig("foo.eps")
输出如下所示:
5
[797, 'BY', '6001', 'Regensburg', 'Regensburg', 'Freistaat
Bayern','Oberpfalz', '09362000', '6.42920556908e+004',
'8.05927936478e+007']
1350746.04018
6287601.12826
我的问题:
- 我假设
lon[1],lon[1]
是边界的一分。显然还有很多。
- 我如何找出文件内容。什么是
shapeType
? records
里面的数字是多少?
- 坐标好像不是"standard"WGS84?这是什么?
- 有没有快速绘制多边形的方法?
非常感谢!!!
我最近写了一篇关于使用 Basemap 制作地图的博客 post,在其中,我使用 shapefile 在英格兰和威尔士的 postcode 区域绘制和着色。这可能会有所帮助。 https://datadependence.com/2016/06/creating-map-visualisations-in-python/
基本上,您可以使用 shapefile 创建一个 PatchCollection,然后为 PatchCollection 着色。然后将其添加到您的地图,Bob 是您的叔叔。
m.readshapefile('data/uk_postcode_bounds/Areas', 'areas')
df_poly = pd.DataFrame({
'shapes': [Polygon(np.array(shape), True) for shape in m.areas],
'area': [area['name'] for area in m.areas_info]
})
df_poly = df_poly.merge(new_areas, on='area', how='left')
cmap = plt.get_cmap('Oranges')
pc = PatchCollection(df_poly.shapes, zorder=2)
norm = Normalize()
pc.set_facecolor(cmap(norm(df_poly['count'].fillna(0).values)))
ax.add_collection(pc)
在这个例子中,我使用新房的数量来为每个区域着色,但你可以随心所欲。
在使用 Basemap 创建了一些地图后,我变得热情起来。我想集成 shapefile 信息,比方说多边形,但是有一些问题。我在这里下载了巴伐利亚村庄的寄宿生:
https://www.arcgis.com/home/item.html?id=b752861d1a08489b9a40337668d4367e
现在我想为雷根斯堡整合一个多边形。我可以用这段代码获取信息,但我遇到了一些问题
#!/usr/bin/env python
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import shapefile
map = Basemap(projection='merc',
resolution='l',
area_thresh=0.01,
llcrnrlon=9.497681, llcrnrlat=47.827908,
urcrnrlon=12.683716, urcrnrlat=50.408517)
map.drawcountries(color="gray")
map.fillcontinents(color='#c8dfb0', lake_color='#53BEFD')
map.drawmapboundary(color='black', linewidth=0.5, fill_color='#53BEFD')
sf = shapefile.Reader("BY_Gemeinden/BY_Gemeinden_WM.shp")
shapes = sf.shapes()
records = sf.records()
for record, shape in zip(records, shapes):
if record[3] == "Regensburg":
print(shape.shapeType)
lons, lates = zip(*shape.points)
print(record)
print(lons)
print(lates)
plt.savefig("foo.eps")
输出如下所示:
5
[797, 'BY', '6001', 'Regensburg', 'Regensburg', 'Freistaat
Bayern','Oberpfalz', '09362000', '6.42920556908e+004',
'8.05927936478e+007']
1350746.04018
6287601.12826
我的问题:
- 我假设
lon[1],lon[1]
是边界的一分。显然还有很多。 - 我如何找出文件内容。什么是
shapeType
?records
里面的数字是多少? - 坐标好像不是"standard"WGS84?这是什么?
- 有没有快速绘制多边形的方法?
非常感谢!!!
我最近写了一篇关于使用 Basemap 制作地图的博客 post,在其中,我使用 shapefile 在英格兰和威尔士的 postcode 区域绘制和着色。这可能会有所帮助。 https://datadependence.com/2016/06/creating-map-visualisations-in-python/
基本上,您可以使用 shapefile 创建一个 PatchCollection,然后为 PatchCollection 着色。然后将其添加到您的地图,Bob 是您的叔叔。
m.readshapefile('data/uk_postcode_bounds/Areas', 'areas')
df_poly = pd.DataFrame({
'shapes': [Polygon(np.array(shape), True) for shape in m.areas],
'area': [area['name'] for area in m.areas_info]
})
df_poly = df_poly.merge(new_areas, on='area', how='left')
cmap = plt.get_cmap('Oranges')
pc = PatchCollection(df_poly.shapes, zorder=2)
norm = Normalize()
pc.set_facecolor(cmap(norm(df_poly['count'].fillna(0).values)))
ax.add_collection(pc)
在这个例子中,我使用新房的数量来为每个区域着色,但你可以随心所欲。