python geohash怎么安装
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python geohash怎么安装相关的知识,希望对你有一定的参考价值。
参考技术A 首先,geohash用一个字符串表示经度和纬度两个坐标。某些情况下无法在两列上同时应用索引 (例如mysql 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。其次,geohash表示的并不是一个点,而是一个矩形区域。比如编码wx4g0ec19,它表示的是一个矩形区域。 使用者可以发布地址编码,既能表明自己位于北海公园附近,又不至于暴露自己的精确坐标,有助于隐私保护。本回答被提问者采纳 参考技术B 打开命令提示符
键入【pip install geohash】(只输入【】内的内容)
回车
记得要联网操作
Geohash-16:怎么样
情况:
我有JavaScript代码,用geohash系统创建base-32。
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位移动,我们需要额外的字符才能达到相同的精度(5bits / char * 9chars = 45bits,所以我们需要至少12个字符在base 16中才能获得相同的精度(4bits / char * 12chars = 48bits,所以我们实际上得到了一些具有该字符数的额外精度)
所以你的代码片段会变成:
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]))
以上是关于python geohash怎么安装的主要内容,如果未能解决你的问题,请参考以下文章