gpt4 book ai didi

javascript - Geohash-16 : how to

转载 作者:行者123 更新时间:2023-11-30 14:44:43 26 4
gpt4 key购买 nike

情况:

我有使用 geohash 系统创建 base-32 的 JavaScript 代码。

var BASE32_CODES = "0123456789bcdefghjkmnpqrstuvwxyz";
var BASE32_CODES_DICT = {};
for (var i = 0; i < BASE32_CODES.length; i++) {
BASE32_CODES_DICT[BASE32_CODES.charAt(i)] = i;
}

var ENCODE_AUTO = 'auto';

var SIGFIG_HASH_LENGTH = [0, 5, 7, 8, 11, 12, 13, 15, 16, 17, 18];

var encode = function (latitude, longitude, numberOfChars) {
if (numberOfChars === ENCODE_AUTO) {
if (typeof(latitude) === 'number' || typeof(longitude) === 'number') {
throw new Error('string notation required for auto precision.');
}
var decSigFigsLat = latitude.split('.')[1].length;
var decSigFigsLong = longitude.split('.')[1].length;
var numberOfSigFigs = Math.max(decSigFigsLat, decSigFigsLong);
numberOfChars = SIGFIG_HASH_LENGTH[numberOfSigFigs];
} else if (numberOfChars === undefined) {
numberOfChars = 9;
}

var chars = [],
bits = 0,
bitsTotal = 0,
hash_value = 0,
maxLat = 90,
minLat = -90,
maxLon = 180,
minLon = -180,
mid;
while (chars.length < numberOfChars) {
if (bitsTotal % 2 === 0) {
mid = (maxLon + minLon) / 2;
if (longitude > mid) {
hash_value = (hash_value << 1) + 1;
minLon = mid;
} else {
hash_value = (hash_value << 1) + 0;
maxLon = mid;
}
} else {
mid = (maxLat + minLat) / 2;
if (latitude > mid) {
hash_value = (hash_value << 1) + 1;
minLat = mid;
} else {
hash_value = (hash_value << 1) + 0;
maxLat = mid;
}
}

bits++;
bitsTotal++;
if (bits === 5) {
var code = BASE32_CODES[hash_value];
chars.push(code);
bits = 0;
hash_value = 0;
}
}
return chars.join('');
};

实际上,我是从 ngeohash npm 模块 ( source code ) 中获取的。

问题:

我不擅长数字系统二进制数据等。我不知道如何将编码更改为 base-16 系统('0123456789abcdef')。如果有人更改它或只是指出我需要更改什么,我会很高兴。谢谢。

最佳答案

所以我认为您只需更改三件事:

  • 字母表定义(代码段中的 BASE32_CODES),改为设置 16 进制字符。
  • 写入字符前要收集的位数(使用 4 而不是 5)
  • 要输出的字符总数(因为每个字符携带的信息较少,所以您需要更多的字符来携带相同的数据)。

由于我们从每个字符 5 -> 4 位移动,我们将需要额外的字符来达到相同的精度(5 位/字符 * 9 个字符 = 45 位,因此我们需要至少 12 个以 16 为基数的字符以达到相同的精度(4 位/字符 * 12 字符 = 48 位,因此我们实际上通过该字符数获得了一些额外的精度)

因此您的代码段将变为:

var BASE16_CODES = "0123456789abcdef"; // <-- changed this
var BASE16_CODES_DICT = {};
for (var i = 0; i < BASE16_CODES.length; i++) {
BASE16_CODES_DICT[BASE16_CODES.charAt(i)] = i;
}

var ENCODE_AUTO = 'auto';

var SIGFIG_HASH_LENGTH = [0, 5, 7, 8, 11, 12, 13, 15, 16, 17, 18];

var encode = function (latitude, longitude, numberOfChars) {
if (numberOfChars === ENCODE_AUTO) {
if (typeof(latitude) === 'number' || typeof(longitude) === 'number') {
throw new Error('string notation required for auto precision.');
}
var decSigFigsLat = latitude.split('.')[1].length;
var decSigFigsLong = longitude.split('.')[1].length;
var numberOfSigFigs = Math.max(decSigFigsLat, decSigFigsLong);
numberOfChars = SIGFIG_HASH_LENGTH[numberOfSigFigs];
} else if (numberOfChars === undefined) {
numberOfChars = 12; // <-- and this
}

var chars = [],
bits = 0,
bitsTotal = 0,
hash_value = 0,
maxLat = 90,
minLat = -90,
maxLon = 180,
minLon = -180,
mid;
while (chars.length < numberOfChars) {
if (bitsTotal % 2 === 0) {
mid = (maxLon + minLon) / 2;
if (longitude > mid) {
hash_value = (hash_value << 1) + 1;
minLon = mid;
} else {
hash_value = (hash_value << 1) + 0;
maxLon = mid;
}
} else {
mid = (maxLat + minLat) / 2;
if (latitude > mid) {
hash_value = (hash_value << 1) + 1;
minLat = mid;
} else {
hash_value = (hash_value << 1) + 0;
maxLat = mid;
}
}

bits++;
bitsTotal++;
if (bits === 4) { // <-- and finally this
var code = BASE16_CODES[hash_value];
chars.push(code);
bits = 0;
hash_value = 0;
}
}
return chars.join('');
};

console.log(encode(...[40.676843, -73.935769]))

编辑:想想看,如果您正在使用此函数具有的 ENCODE_AUTO 功能,您还需要增加 SIGFIG_HASH_LENGTH 数组中的值(出于与之前相同的原因,更多相同或更高的精度需要字符)。所以它最终应该是:

var SIGFIG_HASH_LENGTH = [0, 7, 9, 10, 14, 15, 17, 19, 20, 22, 23]

关于javascript - Geohash-16 : how to,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49136896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com