我用 Python 编写了一个脚本,给定纬度/经度,生成包含道路边缘、人行横道和车道的 geojson。它看起来像这样:
def fetch_intersection_data(lat, lon, radius: int = 20):
"""
Fetch intersection data from OpenStreetMap using Overpass API and convert to GeoJSON.
:param lat: Latitude of the center of the intersection
:param lon: Longitude of the center of the intersection
:param radius: Radius around the point to search (in meters)
:return: GeoJSON data as a dictionary
"""
overpass_url = "http://overpass-api.de/api/interpreter"
overpass_query = f"""
[out:json];
(
way["highway"](around:{radius},{lat},{lon});
node["highway"="crossing"](around:{radius},{lat},{lon});
way["lanes"](around:{radius},{lat},{lon});
way["lanes:forward"](around:{radius},{lat},{lon});
way["lanes:backward"](around:{radius},{lat},{lon});
);
out geom;
"""
print(overpass_query)
response = requests.get(overpass_url, params={'data': overpass_query})
osm_data = response.json()
with open('raw_data.json', 'w') as f:
json.dump(osm_data, f)
try:
features = []
for element in osm_data['elements']:
feature = {
"type": "Feature",
"properties": element.get('tags', {}),
"geometry": None
}
if element['type'] == 'way':
if 'geometry' in element:
feature['geometry'] = {
"type": "LineString",
"coordinates": [[point['lon'], point['lat']] for point in element['geometry']]
}
feature['properties']['id'] = element['id']
elif element['type'] == 'node':
feature['geometry'] = {
"type": "Point",
"coordinates": [element['lon'], element['lat']]
}
feature['properties']['id'] = element['id']
if feature['geometry']:
features.append(feature)
geojson = {"type": "FeatureCollection","features": features}
except Exception as e:
print(e)
return geojson
到目前为止一切顺利:它几乎完成了我需要的一切。例如,这就是我在
geojson.io
上绘制 geojson 时的样子:
现在,它缺少的是 道路内的车道 我的意思是,我希望能够获取几何图形/坐标来绘制类似这样的内容(红色):
API 返回的 JSON 文件似乎没有车道坐标。我不确定我的查询是否缺少某些内容或者此信息是否不可用。
有什么想法吗?
遗憾的是,你希望实现的目标 通常是不可行的 ,仅使用 OpenStreetMap 数据和 Overpass API。以下是原因:
-
OpenStreetMap 数据中车道级别几何图形的可用性有限。 虽然 OpenStreetMap 在道路和人行横道等特征的制图方面做得非常出色,但它通常不存储有关单个车道精确定位和几何图形的信息。道路上的车道数等信息通常在“车道”标签中可用,但这些标签不会转换为表示单个车道几何图形的单独坐标。
-
Overpass API 旨在用于检索数据,而不是进行几何计算。 虽然 Overpass 可以有效地查询和过滤基于标签和空间关系的 OSM 数据,但它没有内置的功能来推断或生成基于道路宽度和车道数量等信息的缺失车道几何图形。
你能做些什么来实现类似的目标?
-
探索其他数据源: 一些提供更详细道路数据(包括车道级别几何图形)的来源包括:
- 政府数据门户网站或交通运输部门: 许多城市和国家/地区都维护着他们自己的道路网络数据库,这些数据库可能比 OpenStreetMap 包含更详细的信息。
- 专业地理空间数据提供商: 像 HERE 和 TomTom 这样的公司提供具有高级道路属性(包括车道几何图形)的高质量道路数据。
-
近似车道几何图形: 如果你必须使用 OpenStreetMap 数据,你可以探索使用道路中心线和车道数信息来近似车道几何图形。但是,这种方法会产生近似值,并且可能无法始终产生准确的结果,特别是在具有复杂几何图形的道路上。这将需要大量的几何计算和处理。
-
为 OpenStreetMap 做出贡献: 如果你有时间和资源,你可以为 OpenStreetMap 项目做出贡献,通过调查和添加缺失的车道级别信息来改进它。
请记住,即使使用其他数据源或近似技术,在所有情况下,获得完美、准确的车道级别几何图形也可能不可行。始终仔细评估你的数据源并了解其局限性,这一点很重要。
标签:python,gis,openstreetmap,overpass-api From: 78792196