python - basemap 形状文件可视化

标签 python matplotlib matplotlib-basemap

使用 Basemap 创建一些 map 后,我变得热情起来。我想集成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

我的问题:

  1. 我假设lon[1],lon[1]是边界的一个点。显然还有更多。
  2. 如何查明该文件的内容。什么是shapeType记录内的数字是什么?
  3. 坐标似乎不是“标准”WGS84?它是什么?
  4. 有没有快速绘制多边形的方法?

非常感谢!!!

最佳答案

我最近写了一篇关于使用 basemap 制作 map 的博客文章,在其中,我使用 shapefile 在英格兰和威尔士的邮政编码区域进行绘制和着色。可能会有一些帮助。 https://datadependence.com/2016/06/creating-map-visualisations-in-python/

基本上,您可以使用 shapefile 创建一个 PatchCollection,然后为 PatchCollection 着色。然后将其添加到您的 map 中,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)

在此示例中,我使用新房屋的数量来为每个区域着色,但您可以做您喜欢的事情。

关于python - basemap 形状文件可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37859994/

相关文章:

python - Pandas 重命名多个 NaN 列名称

python - 带平滑条件的拉普拉斯校正

python - 如何平滑 python 散点图中的数据点?

python - 二维纬度/经度数据为什么我的 pcolor 图没有绘制数据

python - 如何使用 PyYaml 或 Ruamel.yaml 仅转储具有 flow_style 的列表

python - 如何提取标签内的 unicode 文本?

python - 绘图中不需要的调色板

python - x 坐标范围较大时,matplotlib 中的条形图显示较少的条形图

python - 使用非零 alpha 值时, basemap 中的 pcolormesh 上出现奇怪的线条

python - 如何在 python 中使用 matplotlib/basemap 在正交投影上标记平行线/子午线