Redis中的地理算法

时间:2016-09-12 11:50:49

标签: math redis geometry geospatial geohashing

我检查了Redis的地理源代码,我无法理解的一个陈述是double difference_longitude = asin(sin(distance) / cos(latr)); 什么是asin(sin(distance) / cos(latr))含义?维基百科有什么理论吗?

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

#define D_R (M_PI / 180.0)

static inline double deg_rad(double ang) { return ang * D_R; }
static inline double rad_deg(double ang) { return ang / D_R; }

int geohashBoundingBox(double longitude, double latitude, double radius_meters,
                       double *bounds) {
    if (!bounds) return 0;

    double lonr, latr;

    lonr = deg_rad(longitude);
    latr = deg_rad(latitude);

    if (radius_meters > EARTH_RADIUS_IN_METERS)
        radius_meters = EARTH_RADIUS_IN_METERS;
    double distance = radius_meters / EARTH_RADIUS_IN_METERS;
    double min_latitude = latr - distance;
    double max_latitude = latr + distance;

    /* Note: we're being lazy and not accounting for coordinates near poles */
    double min_longitude, max_longitude;
    **double difference_longitude = asin(sin(distance) / cos(latr));**
    min_longitude = lonr - difference_longitude;
    max_longitude = lonr + difference_longitude;

    bounds[0] = rad_deg(min_longitude);
    bounds[1] = rad_deg(min_latitude);
    bounds[2] = rad_deg(max_longitude);
    bounds[3] = rad_deg(max_latitude);
    return 1;
}

0 个答案:

没有答案