基于geohash6编码实现相邻4、9、16网格合并

前面的两篇文章介绍了geohash的基本原理及c#代码相关实现,其中geohash 5位编码单个网格覆盖面积大约在24平方千米,6位编码单网格覆盖面大约在0.73平方千米, 相邻编码长度之间单网格覆盖面积跨度太大,在实际应用中希望计算出3平方千米、5平方千米、10平方千米的覆盖率,可行的方案在Geohash6对应的网格上进行4、9、16网格的合并。

   基本思路 :

  • 将城市坐标看成一个基于经纬度线的坐标系,取出所在城市的经纬度范围(为了减少网格的个数,在满足业务的需求的前提下,确定的范围值越小越好)
  • 从最小的经纬度开始计算网格,在 geohash基本原理 一文中,通过在网上收集的资料,geohash码相邻网格的经纬度分别是为:0.0055 和 0.0027, 通过验证,相邻网格正确的偏移量分别为:

    DIFF_LAT = 0.0054931640625;
    DIFF_LON = 0.010986328125;
  • 在计算的过程中,将最小经纬度画出的表格定位在坐标系中的第一行、第一列,根据上面提供的偏差量依次进行循环,计算出范围内所有网格及其所在的行、列,以青岛为例,计算出来的示例数据如下:
  • 数据清洗完成后,接下来需要做的就是进行网格的合并(本质是给合并的网格一个相同的编码),如下图:
  • 红框内以4格合并为例,每个合并后的网格占2行2列,框内的11表示第一行第一列,12表示第一行第二列,21表示第二行第一行,当4格合并后新生成的风格占第一行第一列,由此不难发现,取geohash6网格所有行、列数除2向下取整即可得到合并后网格所在的新行和新列,对数据进行组合,确定唯一码
  • 同理,对于9格、16格、25格的合并岂是一样,它们分别可以使用3行3列、4行4列、5行5列的明细风格进行合并,然后取出合并后网格的最大和最小经纬度即可计算出坐标范围,如下:

    /*group4*/
        update  ETL_GeoCityGrid set geogroup4 = cityID + ‘-‘ + ‘G4-‘ +  cast(CEILING(cast(grow as decimal)/2) as varchar) + ‘-‘ + cast(CEILING(cast(gcol as decimal)/2) as varchar);
    
        /*group9*/
        update  ETL_GeoCityGrid set geogroup9 = cityID + ‘-‘ + ‘G9-‘ +  cast(CEILING(cast(grow as decimal)/3) as varchar) + ‘-‘ + cast(CEILING(cast(gcol as decimal)/3) as varchar);
    
        /*group16*/
        update  ETL_GeoCityGrid set geogroup16 = cityID + ‘-‘ + ‘G16-‘ +  cast(CEILING(cast(grow as decimal)/4) as varchar) + ‘-‘ + cast(CEILING(cast(gcol as decimal)/4) as varchar);
  • 合并后网格的唯一码确定后,计算每个合并后网格的坐标范围就相对容易,如下:
     select geogroup4,min(minlat) as minlat,min(minlng) as minlng,max(maxlat) as maxlat,max(maxlng) as maxlng
            from ETL_GeoCityGrid
           where cityid = ‘3702‘
          group by geogroup4
时间: 2025-01-07 11:09:18

基于geohash6编码实现相邻4、9、16网格合并的相关文章

Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的repository,该分类下面有一个名为Jcompress的目录便是本文所述的压缩.解压缩小程序的源代码.后续会在Utility下面增加其他一些实用的小程序,比如基于socket的文件断点下载小程序等等.如果你读了此文觉得还不错,不防给笔者的github点个star, 哈哈.在正式介绍Jcompres

TensorFlow上实践基于自编码的One Class Learning

“我不知道什么是爱,但我知道什么是不爱” --One Class Learning的自白 一.单分类简介 如果将分类算法进行划分,根据类别个数的不同可以分为单分类.二分类.多分类,常见的分类算法主要解决二分类和多分类问题,预测一封邮件是否是垃圾邮件是一个典型的二分类问题,手写体识别是一个典型的多分类问题,这些算法并不能很好的应用在单分类上,但单分类问题在工业界广泛存在,由于每个企业刻画用户的数据都是有限的,很多二分类问题很难找到负样本,比如通过用户的搜索记录预测一个用户是否有小孩,可以通过规则筛

基于实数编码(离散杂交+自适应变异),线性排名选择的遗传算法(附代码)

我们来看一个很简单的小问题f=x1+x2+x3+x4,x1.x2.x3.x4是大于等于10小于等于100的实数,求f的最大值. 这个小学生就能解决的问题我今天打算用遗传算法来解决,你可能说这不是智障吗?但是其实这只是一个小例子,因为用同样的方法,你可以解决f=x1^x2*x3^x4/x2^x1*x4^x3甚至是更复杂的问题,下面就来详细讲一讲. 基于对遗传算法的一般性了解,我就不再赘述详细过程(其实是因为上一篇写过了懒得再写一遍),只谈谈实数编码和线性排名选择策略. 实数编码顾名思义就是用实数进

基于 Arch Linux 的发行 Manjaro Linux 16.08 发布

Manjaro Linux 16.08 发布了. Manjaro Linux是快速的.用户友好的.面向桌面的.基于Arch Linux的操作系统.它的一些显 著特性包括:一份直观的安装程序.自动硬件检测.稳定的滚动式发布模式.对安装多个内核的支持.用于管理图形卡的特别Bash脚本.高度的桌面可配置性(腾云科技TY300.COM). Manjaro Linux提供Xfce桌面作为核心选项,并为高级用户提供一份最小主义的Net版本.用户还可以获得社区支持的GNOME 3/Cinnamon及KDE版本

DeepLearning (四) 基于自编码算法与softmax回归的手写数字识别

[原创]Liu_LongPo 转载请注明出处 [CSDN]http://blog.csdn.net/llp1992 softmax 回归模型,是logistic 回归模型在多分类问题上的推广.关于logistic回归算法的介绍,前面博客已经讲得很清楚,详情可以参考博客 机器学习实战ByMatlab(五)Logistic Regression 在logistic回归模型中,我们的激励函数sigmoid的输入为: z=θ0x0+θ1x1+θ2x2+...+θnxn 则可以得到假设函数为: hθ(x)

基于Huffman编码的压缩软件的Python实现

哈夫曼编码是利用贪心算法进行文本压缩的算法,其算法思想是首先统计文件中各字符出现的次数,保存到数组中,然后将各字符按照次数升序排序,挑选次数最小的两个元素进行连结形成子树,子树的次数等于两节点的次数之和,接着把两个元素从数组删除,将子树放入数组,重新排序,重复以上步骤.为了解压,在压缩时首先往文件中填入huffman编码的映射表的长度,该表的序列化字符串,编码字符串分组后最后一组的长度(编码后字符串长度模上分组长度),最后再填充编码后的字符串.本算法中以一个字节,8位作为分组长度,将编码后二进制

【剑指Offer】16、合并两个排序的链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解法一:使用ArrayList 1 public static ListNode Merge(ListNode list1,ListNode list2) { 2 if(list1==null||list2==null){ 3 if(list1==null){ 4 return list2; 5 }else{ 6 return list1; 7 } 8 } 9 ArrayList<ListNo

剑指offer(16)合并两个排序的链表

题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题代码: /*function ListNode(x){ this.val = x; this.next = null; }*/ function Merge(pHead1, pHead2) { // write code here if(pHead1 == null && pHead2 == null){ return null; } if(pHead1 == null){ ret

JS实现—Base64编码解码,带16进制显示

代码如下: <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <titl