Python读取本地文件OSM文件中的路网数据结合CSV数据处理

本文介绍如何使用Python的OSMnx库读取OSM文件中的路网数据,并结合CSV文件中的时间速度和公交站点信息,通过经纬度匹配赋值到相应路段。针对位于两个经纬度之间的路段,采用中间时间值计算速度。同时,以5分钟为间隔计算任意时间段内路段的平均速度。
摘要由CSDN通过智能技术生成

编写一个Python程序,使它能读取本地文件OSM文件中的路网数据,并将csv文件中的时间速度和公交车设备号根据公交站点信息或者经纬度信息赋值到OSM路网数据中对应的路段上,
如果有些路段处于两个经纬度之间,赋值的时间则取前后经纬度坐标所对应时间的的中间值。并设计时间间隔为5分钟,计算任意时间段任意路段的平均速度。

步骤实现:

读取OSM路网数据,可以使用OSMnx库来实现。
读取CSV文件中的公交车设备号,时间速度和公交站点信息或经纬度信息。
将公交车设备号和时间速度信息匹配到OSM路网数据的对应路段上。可以使用路网数据中的经纬度信息来匹配。
对于那些路段处于两个经纬度之间的情况,根据前后经纬度坐标所对应时间的中间值来计算时间和速度。
设计时间间隔为5分钟,根据时间和路段长度计算路段速度。
计算任意时间段任意路段的平均速度,可以使用Pandas库进行数据分析和计算。

想在Python中安装OSMnx库

pip install geopandas
pip install matplotlib
pip install networkx
pip install numpy
pip install pandas
pip install requests
pip install Rtree
pip install Shapely

pip install osmnx
pip install osmxtract
pip install osmium
pip install osmread

读取CSV文件中的经纬度,按顺序将两经纬度与O S M路网进行匹配,确定俩经纬度之间包含的路段,并将公交车设备号,速度都赋值到这些路段上,同时,将经纬度所对应的时间赋值到经纬度所包含的路段的两头,将时间的中间值赋值到属于中间的路段上。如果上一个经纬度与下一个经纬度一致,则跳过。
再根据时间间隔,将各个路段上被赋值的所有速度求平均,得出平均速度,最终输出结果为:路段ID+时间+平均速度

import csv
import geojson
from geopy.distance import geodesic
from shapely.geometry import Point
from osmapi import OsmApi
from datetime import datetime, timedelta
import pandas as pd

'''
1:按顺序读取CSV文件中的经纬度点,俩个为一组,如(第一个,第二个);(第二个,第三个)……
2:读取OSM路网中的数据,将经纬度点与OSM路网进行匹配,确定这两个经纬度之间包含多少路段
3:再将经纬度坐标点所对应的时间、公交车设备号、速度全部赋值到这些路段上(注意在赋值时间时,将经纬度所对应的起始时间赋值到靠近起始经纬度的路段上,对于处于中间的路段,就用起始时间的中间值
4:设置时间间隔为5分钟,10分钟,15分钟,30分钟;以5分钟为例,以每个路段上被赋值的最早的一个时间开始,以每5分钟计为一个时间段。然后计算出在这个时间段内,
各个路段上,被赋值的速度的平均值,输出形式为:路段id+时间+路段的平均速度

'''

def min_dist(cords, point):
    return min([Point(pt).distance(point) for pt in cords])


def waypoint_distance(waypoints, point):
    min_d = float('inf')
    for i in range(len(waypoints)-1):
        segment_start = waypoints[i]
        segment_end = waypoints[i+1]
        segment_d = min_dist([segment_start, segment_end], point)
        min_d = min(min_d, segment_d)
    return min_d


import osmium


class NodeCountHandler(osmium.SimpleHandler):
    def __init__(self):
        osmium.SimpleHandler.__init__(self)
        self.num_nodes = 0
        self.nodes = {
   }
        self.ways = {
   }
        self.current_way = None
        self.timestamp_list = {
   }

    def node(self, n):
        self.num_nodes += 1

    def way(self, w):
        self.current_way = w.id
        self.ways[w.id] = []
        # print(w)
        for node in w.nodes:
            self.ways[w.id].append(node.ref)

    def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值