pandas/geopandas 笔记:判断地点在不在路网上 不在路网的点和路网的距离

0 导入库

import osimport pandas as pd
pd.set_option('display.max_rows',5)import osmnx as oximport geopandas as gpd
from shapely.geometry import Point

1 读取数据

假设我们有 如下的数据:

1.1 新加坡室外基站位置数据

cell_station=pd.read_csv('outdoor_LTE.csv')
cell_station

1.2 新加坡路网openstreetmap数据

G=ox.graph_from_place('Singapore,Singapore',network_type='drive')
ox.plot_graph(G)

1.2.1 从openstreetmap数据中提取路网数据

road_network=ox.utils_graph.graph_to_gdfs(G,nodes=False)
road_network

1.3 出行轨迹数据

traj=pd.read_csv('processed_dart_outdoor_3d.csv')
traj

其中latitude和longitude 是用户位置,带cell的是对应的基站位置,new_installation_id是用户id,timestamp_5s是时刻

1.3.1 出行轨迹转GeoDataFrame

points = [Point(xy) for xy in zip(traj.longitude, traj.latitude)]
points_gdf = gpd.GeoDataFrame(traj, geometry=points)
points_gdf

2 判断用户点在不在路网上

2.1 为每条道路创建非常小的缓冲区

在赤道附近,经纬度坐标系统中的一个度大约等于地球表面上的111公里,所以这里的buffer相当于1m

road_network_buffered = road_network.geometry.buffer(0.00001)
#将路网线几何对象缓冲一定距离(例如,1米),创建一个新的GeoDataFrame
road_network_buffered
'''
u            v           key
25451929     6749812859  0      POLYGON ((103.87103 1.29515, 103.87066 1.29508...
25455287     1637003462  0      POLYGON ((103.87412 1.29550, 103.87413 1.29550......                        
10732302222  259401350   0      POLYGON ((103.90657 1.30628, 103.90657 1.30628...
10806629050  2325064861  0      POLYGON ((103.90709 1.30698, 103.90709 1.30698...
Length: 45583, dtype: geometry
'''

缓冲区转化为geoDataFrame

road_network_buffered_gdf = gpd.GeoDataFrame(geometry=road_network_buffered)
road_network_buffered_gdf

2.2 判断每个点在不在路网的buffer上

points_in_road_network = gpd.sjoin(points_gdf,road_network_buffered_gdf, how="inner", op='within')
points_in_road_network
  • gpd.sjoin()函数:执行空间连接操作。它将两个GeoDataFrame基于空间关系合并。【基于点(points_gdf)是否在多边形(road_network_buffered_gdf)内部】

  • how="inner":指定连接类型为内连接。这意味着结果中只会包含在points_gdf中的点,并且这些点必须位于road_network_buffered_gdf内部。不在缓冲区内的点将被排除在外。

  • op='within':指定空间操作类型为“within”,即查找outdoor_traj中哪些点位于road_network_buffered_gdf的缓冲区多边形内部。

  • 但是sjoin会存在一个问题:如果一个points_gdf中的点同时在两条路段的buffer中,结果中会分别出现这个点+一条路段buffer 的两个结果
    • ——>一个时刻一个用户id,只保留一条即可 
points_in_road_network_in_road=points_in_road_network.drop_duplicates(subset=['new_installation_id','timestamp_5s'])
points_in_road_network_in_road

3 不在路网的点和最近路段的距离

3.1 找到不在路网的用户点

traj_remain=traj.iloc[traj.index.difference(points_in_road_network_in_road.index)]
traj_remain

同样,生成对应的GeoDataFrame

geometry = [Point(xy) for xy in zip(traj_remain['longitude'], traj_remain['latitude'])]
traj_remain_gdf = gpd.GeoDataFrame(traj_remain, geometry=geometry)

3.2 将经纬度坐标转化为墨卡托坐标 

转换成墨卡托坐标之后,两个点之间的距离单位就是米了

# 转换坐标系到UTM【横轴墨卡托】
utm_projection = "EPSG:32648"  
# 新加坡对应的EPSG代码# 设置原始CRS为WGS 84 (EPSG:4326)
traj_remain_gdf.set_crs("EPSG:4326", inplace=True)
#这是GPS数据常用的坐标系统,其EPSG代码为4326road_network_utm = road_network.to_crs(utm_projection)
traj_remain_utm = traj_remain_gdf.to_crs(utm_projection)

3.3 获取距离

