使用OpenStreetMap数据的区域分段地图

5
我的目标是在德国的邮政编码区域获得所谓的“等值面地图”(我猜是这个)。我已经找到了Python包“folium”,但似乎它需要一个.json文件作为输入:https://github.com/python-visualization/folium。在OpenStreetMap上,我只看到shp.zip和.osm.pbf文件。在shp.zip存档中,我发现各种我从未听说过的文件结尾,但没有.json文件。我该如何使用来自OpenStreetMap的数据来提供给folium?我是否走错了方向?

以前没有做过这个,但很快也需要它。如果有帮助的话,可以看一下关于类似主题的这篇文章 - cardamom
3个回答

1
如果您想创建一个区域地图,您需要按照以下步骤进行操作:
  1. 首先,您需要一个包含该国家地区信息的文件。本答案提供了一个样例.json文件,但实际上有许多常用于地图的文件格式。在您的情况下,您需要将OSM形状文件(.shp)转换为更现代的文件类型,如.geojson。幸运的是,我们有ogr2ogr来完成这最后一步:

ogr2ogr -f GeoJSON -t_srs EPSG:4326 -simplify 1000 [name].geojson [name].shp

建议:您还可以从这些网站中提取行政边界:

* [OSM Boundaries Map 4.2][2]
* [Mapzen][3]
* [Geofabrik][4]  
  1. 下载基于它的数据(例如 .csv 文件)。显然,该文件必须有一个包含该国邮政编码的列。

  2. 一旦获得这些文件,其余部分就很简单了,Folium 将自动创建等值线地图。

我写了一个关于美国失业率的简单示例:

代码:

import folium
import pandas as pd

osm = folium.Map([43, -100], zoom_start=4)

osm.choropleth(
    geo_str = open('US_states.json').read(),
    data = pd.read_csv("US_unemployment.csv"),
    columns = ['State', 'Unemployment'],
    key_on = 'feature.id',
    fill_color = 'YlGn',
)

输出:

enter image description here


本答案附带了一个示例 .json 文件,但您也可以从形状文件 (.shp) 创建此文件。这基本上是我的问题:您如何处理 OpenStreetMap 数据以将其提供给 Folium?您能否在此部分提供更多详细信息? - user3182532
地图是自动从OpenStreetMap中提取的。像.json这样的文件只包含有关边界的信息。您想了解如何将.shp文件转换为.json文件吗? - mforpe
是的,我认为这是我需要完成的步骤。使用folium本身似乎非常简单。 我需要从openstreetmap获得邮政编码边界信息(无论文件是什么),将其转换为.json,然后使用教程/您的帖子中的代码。 - user3182532
你可以使用我发布的小程序提取行政边界线。有许多方法可以做到这一点,但大多数都不是简单的。 - mforpe

0

我本人没有做过这个,但是有各种解决方案可以将OSM文件(.osm或.pbf)转换为(geo)json。例如 osmtogeojson。更多工具可以在OSM维基中的GeoJSON页面找到。


那么我需要从OpenStreetMap下载哪个文件呢?我需要一个包含邮政编码区域边界的文件。我找不到它。之后,我猜我可以尝试那些转换工具。 - user3182532
这是一个不同的问题。通常,OSM文件包含OSM中可用的所有信息。如果您只想要邮政编码,则可以从OSM文件中提取它们(例如通过osmium),或者首先使用Overpass API仅下载邮政编码。无论哪种方式,评论都不适合详细解释这些步骤。此外,关于仅下载特定OSM数据的问题已经多次得到回答(在这里,在http://gis.stackexchange.com和在help.openstreetmap.org)。 - scai
@user3182532:@scai是对的,那是一个不同的问题。你问的是如何使用.shp文件来提供folium。从OSM中提取行政边界线并不容易。 - mforpe

0

我访问了https://overpass-turbo.eu/(它通过特定的查询语言QL从openstreetmap检索数据),并在以下代码上点击运行:

[timeout:900];
area[name="Deutschland"][admin_level=2][boundary=administrative]->.myarea;
rel(area.myarea)["boundary"="postal_code"];
out geom;

你可以“导出到GeoJSON”,但在我的情况下,这并不起作用,因为数据量太大,无法在浏览器内处理。但是导出“原始数据”是有效的。所以我这样做了,然后我使用了“osmtogeojson”来获取正确的格式。之后,我就能够像folium教程中描述的那样将我的OpenStreetMap数据提供给folium。


这个答案是由edit发布的,关于使用OpenStreetMap数据制作分级地图Choropleth map with OpenStreetMap data,由OP user3182532 在CC BY-SA 3.0下发布。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接