新普金娱乐网址


地理数字化生活,我的mac软件清单(不定时,持续创新)

地理十八件礼品,十八查封信

地理【怦然心动】似舞|因为你以,所以我来

  • 十一月 13, 2018
  • 地理
  • 没有评论

Redis的GEO函数

因而,你快点出现好不好。

代码实现

心想事成中本人用 GeoHash 的顶可怜精度设置为26号,此时其的偏离精度也
0.3m。当然我们为可以充分利用 Redis 的 sorted set 的 score,设置精度也 32
位,刚好用其的 double 类型。

加大上GitHub源码地址:空间索引-GeoHash

当自我同一配一道地理清于你因,你道歉,追赶着圈了自家之诸一样首文章。

原理

GeoHash 算法的规律说起来是老大简短的,如下图:

地理 1

  1. 打横向上将整个方形纸分为横个别卖,左侧有也符为 0
    右侧有号为 1
  2. 复以红点所在的有分也横简单块,再对红点位置做相同的标识,最后得出红点在横向上的标识也
    10;
  3. 在纵向上对方形纸做一样的划分,左侧标识为0,右侧标识为
    1,得出红点位置于纵向上的标识为 01;
  4. 将横向标识以及纵向标识合并,规则为 纵向在奇数位,横向在偶数位
    (也可是纵横相反,但万一当合系统内保持一致),得出红点在方形纸上之标识为
    1001;

单纯记一个方格显得看不发出什么规律,如果我们拿这些都空格都标识后会见发觉
被划分在角落里的四个方格会有同样的前缀,一般来说图所示。

地理 2

平等的前缀意味着可以采用 B树 索引查找有同一前缀的点当附近的接触,GeoHash
算法便是这些同的前缀上面做文章。

有关青春

墨卡托影

墨卡托影子,是正轴等比赛圆柱投影。由荷兰地图学家墨卡托(G.Mercator)于1569年创造。假想一个以及地轴方向平的圆柱切或割于地球,按相当于比赛条件,将经纬网投影到圆柱面上,将圆柱面展为面后,即得按照投影。墨卡托投影在切圆柱投影和割圆柱投影中,最早吗是极致常用之是切圆柱投影。

墨卡托影简单地游说,就是得
把整个地球平面作为一个正方形来处理,当然地平面不是严格的正方形,此投影于两极附近的点会有误差,本文专注于原理,纠偏就无多领取了(我哉未知情,逃)。

我妈已经问过好勤,我何以还无谈恋爱。

冲查询范围半径获取精度

上文说罢,精度是由于地图的细分次数决定的,划分次数多了,范围就不怎么了,查询的有的数目就是无都;划分次数少了,范围就会怪了,我们本着数码过滤时就见面发生了多的耗费。

private function getLevel($range_meter){
    $level = 0;
    $global = self::MERCATOR_LENGTH;
    while ($global > $range_meter) {
        $global /= 2;
        $level++;
    }

    return $level;
}   

地方代码的构思来redis geo函数源码,真的要命巧妙。

于墨卡托影下,地球之外部可以视作一个正要方形来拘禁,它的边是地球周长中最为丰富之一个。而学过初中地理的我们理解:“地球是一个两极稍扁,赤道略鼓的球”,那么它们极其丰富之一个周长就是赤道周长了,于是我们获悉墨卡托投影的长边为
2*PI*R=40075452.74M;

乃我们以正方形的一个边来不停歇地开展次软私分,直到划分后的结果刚比克半径长,那么它们做的一个方,便是我们要之方格。

君小上火,不明白我胡不肯而的草稿,但还是保持正风度。

小结

消费了十基本上个小时,总算将 GeoHash 完全整体了一致百分之百,完全明了 GeoHash
并无感念像被的那么粗略。除了
GeoHash,四叉树和R树据说查询效率会重强,有时空再次钻一下。

若是你看本文对君来帮衬,可以点击下面的 推荐 支持一下自我。博客一直于创新,欢迎 关注 。

参考:

GeoHash核心原理分析

Redis GEO
源码注释

GeoHash位数精度对照表(wiki百科):

GeoHash length lat bits lng bits lat error lng error km error
1 2 3 ±23 ±23 ±2500
2 5 5 ±2.8 ±5.6 ±630
3 7 8 ±0.70 ±0.70 ±78
4 10 10 ±0.087 ±0.18 ±20
5 12 13 ±0.022 ±0.022 ±2.4
6 15 15 ±0.0027 ±0.0055 ±0.61
7 17 18 ±0.00068 ±0.00068 ±0.076
8 20 20 ±0.000085 ±0.00017 ±0.019

base32 编码映射表:

Value Symbol Value Symbol Value Symbol Value Symbol
0 A 9 J 18 S 27 3
1 B 10 K 19 T 28 4
2 C 11 L 20 U 29 5
3 D 12 M 21 V 30 6
4 E 13 N 22 W 31 7
5 F 14 O 23 X    
6 G 15 P 24 Y    
7 H 16 Q 25 Z    
8 I 17 R 26 2    

