【Google Map】怎么根据经维度计算两点之间的距离,怎么根据经纬度与距离计算目标地点的经纬度

根据两站点的经纬度求两站点间的距离 
/**** 根据两站点的经纬度求两站点间的距离 ****/
double D_jw(double wd1,double jd1,double wd2,double jd2)
{
    double x,y,out;
    double PI=3.14159265;
    double R=6.371229*1e6;

x=(jd2-jd1)*PI*R*cos( ((wd1+wd2)/2) *PI/180)/180;
    y=(wd2-wd1)*PI*R/180;
    out=hypot(x,y);
    return out/1000;
}

==

一个经纬度相关计算的C++类 
写了一个经纬度距离计算的类

--------------CJWD.h--------------

#ifndef __JWD_AND_HELPER_20051005
#define __JWD_AND_HELPER_20051005

#include "stdafx.h"
#include <math.h>
#include <iostream>
using namespace std;

#ifndef PI

#define PI 3.14159265;

#endif
static double Rc = 6378137;  // 赤道半径

static double Rj = 6356725;  // 极半径

namespace CDYW{

class JWD
{
public:
double m_LoDeg, m_LoMin, m_LoSec;  // longtitude 经度
double m_LaDeg, m_LaMin, m_LaSec;
double m_Longitude, m_Latitude;
double m_RadLo, m_RadLa;
double Ec;
double Ed;
public:
// 构造函数, 经度: loDeg 度, loMin 分, loSec 秒;  纬度: laDeg 度, laMin 分, laSec秒
    JWD(double loDeg, double loMin, double loSec, double laDeg, double laMin, double laSec)
{
  m_LoDeg=loDeg; m_LoMin=loMin; m_LoSec=loSec; m_LaDeg=laDeg; m_LaMin=laMin; m_LaSec=laSec;
  m_Longitude = m_LoDeg + m_LoMin / 60 + m_LoSec / 3600;
  m_Latitude = m_LaDeg + m_LaMin / 60 + m_LaSec / 3600;
  m_RadLo  = m_Longitude * PI / 180.;
  m_RadLa  = m_Latitude * PI / 180.;
  Ec = Rj + (Rc - Rj) * (90.- m_Latitude) / 90.;
  Ed = Ec * cos(m_RadLa);
}

//!
JWD(double longitude, double latitude)
{
  m_LoDeg = int(longitude);
  m_LoMin = int((longitude - m_LoDeg)*60);
  m_LoSec = (longitude - m_LoDeg - m_LoMin/60.)*3600;
  
  m_LaDeg = int(latitude);
  m_LaMin = int((latitude - m_LaDeg)*60);
  m_LaSec = (latitude - m_LaDeg - m_LaMin/60.)*3600;
  
  m_Longitude = longitude;
  m_Latitude = latitude;
  m_RadLo = longitude * PI/180.;
  m_RadLa = latitude * PI/180.;
  Ec = Rj + (Rc - Rj) * (90.-m_Latitude) / 90.;
  Ed = Ec * cos(m_RadLa);
}
};

class CJWDHelper
{
public:
CJWDHelper() {};
~CJWDHelper() {};

//! 计算点A 和 点B的经纬度,求他们的距离和点B相对于点A的方位
/*! 
  * /param A A点经纬度
  * /param B B点经纬度
  * /param angle B相对于A的方位, 不需要返回该值,则将其设为空
  * /return A点B点的距离
  */
static double distance(JWD A, JWD B, double *angle)
{
  double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;
  double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;
  double out = sqrt(dx * dx + dy * dy);
  
  if( angle != NULL)
  {
   *angle = atan(fabs(dx/dy))*180./PI;
   // 判断象限
   double dLo = B.m_Longitude - A.m_Longitude;
   double dLa = B.m_Latitude - A.m_Latitude;
   
   if(dLo > 0 && dLa <= 0) {
     *angle = (90. - *angle) + 90.;
    }
   else if(dLo <= 0 && dLa < 0) {
     *angle = *angle + 180.;
    }
   else if(dLo < 0 && dLa >= 0) {
     *angle = (90. - *angle) + 270;
    }
}

return out/1000;
}

//! 计算点A 和 点B的经纬度,求他们的距离和点B相对于点A的方位
/*! 
  * /param longitude1 A点经度
  * /param latitude1 A点纬度
  * /param longitude2 B点经度
  * /param latitude2 B点纬度
  * /param angle B相对于A的方位, 不需要返回该值,则将其设为空
  * /return A点B点的距离
  */
static double distance(
  double longitude1, double latitude1,
  double longitude2, double latitude2, 
  double *angle)
{
  JWD A(longitude1,latitude1);
  JWD B(longitude2,latitude2);

return distance(A, B, angle);
}

//! 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度
/*!
  * /param A 已知点A
  * /param distance B点到A点的距离 
  * /param angle B点相对于A点的方位
  * /return B点的经纬度坐标
  */
static JWD GetJWDB(JWD A, double distance, double angle)

