当前位置: 首页 > 面试题库 >

Redis源代码中的“ area”和“ BoundingBox”有什么区别

冯曾笑
2023-03-14
问题内容

http://download.redis.io/redis-stable/deps/geohash-
int/geohash_helper.c

通过上面的URL,我们知道有两个概念,一个是geohashBoundingBox,另一个是Area,我的问题是有什么区别它们之间,为什么我们都需要它们?还有为什么句子“
geohashGetCoordRange(&long_range,&lat_range);” 被称为两次?

GeoHashRadius geohashGetAreasByRadius(double longitude, double latitude,    double radius_meters) {
GeoHashRange long_range, lat_range;
GeoHashRadius radius = { { 0 } };
GeoHashBits hash = { 0 };
GeoHashNeighbors neighbors = { { 0 } };
GeoHashArea area = { { 0 } };
double min_lon, max_lon, min_lat, max_lat;
double bounds[4];
int steps;

geohashBoundingBox(longitude, latitude, radius_meters, bounds);
min_lon = bounds[0];
min_lat = bounds[1];
max_lon = bounds[2];
max_lat = bounds[3];

steps = geohashEstimateStepsByRadius(radius_meters,latitude);

geohashGetCoordRange(&long_range, &lat_range);
geohashEncode(&long_range, &lat_range, longitude, latitude, steps, &hash);
geohashNeighbors(&hash, &neighbors);
geohashGetCoordRange(&long_range, &lat_range);
geohashDecode(long_range, lat_range, hash, &area);

if (area.latitude.min < min_lat) {
    GZERO(neighbors.south);
    GZERO(neighbors.south_west);
    GZERO(neighbors.south_east);
}
if (area.latitude.max > max_lat) {
    GZERO(neighbors.north);
    GZERO(neighbors.north_east);
    GZERO(neighbors.north_west);
}
if (area.longitude.min < min_lon) {
    GZERO(neighbors.west);
    GZERO(neighbors.south_west);
    GZERO(neighbors.north_west);
}
if (area.longitude.max > max_lon) {
    GZERO(neighbors.east);
    GZERO(neighbors.south_east);
    GZERO(neighbors.north_east);
}
radius.hash = hash;
radius.neighbors = neighbors;
radius.area = area;
return radius;

}


问题答案:

通常,绑定盒是将包含对象的最小矩形盒。我无法说说Redis中GeoHashArea的确切功能,但是由于您暗示它们具有相似的用途,如果它们都代表一个地理区域,则与简单的矩形相比,GeoHashArea最有可能是一个更详细的多边形表示形式像geohashBoundingBox。

对于第二个问题,大概是因为变量long_rangelat_range通过引用传递,所以有可能

geohashEncode(&long_range, &lat_range, longitude, latitude, steps, &hash);

修改其值,因此geohashGetCoordRange将对不同的值再次调用该函数。



 类似资料:
  • 问题内容: 我想使用 Redis的-PY 缓存一些数据,但我无法找到之间的差异的一个合适的解释和。它们相等吗? 此外,在Redis Python Docs中找不到关于的参数的清晰文档。任何想法? 问题答案: 这似乎很清楚: 和 您需要向后兼容吗?使用。不在乎吗 使用。 2017-03-31 以下是从github.com链接引用的向后兼容性的详细信息: 除了上述更改之外,Redis类是StrictR

  • 1、Redis相比memecache,拥有更多的数据结构和支持更丰富的数据操作。 (1)Redis支持key-value,常用的数据类型主要有String、Hash、List、Set、Sorted Set。 (2)memecache只支持key-value。 2、内存使用率对比,Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memecache。 3、性

  • 似乎至少有三种方法可以做听起来相同的事情。 他们的区别是什么 注意:这看起来可能是这个的重复,但这些答案是不完整的,并且不能解释更改URL与“远程”的区别? 编辑: 做一些进一步的谷歌搜索:从这个SO答案中: git中的远程基本上是另一个存储库的书签,您可能希望从中提取或推送代码。带书签的存储库可能位于本地计算机上的另一个文件夹、远程服务器上,甚至可能是存储库本身。。。但最简单的类比是书签。存储库

  • 问题内容: 我正在学习用来汇总和发送任务。我下面有一个简单的程序 它什么也没做,但是创建了两个并总共提交了5个任务。每次完成任务后,将执行下一个任务。在上面的代码中,我使用。我也改为了。但我看不出输出有任何区别。以何种方式都和方法有什么不同?这个怎么说 方法提交通过创建并返回一个可以用来取消执行和/或等待完成的Future来扩展基本方法Executor.execute(java.lang.Runn

  • 我为Visual Studio代码分析定义了一组规则,并在Sonar(http://www.sonarqube.org/)中配置了这些规则。我得到不同的结果。

  • 301和302状态码都表示重定向,当浏览器拿到服务器返回的这个状态码后悔自动跳转到一个新的URL地址。 301代表永久性重定向,旧地址被永久移除,客户端向新地址发送请求。 302代表暂时性重定向,旧地址还在,客户端继续向旧地址发送请求。 303代表暂时性重定向,重定向到新地址时,必须使用GET方法请求新地址。 307代表暂时性重定向,与302的区别在于307不允许从POST改为GET。 307代表