前言
- 目前下面的代码可以实现根据 全国不同地级市(如青岛市、泰安市等行政区划),进行OSM道路数据实时下载功能;
一、代码详情
代码如下:
import requests
import re
import os
def get_osm_data(area_name, output_folder):
# 设置请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded"
}
# 构造 Overpass API 查询,查询行政区域的关系 ID
data = f'<osm-script><query type="relation"><has-kv k="boundary" v="administrative"/><has-kv k="name:zh" v="{area_name}"/></query><print/></osm-script>'
url = "http://www.overpass-api.de/api/interpreter"
response = requests.post(url, data=data.encode(), headers=headers)
# 利用正则表达式提取关系 ID
match = re.search('<relation id="(.*?)">', response.text)
if not match:
print("未找到相关行政区域数据。")
return
id = match.group(1)
id = str(3600000000 + int(id)) # 将 ID 转换为 10 位格式
# 构造查询,获取包含更详细信息的 OpenStreetMap 数据
data2 = f'<osm-script timeout="1800" element-limit="100000000"><union><area-query ref="{id}"/><recurse type="node-relation" into="rels"/><recurse type="node-way"/><recurse type="way-relation"/></union><union><item/><recurse type="way-node"/></union><print mode="body"/></osm-script>'
response2 = requests.post(url, data=data2, headers=headers)
# 将结果保存到文件
output_file = os.path.join(output_folder, f"{area_name}.osm")
with open(output_file, "w", encoding="utf-8") as f:
f.write(response2.text)
print(f"OSM 数据已保存到 {output_file}")
# 指定行政区域名称和输出文件夹路径
area_name = "泰安市"
output_folder = "G:\OSM"
# 调用函数获取并保存 OSM 数据
get_osm_data(area_name, output_folder)