数仓项目中geohash字典的构建(上)

数仓项目中geohash字典的构建(上)

–先将自己的全国县市字典表调整成扁平化的结构的表
–源表 t_md_areas
–目标表 geohash

–源表样例:

`id` `areaname` `parentid`(父编号) `shortname` `level`(级别) `flag` `wgs84_lng` `wgs84_lat` `gcj02_lng` `gcj02_lat` `bd09_lng`(区的纬度) `bd09_lat` (区的经度)
110000	北京市	0	北京	1	1	116.225197381925	40.2195249171251	116.23128	40.22077	116.395645037879	39.9299857780802
110100	北京市	110000	北京	2	1	116.225197381925	40.2195249171251	116.23128	40.22077	116.395645037879	39.9299857780802
110101	东城区	110100		3	1	116.410130065889	39.9271493544194	116.41637	39.92855	116.421884701264	39.9385740129861
110102	西城区	110100		3	1	116.359896235384	39.910932409618	116.36611	39.91231	116.373190104018	39.9342801437085
110105	朝阳区	110100		3	1	116.437354734245	39.9205326299248	116.44355	39.9219	116.521694891081	39.9589531664067

–目标表目标表样例:

geo       province   city     district
wtbm7y     河北省   辛集市    新垒头镇
wtbm8y     河南省   南阳市    方程县

–sql语句 意思: 区的父id join 市的id 市的父id join 省的id

create table tmp as 
select
d.bd09_lng as lng,
d.bd09_lat as lat,
p.areaname as province,
c.areaname as city,
d.areaname as district
from
t_md_areas d join t_md_areas c on d.`level`=3 and d.parentid=c.id 
             join t_md_areas p on c.parentid=p.id 
;

–代码实现:

115.795795381251	40.0008930314765	门头沟区	北京市	北京市
115.862836312904	39.7267526207963	房山区	    北京市	北京市
116.740079180676	39.8098148838513	通州区	    北京市	北京市
116.728229045281	40.1549514704414	顺义区	    北京市	北京市
116.216456356894	40.2217235498323	昌平区	    北京市	北京市
116.425194597379	39.6527901183645	大兴区	    北京市	北京市

这还是不是我们最终要的结果我们需要把经纬度改成geohash码!
剩下的需要用到geohash的算法窃听下部分解

geohash简介: geohash是一种地址编码,它能把二维的经纬度编码成一维的字符串。geohash有以下几个特点: 首先,geohash用一个字符串示经度和纬度两个坐标。某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。 其次,geohash示的并不是一个点,而是一个矩形区域。比如编码wx4g0ec19,它示的是一个矩形区域。 使用者可以发布地址编码,既能明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。 第三,编码的前缀可以示更大的区域。例如wx4g0ec1,它的前缀wx4g0e示包含编码wx4g0ec1在内的更大范围。 这个特性可以用于附近地点搜索。首先根据用户当前坐标计算geohash(例如wx4g0ec1)然后取其前缀进行查询 (SELECT * FROM place WHERE geohash LIKE 'wx4g0e%'),即可查询附近的所有地点。Geohash比直接用经纬度的高效很多。用途: 移动互联网,lbs可以说是一个基础应用,geohash对于解决附近地点搜索提供了一个有效的解决方案。扩展: 这个php扩展,提供了三个函数:/**     *  $latitude    //纬度     *  $longitude   //经度     *  $precision   //精密度, 默认是12     *  返回 $precision 长度的 string     */    geohash_encode($latitude, $longitude, $precision=12);      /**     *  $hash    //geohash_encode后的值     *  返回 array // Array     *                    (     *                        [latitude] => 39.416916975752     *                        [longitude] => 100.92223992571     *                        [north] => 39.416917059571     *                        [east] => 100.92224009335     *                        [south] => 100.92223992571     *                        [west] => 100.92223975807     *                    )     */    geohash_decode($hash);    /**     *  $hash    //geohash_encode后的值     *  返回 在$hash 8个 (东南西北各二个)附近的hash值     */    geohash_neighbors($hash); 标签:geohash
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值