C++-计算某经纬度1公里内的对象,怎么算呢?

小组聊天灌水 小组聊天灌水 主题:993 回复:2175

C++-计算某经纬度1公里内的对象,怎么算呢?

虐人心 发布于 2017-09-16 字数 1076 浏览 1067 回复 4

还是通信行业的内容。我的数据库里有N多个基站(你们就当地点就行了)的数据。有相对应的经纬度,每个基站还有其它信息,我就是想根据某基站的经纬度,算出它1公里范围内(圆或方都可以)所有的基站,应该怎么做呢?。比如数据格式如下:
经度:73.821474 纬度:-31.820520
经度:73.825800 纬度:-31.820020
经度:73.828844 纬度:-31.820002
经度:73.822522 纬度:-31.820201
经度:73.823124 纬度:-31.826201
经度:73.826741 纬度:-31.820038
那我如何根据这个经纬度去计算在他周围1公里内的经纬度呢?
感觉我这个有点像网游里的A Star算法的内容,那位有相在经验呢?因为我数学差,虽然做过编程,但早改行了,现在只当爱好,很多东西不怎么用都越来越差了。大家能否给我出个具体的方法呢?先谢谢了。

大家的方法确实是有用的。对于Zhaoling的筛选,我感觉实际使用时,会很难处理,因为这样的话就还要考虑到一个方向性的问题。而对于社区维基的公式,我还未试过,如果可行的,但不是要每一个比较后才能确定吗?但我数据多时,会不会很慢呢?那么,如果结合了sFisherE的KD树算法的话,可能会有所改善,但我技术差,可能得研究一阵子,先按两位的思路试下~。
先不结帖,再次谢谢三位的热心。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(4

甜柠檬 2017-10-20 4 楼

设中心基站坐标为pos = (pos_x, pos_y);
将所有基站按经度排序,得到S1;
把经度在[pos_x - 0.5公里, pos_x + 0.5公里]区间内的S1筛选出来,得到S2;

把S2按纬度排序,得到S3;
把纬度在[pos_y - 0.5公里, pos_y + 0.5公里]区间内的S2筛选出来,得到S3;

S3为所求

瑾兮 2017-10-16 3 楼

从具体的某站到其他基站的距离,可以简单的遍历一次 得到其他站点和目标站点的距离.再做判断就可以了,已知2点坐标,获得他们的距离的方法:

2点分别为P1(Lat1, Lng1) , P2(Lat2, Lng2)

公式的单位都是弧度。

/** 【简注】 根据已知两点经纬度求距离. 经纬度输入以度为单位

  •                 使用此函数,需要包含头文件
  • include <math.h>

  • 【参数】 double lat1 第一个点的纬度
  • 【参数】 double lng1 第一个点的经度
  • 【参数】 double lat2 第二个点的纬度
  • 【参数】 double lng2 第二个点的经度
  • 【返回】 double dm 两点间的距离,单位为千米。
    /
    double CJwd2Doc::GetDistance(double lat1, double lng1, double lat2, double lng2)
    {
    double radlat1 = lat1
    3.1415926/180.0;
    double radlat2 = lat23.1415926/180.0;
    double radlng1 = lng1
    3.1415926/180.0;
    double radlng2 = lng2*3.1415926/180.0;

double ff = (radlat1+radlat2)/2.0;
double gg = (radlat1-radlat2)/2.0;
double ll = (radlng1-radlng2)/2.0;
double ss = pow((sin(gg)),2)pow((cos(ll)),2)+pow((cos(ff)),2)pow((sin(ll)),2);
double cc = pow((cos(gg)),2)pow((cos(ll)),2)+pow((sin(ff)),2)pow((sin(ll)),2);
double ww = atan(sqrt(ss/cc));
double banjin = 6378.135; //地球半径km
double dist = 2wwbanjin;
double rr = sqrt(sscc)/ww;
double h1 = (3
rr-1)/(2cc);
double h2 = (3
rr+1)/(2ss);
double xx = 1/298.257223543; //修正率
double dm;
if(ww!=0)
dm = dist
(1+xxh1pow((sin(ff)),2)pow((cos(gg)),2)-xxh2pow((cos(ff)),2)pow((sin(gg)),2));
else
dm = 0;
return dm;
}

//来自 http://cdj850909.blog.163.com/blog/static/10245702201231113239865/

泛泛之交 2017-10-14 2 楼

以前做过一个房地产的项目,计算周边楼盘的,PHP写的

define('EARTH_RADIUS',6371.3);
define('PI',M_PI);

function rad($d)
{
    return $d*PI/180.0;
}
/*求两个坐标之间的距离——公里*/
function getDistance($lat1, $lng1, $lat2, $lng2)
{
    $radLat1 = rad($lat1);
    $radLat2 = rad($lat2);
    $a = $radLat1 - $radLat2;
    $b = rad($lng1) - rad($lng2);
    $s = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)));
    $s = $s * EARTH_RADIUS;
    $s = round($s * 10000) / 10000;
    return $s;
}
夜无邪 2017-09-28 1 楼

kd树应该是最快的。kd树主要应用于高维数据范围查询,最近邻和k临近查询,可以查询和指定数据距离D范围内的数据集合。