一、综述

在空间大数据可视化展示中,往往需要计算基于道路路网的通行密度,从而得出道路不同路段的权重,然后根据不同的权重值进行道路的分色分级绘制,得出基于不同业务需求的分析展示,如我们每天日常看到的实时道路拥堵情况、道路交通流量压力等线性密度图,如下图的场景:
1.道路实时交通

2.道路通行密度(此图实际是道路的叠加,效果跟笔者所描述一致,实现方式不同)

二、数据和方法

根据摩拜的一天骑行轨迹(计算结果不受数据量的约束,理论上数据量越大越好,相应的计算量就越大),然后跟北京道路的路网中心线进行匹配计算,最终计算出哪些道路是骑行密度较大的道路,能够为政府规划、道路路网优化做决策辅助。
方法主要是根据Geohash算法做道路点和骑行轨迹点的匹配,得到道路上不同点的权重,然后根据权重进行道路点的分色渲染,最后将结果以空间化的方式展示。
摩拜骑行轨迹原始空间展示如下图所示:

具体步骤如下:
1.将路网上每条道路上的点全部提取,按照roadindex(道路索引),pointindex(道路上点的索引),x(当前点经度),y(当前点维度)方式存储。
2.根据GeoHash,计算每个道路点的hash值(详细方法参考第三部分)
3.遍历摩拜骑行轨迹数据点,将每个点进行geohash转换,跟路网的每个顶点geohash匹配,如果有相同的值,则路网顶点的权重+1,最后遍历完所有的轨迹,即可计算出道路上所有的订单的权重列表
4.根据权重列表进行分级,可以按照不同的标准进行分级展示

三、GeoHashUtils

