add GEO function get_line_distance_km
parent
c623a6c935
commit
ba6cc38703
3
HISTORY
3
HISTORY
|
|
@ -1,4 +1,7 @@
|
|||
|
||||
Version 1.20 2015-08-06
|
||||
* add GEO function get_line_distance_km
|
||||
|
||||
Version 1.19 2015-07-24
|
||||
* correct logger rotate time near 0 clock
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
%define LibFastcommonDevel libfastcommon-devel
|
||||
|
||||
Name: libfastcommon
|
||||
Version: 1.0.19
|
||||
Version: 1.0.20
|
||||
Release: 1%{?dist}
|
||||
Summary: c common functions library extracted from my open source projects FastDFS
|
||||
License: GPL
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#include "logger.h"
|
||||
#include "hash.h"
|
||||
#include "sockopt.h"
|
||||
#include "shared_func.h"
|
||||
#include "fastcommon.h"
|
||||
|
||||
#define MAJOR_VERSION 1
|
||||
|
|
@ -40,6 +41,7 @@ const zend_fcall_info empty_fcall_info = { 0, NULL, NULL, NULL, NULL, 0, NULL, N
|
|||
ZEND_FE(fastcommon_gethostaddrs, NULL)
|
||||
ZEND_FE(fastcommon_time33_hash, NULL)
|
||||
ZEND_FE(fastcommon_simple_hash, NULL)
|
||||
ZEND_FE(fastcommon_get_line_distance_km, NULL)
|
||||
{NULL, NULL, NULL} /* Must be the last line */
|
||||
};
|
||||
|
||||
|
|
@ -240,3 +242,35 @@ ZEND_FUNCTION(fastcommon_simple_hash)
|
|||
RETURN_LONG(simple_hash(str, str_len) & 0x7FFFFFFF);
|
||||
}
|
||||
|
||||
/*
|
||||
double fastcommon_get_line_distance_km(double lat1, double lon1,
|
||||
double lat2, double lon2)
|
||||
return line distance in KM
|
||||
*/
|
||||
ZEND_FUNCTION(fastcommon_get_line_distance_km)
|
||||
{
|
||||
int argc;
|
||||
double lat1;
|
||||
double lon1;
|
||||
double lat2;
|
||||
double lon2;
|
||||
|
||||
argc = ZEND_NUM_ARGS();
|
||||
if (argc != 4) {
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"fastcommon_get_line_distance_km parameters count: %d is invalid",
|
||||
__LINE__, argc);
|
||||
RETURN_BOOL(false);
|
||||
}
|
||||
|
||||
if (zend_parse_parameters(argc TSRMLS_CC, "dddd", &lat1, &lon1,
|
||||
&lat2, &lon2) == FAILURE)
|
||||
{
|
||||
logError("file: "__FILE__", line: %d, "
|
||||
"zend_parse_parameters fail!", __LINE__);
|
||||
RETURN_BOOL(false);
|
||||
}
|
||||
|
||||
RETURN_DOUBLE(get_line_distance_km(lat1, lon1, lat2, lon2));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ ZEND_FUNCTION(fastcommon_version);
|
|||
ZEND_FUNCTION(fastcommon_gethostaddrs);
|
||||
ZEND_FUNCTION(fastcommon_time33_hash);
|
||||
ZEND_FUNCTION(fastcommon_simple_hash);
|
||||
ZEND_FUNCTION(fastcommon_get_line_distance_km);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <dirent.h>
|
||||
#include <grp.h>
|
||||
#include <pwd.h>
|
||||
#include <math.h>
|
||||
#include "shared_func.h"
|
||||
#include "logger.h"
|
||||
#include "sockopt.h"
|
||||
|
|
@ -2092,3 +2093,21 @@ int ignore_signal_pipe()
|
|||
return 0;
|
||||
}
|
||||
|
||||
double get_line_distance_km(const double lat1, const double lon1,
|
||||
const double lat2, const double lon2)
|
||||
{
|
||||
#define FAST_ABS(v) ((v) >= 0 ? (v) : -1 * (v))
|
||||
#define DISTANCE_PER_LATITUDE 111.111
|
||||
|
||||
double lat_value;
|
||||
double lng_distance;
|
||||
double lat_distance;
|
||||
|
||||
lat_value = FAST_ABS(lat1) < FAST_ABS(lat2) ? lat1 : lat2;
|
||||
lat_distance = FAST_ABS(lat1 - lat2) * DISTANCE_PER_LATITUDE;
|
||||
lng_distance = FAST_ABS(lon1 - lon2) * DISTANCE_PER_LATITUDE *
|
||||
cos(lat_value * 3.1415926 / 180.0);
|
||||
|
||||
return sqrt(lat_distance * lat_distance + lng_distance * lng_distance);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -512,6 +512,9 @@ int set_file_utimes(const char *filename, const time_t new_time);
|
|||
*/
|
||||
int ignore_signal_pipe();
|
||||
|
||||
double get_line_distance_km(const double lat1, const double lon1,
|
||||
const double lat2, const double lon2);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue