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_range和lat_range通过引用传递,所以有可能
long_range
lat_range
geohashEncode(&long_range, &lat_range, longitude, latitude, steps, &hash);
修改其值,因此geohashGetCoordRange将对不同的值再次调用该函数。
geohashGetCoordRange