共享单车轨迹数据分析:以厦门市共享单车数据为例(五)

先来聊聊啥是共享单车电子围栏?

共享单车电子围栏是一种基于地理位置技术的虚拟边界,用于管理和规范共享单车的停放和使用。这种技术通过在地图上划定特定区域,帮助用户了解哪些地方可以停车,哪些地方不能停车,从而减少随意停放带来的城市管理问题;

共享单车电子围栏是指在地图上划定的虚拟区域,这些区域通过GPS或其他定位技术来识别和管理。当用户在这些区域内停放或取用共享单车时,系统会进行相应的管理和监控。

功能和作用

  1. 规范停车

    • 指定停车区域:在城市中划定特定的停车区域,引导用户在这些区域内停放共享单车,减少乱停乱放现象。
    • 禁止停车区域:在一些敏感区域(如学校、医院、公园等)划定禁止停车区域,防止共享单车对这些区域的正常使用造成干扰。
  2. 用户引导

    • APP提示:当用户接近电子围栏区域时,共享单车APP会提示用户当前的位置是否适合停车或取车。
    • 奖励机制:鼓励用户在指定区域内停车,通过积分、优惠券等方式给予奖励。
  3. 运营管理

    • 实时监控:运营方可以通过后台系统实时监控共享单车的分布情况,及时调度车辆,确保供需平衡。
    • 违规处罚:对于在禁止停车区域内停放的用户,可以通过扣分、罚款等方式进行处罚,提高用户的合规意识。

技术实现

  1. GPS定位

    • 共享单车内置GPS模块,实时上传车辆位置信息到服务器。
    • 用户通过APP获取当前位置信息,判断是否在电子围栏区域内。
  2. 地图服务

    • 使用地图API(如Google Maps、高德地图等)绘制电子围栏区域。
    • 通过地图服务获取用户的精确位置信息,判断用户是否在指定区域内。
  3. 数据处理

    • 服务器端接收和处理来自共享单车的实时位置数据。
    • 根据预设的电子围栏规则,判断车辆是否在允许停放的区域内。

我们的重点是如何将共享单车的电子围栏数据转换成可用的图层数据。由于坐标已经是WGS84格式,因此不需要进行坐标系转换。我们先来看一下原始数据及其标签解释;

FENCE_ID:电子围栏唯一编号,FENCE_LOC:电子围栏位置坐标串(包括电子围栏所在位置四个顶点的坐标信息,WGS84坐标),数据范围厦门市思明区和湖里区(1.4071万条);

我们要做的就是把电子围栏数据的坐标点进行转化成可用的面图层,为了实现这一效果,我们通过python脚本来完成,注意把读取路径和导出路径改成自己的即可;

完整代码#运行环境Python 3.11

python 复制代码
# -*- coding: utf-8 -*-

import pandas as pd
import geopandas as gpd
from shapely.geometry import Polygon
import ast

def parse_fence_loc(fence_loc):
    """
    解析FENCE_LOC列中的字符串,将其转换为列表形式的坐标点。
    
    :param fence_loc: 包含坐标点的字符串
    :return: 坐标点的列表
    """
    return ast.literal_eval(fence_loc)

def calculate_rectangle_bounds(points):
    """
    计算给定坐标点的最小矩形边界。
    
    :param points: 坐标点的列表
    :return: 矩形的五个顶点坐标
    """
    # 初始化最小和最大值
    min_lon, max_lon = float('inf'), float('-inf')
    min_lat, max_lat = float('inf'), float('-inf')

    for lon, lat in points:
        min_lon = min(min_lon, lon)
        max_lon = max(max_lon, lon)
        min_lat = min(min_lat, lat)
        max_lat = max(max_lat, lat)

    # 返回矩形的五个顶点坐标
    return [(min_lon, min_lat), (max_lon, min_lat), (max_lon, max_lat), (min_lon, max_lat), (min_lon, min_lat)]

