OSM道路数据实时爬取


前言

  • 目前下面的代码可以实现根据 全国不同地级市(如青岛市、泰安市等行政区划),进行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)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值