末了,我怀念享受给你,那些感动了自家之语句,出自我之文章评论。

实现

准墨卡托投影的面,我们好按地方划分方格纸的方式来将全方位地球表面划分为顺序小方格。

只要(116.276349, 40.040875)这个点的经度划分:

  1. 经度在 [-180,0) 范围外的标识为0,经度范围以 [0, 180) 度的标识为
    1;
  2. 继承划分,经度范围以 [0,90) 的标识也 0,经度范围以 [90,180)
    的标识为 1;
  3. 然,我们分开 20 次,方格的精度(见文末对照表)已达标
    2m,得到经度的标识二上前制串为11010010101011110111;
  4. 对纬度同样划分,得到纬度的标识二进制串为10111000111100100111;
  5. 俺们针对其整合,得到40位之老二迈入制串11011 01110 00010 01110 11100 10111 01001 11111;
  6. 我们以是次前行制串使用
    base32编码(原理同base64,可以展现我之别一样首文章:WEB开发被之字符集及编码,位编码映射表见下),得到
    GeoHash 编码为 3OCO4XJ7;

那么GeoHash编码前缀为 3OCO4XJ7的地理点就是离 (116.276349,
40.040875)两米外之触发。如果我们把地理位置点和该GeoHash编码存入数据库的话,我们而摸
附近有数米点之触发,只待限标准 geo_code like '3OCO4XJ7%'就行了;

本人亦了解,我此岁数,放在古代,已是适嫁。《诗经·召南·摽有梅》曰:“摽有梅,其实七乎。求己庶士,迨其吉兮。”

方案

乃我们就寻找解决方案,既然使用 base32 转换为 32进制码
会不好控制精度,保持二进制又导致索引长度过长,那么进制位数和目录长度有没出一个抵也?

此外 Redis 的 sorted set 支持 64个 的 double 类型的
score,我们将二进制的 GeoHash 码转为十进制放入 Redis 的 sorted set
中,不是可以兑现 log(n)的询问效率了吗。

说实话第一次等见到 Redis 的 GEO
系列函数的时段我的心房是倒的,原来自己感觉太精彩的设计曾为人实现了(虽然这种景象经常出现)。。。

当然不可知饶如此算了,于是自己使用PHP造了平等整个轮子。。。

重在步骤如下:


便是世界让大雨颠倒,我哉会一直深受您无比暖的怀抱。

边界点问题

不过最好简版的 GeoHash 还有一个败笔,如下图:

地理 3

一旦每个方格的精度也 2km,那么我们一直按前缀查询红点附近 2km
的触发是找无顶距其杀靠近的黑点的。

设若缓解者问题,我们不怕待所其广泛八只方格也考虑上,将我方格和周边八个方格内之点还遍历一不好,再回到符合要求的触及。那么什么样理解周边方格的前缀呢?

细察看附近方格,我们见面发觉少单小方格会在
经度或纬度的二进制码上相差1;我们经过 GeoHash
码反向解析出二进制码后,将其经度或纬度(或双边)的二进制码加同,再次结缘也
GeoHash 码。


自述:

前言

上篇博客中关系了半空中引得的用以及多种数据库对空中引得的支持情况,那么当应用层以下,好学的伴侣应该会设想空间引得的落实原理了。

时下空中引得的落实有 R树和那个变种GIST树、四交叉树、网格索引等。
网格索引不再多提,使用普通的hash表存储地点以及作风中的投来实现。今天如果介绍的GeoHash算法实现之空间引得,虽然是以B树实现,但本身以为它们为借用网格索引的平局部考虑。


绕了很特别一环才遇见你,一定是出专门的缘分,才会惨遭见爱情,遇见一生。

问题

咱们广阔的需求是寻觅 n米 范围外的触及,那么 n米 与 GeoHash
码位数以内的投如何兑现吗?由于 GeoHash
码是由5位二进制码组成,每少一员,精度就见面损失 2e(5/2)

法自然片,我们以第二上前制GeoHash码直接索引就足以,但非常丰富的目录长度会促成
B树 索引查询效率会快速下滑。

因您于,所以自己来,可能而还无到,但信而得来。靠近我,温暖你。

多少入库:

拿通过纬度通过 GeoHash 算法获取到第二上制 GeoHash
码,并拿那个转移成为十向前制作也之点之 score 存入 Redis 的 sorted set;

// GeoHash核心方法 传入float类型的度数和其对应的范围,经度和纬度公用方法
public function getBits($loc, $range, $level = self::LEVEL_MAX) {
    $bits = '';
    for ($i = 0; $i < $level; $i++) {
        $mid = ($range['min'] + $range['max']) / 2;
        if ($loc < $mid) {
            $bits .= '0';
            $range = ['min' => $range['min'], 'max' => $mid];
        } else {
            $bits .= '1';
            $range = ['min' => $mid, 'max' => $range['max']];
        }
    }

    return $bits;
}     

