#include #include #include #include #include /* for Pt */ #include /* for palloc */ /* Earth's radius is in statute miles. */ const EARTH_RADIUS = 3958.747716; const TWO_PI = 2.0 * M_PI; /****************************************************** * * degtorad - convert degrees to radians * * arg: double, angle in degrees * * returns: double, same angle in radians ******************************************************/ static double degtorad(double degrees) { return (degrees / 360.0) * TWO_PI; } /****************************************************** * * geo_distance - distance between points * * args: * a pair of points - for each point, * x-coordinate is longitude in degrees west of Greenwich * y-coordinate is latitude in degrees above equator * * returns: double * distance between the points in miles on earth's surface ******************************************************/ double * geo_distance(Point *pt1, Point *pt2) { double long1, lat1, long2, lat2; double longdiff; double *resultp = palloc(sizeof(double)); /* convert degrees to radians */ long1 = degtorad(pt1->x); lat1 = degtorad(pt1->y); long2 = degtorad(pt2->x); lat2 = degtorad(pt2->y); /* compute difference in longitudes - want < 180 degrees */ longdiff = fabs(long1 - long2); if (longdiff > M_PI) longdiff = TWO_PI - longdiff; *resultp = EARTH_RADIUS * acos (sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(longdiff)); return resultp; }