2016-09-13 65 views
0

http://download.redis.io/redis-stable/deps/geohash-int/geohash_helper.c 從上面的URL我們知道有兩個概念,一個是geohashBoundingBox,另一個是區域,我的問題是它們和爲什麼我們需要他們兩個? 也爲什麼這句話「geohashGetCoordRange(& long_range,& lat_range);」被稱爲兩次?Redis的源代碼中的「area」和「BoundingBox」有什麼區別

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; 

}

回答

0

的接合盒一般是最小的矩形框將包含一個對象。我不能說Redis中GeoHashArea的確切功能,但是因爲你暗示它們有相似的目的,如果它們都代表一個地理區域,那麼GeoHashArea肯定是一個區域的更詳細的多邊形表示,而不是一個簡單的矩形像geohashBoundingBox。

關於第二個問題,據推測,由於變量long_rangelat_range按引用傳遞,有一個機會,

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

修改自己的價值,因此函數geohashGetCoordRange再次呼籲不同的值。

相關問題