def process_csv(input_file, output_file):
    """
    处理CSV文件,计算每个围栏的矩形边界,并将结果保存为Shapefile。
    
    :param input_file: 输入CSV文件路径
    :param output_file: 输出Shapefile文件路径
    """
    # 读取CSV文件,指定编码为UTF-8
    df = pd.read_csv(input_file, encoding='utf-8')

    # 创建GeoDataFrame
    # 使用apply方法将FENCE_LOC列中的字符串解析为坐标点,计算矩形边界,并创建Polygon对象
    gdf = gpd.GeoDataFrame(df, geometry=df['FENCE_LOC'].apply(lambda loc: Polygon(calculate_rectangle_bounds(parse_fence_loc(loc)))))

    # 保存为Shapefile,指定编码为UTF-8
    gdf.to_file(output_file, driver='ESRI Shapefile', encoding='utf-8')

if __name__ == "__main__":
    input_file = 'D://data//共享单车.csv'  # 输入CSV文件路径
    output_file = '共享单车电子围栏.shp'  # 输出Shapefile文件路径
    process_csv(input_file, output_file)
    print(f"处理完成,结果已保存到 {output_file}")

为什么需要五个点?

  1. 闭合多边形

    • 在地理信息系统(GIS)中,多边形必须是闭合的,即起点和终点必须相同。这是为了确保多边形是一个封闭的区域,而不是开放的线条。
    • 如果不重复第一个点,多边形将是一个开放的四边形,而不是闭合的矩形。

矩形的五个顶点

  1. 左下角 (min_lon, min_lat)
  2. 右下角 (max_lon, min_lat)
  3. 右上角 (max_lon, max_lat)
  4. 左上角 (min_lon, max_lat)
  5. 左下角 (min_lon, min_lat) - 重复第一个点

因为电子围栏数据仅包含岛内(思明区和湖里区),我们把生成的shp图层导入arcgis/arcgispro里面看一下,可以看出来电子围栏基本上在路网周边分布;

街道周边电子围栏局部放大展示(一);

地铁站出入口周边电子围栏局部放大展示(二);

这些是我们直观看到的结果,我们再来看看一下数据背后的东西,比如共享单车在岛内的投放策略,我们使用ArcGIS/ArcGIS Pro中的【要素转点】工具,将每个电子围栏区域(面层)计算出其中心点。这些中心点代表了每个电子围栏区,同样的检索并使用【核密度分析】工具。通过核密度分析,我们可以生成一个连续的密度表面,显示共享单车在岛内不同区域的集中程度,这里用自然间断点分级法,并将其分为10个等级进行展示;

厦门市人口栅格数据分布;

厦门市2020年12月21日 上午06:00-10:00的出发地订单累计数核密度;

对于人口栅格分析和共享单车订单分析详见 :共享单车轨迹数据分析:以厦门市共享单车数据为例(二)_共享单车轨迹数据处理-CSDN博客

将共享单车电子围栏中心点的核密度图、栅格人口数据分布图和共享单车订单分布图进行横向分析,通过对比三者的分布情况,可以发现它们在空间上存在高度的一致性,表现为高密度区域重合:共享单车电子围栏中心点、人口密集区和高订单量区域在空间上高度重合,表明共享单车的投放策略与人口分布和使用需求紧密相关;

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

相关推荐
忒可君3 分钟前
Qt/C++开发经验
数据库·c++·qt·学习·c#
Q1860000000012 分钟前
Windows 系统中python的安装步骤
开发语言·windows·python
鸽芷咕13 分钟前
【Python报错已解决】AttributeError: ‘Tensor‘ object has no attribute ‘kernel_size‘
开发语言·python·机器学习·bug
wclass-zhengge13 分钟前
MySQL篇(日志)
数据库·mysql
拾伍廿肆21 分钟前
Django-cookie和session
数据库·django
Amagi.22 分钟前
Redis常用数据类型
数据库·redis·缓存
程序员小杰@31 分钟前
大数据:快速入门Scala+Flink
大数据·flink·scala
Niu_brave1 小时前
Python基础学习(3)
python·学习
风随心飞飞1 小时前
Docker 以外置数据库方式部署禅道
数据库·docker·容器
我码玄黄1 小时前
探索GraphRAG:用yfiles-jupyter-graphs将知识库可视化!
python·ai·jupyter