首页 > 编程问答 >立交桥 API 和道路车道

立交桥 API 和道路车道

时间:2024-07-25 16:48:23浏览次数:13  
标签:python gis openstreetmap overpass-api

我用 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 时的样子:

enter image description here

现在,它缺少的是 道路内的车道 我的意思是,我希望能够获取几何图形/坐标来绘制类似这样的内容(红色):

enter image description here

API 返回的 JSON 文件似乎没有车道坐标。我不确定我的查询是否缺少某些内容或者此信息是否不可用。

有什么想法吗?


遗憾的是,你希望实现的目标 通常是不可行的 ,仅使用 OpenStreetMap 数据和 Overpass API。以下是原因:

  1. OpenStreetMap 数据中车道级别几何图形的可用性有限。 虽然 OpenStreetMap 在道路和人行横道等特征的制图方面做得非常出色,但它通常不存储有关单个车道精确定位和几何图形的信息。道路上的车道数等信息通常在“车道”标签中可用,但这些标签不会转换为表示单个车道几何图形的单独坐标。

  2. Overpass API 旨在用于检索数据,而不是进行几何计算。 虽然 Overpass 可以有效地查询和过滤基于标签和空间关系的 OSM 数据,但它没有内置的功能来推断或生成基于道路宽度和车道数量等信息的缺失车道几何图形。

你能做些什么来实现类似的目标?

  1. 探索其他数据源: 一些提供更详细道路数据(包括车道级别几何图形)的来源包括:

    • 政府数据门户网站或交通运输部门: 许多城市和国家/地区都维护着他们自己的道路网络数据库,这些数据库可能比 OpenStreetMap 包含更详细的信息。
    • 专业地理空间数据提供商: 像 HERE 和 TomTom 这样的公司提供具有高级道路属性(包括车道几何图形)的高质量道路数据。
  2. 近似车道几何图形: 如果你必须使用 OpenStreetMap 数据,你可以探索使用道路中心线和车道数信息来近似车道几何图形。但是,这种方法会产生近似值,并且可能无法始终产生准确的结果,特别是在具有复杂几何图形的道路上。这将需要大量的几何计算和处理。

  3. 为 OpenStreetMap 做出贡献: 如果你有时间和资源,你可以为 OpenStreetMap 项目做出贡献,通过调查和添加缺失的车道级别信息来改进它。

请记住,即使使用其他数据源或近似技术,在所有情况下,获得完美、准确的车道级别几何图形也可能不可行。始终仔细评估你的数据源并了解其局限性,这一点很重要。

标签:python,gis,openstreetmap,overpass-api
From: 78792196

相关文章

  • 如何从另一个 python 文件运行一个 python 文件
    我正在尝试从另一个python运行一个python文件,但是当涉及到调用另一个python文件中的方法时,它只会重新运行当前的python文件。我尝试了这段代码。我将导入放入log_user_in方法中,因为如果我将其导入到文件顶部,则会出现循环导入错误。这是我的代码片段fromtkinter......
  • 如何在Mac电脑上安装Python 2
    Python是一种高级编程语言,广泛应用于数据科学、网络开发、人工智能等领域。本文将介绍如何在Mac电脑上安装Python2,帮助初学者快速入门。一、下载Python2安装包在Python官网上下载Python2的安装包,网址为https://www.python.org/downloads/release/python-2718/ 。下载完......
  • 我的 python 抓取数据是空的,不确定我的代码出了什么问题
    我的结果是空的,不确定我的代码出了什么问题:这里是我的代码:#尝试从该网站获取数据https://www.watsons.com.sg/health/c/2100000?currentPage=1importrequestsfrombs4importBeautifulSoupimportpandasaspd#Settingdisplayoptionsforpandaspd.......
  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 如何从另一个文件运行 python 文件
    我正在尝试从另一个名为LoginOrReg的文件运行一个名为HabitTracker的python文件,但是当我这样做时,它会重新运行LoginOrReg文件。我已经尝试过这个classLoginOrReg:def__init__(self,db,cursor,login_username,data):self.db=mysql.connector.......
  • Python的字典和集合
    一、字典1.定义字典字典和列表虽然类似,但是字典是无序的可变序列,并且可以像查字典一样去查找。字典的元素都是成对出现的,每个元素都是由冒号“:”和键值对(“:”左边的称为键或者Key,“:”右边的称为值或者Value)构成的,用“{}”标识,元素之间用逗号“‘,”分隔。字典的键必须是唯一......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • python cobs协议编解码算法demo
    1.SummaryCOBS(ConsistentOverheadByteStuffing)是一种算法,直译为一致的开销字节填充。简而言之,无论数据包的内容如何,都能通过产生高效可靠明确的数据包帧,从而使接受端能够从损坏的包中恢复。通常使用0x00来作为数据包的分隔符,即切割数据包的片分隔符。当使用0x00作为......
  • 如何将unicode编码为字节,以便可以检索到原始字符串?在Python 3.11中
    在python3.11中,我们可以对字符串进行编码,如:string.encode('ascii','backslashreplace')这对于说:hellö=>hell\\xf6但是当我插入时hellöw\\xf6rldIgethell\\xf6w\\xf6rld(注意第二个有一个看起来像字符转义序列的文字部分)......
  • python flask允许跨域
    flask接口支持跨域设置方法在Flask中,可以通过安装flask-cors扩展来支持跨域请求。下面是使用flask-cors扩展的示例代码:fromflaskimportFlaskfromflask_corsimportCORS#ipinstallflask-corsapp=Flask(__name__)CORS(app)可以通过CORS扩展的origins参数......