js实现GeoHash算法

说明

  1. Mysql中可以利用空间函数ST_GeoHash方便快捷的实现GeoHash值的计算
SELECT ST_GeoHash(120.190856853749, 30.1862355009353,12)
  1. 关于GeoHash算法的原理,就是不停地遍历找到最适合目标点的一个区域范围。关于详细说明可以参考下面资料中的第一个链接。
  2. GeoHash中的精度也很好理解,就是遍历的次数越多,找到的范围越小,误差也就越小。默认的话一般12位就可以,已经是很精确了。
  3. 已经验证过这个算法和Mysql中的计算结果是一致的。
  4. 如果代码中有看不明白的地方可以询问。

实现代码

function CreateGeoHash(longitude, latitude, length) {
    if (!longitude && !latitude) {
        console.error('请传入经纬度')
    }
    if(typeof longitude =="string") {
        longitude = Number(longitude)
    }
    if(typeof latitude =="string") {
        latitude = Number(latitude)
    }
    // 获取base32编码
    const Base32 = function(str) {
        let num = str
        if(typeof num == "string") {
            num = Number(str)
        }
        if(num >= 0 && num <=9) {
            return num.toString()
        } else if(num >= 10 && num <= 16){
            return String.fromCharCode(98 + str - 10)
        } else if(num >= 17 && num <= 18){
            return String.fromCharCode(106 + str - 17)
        } else if(num >= 19 && num <= 20){
            return String.fromCharCode(109 + str - 19)
        } else if(num >= 21 && num <= 31){
            return String.fromCharCode(112 + str - 21)
        }
    }
    let lngExtent = [-180, 180]
    let latExtent = [-90, 90]
    let accuracy = length || 12 // 精度
    let times = (accuracy * 5) / 2
    let result = []
    let lngList = [] // 经度的二进制结果
    let latList = [] // 纬度的二进制结果
    let lngAverage = 0
    let latAverage = 0
    let lngLeftRange = []
    let lngRightRange = []
    let latLeftRange = []
    let latRightRange = []
    for (let i = 0; i < times; i++) {
        lngAverage = eval(lngExtent.join("+")) / lngExtent.length
        latAverage = eval(latExtent.join("+")) / latExtent.length
        lngLeftRange = [lngExtent[0], lngAverage]
        lngRightRange = [lngAverage, lngExtent[1]]
        latLeftRange = [latExtent[0], latAverage]
        latRightRange = [latAverage, latExtent[1]]
        if (longitude >= lngLeftRange[0] && longitude < lngLeftRange[1]) {
            lngList.push(0)
            lngExtent = lngLeftRange
        } else {
            lngList.push(1)
            lngExtent = lngRightRange
        }
        if (latitude >= latLeftRange[0] && latitude < latLeftRange[1]) {
            latList.push(0)
            latExtent = latLeftRange
        } else {
            latList.push(1)
            latExtent = latRightRange
        }
    }
    let lngNum = 0
    let latNum = 0
    // 合并:偶数位放经度,奇数位放纬度
    for (let j = 0; j < times * 2; j++) {
        if (j % 2 == 0) {
            result.push(lngList[lngNum])
            lngNum++
        } else {
            result.push(latList[latNum])
            latNum++
        }
    }
    // 转为十进制,再转base32编码
    let geohash = ''
    let k = 0
    for (let k = 0; k < result.length; k = k + 5) {
        let arr = result.slice(k, k + 5)
        let sum = parseInt(arr.join(''), 2)
        let base32 = Base32(sum)
        geohash += base32
    }
    return geohash
}

实现结果

const result = CreateGeoHash(120.190856853749, 30.1862355009353, 12)
console.log(result)
// 输出结果:wtm7xp0r9fns

在这里插入图片描述

参考资料

javascript实现geohash算法

ASC码对照表:
在这里插入图片描述
Base32编码对照表:

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要在Python中实现geohash算法,你可以使用geohash库。首先,你需要确保已经安装了geohash库。你可以使用pip命令进行安装,命令如下:pip install geohash。如果安装成功后,仍然无法导入geohash模块并提示ImportError: No module named 'geohash'的错误,你可以尝试以下方法进行修复:将Geohash文件名改为geohash,然后在geohash文件夹下的__init__.py文件中将from geohash import decode_exactly, decode, encode改为from .geohash import decode_exactly, decode, encode(在geohash前面加一个'.')。这样应该可以解决导入模块的问题。[1] 一旦你成功导入了geohash库,你就可以使用它来进行geohash算法实现。例如,你可以使用decode_exactly函数来将geohash字符串解码为经度和纬度的坐标。例如,你可以使用以下代码来解码geohash字符串"wm6nc":print(geohash.decode_exactly("wm6nc")),这将返回一个包含经度、纬度、经度精度和纬度精度的元组。(30.73974609375, 104.12841796875, 0.02197265625, 0.02197265625)[2] geohash库还提供了其他功能模块,如距离度量和几何计算。距离度量模块提供了与距离相关的函数,如distance和dimensions。几何模块提供了将多边形转换为geohash列表的函数,如polygon_to_geohashgeohash_to_polygon。这些功能可以帮助你在地理区域中进行近似地理差异的计算。你可以使用shapely库进行几何计算[3]。 综上所述,要在Python中实现geohash算法,你可以使用geohash库,并根据需要使用其提供的不同功能模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶尔躲躲乌云_0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值