2016-09-13 8 views
0

http://download.redis.io/redis-stable/deps/geohash-int/geohash_helper.c Из приведенного выше URL мы знаем, что существует две концепции: одна - это geohashBoundingBox, а другая - область. Мои вопросы - вот в чем разница между ними и почему мы нуждаемся в них обоих? Также почему предложение «geohashGetCoordRange (& long_range, & lat_range);" называется два раза?В чем разница между «областью» и «BoundingBox» от исходного кода Redis

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

Связующий коробка в целом является наименьшим прямоугольный блок, который будет содержать объект. Я не могу говорить о конкретной функции GeoHashArea в redis, но поскольку вы подразумеваете, что у них есть аналогичная цель, если оба они представляют географическую область, тогда GeoHashArea, безусловно, будет более подробным многоугольным представлением области, чем простой прямоугольник как geohashBoundingBox.

Для вашего второго вопроса, предположительно, так как переменные long_range и lat_range передаются по ссылке, есть шанс, что

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

изменяет свое значение и поэтому функция geohashGetCoordRange снова вызывается на разных значениях.

 Смежные вопросы

  • Нет связанных вопросов^_^