  double dx = distance*1000 * sin(angle * PI /180.);
  double dy = distance*1000 * cos(angle * PI /180.);
  
  //double dx = (B.m_RadLo - A.m_RadLo) * A.Ed;
  //double dy = (B.m_RadLa - A.m_RadLa) * A.Ec;

double BJD = (dx/A.Ed + A.m_RadLo) * 180./PI;
  double BWD = (dy/A.Ec + A.m_RadLa) * 180./PI;
  JWD B(BJD, BWD);
  return B; 
}

//! 已知点A经纬度,根据B点据A点的距离,和方位,求B点的经纬度
/*!
  * /param longitude 已知点A经度
  * /param latitude 已知点A纬度
  * /param distance B点到A点的距离 
  * /param angle B点相对于A点的方位
  * /return B点的经纬度坐标
  */
static JWD GetJWDB(double longitude, double latitude, double distance, double angle)

  JWD A(longitude,latitude);
  return GetJWDB(A, distance, angle);
}

};
}
#endif

=========== 测试程序==========

#include "stdafx.h"
#include <math.h>
#include <iostream>#include "CJWD.h"
using namespace std;using namespace CDYW;
double Rc = 6378137;  // 赤道半径
double Rj = 6356725;  // 极半径// 绵阳
double jd1 = 104.740999999;
double wd1 = 31.4337;// 成都
double jd2 = 104.01;
double wd2 = 30.40; int main(int argc, char* argv[])
{
double angle = 0;
cout << "A(绵阳): JD = " << jd1 << "  WD = " << wd1 << endl;
cout << "B(成都): JD = " << jd2 << "  WD = " << wd2 << endl; 
cout << "--------------------" << endl;
cout << D_jw(wd1,jd1,wd2,jd2, angle) << endl;
cout << "angle: " << angle <<endl;
cout << "==============" <<endl;
JWD A(jd1,wd1),B(jd2,wd2);
double distance = CJWDHelper::distance(jd1,wd1,jd2,wd2, &angle);
//cout << CJWDHelper::distance(A,B, &angle) << endl;
cout << distance << endl;
cout << "angle: " << angle <<endl; 
cout << "==============" <<endl;
JWD C = CJWDHelper::GetJWDB(A, distance, angle);
cout << "JD = " << C.m_Longitude << "  WD = " << C.m_Latitude << endl;
cout << "==============" <<endl; 
cout << A.m_LoDeg << " " << A.m_LoMin << " " << A.m_LoSec << endl; return 0;
}

=====
通过两个点的经纬度计算距离 
关键词: gis

从google maps的脚本里扒了段代码,没准啥时会用上。大家一块看看是怎么算的。

private const double EARTH_RADIUS = 6378.137;
private static double rad(double d)
{
   return d * Math.PI / 180.0;
}

public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lng1) - rad(lng2);
   double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) + 
    Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));
   s = s * EARTH_RADIUS;
   s = Math.Round(s * 10000) / 10000;
   return s;
}

非常感谢,帮了我大忙了:) 
虽然我也没看明白到底原理是什么,但验算了A(60,30),B(60,90)两点之间,此段代码和我用余弦定理算出来的结果很一致。 
余弦定理的步骤是:1、算A、B弦长:地球半径R*cos(经度差60)=R/2; 
2、算角AOB,O为地球圆心,利用余弦定理, 
cosAOB=(2R*R-(R/2)^2) /2*R*R=7/8; 
3、弧AB的长为:R*arc cos(7/8);求毕 。

/******************************************************************/

博主注:

上述代码博主在某项目中使用过了,真实有效,呵呵

这是博主在北京随机选择了两个经纬度(从Google地图上),两个点的距离为8.3公里左右。

上述代码获得的结果,与Google Map2提供的API相比,误差在10 - 11米之间。

请注意,博主只测试了一组数据哈。

/******************************************************************/

引自:http://blog.csdn.net/fdnike/archive/2007/07/18/1696603.aspx

