当前位置: 面试刷题>> Geo哈希Ⅰ (经典算法题500道)


题目描述补充

Geo哈希(Geohash)Ⅰ

Geohash 是一种地址编码方式,它将地球上的位置编码成一个简短的字符串。这个字符串表示的是一个矩形区域,并且这个区域可以递归地缩小范围,直到达到所需的精度。Geohash 使用一个基本的编码系统,该系统基于经纬度,并通过一种类似于二进制的分割方式逐步减少范围。

题目要求:

  1. 实现一个函数,该函数接受一个经纬度(纬度在前,经度在后)的元组或数组,以及一个表示精度的整数(如精度 5 表示返回的 Geohash 字符串长度为 5)。
  2. 函数应返回对应经纬度的 Geohash 字符串。

示例代码

PHP 示例

function encodeGeohash($latitude, $longitude, $precision = 5) {
    $base32 = '0123456789bcdefghjkmnpqrstuvwxyz';
    $isEvenBit = true;
    $latMin = -90.0;
    $latMax = 90.0;
    $lonMin = -180.0;
    $lonMax = 180.0;
    $bit = 0;
    $geohash = '';

    while ($geohash->length() < $precision) {
        if ($isEvenBit) {
            $mid = ($lonMin + $lonMax) / 2;
            if ($longitude > $mid) {
                $ch = base_convert(intval(substr($base32, 0, 1)), 10, 2);
                $lonMin = $mid;
            } else {
                $ch = base_convert(intval(substr($base32, 1, 1)), 10, 2);
                $lonMax = $mid;
            }
        } else {
            $mid = ($latMin + $latMax) / 2;
            if ($latitude > $mid) {
                $ch = base_convert(intval(substr($base32, 0, 1)), 10, 2);
                $latMin = $mid;
            } else {
                $ch = base_convert(intval(substr($base32, 1, 1)), 10, 2);
                $latMax = $mid;
            }
        }

        $isEvenBit = !$isEvenBit;
        $geohash .= $ch;

        if (strlen($geohash) == $precision) {
            break;
        }
    }

    return substr($geohash, 0, $precision);
}

// 示例用法
echo encodeGeohash(34.0522, -118.2437, 12);

注意:上述 PHP 示例包含了一些假设和简化的逻辑,主要用于展示思路。实际上,Geohash 的生成需要更精细地处理位操作和字符编码映射。

Python 示例

def encode_geohash(latitude, longitude, precision=5):
    base32 = '0123456789bcdefghjkmnpqrstuvwxyz'
    bit = 0
    even = True
    lat_range = (-90.0, 90.0)
    lon_range = (-180.0, 180.0)
    geohash = []

    while len(geohash) < precision:
        if even:
            mid = (lon_range[0] + lon_range[1]) / 2
            if longitude > mid:
                geohash.append(base32[(bit // 5) % 32])
                lon_range = (mid, lon_range[1])
            else:
                geohash.append(base32[(bit // 5 + 1) % 32])
                lon_range = (lon_range[0], mid)
        else:
            mid = (lat_range[0] + lat_range[1]) / 2
            if latitude > mid:
                geohash.append(base32[(bit // 5) % 32])
                lat_range = (mid, lat_range[1])
            else:
                geohash.append(base32[(bit // 5 + 1) % 32])
                lat_range = (lat_range[0], mid)
        even = not even
        bit += 5

    return ''.join(geohash[:precision])

# 示例用法
print(encode_geohash(34.0522, -118.2437, 12))

JavaScript 示例

function encodeGeohash(latitude, longitude, precision = 5) {
    const base32 = '0123456789bcdefghjkmnpqrstuvwxyz';
    let isEvenBit = true;
    let latMin = -90.0;
    let latMax = 90.0;
    let lonMin = -180.0;
    let lonMax = 180.0;
    let bit = 0;
    let geohash = '';

    while (geohash.length < precision) {
        if (isEvenBit) {
            const mid = (lonMin + lonMax) / 2;
            if (longitude > mid) {
                geohash += base32[Math.floor(bit / 5) % 32];
                lonMin = mid;
            } else {
                geohash += base32[Math.floor(bit / 5) + 1 % 32];
                lonMax = mid;
            }
        } else {
            const mid = (latMin + latMax) / 2;
            if (latitude > mid) {
                geohash += base32[Math.floor(bit / 5) % 32];
                latMin = mid;
            } else {
                geohash += base32[Math.floor(bit / 5) + 1 % 32];
                latMax = mid;
            }
        }
        isEvenBit = !isEvenBit;
        bit += 5;
    }

    return geohash.substring(0, precision);
}

// 示例用法
console.log(encodeGeohash(34.0522, -118.2437, 12));

以上示例提供了不同编程语言实现 Geohash 编码的方法。希望这对你的面试准备或学习有帮助!码小课网站中有更多相关内容分享给大家学习。

推荐面试题