C#

    public static class Geohash{#region Direction enumpublic enum Direction{Top = 0,Right = 1,Bottom = 2,Left = 3}#endregionprivate const string Base32 = "0123456789bcdefghjkmnpqrstuvwxyz";private static readonly int[] Bits = new[] { 16, 8, 4, 2, 1 };private static readonly string[][] Neighbors = {new[]{"p0r21436x8zb9dcf5h7kjnmqesgutwvy", // Top"bc01fg45238967deuvhjyznpkmstqrwx", // Right"14365h7k9dcfesgujnmqp0r2twvyx8zb", // Bottom"238967debc01fg45kmstqrwxuvhjyznp", // Left}, new[]{"bc01fg45238967deuvhjyznpkmstqrwx", // Top"p0r21436x8zb9dcf5h7kjnmqesgutwvy", // Right"238967debc01fg45kmstqrwxuvhjyznp", // Bottom"14365h7k9dcfesgujnmqp0r2twvyx8zb", // Left}};private static readonly string[][] Borders = {new[] {"prxz", "bcfguvyz", "028b", "0145hjnp"},new[] {"bcfguvyz", "prxz", "0145hjnp", "028b"}};public static String CalculateAdjacent(String hash, Direction direction){hash = hash.ToLower();char lastChr = hash[hash.Length - 1];int type = hash.Length % 2;var dir = (int)direction;string nHash = hash.Substring(0, hash.Length - 1);if (Borders[type][dir].IndexOf(lastChr) != -1){nHash = CalculateAdjacent(nHash, (Direction)dir);}return nHash + Base32[Neighbors[type][dir].IndexOf(lastChr)];}public static void RefineInterval(ref double[] interval, int cd, int mask){if ((cd & mask) != 0){interval[0] = (interval[0] + interval[1]) / 2;}else{interval[1] = (interval[0] + interval[1]) / 2;}}public static double[] Decode(String geohash){bool even = true;double[] lat = { -90.0, 90.0 };double[] lon = { -180.0, 180.0 };foreach (char c in geohash){int cd = Base32.IndexOf(c);for (int j = 0; j < 5; j++){int mask = Bits[j];if (even){RefineInterval(ref lon, cd, mask);}else{RefineInterval(ref lat, cd, mask);}even = !even;}}return new[] { (lat[0] + lat[1]) / 2, (lon[0] + lon[1]) / 2 };}public static String Encode(double latitude, double longitude, int precision = 12){bool even = true;int bit = 0;int ch = 0;string geohash = "";double[] lat = { -90.0, 90.0 };double[] lon = { -180.0, 180.0 };if (precision < 1 || precision > 20) precision = 12;while (geohash.Length < precision){double mid;if (even){mid = (lon[0] + lon[1]) / 2;if (longitude > mid){ch |= Bits[bit];lon[0] = mid;}elselon[1] = mid;}else{mid = (lat[0] + lat[1]) / 2;if (latitude > mid){ch |= Bits[bit];lat[0] = mid;}elselat[1] = mid;}even = !even;if (bit < 4)bit++;else{geohash += Base32[ch];bit = 0;ch = 0;}}return geohash;}

java语言
参考如下网址:
https://github.com/GuoZhenghao/note/blob/master/Language/Java/Utils/GeoHash.md

四、结果

因为geohash在encode的时候需要传精度参数,所以不同精度得到的计算结果可能不一致,根据mobike一天骑行轨迹得到的骑行道路密度如下:
1.北京主城区骑行道路密度,这里划分了四个等级


2.西单附近道路密度

3.中关村附近道路密度

GeoHash在空间道路密度计算中的应用-以mobike骑行轨迹为例相关推荐

  1. DBSCAN: 基于密度对空间含噪声数据中不规则形状进行聚类

    聚类算法是机器学习中使用频率较高的无监督学习方法,不需要样本标签,就可以将其进行分类,常常作为其他学习任务的前期粗加工.但是原始聚类算法在面对含有噪声或形状非凸的数据分布时表现较差,于是有研究人员提出 ...

  2. Arcgis基于格网的道路密度分析

    文章目录 前言 朴素和可靠的计数法: 实现过程 原始数据 环境准备 建立格网 让道路与格网在空间产生交集 分组统计 属性表连接 计算道路密度 道路密度可视化 总结 前言 在ArcGIS中,计算研究区域 ...

  3. 空间连接时计算总和_【数据技术】城市功能混合程度计算

    01混合度计算◐  1.1 概念与计算 熵:信息论中度量随机事件在某项实验中的不确定程度的概念. 计算公式: H(X)表示随机变量X的熵; Pi为X取Xi的概率 .显然 , 熵值越大 , 不肯定性越大 ...

  4. 格子玻尔兹曼方法(LBM)计算中的无量纲化转化(将物理参数转化为格子参数)

    说明:方法来自外文资料,主要通过无量纲方法进行LBM仿真计算中由实际物理量到格子物理量的转化,保证其一致性 已知量 物理长度尺寸HHH : 格子长度尺寸 (自定义)H~\tilde{H}H~: 密度ρ ...

  5. 基于GeoHash算法的四大经纬度计算方案

    背景 前天下班前,有两个同事在讨论到关于一个接口的性能,是关于经纬度的计算,需求是:返回指定经纬度.20公里以内的.按距离排序的前100个站点.         因为之前关于距离的计算是使用公式计算的 ...

  6. 综述 | 语言分析技术在社会计算中的应用

    综述 | 语言分析技术在社会计算中的应用 刘知远 社媒派SMP 2016-01-27 中国中文信息学会社会媒体处理专委会 传统社会科学研究中的数据主要通过调查问卷或口头采访等方式获取,既耗时耗力,数据 ...

  7. 试编写一个将双向循环链表逆置的算法_循环双向链表在电路计算中的应用

    问题描述在电路分析中,通常以图论为数学工具,进行建模,求解.我们只研究二端元件,可以将电路中的每一个元件用一条边来表示,元件的端点用顶点来表示. 元件的端点和端点是可以连接在一起的,比如导线的端点连接 ...

  8. PCIe配置空间和PCI设备中的寄存器

    1.访问PCI配置空间,PCI基本配置空间的读写使用下列函数: 原型定义在<linux/pci.h> int pci_read_config_byte(struct pci_dev *pd ...

  9. 【Android 内存优化】Bitmap 图像尺寸缩小 ( 考虑像素密度、针对从不同像素密度资源中解码对应的 Bitmap 对象 | inDensity | inTargetDensity )

    文章目录 一.像素密度对解码图片的影响 二.不考虑像素密度会导致图片缩小尺寸不准确 三.DisplayMetrics 源码阅读.研究手机资源获取规则 四.像素密度参数设置取值 ( inDensity ...

  10. 命名空间不能直接包含字段或方法之类的成员_Linux内存取证:解析用户空间进程堆(中)...

    上文我们对解析用户空间进程堆的动机和历史,做了一个简要的概述.另外,我们Glibc堆的3层结构也做了一些概述,这些结构是解析用户空间进程堆的关键.至于每个结构所起的作用,请看本文的分析. 内存视图 本 ...

最新文章

  1. c语言信号灯作用,交通信号灯对交通领域的作用与影响
  2. 排班系统c语言设计说明,帮我设计一个关于员工排班的C语言程序
  3. 网站优化中能有效提升网站打开速度的技巧有哪些?
  4. 推荐一套开源通用后台管理系统(附源码)
  5. linux校园网电脑开wifi密码,Linux/Ubuntu 16.04 使用校园网客户端Dr.com DrClient 有线连网,同时开启WiFi热点...
  6. 透明图片怎么发给别人_戒指大了怎么办?
  7. PCM设备的作用,为什么要选用PCM设备?
  8. 下拉框_jQuery 美化界面的下拉框
  9. Redhat与ubuntu配置网卡
  10. SpringBoot基础教程2-1-6 日志规范-使用AOP统一处理Web日志
  11. 公司周刊-非常6+1—营销平台小组
  12. Vim快捷键(三):剪切复制粘贴
  13. 湖南大学离散数学实验——代码(一)
  14. java dateutil 获取时间戳_java获取时间戳的方法
  15. 那么一个数字字符串比如“111“,就可以转化为“AAA”、“KA”和“AK”。
  16. 八种网络攻击类型,你了解多少?
  17. 笨方法学python 42课笔记:物以类聚
  18. Robomaster小陀螺
  19. 小猫爪:S32K3学习笔记01-S32K3 RTD【MCALSDK】的使用和环境搭建
  20. Linux学习 第一期 Ubuntu入门篇

热门文章

  1. vscode生成的.BROWSE.VC.DB文件超大问题
  2. openocd编译安装使用 (基于百问网openjtag工具 ftdi)
  3. 【noi.ac #1997】A. 制胡窜
  4. BIOS和EFI启动过程
  5. 隔壁老王|亲述,我的运维心路历程
  6. 在Linux系统中增加一块SCSI硬盘,重新启动计算机。
  7. 计算机十年歌曲,抖音还有多少个十年能勇敢做热血青年是什么歌
  8. 演化策略(Evolutionary Strategies)
  9. redis管理_Redis 桌面管理工具Redis Desktop Manager
  10. 计算机锁屏图片怎么设置方法,怎么设置电脑锁屏图片 电脑锁屏图片设置步骤...