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.hqwc.cn/news/484415.html

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

相关文章

面试答疑03

1、登录鉴权怎么做的?为什么采用jwt的方式?有什么好处? Java登录鉴权常见的实现方式包括**CookieSession、HTTP Basic Authentication、ServletJDBC**等。 在Java的Web应用中,登录鉴权是确认用户身份的关键环节。一个常用的传统…

《探索网校 App 的魅力世界:知识与科技的完美结合》

在数字化时代,教育也在经历着深刻的变革。网校 App 的出现,正为学习者们开启了一扇通往知识的新大门,它融合了科技的力量,让学习变得更加便捷、高效和有趣。 一、功能与优势 网校 App 提供了丰富多样的学习功能,满足了…

Vue 中 onclick和@click区别

文章目录 一、直接上结论二、验证代码&#xff0c;可直接运行三、点击结果 一、直接上结论 onclick 只能触发 js的原生方法&#xff0c;不能触发vue的封装方法click 只能触发vue的封装方法&#xff0c;不能触发js的原生方法 二、验证代码&#xff0c;可直接运行 <!DOCTYP…

11-树-二叉树的前序遍历

这是树的第11篇算法&#xff0c;力扣链接。 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 做了这么久的树问题&#xff0c;现在开始回忆三种遍历方法&#xff0c;这篇文章…

【嵌入式学习】IO进程线程day02.22

一、思维导图 二、习题 1> 将互斥机制的代码实现 #include <myhead.h>//定义一个全局变量 char str[128]"我是一个全局字符串数组"; //1、创建一个互斥锁变量 pthread_mutex_t mutex;//线程1 void *pth1(void *arg) {//上锁pthread_mutex_lock(&mutex…

为新固态硬盘安装操作系统

目录 背景方案具体步骤1 为新硬盘进行分区2 下载Dism3 下载win10的iso文件4 通过Dism 重装系统5 从biso调整启动顺序5 遗留问题 参考资料 背景 情况是这样的&#xff0c;我的电脑本来就有一块sata的固态硬盘&#xff0c;作为c盘&#xff0c;装载的是win10系统。 一方面只有500…

matlab代码--基于matlabLDPC-和积译码系统

LDPC编码 一个码长为n、信息位个数为k的线性分组码&#xff08;n,k&#xff09;可以由一个生成矩阵 来定义&#xff0c;信息序列 通过G被映射到码字XS.G。线性分组码也可以由一个校验矩阵 来描述。所以码字均满足 。校验矩阵的每一行表示一个校验约束 &#xff0c;其中所有的非…

springboot大学生体质测试管理系统源码和论文

大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能包括首…

(全注解开发)学习Spring-MVC的第三天

全注解开发 第一部分 : 1.1 消除spring-mvc.xml 这些是原来spring-mvc.xml配置文件的内容 <!--1、组件扫描, 使Controller可以被扫描到--><context:component-scan base-package"com.itheima.controller"/><!--2、非自定义的Bean, 文件上传解析器--&…

尝试一下最新的联合办公利器ONLYOffice

下载下来一起试试吧 桌面安装版下载地址&#xff1a;https://www.onlyoffice.com/zh/download-desktop.aspx) 官网地址&#xff1a;https://www.onlyoffice.com 普通Office对联合办公的局限性 普通Office软件&#xff08;如Microsoft Office、Google Docs等&#xff09;在面对…

程序员可以做哪些副业?

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

adb-连接模拟器和真机操作

目录 1. 连接模拟器&#xff08;夜神模拟器示例&#xff09; 1.1 启动并连接模拟器 1.2 开启调试模式 2. USB连接真机调试 2.1 usb数据线连接好电脑&#xff0c;手机打开调试模式 2.2 输入adb devices检测手机 3. Wifi连接真机调试 3.1 USB连接手机和电脑 3.2 运行 adb…