2 * Different Lat/Lon related function (conversion, distances, etc)
11 /* Int ranges for integerized lat/lon */
12 #define LATLON_MAX 2147483646
13 #define LATLON_MIN -2147483646
15 #define EARTH_RADIUS (3440.06479f)
17 /* Convert latitude to integerized+mercator projected value */
19 lat2mp_int(gdouble lat)
21 return lat > 85.051128779 ? LATLON_MAX : lat < -85.051128779 ? LATLON_MIN :
22 lrint(log(tan(M_PI_4l+lat*M_PIl/360))/M_PIl*LATLON_MAX);
25 /* Convert longitude to integerized+mercator projected value */
27 lon2mp_int(gdouble lon)
29 return lrint(lon/180*LATLON_MAX);
35 return (gdouble)lon/LATLON_MAX*180;
45 calculate_idistance(gint lat1, gint lon1, gint lat2, gint lon2)
47 return lrint(sqrt((double)((lat1-lat2)*(lat1-lat2)+(lon1-lon2)*(lon1-lon2))));
51 * Quick distance for comparing, skips the final square root
54 calculate_idistance_cmp(gint lat1, gint lon1, gint lat2, gint lon2)
56 return ((lat1-lat2)*(lat1-lat2)+(lon1-lon2)*(lon1-lon2));
60 * Calculate the distance between two lat/lon pairs.
61 * The distance is returned in kilometers.
65 calculate_distance(gdouble lat1, gdouble lon1, gdouble lat2, gdouble lon2)
67 gdouble dlat, dlon, slat, slon, a;
69 /* Convert to radians. */
70 lat1*=(M_PI_4l / 180.f);
71 lon1*=(M_PI_4l / 180.f);
72 lat2*=(M_PI_4l / 180.f);
73 lon2*=(M_PI_4l / 180.f);
81 a=(slat * slat) + (cos(lat1) * cos(lat2) * slon * slon);
83 return ((2.f * atan2(sqrt(a), sqrt(1.f - a))) * EARTH_RADIUS);