怎么根据经维度计算两点之间的距离,怎么根据经纬度与距离计算目标地点的经纬度相关推荐

  1. Java对接高德地图计算距离_高德地图计算两点之间的距离java+html

    高德地图现在使用比较多了,但是高德地图计算两点之间的距离有些问题.下面提供一个很好的解决方案. 代码如下: /** * 两点的经纬度获取两点距离米 * @param (121.293986,37.27 ...

  2. php 如何根据经纬度计算距离,小程序实例:如何根据经纬度计算两点之间的距离(代码)...

    本篇文章给大家带来的内容是关于小程序实例:如何根据经纬度计算两点之间的距离(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.//计算两点位置距离 getDistance: fun ...

  3. 本关任务:编写一个Point类,有x、y两个属性。编写一个PointDemo类,并提供一个distance(Point p1,Point p2)方法用于计算两点之间的距离,实例化两个具体的Point对

    #java编程基础 以后会时常更新java编程题,分享所遇之难,答疑解惑,共同努力. 本关任务:编写一个Point类,有x.y两个属性.编写一个PointDemo类,并提供一个distance(Poi ...

  4. 计算两点之间的距离(经度)

    根据两个点的经纬度值计算这两个点之间的距离,返回距离单位米. /** * 地球半径,单位 km */ private static final double EARTH_RADIUS = 6378.1 ...

  5. (C++)二维坐标系下,计算两点之间方位角

    (C++)二维坐标系下,计算两点之间方位角 思路 代码 思路 将其中点ori视为坐标原点,求点p相对其方位角 代码 double GlobalSettings::GetPointHAngle(Poin ...

  6. android 百度地图两点之间的距离计算,Android 百度地图 计算两点之间的距离

    注:Location类为自定义的实体类,里面包含latitude和longitude两个属性(Double类型) /** * 计算两点之间距离 * @param start * @param end ...

  7. 计算两点之间的距离(二维、三维)

    项目场景: 参考:两点之间距离 计算两点之间的距离 空间两点间距离 欧氏距离( Euclidean distance)也称欧几里得距离,它是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离 ...

  8. java计算两点之间的距离和三角形的面积(海伦公式)

    首先创建三个类:mian主函数,关于点的类,计算的类 首先定义出点的类,构造函数,横纵属性: private double x;private double y;public Class(double ...

  9. 微信小程序通过经纬度计算两点之间距离

    小程序中通过经纬度计算两点之间的距离km 1.拾取两地经纬度坐标 . data:{//当前定位位置latitude: null,longitude: null,// 目的地坐标latitude2: 1 ...

最新文章

  1. 学python培训到底能干嘛
  2. opencv教程大全
  3. OWASP Top 10 – 2013, 最新十大安全隐患(ASP.NET解决方法)
  4. jvm四:常量的本质含义以及助记符基本认识
  5. 从S3获取数据在html表示,AWS Lambda从DynamoDB加载内容,以S3格式显示在HTML中(示例代码)...
  6. java集合浅谈(一)
  7. MOXy作为您的JAX-RS JSON提供程序–客户端
  8. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
  9. android 控件随手指移动_Android 实习生面试经历记录
  10. JAVA8免费下载安装(win10)
  11. Shader 学习笔记:水面
  12. n1进入recovery模式_OPPO N1如何进入recovery模式
  13. 卡内基梅隆计算机专业排名,2019年卡内基梅隆大学计算机专业排名多少?
  14. 当黑客被抓是种怎样的体验?
  15. 我的C站万粉成长之路、2021 笔耕不辍
  16. java找最长连续号段,字符串—寻找最长连续子串
  17. Servlet 的运行原理
  18. QT实现滑动切换界面,ARM/Linux触屏滑动切换界面,切换Qwidget
  19. 聊一聊 MySQL 中的事务及其实现原理
  20. webp转换工具cwebp

热门文章

  1. Win11和Win10怎么禁用驱动程序强制签名? 关闭Windows系统驱动强制签名的技巧?
  2. 瞎弄电脑BIOS设置,再次开机进入BitLocker恢复,恰巧微软账户啥密钥ID都有,就是和自己这个密钥对不上,然后如何将自己密钥保存到微软账户
  3. kubernetes监控检查(探针)
  4. vue中的class和style在行内中用发有几种
  5. win10计算机文件夹选项在哪里,win10 文件夹选项_win10文件夹选项在哪里
  6. 百年包豪斯 (Bauhaus) 对当今 UX 设计的启发与影响
  7. css多个属性怎么写,.css多个属性读取写法?
  8. html5QQ浏览器页面引导模板,手机QQ浏览器 策略打造HTML5开放平台
  9. Keil uVision5 界面模糊(优化)变清晰
  10. 如何配置Python虚拟环境