地球两点距离

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);
}

Google 地图偏移修正

参考:
http://wap.anttna.com/index-wap2.php?p=468
http://blog.sina.com.cn/s/blog_65bd7eef0100hu5o.html

google 地图修正接口
http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067

测试

纬度(latitude), 经度(longitude)

GIS 资料整理

地理信息系统算法基础
http://d.download.csdn.net/down/1203720/jiashouhgp

坐标方位角计算公式(通用)
用极坐标法放样必须计算出测站点(仪器点)到放样点得距离和方位角,才能进行放样。
原计算公式为:
S12=sqr( (x2-x1)2+(y2-y1)2)= sqr(x221+y221)
A12=arcsin((y2-y1)/S12)
S12为测站点1至放样点2的距离;
A12为测站点1至放样点2的坐标方位角。
x1y1为测站点坐标;
x2y2为放样点坐标。
按公式A12=arcsin((y2-y1)/S12)计算出的方位角都要进行象限判断后加常数才是真正的方位角。

新计算公式为:
A12=arccos(x21/S12)*sgn(y21)+360°
式中sgn()为取符号函数,改公式只需加上条件(A12>360°, A12= A12-360°)就可以计算出坐标方位角,不需要进行象限判断。