精华内容
下载资源
问答
  • 计算两经纬度之间的距离、方位角            测试了三组数据,并与在线工具测试后对比效果:       具体理论这里不做介绍,大家可以看如下代码再去理解公式: #include <iostream> // 地球...

    顺看

    编码不易,觉得文章好,请给作者点赞关注、一键三连。谢谢!

         

    * 计算两经纬度之间的距离、方位角
    * 已知A经纬度、根据距离、方位,计算目标经纬度

         
         测试了三组数据,并与在线工具测试后对比效果:
    在这里插入图片描述
         方位角,距离,海拔在线计算器 (侵删)

         
         
    具体理论这里不做介绍,大家可以看如下代码再去理解公式:

    #include <iostream>
    
    // PI
    #define M_PI		3.14159265358979323846
    
    // 地球半径
    const double EARTH_RADIUS = 6371000;
    
    // 大地坐标系资料WGS-84,长半径 6378137
    const double WGS84_L_RADIUS = 6378137;
    
    // 大地坐标系资料WGS-84,短半径 6356752.3142 */
    const double WGS84_S_RADIUS = 6356752.3142;
    
    // 扁率
    const double M_F = 1 / 298.2572236;
    
    // 角度转弧度
    double A2R(double d) { return d * M_PI / 180.0; }
    
    // 弧度转角度
    double R2A(double d) { return d / M_PI * 180.0; }
    
    // 1、计算两个经纬度之间的距离(m)
    double GetDistanceCpp(double lat1, double lng1, double lat2, double lng2)
    {
        double radLat1 = A2R(lat1);
        double radLat2 = A2R(lat2);
        double a = radLat1 - radLat2;
        double b = A2R(lng1) - A2R(lng2);
        double s = 2 * asin(sqrt(pow(sin(a/2),2) +cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));
        s = s * EARTH_RADIUS;
        return s;
    }
    
    // 2、计算两个经纬度之间的方位角(偏北角)(°)
    double GetYaw(double lat1, double lon1, double lat2, double lon2)
    {
    	double result = 0.0;
    
        int ilat1 = (int) (0.50 + lat1 * 360000.0);
        int ilat2 = (int) (0.50 + lat2 * 360000.0);
        int ilon1 = (int) (0.50 + lon1 * 360000.0);
        int ilon2 = (int) (0.50 + lon2 * 360000.0);
    
        lat1 = A2R(lat1);
        lon1 = A2R(lon1);
        lat2 = A2R(lat2);
        lon2 = A2R(lon2);
    
        if ((ilat1 == ilat2) && (ilon1 == ilon2)){return result;}
        else if (ilon1 == ilon2){if (ilat1 > ilat2){result = 180.0;}}
        else
        {
            double c = acos(sin(lat2) * sin(lat1) + cos(lat2)* cos(lat1) * cos((lon2 - lon1)));
            double A = asin(cos(lat2) * sin((lon2 - lon1)) / sin(c));
    
            result = R2A(A);
    
            if ((ilat2 > ilat1) && (ilon2 > ilon1)){}
            else if ((ilat2 < ilat1) && (ilon2 < ilon1)){result = 180.0 - result;}
            else if ((ilat2 < ilat1) && (ilon2 > ilon1)){result = 180.0 - result;}
            else if ((ilat2 > ilat1) && (ilon2 < ilon1)){result += 360.0;}
        }
    
        if(result<0){result +=360.0;}
        if(result>360){result -=360.0;}
    
        return result;
    }
    
    // 3、已知经纬度A,并知道A到B经纬度的距离、方位角(偏北角)。计算B经纬度)
    void computerThatLonLat(double lon, double lat, double Yaw, double dist,double &dLon,double &dLat)
    {
    	double alpha1		= A2R(Yaw);
    	double sinAlpha1	= sin(alpha1);
    	double cosAlpha1	= cos(alpha1);
    
    	double tanU1		= (1.0 - M_F) * tan(A2R(lat));
    	double cosU1		= 1.0 / sqrt((1.0 + tanU1 * tanU1));
    	double sinU1		= tanU1 * cosU1;
    	double sigma1		= atan2(tanU1, cosAlpha1);
    	double sinAlpha		= cosU1 * sinAlpha1;
    	double cosSqAlpha	= 1.0 - sinAlpha * sinAlpha;
    	double uSq			= cosSqAlpha * (WGS84_L_RADIUS * WGS84_L_RADIUS - WGS84_S_RADIUS * WGS84_S_RADIUS) / (WGS84_S_RADIUS * WGS84_S_RADIUS);
    	double A			= 1.0 + uSq / 16384.0 * (4096.0 + uSq * (-768.0 + uSq * (320 - 175.0 * uSq)));
    	double B			= uSq / 1024.0 * (256.0 + uSq * (-128 + uSq * (74.0 - 47.0 * uSq)));
    
    	double cos2SigmaM	= 0;
    	double sinSigma		= 0;
    	double cosSigma		= 0;
    	double sigma		= dist / (WGS84_S_RADIUS * A), sigmaP = 2.0 * M_PI;
    	while (abs(sigma - sigmaP) > 1e-12)
    	{
    		cos2SigmaM		= cos(2.0 * sigma1 + sigma);
    		sinSigma		= sin(sigma);
    		cosSigma		= cos(sigma);
    		double deltaSigma = B * sinSigma * (cos2SigmaM + B / 4.0 * (cosSigma * (-1 + 2.0 * cos2SigmaM * cos2SigmaM) - B / 6.0 * cos2SigmaM * (-3 + 4.0 * sinSigma * sinSigma) * (-3 + 4.0 * cos2SigmaM * cos2SigmaM)));
    		sigmaP			= sigma;
    		sigma			= dist / (WGS84_S_RADIUS * A) + deltaSigma;
    	}
    
    	double tmp			= sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1;
    	double lat2			= atan2(sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1,(1 - M_F) * sqrt(sinAlpha * sinAlpha + tmp * tmp));
    	double lambda		= atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1);
    	double C			= M_F / 16.0 * cosSqAlpha * (4 + M_F * (4 - 3.0 * cosSqAlpha));
    	double L			= lambda - (1 - C) * M_F * sinAlpha* (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2.0 * cos2SigmaM * cos2SigmaM)));
    
    	double revAz		= atan2(sinAlpha, -tmp);
    
    	// 输出经纬度
    	dLat = R2A(lat2);
    	dLon = lon + R2A(L);
    }
    
    int main(int argc, char *argv[])
    {
    	//double ln_1 = 119.2928,la_1 = 26.07907;
    	//double ln_2 = 114.0538,la_2 = 22.54151;
                                           
    	//double ln_1 = 123.449,la_1 = 41.72306; 
    	//double ln_2 = 123.4494,la_2 = 41.72217;
                                           
    	double ln_1 = 118.4723,la_1 = 32.65736;
    	double ln_2 = 118.4715,la_2 = 32.65258;
    	
        // 计算距离
        std::cout << GetDistanceCpp(la_1,ln_1,la_2,ln_2) / 1000.0 << "km\n";
    
        // 计算方位角
        std::cout << GetYaw(la_1,ln_1,la_2,ln_2);
    
    	// 已知经纬度A,未知经纬度B。同样已知A到B的距离(m)、A到B的方位角(偏北角),计算经纬度B?
        double dLon = 0.0,dLat = 0.0;
        computerThatLonLat(ln_1,la_1,120,1000,dLon,dLat);
        std::cout << "target lon:" << dLon << " target lat:" << dLat << std::endl;
        
    	return 0;
    }
    

    顺看

    编码不易,觉得文章好,请给作者点赞关注、一键三连。谢谢!

    关注

    笔者 - jxd

    微信公众号搜索 “码农总动员” 了解更多你不知道的XX,O(∩_∩)O

    在这里插入图片描述

    展开全文
  • 1、计算两个经纬度之间的距离 CLLocation *orig=[[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self doubleValue] longitude:[mainDelegate.longitude_self doubleValue]] autorelease]; ...

    1、计算两个经纬度之间的距离

     <span style="white-space:pre">	</span>CLLocation *orig=[[[CLLocation alloc] initWithLatitude:[mainDelegate.latitude_self doubleValue]  longitude:[mainDelegate.longitude_self doubleValue]] autorelease];  
        <span style="white-space:pre">	</span>CLLocation* dist=[[[CLLocation alloc] initWithLatitude:[tmpNewsModel.latitude doubleValue] longitude:[tmpNewsModel.longitude doubleValue] ] autorelease];  
          
        <span style="white-space:pre">	</span>CLLocationDistance kilometers=[orig distanceFromLocation:dist]/1000;  
        <span style="white-space:pre">	</span>NSLog(@"距离:",kilometers);

    2、根据经纬度获取具体位置(多种方法)(待续)

    展开全文
  • public class Distance { private static final double EARTH_RADIUS = 6378137.0; public static void main(String[] args) { double lo1 = 108.90, la1 = 34.1;// 第一个经纬度 ...// 第二个经纬度.
    /**
     * 测量方法来自百度地图
     */
    public class MapDistance {
    	private double DEF_PI = 3.14159265359; // PI
    	private double DEF_2PI = 6.28318530712; // 2*PI
    	private double DEF_PI180 = 0.01745329252; // PI/180.0
    	private double DEF_R = 6370693.5; // radius of earth
    	private MapDistance(){}
    	private static MapDistance instance;
    	
    	public static synchronized MapDistance getInstance(){
    		if(instance == null){
    			instance = new MapDistance();
    		}
    		return instance;
    	}
    	/**
    	 * 返回为m,适合短距离测量
    	 * 
    	 * @param lon1
    	 * @param lat1
    	 * @param lon2
    	 * @param lat2
    	 * @return
    	 */
    	public String getShortDistance(double lon1, double lat1, double lon2, double lat2) {
    		double ew1, ns1, ew2, ns2;
    		double dx, dy, dew;
    		double distance;
    		// 角度转换为弧度
    		ew1 = lon1 * DEF_PI180;
    		ns1 = lat1 * DEF_PI180;
    		ew2 = lon2 * DEF_PI180;
    		ns2 = lat2 * DEF_PI180;
    		// 经度差
    		dew = ew1 - ew2;
    		// 若跨东经和西经180 度,进行调整
    		if (dew > DEF_PI)
    			dew = DEF_2PI - dew;
    		else if (dew < -DEF_PI)
    			dew = DEF_2PI + dew;
    		dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)
    		dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)
    		// 勾股定理求斜边长
    		distance = Math.sqrt(dx * dx + dy * dy);
    		return trans(distance);
    	}
     
    	/**
    	 * 返回为m,适合长距离测量
    	 * 
    	 * @param lon1
    	 * @param lat1
    	 * @param lon2
    	 * @param lat2
    	 * @return
    	 */
    	public String getLongDistance(double lon1, double lat1, double lon2, double lat2) {
    		double ew1, ns1, ew2, ns2;
    		double distance;
    		// 角度转换为弧度
    		ew1 = lon1 * DEF_PI180;
    		ns1 = lat1 * DEF_PI180;
    		ew2 = lon2 * DEF_PI180;
    		ns2 = lat2 * DEF_PI180;
    		// 求大圆劣弧与球心所夹的角(弧度)
    		distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1) * Math.cos(ns2)
    				* Math.cos(ew1 - ew2);
    		// 调整到[-1..1]范围内,避免溢出
    		if (distance > 1.0)
    			distance = 1.0;
    		else if (distance < -1.0)
    			distance = -1.0;
    		// 求大圆劣弧长度
    		distance = DEF_R * Math.acos(distance);
    		return trans(distance);
    	}
     
    	private String trans(double distance) {
    		boolean isBig = false; // 是否为大于等于1000m
    		if (distance >= 1000) {
    			distance /= 1000;
    			isBig = true;
    		}
    		return (new DecimalFormat(".00").format(distance)) + (isBig ? "千米" : "米");
    	}
     
    }
    

     

    展开全文
  • 通过两个经纬度计算两个经纬度之间的距离,误差在2-5米,通过高德地图测试通过
  • C#计算两个经纬度距离

    千次阅读 2019-06-14 10:37:35
    一、C#计算两个经纬度距离 //地球半径,单位米 private const double EARTH_RADIUS = 6378137; /// <summary> /// 计算两点位置的距离,返回两点的距离,单位 米 /// 该公式为GOOGLE提供,误差小于0.2...

    一、C#计算两个经纬度的距离

    //地球半径,单位米
           private const double EARTH_RADIUS = 6378137;
           /// <summary>
           /// 计算两点位置的距离,返回两点的距离,单位 米
           /// 该公式为GOOGLE提供,误差小于0.2米
           /// </summary>
           /// <param name="lat1">第一点纬度</param>
           /// <param name="lng1">第一点经度</param>
           /// <param name="lat2">第二点纬度</param>
           /// <param name="lng2">第二点经度</param>
           /// <returns></returns>
           public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
           {
               double radLat1 = Rad(lat1);
               double radLng1 = Rad(lng1);
               double radLat2 = Rad(lat2);
               double radLng2 = Rad(lng2);
               double a = radLat1 - radLat2;
               double b = radLng1 - radLng2;
               double result = 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))) * EARTH_RADIUS;
               return result;
           }
     
           /// <summary>
           /// 经纬度转化成弧度
           /// </summary>
           /// <param name="d"></param>
           /// <returns></returns>
           private static double Rad(double d)
           {
               return (double)d * Math.PI / 180d;
           }

     

    更多:

    SqlServer数据查找距离指定坐标附近的数据(一)

    展开全文
  • function getDistance(lat1, lng1, lat2, lng2) { var dis = 0; var radLat1 = toRadians(lat1); var radLat2 = toRadians(lat2); var deltaLat = radLat1 - radLat2; var deltaLng = toRadians(lng1) - to...
  • 不管是“离我最近”还是“智能排序”,都涉及到计算用户位置与各个团购单子或者商家的距离(注:在智能排序中距离作为一重要的参数参与排序打分)。以筛选商家为例,北京地区有5~6wPOI(本文将商家称之为POI),...
  • 业界比较通用的地理位置距离排序算法是 GeoHash 算法,Redis 也使用 GeoHash 算法。比如,我们的外卖员送快递的时候需要定位要配送的地点的距离。比如我们找工作的时候,需要查一下面试的公司的位置,以及距离有多远...
  • 根据两个地点的经纬度计算两点间距离 科普 地球是一个近乎标准的椭球体,它的赤道半径为6378.140千米,极半径为 6356.755千米,平均半径6371.004千米。如果我们假设地球是一个完美的球体,那么它的半径就是地球的...
  • 新人报道,因为测试的时候拿到数据库的经纬度计算不方便,就自己写了计算的软件,方便测试人员使用
  • 开发中经常会遇到计算两个点(经纬度)之间的距离或者计算最近门店的场景,下面简单实现一下如何计算两个经纬度之间相隔的距离。 解决方案 加入第三方开发包 <dependency>  <groupId>org.gavaghan&...
  • 计算两个经纬度距离和角度 matlab

    千次阅读 2020-06-12 19:16:29
    %x=[E1,N1];y[E2,N2])经度 ,纬度 function [distance,deg] = Spherediff(x,y,R) if nargin < 3 R = 6378137; %地球半径 end x = deg2rad(x); %度转弧度 y = deg2rad(y);...DeltaS = acos(cos(x(2))*cos(y(2))*cos...
  • * 计算两个经纬度坐标之间的距离 * @param lng1: 第1个坐标的经度 * @param lat1: 第1个坐标的纬度 * @param lng2: 第2个坐标的经度 * @param lat2: 第2个坐标的纬度 * @return */ public static ...
  • 通过经纬度坐标,得到点的距离和角度。进行高斯转化。
  • 百度地图经纬度坐标拾取: http://api.map.baidu.com/lbsapi/getpoint/index.html var EARTH_RADIUS = 6378137.0; //单位M var PI = Math.PI; function getRad(d) { return d * PI / 180.0; } /** * ...
  • 今天小编就为大家分享一篇python实现两个经纬度点之间的距离和方位角的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 点之间计算距离的小工具,对求点之间的距离很有帮助,希望对您有用
  • 代码如下:select *,(2 * 6378.137* ASIN(SQRT(POW(SIN(PI()*(111....20差不多就是这样的,做记录但是我觉得这样还是很慢,因为我的坐标都是通过百度获取的,我的想法是能够转成平面坐标更好,这样更好计算
  • publicclassDistance { privatestaticfinaldoubleEARTH_RADIUS=6378137; privatestaticdoublerad(doubled) ... *根据点间经纬度坐标(double值),计算两点间距离,单位为米 *@paramlng1 *@paramlat1...
  • python计算两个经纬度之间的距离

    千次阅读 2019-02-22 15:35:14
    # 计算经纬度之间的距离,单位为千米 EARTH_REDIUS = 6378.137 def rad(d): return d * pi / 180.0 def getDistance(lat1, lng1, lat2, lng2): radLat1 = rad(lat1) radLat2 = rad(lat2)...
  • packagea; publicclassDistance{ privatestaticfinaldoubleEARTH_RADIUS=6378137.0; publicstaticvoidmain(String[]args){ doublelo1=108.90,la1=34.1;//第一个经纬度 d...
  • Java计算两个经纬度点之间距离(以米为单位)算法, 纯Java代码, 可供参考。 在具体项目中使用过。
  • * @desc 根据点间的经纬度计算距离 * @param float $lat 纬度值 * @param float $lng 经度值 */ function getDistance($lat1, $lng1, $lat2, $lng2) { $earthRadius = 6367000; //approximate radius of earth in ...
  • --计算弧度角Create function [dbo].[FnRad](@d float) returns floatas begindeclare @rad floatset @rad=@d*PI()...--通过两个经纬度计算距离,返回以千米为单位Create function [dbo].[FnNear](@lat1 float,-...
  • 已知A,B点的经度、纬度、高度,计算A相对于B的北向方位及距离,或者计算B相对于A的北向方位及距离。如果有高度,利用距离和高度再算出俯仰角
  • 个经纬度距离的工具 ; Lat1 Lng1 表示A点纬度和经度,Lat2 Lng2 表示B点纬度和经度(不要弄错顺序); a = Lat1 – Lat2 为点纬度之差   b = Lng1 -Lng2 为点经度之差; 6378.137为地球...
  • 已知两点经纬度,自动计算距离。在表格分别输入两点的经度、纬度,即可计算出这两个点之间的距离长度。已知两点经纬度,自动计算距离。在表格分别输入两点的经度、纬度,即可计算出这两个点之间的距离长度。
  • 根据经纬度坐标计算实际距离C/C++实现。输入: lat1,lng1:第一点纬度、经度 lat2,lng2:第二点纬度、经度 输出: 返回距离
  • 计算两个经纬度距离的方法这里提供两种。 1 基于 googleMap 中的算法得到两经纬度之间的距离计算精度与谷歌地图的距离精度差不多。 2 计算中心经纬度与目标经纬度的距离(米) 二代码 public class ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,975
精华内容 4,390
关键字:

两个经纬度计算距离