数据库中查询,两个经纬度之间的距离代码
radians( double degrees)
{
return degrees * M_PI / 180.0 ;
}
- ( void )testDistance
{
FMDatabase *db = [FMDatabase databaseWithPath:_writableDBPath];
if (! [db open]) {
return ;
}
[db makeFunctionNamed: @" distance " maximumArguments: 4 withBlock:^(sqlite3_context *context, int argc, sqlite3_value ** argv) {
double values[ 4 ];
// get the double values for the four arguments
for ( int i = 0 ; i < 4 ; i++ ) {
int dataType = sqlite3_value_numeric_type(argv[i]);
if (dataType == SQLITE_INTEGER || dataType == SQLITE_FLOAT) {
values[i] = sqlite3_value_double(argv[i]);
} else {
sqlite3_result_null(context);
return ;
}
}
// let‘s give those values meaningful variable names
double lat = radians(values[ 0 ]);
double lng = radians(values[ 1 ]);
double lat2 = radians(values[ 2 ]);
double lng2 = radians(values[ 3 ]);
// calculate the distance
double result = 6371.393 * acos(cos(lat2) * cos(lat) * cos(lng2 - lng) + sin(lat2) * sin(lat));
sqlite3_result_double(context, result);
}];
int rowCount = 0 ;
FMResultSet *rs = [db executeQuery: @" SELECT *,distance(lat,lng,34.27344,108.95996) AS distance FROM hotel WHERE cityId = 10 AND lat > 33.27344 AND lat < 35.27344 AND lng > 107.95996 AND lng < 109.95996 ORDER BY distance ASC LIMIT 10 " ];
while ([rs next]) {
rowCount ++ ;
NSLog( @" Does %@,%@ " , [rs stringForColumnIndex: 1 ],[rs stringForColumn: @" distance " ]);
}
}
数据库中查询,两个经纬度之间的距离代码
标签:style blog io ar color os sp for on
查看更多关于数据库中查询,两个经纬度之间的距离代码的详细内容...
阅读:22次