- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有使用 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 进制字符。由于我们从每个字符 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/
如果 geohash 字符串的长度更大,则更准确。但是是否有任何直接关系,例如如果长度为 7,则它提供 100 米的精度, 即如果两个 geohash(以及它们的任何一个边界框)有前 7 个字符匹配,
两个 geohash 前 6 个字符匹配,两个 geohash 之间的距离最大为 0.61km 两个 geohash 前 5 个字符匹配,两个 geohash 之间的距离最大为 2.5km 问:给定
我有一个问题,我需要检查一个 geohash 是否落入具有动态半径/框的其他点的列表中。我目前正在做的是获取包含纬度/经度的 ortb 出价请求消息,并使用 redis 检查哪些 Activity 将
我在尝试安装 Redis 3.2.1 时遇到以下问题: [root@clj-lc-test01 redis-3.2.1]# make cd src && make all make[1]: Enter
我的点具有给定的latlong和周围的距离-例如{40.6826048,-74.0288632:20英里,51.5007825,-0.1258957:100英里}。如果我选择固定的geohash长度(
我在 Windows 10 中使用 ipython Jupyter 笔记本。我在 cmd 中使用 pip install geohash 安装了 Geohash。 当我尝试使用 geohash(imp
情况: 我有使用 geohash 系统创建 base-32 的 JavaScript 代码。 var BASE32_CODES = "0123456789bcdefghjkmnpqrstuvwxyz"
我正在尝试编写一个 geohashing 函数,该函数采用纬度/经度对并返回其 base2(geohash 一旦转换为 base32)字符串。但是,这给了我不正确的结果。有什么问题吗? public
我想做一个边界框查询 geohashed 字符串的 Trie,其中点位于空间中心周围。当点跨越中心点时,我似乎找不到查询 trie 的好方法。 假设您在 16x16 空间中每个坐标有 4 位(总共 8
我看过this post关于geohashes。根据作者的说法,计算哈希的最后一步是交错 x 和 y 索引值。但这真的有必要吗?只要哈希表是根据更改后的索引规则构建的,是否有适当的理由不只是连接这些值
我现在正在寻找一种优雅的算法,使用地理散列算法 (http://www.geohash.org) 递归查找邻居的邻居。 基本上采用中央 geohash,然后在其周围获得相同大小的散列的第一个“环”(8
我的要求是: 给定一个经纬度边界框,返回一组 geohashes,使得: 集合中的 geohash 数量应该很少(1 到 5 个 geohash 矩形)如果可能。 覆盖范围应尽可能接近输入纬度边界框
您好,我正在使用 googleCharts https://developers.google.com/chart/interactive/docs/gallery/geochart我需要将 GeoH
我找到了this amazing plugin用于在elasticsearch中创建基于geohash的facet。它似乎在 _head pluing 中工作得很好。我只是不太确定如何从 JavaCl
我正在尝试使用 Python 的 geohash 模块获取 geohash 的边界框(x,y 坐标)。我能够成功读取 geohash 并获取它们的质心,但是当我尝试使用 geohash.bbox()
最近我一直在研究 Geohashes和Firestore。我的待办事项场景是收集文件(餐厅),每个餐厅都会有交付给的 Geohashes 列表。 我想避免在文档 restaurant 中添加 geoa
要求保留一个城市中排名前十的地区的列表,这些城市在任何给定时刻都对我们的食品服务产生了需求。这个城市可能有成千上万的地方。 如果必须在内存中进行近乎实时的(滞后时间不超过5分钟)数据存储, -保持按地
我跟随this article用亚马逊DynmoDB索引我的ElasticSearch内容。我在每个DynamoDB行中都有一个嵌套字段,称为location,其中包含5个项目:latitude,lo
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我是一名优秀的程序员,十分优秀!