另外 php 的 bindec($bin_str) 方法会高效将二上前制字符串转为十进制数字。

职业:上班族

GeoHash

《想与而一同当海边撒欢》

多少查询

数量查询时,我们需要得到中间方块的卓绝小 score 值和其范围,最小 score
值很简短,直接将二进制位不足52个的在后头加0

另外,为了避免边界点问题,我们尚亟需拿方圆八单方格的 score
值范围吗取得到。

咱以细分地图时,每多分割一次等,会助长经度和纬度两独二进制位,在精度高时,那么每一个方格的极端深价值和最小值之间差1。由此,我们经过下面的艺术获得到一个方格的不过充分以及极其小
score 值之差。

private function getLevelRange($level) {
    $range = pow(2, 2 * (self::LEVEL_MAX - $level));

    return $range;
}

又由方提过的边界点问题的缓解方案,获取到广八个方格的极致小 score 值。

使用 Redis
ZRANGEBYSCORE key hashInt hashInt+range命令将即刻九只方格内的触及全取到,再遍历九个方格,将去不相符的数额过滤掉。


或是咱们见面结婚,那时我们得好当简书上落一波狗粮。

1111愿望:

迎面而来的您,穿在白衬衫,笑着发两发小虎牙,暖化我之早起。

自我每每挂于嘴边,说自己了了耳听爱情的岁。直到遇见你,我才知,那不过是片面措词。

发生好宠爱我的婆婆,对自身太好之家属,想一直好所能够好好回报他们。

怀念使你的食指,也想宠你的胃。

听见你说,还想看像

但为当一个你,我从来不后悔。

过来简书就比如打开一个新世界的大门,简书有广大特别厉害的总人口,在这里描绘好的故事,也撞同样拉扯志同道合的人口。

**我在参加怦然心动·邂逅你的11封闭情书——1111情节书交友创作大赛,快来受自身写情书吧。
**

3.存均等画恋爱基金,以后去举行我们喜欢的从业,开平内甜品店,开平中民宿。

情书:

昵称:似舞+然而是一个自己,遇见一个您

可合的想象力,都比不上初次看您,汝道的那么同样句:“我及了”。

end.【无防范365上极限挑战日再次训练营第8天】

《遇见你不早不晚,刚刚好》

嗜多品,遇见各种风格的投机,偶尔生平静,嗨的时节呢会非常吵。常常没心没肺,会管纷繁的事务简单化。

当暖暖的太阳透过层层叠叠的银杏叶,丝丝缕缕地散落下,空气受发生初秋的清凉。

咱俩就算这样经过简信,搭起一所相识相知的大桥。慢慢你的干货文在首页很容易欢迎,每次发文沙发都好难抢,不过不久而的沙发我是当真的。

约莫每个女儿衷心,曾经还住着只帅气阳光之挺男孩,像极了一布置素描。阳光照着他的面子,花香沾满了他的衣服,清风吹起了外的黑发。他拥在天的平去蓝,深情款款地动来。

年少芳华,曾遇到一个口,真心爱过,尔后去疼了。

在绝美好的时间,会遇到好对之总人口,等风等雨啊当你。

可望当某年某月某日,可以不期而遇,然后于一块儿,余生都是公

青春记忆里的易,大概都与自己随后底人生无关,可爱了,疼过,到底是抚今追昔。

地理 4

自家是独好没安全感,也时常怀想最多之人。多了一个而,替自己思前想后,贴心又暖和,女生还是宠爱出来的,谢谢君拿自身放在心里。

  我哥对文: 季动 
因为您于,所以我错过

喜爱写故事,钟情写故事。可能实际太凉,所以故事来取暖,想写暖心头的故事,愿被见有趣之若。

直接觉得好于作文上并未啊天赋,唯有死磕,就用力再写一年。

喜爱随心的在,是独特别会折腾的食指。会起火,喜欢烘焙,玩过早餐马拉松。最近在拟在带来便当,致力做爽口的食物吃喜欢的人口。

地理 5

自告奋勇文章:

新生,你时不时找我看文章,我细细麻麻地受您围着点着。你吗为自身绣错别字,在自我形容文有来失意的当儿,给自己鼓励与称赞。

1.吸收你的围脖以及过硬棒糖,围巾的颜料想使冰粉红,棒棒糖都得以。

地点:潮汕

有关在

2.暨您到厦门走相同活动,已经计划长期,一直未能成行,或许你来,风景就发生了。

有关爱情

我眷恋像了大多种跟而见面的规范,或许很唯美,或许很急。

些微话,当在公的冲,我开始不了人,怕自己无比过娇情,就借着情书告诉你。

身高:161cm

我们以简书上的缘分,是为您收到自己之均等封闭拒稿信。

**星座:双子座
**

《那个棒棒糖少年》

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图