from shapely.ops import nearest_points
import pandas as pd# 创建一个空列表来存储距离
distances = []# 计算距离
for point in traj_remain_utm.geometry:#遍历每一个用户点nearest_geom_index = list(road_network_utm.sindex.nearest(point, 1))[1]nearest_geom = road_network_utm.geometry.iloc[nearest_geom_index]# 获取最近的路段(使用空间索引)distance = point.distance(nearest_geom)distances.append(distance.values[0])# 计算并存储距离traj_remain_utm['distance_to_nearest_road'] = distances
# 将距离列表添加到outdoor_traj_not_in_network_utm DataFrametraj_remain_utm['distance_to_nearest_road'].describe()
'''
count    330825.000000
mean         29.847753
std          65.107624
min           1.106306
25%           3.725888
50%           9.576145
75%          44.843000
max        4582.239106
Name: distance_to_nearest_road, dtype: float64
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/696787.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TSINGSEE青犀AI智能分析网关V4初始配置与算法相关配置介绍

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常见…

通过例子学习golang的Goroutine

Go 语言中的 Goroutine 是一种轻量级的并发执行单位。它可以与其他 Goroutine 并发地执行,而不需要显式地管理线程的创建和销毁。Goroutine 是 Go 语言并发模型的核心组成部分,它使得编写并发程序变得更加简单和高效。 例一 创建两个function&#xff0…

linux下ffmpeg调用GPU硬件解码(VDPAU/VAAPI)保存文件

本文讲解在linux下面,如何通过ffmpeg调用GPU硬件解码,并保存解码完的yuv文件。 其实,ffmpeg自带的例子hw_decode.c这个文件,就已经能满足要求了,因此,本文就尝试讲解以下hw_decode这个例子。hw_decode.c可以…

watchpoint

前言 内存被踩,通过 watchpoint 找到真凶 实例 以 smsc911x 网卡驱动为基体,进行实验,和网卡本身功能无关, 每执行一次 ifconfig eth0 up,就会调用一次 smsc911x_open(),我在这里设计了一段代码&#xf…

数学知识(四)(容斥原理、博弈论)

一、容斥原理 容斥原理公式 一共加或者减的式子个数 (一)利用容斥原理解决求能被质数整除的数的个数 890计算能被整除的数的个数 因为一共有2^n-1种选法,可以用位运算的方式枚举,对于得到的每一种选法,根据存在的数…

六、回归与聚类算法 - 逻辑回归与二分类

线性回归欠拟合与过拟合线性回归的改进 - 岭回归分类算法:逻辑回归模型保存与加载无监督学习:K-means算法 1、应用场景 2、原理 2.1 输入 2.2 激活函数 3、损失以及优化 3.1 损失 3.2 优化 4、逻辑回归API 5、分类的评估方法 5.1 精确率和召回率 5.2…

找出作弊的人

文章目录 题目描述输入描述输出描述样例1解释:样例2代码 题目描述 公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。 过滤的规则为:找到分差最小的员工ID对(p1,p2)列表…

【Spring】IoC容器 控制反转 与 DI依赖注入 配置类实现版本 第四期

文章目录 基于 配置类 方式管理 Bean一、 配置类和扫描注解二、Bean定义组件三、高级特性:Bean注解细节四、高级特性:Import扩展五、基于注解配置类方式整合三层架构组件总结 基于 配置类 方式管理 Bean Spring 完全注解配置(Fully Annotatio…

Kotlin学习 6

1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…

C语言读取 ini 配置文件,修改/添加键值对

C语言读取 ini 配置文件,修改/添加键值对 C语言读取 ini 配置文件,对section中的键值对进行修改/添加,如果section不存在,则在末尾将新的section/key/value 添加进去。 一、了解什么是INI文件? ini 文件是Initializ…

【大数据】Flink 之部署篇

Flink 之部署篇 1.概述和参考架构2.可重复的资源清理3.部署模式3.1 Application 模式3.2 Per-Job 模式(已废弃)3.3 Session 模式 Flink 是一个多用途框架,支持多种不同的混合部署方案。下面,我们将简要介绍 Flink 集群的构建模块、…

流动资金贷款管理办法

流动资金贷款管理办法 (2024年1月30日国家金融监督管理总局令2024年第2号公布 自2024年7月1日起施行) 第一章 总 则 第一条 为规范银行业金融机构流动资金贷款业务经营行为,加强流动资金贷款审慎经营管理,促进流动资金贷款业务健康发展,依…

【html学习笔记】3.表单元素

1.文本框 1.1 语法 <input type "text">表示文本框。且只能写一行 1.2 属性 使用属性size 设置文本框大小 <input type"text" size"10">2. 使用属性value 来设置文本框的默认文字 <input type"text" size"…

Vue状态管理库-Pinia

一、Pinia是什么&#xff1f; Pinia 是 Vue 的专属状态管理库&#xff0c;它允许支持跨组件或页面共享状态&#xff0c;即共享数据&#xff0c;他的初始设计目的是设计一个支持组合式API的 Vue 状态管理库&#xff08;因为vue3一个很大的改变就是组合式API&#xff09;,当然这…

PFA三角烧瓶实验室PFA锥形瓶本底纯净耐腐蚀性强

PFA三角烧瓶外观呈平底圆锥状&#xff0c;下阔上狭&#xff0c;有一圆柱形颈部&#xff0c;上方有一较颈部阔的开口&#xff0c;可用塞子封闭。PFA三角烧瓶也称PFA锥形瓶&#xff0c;PFA反应瓶&#xff0c;PFA三角烧瓶、PFA依氏烧瓶、PFA锥形烧瓶&#xff0c;PFA鄂伦麦尔瓶等。…

普中51单片机学习(串口通信)

串口通信 原理 计算机通信是将计算机技术和通信技术的相结合&#xff0c;完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类&#xff1a;并行通信与串行通信。并行通信通常是将数据字节的各位用多条数据线同时进行传送 。控制简单、传输速度快&#xff1…

【大模型】finetune 百川2

使用官网例子finetune百川2&#xff0c;微调脚本如下 模型为baichuan_chat_13B_v1 export CUDA_VISIBLE_DEVICES1 hostfile"" deepspeed --hostfile$hostfile baichuan_fineturn/fine-tune/fine-tune.py \--report_to "none" \--data_path "baichu…

2.22号qt

1.使用信号和槽实现多个界面跳转 1.1准备两个界面 1.2第一个界面准备signal 1.3第二个界面准备slot 1.4将第一个界面的信号和槽进行连接 2.qss登录界面升级优化 2.1概念 Qss是Qt程序界面中用来设置控件的背景图片、大小、字体颜色、字体类型、按钮状态变化等属性&#xff…

【Python】Python实现串口通信(Python+Stm32)

&#x1f389;欢迎来到Python专栏~Python实现串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望…

springboot208基于springboot物流管理系统

基于spring boot物流管理系统设计与实现 摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。…