地球两点距离

void distance(sqlite3_context *context, int nargs, sqlite3_value **values){
char *errorMessage;
double pi = 3.14159265358979323846;
if(nargs != 4){
errorMessage=”Wrong # of args. Distance(lat1,lon1,lat2,lon2)”; sqlite3_result_error(context,errorMessage,strlen(errorMessage));
return;
}
if((sqlite3_value_type(values[0]) != SQLITE_FLOAT) ||
(sqlite3_value_type(values[1]) != SQLITE_FLOAT) || (sqlite3_value_type(values[2]) != SQLITE_FLOAT) || (sqlite3_value_type(values[3]) != SQLITE_FLOAT)){
errorMessage =”All four arguments must be of type float.”; sqlite3_result_error(context, errorMessage,strlen(errorMessage)); return;
}

double latitude1, longitude1, latitude2, longitude2;
latitude1 = sqlite3_value_double(values[0]);
longitude1 = sqlite3_value_double(values[1]);
latitude2 = sqlite3_value_double(values[2]);
longitude2 = sqlite3_value_double(values[3]);
double x = sin( latitude1 * pi/180 ) * sin( latitude2 * pi/180 ) + cos(latitude1 *pi/180 ) * cos( latitude2 * pi/180 ) * cos( abs( (longitude2 * pi/180) ­ (longitude1 *pi/180) ) );
x = atan( ( sqrt( 1- pow( x, 2 ) ) ) / x );
x = ( 1.852 * 60.0 * ((x/pi)*180) ) / 1.609344;
sqlite3_result_double(context, x);
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注