网站备案 强制,昆明企业建网站多少钱,网站建设的3个阶段,家具设计图片目录 前言道路栅格化轨迹聚类参考资料 前言
很多针对道路轨迹的挖掘项目前期都需要对道路进行一段一段的分割成路段#xff0c;然后对每一个路段来单独进行考察#xff0c;如设定路段限速标识#xff0c;超速概率等#xff0c;如何对道路进行划分#xff0c;其实是一个很… 目录 前言道路栅格化轨迹聚类参考资料 前言
很多针对道路轨迹的挖掘项目前期都需要对道路进行一段一段的分割成路段然后对每一个路段来单独进行考察如设定路段限速标识超速概率等如何对道路进行划分其实是一个很有技巧性的活最直白的有以下2种策略 道路栅格化 轨迹点聚类
下面分别对两种策略进行简单讲解。
道路栅格化 道路栅格化简言之就是用一张纵横交错的网去尽可能覆盖道路所在的范围这样整个区域就被划分成一块一块的小矩形形成栅格化可以给每一个栅格编号形成编号序列而且可以判断出哪些栅格有轨迹点落入哪些是没有轨迹点落入的有轨迹点的栅格相对稀疏一些此方法关键要考虑道路的经纬度最大范围和网眼大小下面是道路栅格化处理主函数。
def roadRaster(road_data, unit_gap): #轨迹栅格化min_lng, max_lng np.min(road_data[lng]), np.max(road_data[lng]) #经度范围min_lat, max_lat np.min(road_data[lat]), np.max(road_data[lat]) #纬度范围lng_gap max_lng - min_lng lat_gap max_lat - min_latm int(lng_gap/unit_gap)n int(lat_gap/unit_gap)print(fleet_id, min_lng, max_lng, min_lat, max_lat, m, n, (m-1)*(n-1))slice_lng np.linspace(min_lng, max_lng, m) #对经度等间距划分slice_lat np.linspace(min_lat, max_lat, n) #对纬度等间距划分idx 0for i in range(len(slice_lng)-1):for j in range(len(slice_lat)-1):raster_a_lng slice_lng[i]raster_a_lat slice_lat[j]raster_b_lng slice_lng[i1]raster_b_lat slice_lat[j1]idx 1代码解读首先找出道路轨迹点经纬度最大最小值然后对经纬度跨度进行等间距划分然后对经纬度循环不断生成栅格左下角点的经纬度对和右上角的经纬度对由这样对顶角的点对就可以刻画出栅格其中unit_gap很关键直接决定网眼大小按下面经纬度小数点对应精度来粗略估计
小数点后位数精度第1位10000米第2位1000米第3位100米第4位10米第5位1米第6位0.1米第7位0.01米第8位0.001米
轨迹聚类
轨迹聚类就是根据历史行驶轨迹点的稠密程度来进行聚合成一簇一簇的轨迹点集合其中同一簇的轨迹点尽可能靠在一起不同一簇的轨迹点尽可能分散开来然后把一簇的轨迹点范围提炼出来如提取其四至这样便把整个道路进行的切分。具体可以利用DBSCAN算法实现DBACAN是一种基于密度的聚类算法可以用于对道路轨迹点进行聚类。具体步骤如下 初始化将所有轨迹点标记为未访问状态并设置一个固定的邻域半径r和最小聚类数量minPts。 随机选择一个未访问的点p以p为中心搜索其邻域内所有未访问点并将这些点标记为已访问状态。 如果邻域内访问点的数量小于minPts则将p标记为噪声点否则创建一个新的聚类并将p加入该聚类中。 遍历邻域内所有访问点的邻域将其未访问的邻域点添加到聚类中并将其标记为已访问状态。 重复2-4步直到所有点都被访问过。 最后将所有噪声点从聚类中去除。
需要注意的是选择合适的邻域半径r和最小聚类数量minPts非常重要这会影响到聚类结果的质量。可以通过试验不同的参数来获得最佳结果下面是利用DBSCAN算法实现轨迹点聚类的主函数。
def roadCluster(trajectory): # 使用DBSCAN聚类算法进行路段划分sample_num int(0.6*len(trajectory))print(sample_num)trajectory_sample trajectory.sample(sample_num) #随机抽样60%样本点 locations np.array(trajectory_sample[[lat,lng]]) #位置数据param_grid {eps:[0.0005, 0.001, 0.003, 0.005, 0.006, 0.01],min_samples:[6, 9, 15, 20, 30, 50, 70]} # epsilon控制聚类的距离阈值min_samples控制形成簇的最小样本数dbscan DBSCAN()grid_search GridSearchCV(estimator dbscan, param_gridparam_grid, scoringmyScore)grid_search.fit(locations)print(best parameters:{}.format(grid_search.best_params_))print(label:{}.format(grid_search.best_estimator_.labels_))labels grid_search.best_estimator_.labels_ #-1表示离群点score silhouette_score(locations, labels, metriceuclidean) #轮廓系数total_cluster labels.max() - labels.min()print(一共聚了{}类, 轮廓系数为{}.format(total_cluster, score))road_label pd.DataFrame({road_label: labels})trajectory_sample.reset_index(dropTrue, inplaceTrue)road_label.reset_index(dropTrue, inplaceTrue)cluster_data pd.concat([trajectory_sample, road_label], axis 1, ignore_indexTrue) #带标签的行驶记录cluster_data.columns [lng, lat, speed, road_label]cluster_data[road_label] [str(i) for i in cluster_data[road_label]]print(cluster_data)return cluster_data代码解读聚类的对象locations由经纬度组成的2维数组通过grid_search 来寻找最佳的超参数epsilon和min_samples,最后把标签类和原先的轨迹拼接起来相当于给原先的每一个轨迹点打一个类别标签聚类后可以只提炼出每一类的经纬度中位数进行可视化即用一个点来代表这一簇效果会显得更加稀疏明显 参考资料
1经纬度坐标小数位与精度的对应关系 https://blog.csdn.net/lang_niu/article/details/123550453
2基于DBSCAN算法的营运车辆超速点聚类分析 https://max.book118.com/html/2018/0407/160435287.shtm