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://xiahunao.cn/news/2804213.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

耐腐蚀的液位传感器有哪些

液位传感器在不同的应用环境中有着不同的要求,特别是在需要耐腐蚀性液体的环境中,选择合适的传感器至关重要。对于这种情况,一种常见且有效的选择是不锈钢液位传感器。 不锈钢液位传感器具有耐腐蚀性好、安装简便、功耗低、耐压性强等优点。…

企业计算机服务器中了crypt勒索病毒怎么办,crypt勒索病毒解密数据恢复

计算机服务器设备为企业的生产运营提供了极大便利,企业的重要核心数据大多都存储在计算机服务器中,保护企业计算机服务器免遭勒索病毒攻击,是一项艰巨的工作任务。但即便很多企业都做好的了安全运维工作,依旧免不了被勒索病毒攻击…

shiro 整合 springboot 实战

序言 前面我们学习了如下内容&#xff1a; 5 分钟入门 shiro 安全框架实战笔记 shiro 整合 spring 实战及源码详解 这一节我们来看下如何将 shiro 与 springboot 进行整合。 spring 整合 maven 依赖 <?xml version"1.0" encoding"UTF-8"?> …

Spring Boot应用集成Actuator端点自定义Filter解决未授权访问的漏洞

一、前言 我们知道想要实时监控我们的应用程序的运行状态&#xff0c;比如实时显示一些指标数据&#xff0c;观察每时每刻访问的流量&#xff0c;或者是我们数据库的访问状态等等&#xff0c;需要使用到Actuator组件&#xff0c;但是Actuator有一个访问未授权问题&#xff0c;…

2.21日学习打卡----初学Nginx(一)

2.21日学习打卡 目录: 2.21日学习打卡一. Nginx是什么&#xff1f;概述Nginx 五大应用场景HTTP服务器正向代理反向代理正向代理与反向代理的区别&#xff1a;负载均衡动静分离 为啥使用Nginx? 二.下载Nginx&#xff08;linux&#xff09;环境准备下载Nginx和安装NginxNginx源码…

自定义Chrome的浏览器开发者工具DevTools界面的字体和样式

Chrome浏览器开发者工具默认的字体太小&#xff0c;想要修改但没有相关设置。 外观——字体可以自定义字体&#xff0c;但大小不可以调整。 github上有人给出了方法 整理为中文教程&#xff1a; 1.打开浏览器开发者工具&#xff0c;点开设置——实验&#xff0c;勾上红框设…

Go语言中的流程控制

「万事开头难&#xff0c;视频号500粉直播需要你的助力&#xff01;你的支持是我前进的动力&#xff01;」 1、Golang 中的流程控制 流程控制是每种编程语言控制逻辑走向和执行次序的重要部分&#xff0c;流程控制可以说是一门语言的“经脉”。Go 语言中最常用的流程控制有 if …

一文读懂Linux内核中的Device mapper映射机制

一、 简介 本文总结Device mapper的映射机制。Device mapper是Linux2.6内核中提供的一种逻辑设备到物理设备的映射框架机制&#xff0c;在该机制下&#xff0c;用户可以很方便的根据自己的需要指定实现存储资源的管理策略&#xff0c;当前比较流行的Linux的逻辑卷管理器比如&a…

程序与算法

数据结构是数据组织、存储和运算的总和。在计算机处理的大量数据中,数据结构和算法是相互关联、彼此联系的。对实际问题选择了一种好的数据结构之后,还得有一个好的算法,才可以更好地求解问题。一个算法应该具备以下特征:1. 有穷性;2. 确定性;3. 可行性;4. 输入;5. 输出…

一图揭秘为什么开发者都选择华为云软件开发生产线CodeArts

华为云软件开发生产线CodeArts是一站式、全流程、安全可信的云原生DevSecOps云平台&#xff0c;集华为30年研发实践、前沿研发理念、先进研发工具为一体&#xff0c;覆盖需求、开发、测试、部署等软件交付全生命周期环节&#xff0c;为开发者打造全云化研发体验。 体验通道&am…

如何快速卸载windows电脑的一些软件?

本系列是一些电脑常规操作的普及&#xff0c;有需要借鉴即可 注&#xff1a;每个电脑都会有差异&#xff0c;参考即可。 其实大部分软件你删除桌面上的图标不等于删除&#xff0c;因为桌面上的那个图标就是一个简单的快捷方式而已。 在这里插入图片描述 那如何正确的卸载软件呢…

基于Python3的数据结构与算法 - 04 快速排序

一、快速排序思路 快速排序特点&#xff1a;快 步骤&#xff1a; 取一个元素p&#xff08;第一个元素&#xff09;&#xff0c;使元素p归为&#xff1b;列表被p分成两部分&#xff0c;左边都比p小&#xff0c;右边都比p大&#xff1b;递归完成排序。 因此我们可以得到快速排…

java 面向对象-上:类的结构之二

类的设计中&#xff0c;两个重要结构之二&#xff1a;方法 方法 描述类应该具的功能。 比如&#xff1a;Math类&#xff1a;sqrt()\random() \... Scanner类&#xff1a;nextXxx() ... Arrays类&#xff1a;sort() \ binarySearch() \ toString() \ equals() \ ... 1.举例 p…

H.323

1 H.323 信令标准。 是 ITU-T 于 1996 年制定的为在局域网上传送话音信息的建议书。 1998 年的第二个版本改用的名称是“基于分组的多媒体通信系统”。 H.323 是互联网的端系统之间进行实时声音和视频会议的标准。 H.323 不是一个单独的协议&#xff0c;而是一组协议。包括…

TYPE-C接口桌面显示器:视频与充电的双重革新

在现代科技的浪潮中&#xff0c;TYPE-C接口桌面显示器崭露头角&#xff0c;它不仅仅是一台显示器&#xff0c;更是充电与视频传输的完美融合。这种新型的显示器&#xff0c;凭借其TYPE-C接口&#xff0c;实现了从DC电源到PD协议充电的华丽转身&#xff0c;为众多设备如笔记本电…

【学网攻】 第(30)节 -- 综合实验三

系列文章目录 目录 系列文章目录 文章目录 前言 一、综合实验 二、实验 1.引入 实验目标 实验设备 实验拓扑图 实验配置 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节…

beego代理前端web的bug

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、beego代理前端web的bug总结 一、beego代理前端web的bug *报错&#xff0c;为web压缩包index.html里面的注释被错误解析&#xff0c;删掉就行 2024/02/22 10:2…

如何在Pycharm中导入第三方库(以pyecharts为例子)

打开Pycharm 点击右上角文件->设置->项目->pythonProject&#xff08;Python解释器&#xff09; 点击下图号 下一步&#xff1a;在搜索栏中直接搜索第三方包pyecharts并安装即可 以上便为使用Pycharm安装第三方库的全过程。 温馨小提示&#xff0c;如果大家在Pychar…

报表开发工具DevExpress .NET Reporting v23.2亮点 - 支持智能标签

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reporting控件日前正式发布了v23.2…

数字化转型导师坚鹏:县域数字化转型案例研究

县域数字化转型案例研究 课程背景&#xff1a; 很多县级政府存在以下问题&#xff1a; 不清楚县域数字化转型的发展模式 不清楚县域数字化转型的成功案例 课程特色&#xff1a; 针对性强 实用性强 创新性强 学员收获: 学习县域数字化转型的发展模式。 学习县…