精华内容
下载资源
问答
  • 求球面两点最短距离
    千次阅读
    2017-04-24 22:33:47

    Problem:
    给定球的半径,两点的经纬度,求这两点间的最短距离。
    Solution:
    球面两点间距离公式:
    r*acos(cos(wa)*cos(wb)*cos(jb-ja) + sin(wa)*sin(wb))
    r代表半径,wa是a点的纬度,wb是b点的纬度,ja是a点的经度,jb是b点的经度,去北纬为正,东经为正。
    note:
    cout输入输出有一定的技巧需要掌握。

    #include<iostream>
    #include<cmath>
    #include <iomanip>
    
    using namespace std;
    
    const double PI = 3.141592653589;
    
    //degree to its radian number
    double convert(double degree) {
        return degree*PI/180;
    }
    
    //parameters are radian number
    double calculate(double r, double wa, double ja, double wb, double jb) {
        return r*acos(cos(wa)*cos(wb)*cos(jb-ja) + sin(wa)*sin(wb));
    }
    
    int main() {
        double r, waa, wbb, jaa, jbb;
        char c;
    
        while(cin >> r) {
            if(r == 0)
                break;
            cin >> c >> waa;
            if(c == 'S')
                waa = -waa;
            cin >> c >> jaa;
            if(c == 'W')
                jaa = -jaa;
            cin >> c >> wbb;
            if(c == 'S')
                wbb = -wbb;
            cin >> c >> jbb;
            if(c == 'W')
                jbb = -jbb;
            cout << fixed << setprecision(2) << calculate(r, convert(waa), convert(jaa), convert(wbb), convert(jbb)) << endl;
        }
    
        return 0;
    }
    
    更多相关内容
  • 则 L0上的P和L1的Q的距离的平方为 J = (P-Q)*(P-Q) = (P-Q)^2 展开步骤为 => (a+u * s - b - v * t)^2 => u^2 * s^2 + v^2 * t^2 - 2*u*v *s*t + 2*(a-b)*u*s - 2*(a-b)*v*t + (a-b)^2 J...

    空间直线L0, L1的参数方程为
    L0:  P = a+u*s;
    L1: Q = b+v*t;
    其中a为L0的原点,u为单位方向向量, 参数s从-inf到+inf

    则 L0上的点P和L1的点Q的距离的平方为
    J = (P-Q)*(P-Q) = (P-Q)^2
    展开步骤为

    =>  (a+u * s - b - v * t)^2
    =>  u^2 * s^2 + v^2 * t^2  - 2*u*v *s*t + 2*(a-b)*u*s - 2*(a-b)*v*t + (a-b)^2

    J其实是个z = f(x,y)空间曲面, s, t则是x,y轴, z是距离的平方值

    根据微分几何,这个曲面z值的最低点就是L0和L1的最短距离,即极值

    这个最低点的对s,t各自的偏导数为零,即过该最低点的x,y两个方向的切线水平

    即: 

    ro_J / ro_s = 0

    ro_J / ro_t = 0

    写出这两个偏导的表达式为

    2*u^2*s - 2*u*v*t + 2*(a-b)*u = 0

    2*v^2*t - 2*u*v*s + 2*(a-b)*v = 0

    继续整理得

    u^2*s - u*v*t = (b-a)*u

    u*v*s - v^2*t = (b-a)*v

    因为u,v是单位向量,即u^2 = 1,则

    s - u*v*t = (b-a)*u

    u*v*s - t = (b-a)*v

    这里令  C = u*v, D0 = (b-a)*u, D1 = (b-a)*v

    s - C*t = D0

    C*s - t = D1  

    s = (D0-C*D1) / (1-C^2)

    t = (C*D0-D1) / (1-C^2)

    当C为接近1的数, 即u和v几乎平行,则s和t无穷大,编写代码时应该避免.

    计算出了s,t则带入J,  则最短距离即得到.
       

    展开全文
  • 已知两点经纬度计算球面距离公式,一搜一大堆,形式如下: 可是至于这个公式为什么是这样的,今天推导了一下,详细推导过程如下。首先画个图(图1),要不然空间想象能力差的话容易犯糊涂。首先对图1做个大致的...

    已知两点经纬度计算球面距离的公式,一搜一大堆,形式如下:

    可是至于这个公式为什么是这样的,今天推导了一下,详细推导过程如下。首先画个图(图1),要不然空间想象能力差的话容易犯糊涂。首先对图1做个大致的说明,红色的半圆表示赤道,蓝色的圆弧表示本初子午线(也就是经度为0的子午线)。球最上方是北极点,点A和点B分别为要计算的两个点,坐标分别为A(jA,wA)和B(jB,wB)。

    图1 示意图

     

    再开始推导之前,我们需要在图中绘制一些辅助线,便于后面的描述和推导。如图1所示,A(jA,wA),B(jB,wB)两点分别为球面上的两点,坐标为经纬度表示。延A、B两点分别做垂直于赤道平面的垂线交赤道面为C、D两点。连接C、D两点,然后过A做CD的平行线交BD与点E。至此,所有的辅助线绘制完毕。假设地球为一个规则的圆球,半径为R(其实地球是一个椭球体,赤道的半径比极地的半径稍微大一点点)。

     

    第一步:确定已知条件,

     

    展开全文
  • Haversine球面半正矢公式,用来计算球面上连点之间的最短距离, 这里有几种语言版本的实现方式,就摘了几种,还有其他例如Smalltalk, Tcl, NCL的就不贴了。//C# using System; namespace HaversineFormula { /// ...

    Haversine球面半正矢公式,用来计算球面上连点之间的最短距离,
    这里有几种语言版本的实现方式,就摘了几种,还有其他例如Smalltalk, Tcl, NCL的就不贴了。

    //C#
    using System;
    namespace HaversineFormula
    {
        /// <summary>
        /// 距离类型,英里/公里
        /// </summary>
        public enum DistanceType { Miles, Kilometers };
        /// <summary>
        /// Specifies a Latitude / Longitude point.
        /// </summary>
        public struct Position
        {
            public double Latitude;
            public double Longitude;
        }
        class Haversine
        {
            /// <summary>
            /// 返回英里或者公里的距离
            /// latitude / longitude points.
            /// </summary>
            /// <param name=”pos1″></param>
            /// <param name=”pos2″></param>
            /// <param name=”type”></param>
            /// <returns></returns>
            public double Distance(Position pos1, Position pos2, DistanceType type)
            {
                double R = (type == DistanceType.Miles)&nbsp;? 3960&nbsp;: 6371;
                double dLat = this.toRadian(pos2.Latitude - pos1.Latitude);
                double dLon = this.toRadian(pos2.Longitude - pos1.Longitude);
                double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
                    Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) *
                    Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
                double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
                double d = R * c;
                return d;
            }
            /// <summary>
            /// 转换成弧度
            /// </summary>
            /// <param name="val"></param>
            /// <returns></returns>
            private double toRadian(double val)
            {
                return (Math.PI / 180) * val;
            }
        }
    }
    //调用方法
    Position pos1 = new Position();
    pos1.Latitude = 40.7486;
    pos1.Longitude = -73.9864;
    Position pos2 = new Position();
    pos2.Latitude = 24.7486;
    pos2.Longitude = -72.9864;
    Haversine hv = new Haversine();
    double result = hv.Distance(pos1, pos2, DistanceType.Kilometers);
    
    //Excel
    Public Function getDistance(latitude1, longitude1, latitude2, longitude2)
    earth_radius = 6371
    Pi = 3.14159265
    deg2rad = Pi / 180
    
    dLat = deg2rad * (latitude2 - latitude1)
    dLon = deg2rad * (longitude2 - longitude1)
    
    a = Sin(dLat / 2) * Sin(dLat / 2) + Cos(deg2rad * latitude1) * Cos(deg2rad * latitude2) * Sin(dLon / 2) * Sin(dLon / 2)
    c = 2 * WorksheetFunction.Asin(Sqr(a))
    
    d = earth_radius * c
    
    getDistance = d
    
    End Function
    //PHP
    function getDistance($latitude1, $longitude1, $latitude2, $longitude2) {
        $earth_radius = 6371;
    
        $dLat = deg2rad($latitude2 - $latitude1);
        $dLon = deg2rad($longitude2 - $longitude1);
    
        $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2);
        $c = 2 * asin(sqrt($a));
        $d = $earth_radius * $c;
    
        return $d;
    }
    
    //Java
    import com.google.android.maps.GeoPoint;
    
    public class DistanceCalculator {
    
       private double Radius;
    
       // R = earth's radius (mean radius = 6,371km)
       // Constructor
       DistanceCalculator(double R) {
          Radius = R;
       }
    
       public double CalculationByDistance(GeoPoint StartP, GeoPoint EndP) {
          double lat1 = StartP.getLatitudeE6()/1E6;
          double lat2 = EndP.getLatitudeE6()/1E6;
          double lon1 = StartP.getLongitudeE6()/1E6;
          double lon2 = EndP.getLongitudeE6()/1E6;
          double dLat = Math.toRadians(lat2-lat1);
          double dLon = Math.toRadians(lon2-lon1);
          double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
             Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
             Math.sin(dLon/2) * Math.sin(dLon/2);
          double c = 2 * Math.asin(Math.sqrt(a));
          return Radius * c;
       }
    }
    //MSSQL
    CREATE FUNCTION [dbo].[GetDistance]
    (
          @lat1 Float(8),
          @long1 Float(8),
          @lat2 Float(8),
          @long2 Float(8)
    )
    RETURNS Float(8)
    AS
    BEGIN
          DECLARE @R Float(8);
          DECLARE @dLat Float(8);
          DECLARE @dLon Float(8);
          DECLARE @a Float(8);
          DECLARE @c Float(8);
          DECLARE @d Float(8);
    
          SET @R = 3960;
          SET @dLat = RADIANS(@lat2 - @lat1);
          SET @dLon = RADIANS(@long2 - @long1);
    
          SET @a = SIN(@dLat / 2) * SIN(@dLat / 2) + COS(RADIANS(@lat1))
                            * COS(RADIANS(@lat2)) * SIN(@dLon / 2) *SIN(@dLon / 2);
          SET @c = 2 * ASIN(MIN(SQRT(@a)));
          SET @d = @R * @c;
          RETURN @d;
    END
    GO
    
    //Python
    #coding:UTF-8
    """
      Python implementation of Haversine formula
      Copyright (C) <2009>  Bartek Górny <bartek@gorny.edu.pl>
    
      This program is free software: you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation, either version 3 of the License, or
      (at your option) any later version.
    
      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details.
    
      You should have received a copy of the GNU General Public License
      along with this program.  If not, see <http://www.gnu.org/licenses/>.
    """
    
    import math
    
    def recalculate_coordinate(val,  _as=None):
      """
        Accepts a coordinate as a tuple (degree, minutes, seconds)
        You can give only one of them (e.g. only minutes as a floating point number) and it will be duly
        recalculated into degrees, minutes and seconds.
        Return value can be specified as 'deg', 'min' or 'sec'; default return value is a proper coordinate tuple.
      """
      deg,  min,  sec = val
      # pass outstanding values from right to left
      min = (min or 0) + int(sec) / 60
      sec = sec&nbsp;% 60
      deg = (deg or 0) + int(min) / 60
      min = min&nbsp;% 60
      # pass decimal part from left to right
      dfrac,  dint = math.modf(deg)
      min = min + dfrac * 60
      deg = dint
      mfrac,  mint = math.modf(min)
      sec = sec + mfrac * 60
      min = mint
      if _as:
        sec = sec + min * 60 + deg * 3600
        if _as == 'sec': return sec
        if _as == 'min': return sec / 60
        if _as == 'deg': return sec / 3600
      return deg,  min,  sec
    
    
    def points2distance(start,  end):
      """
        Calculate distance (in kilometers) between two points given as (long, latt) pairs
        based on Haversine formula (http://en.wikipedia.org/wiki/Haversine_formula).
        Implementation inspired by JavaScript implementation from http://www.movable-type.co.uk/scripts/latlong.html
        Accepts coordinates as tuples (deg, min, sec), but coordinates can be given in any form - e.g.
        can specify only minutes:
        (0, 3133.9333, 0) 
        is interpreted as 
        (52.0, 13.0, 55.998000000008687)
        which, not accidentally, is the lattitude of Warsaw, Poland.
      """
      start_long = math.radians(recalculate_coordinate(start[0],  'deg'))
      start_latt = math.radians(recalculate_coordinate(start[1],  'deg'))
      end_long = math.radians(recalculate_coordinate(end[0],  'deg'))
      end_latt = math.radians(recalculate_coordinate(end[1],  'deg'))
      d_latt = end_latt - start_latt
      d_long = end_long - start_long
      a = math.sin(d_latt/2)**2 + math.cos(start_latt) * math.cos(end_latt) * math.sin(d_long/2)**2
      c = 2 * math.asin(math.sqrt(a))
      return 6371 * c
    
    
    if __name__ == '__main__':
     warsaw = ((21,  0,  30),  (52, 13, 56))
     cracow = ((19, 56, 18),  (50, 3, 41))
     print points2distance(warsaw,  cracow)
    展开全文
  • 已知两点经纬度计算球面距离公式,一搜一大堆,形式如下: 可是至于这个公式为什么是这样的,今天推导了一下,详细推导过程如下。首先画个图(图1),要不然空间想象能力差的话容易犯糊涂。首先对图1做个大致的...
  • 已知两点经纬度计算球面距离公式,一搜一大堆,形式如下: 可是至于这个公式为什么是这样的,今天推导了一下,详细推导过程如下。首先画个图(图1),要不然空间想象能力差的话容易犯糊涂。首先对图1做个...
  • Haversine公式是在导航中很重要的方程式,它可以根据其经度和纬度给出球体上之间的大圆距离。 这是球面三角法中更通用的公式的特例,该公式具有正弦曲线的定律,关系到球面三角形的边和角。 ( ) 余弦球定律...
  • matlab求两点距离

    千次阅读 2021-04-19 02:32:35
    end for k=1:N %Floyd算法求解任意两点的最短距离 for i=1:N for j=1:N if D(i,j)>D(i,k)+D(k,j) D(i,j)=D......Matlab求解边值问题方法+例题_工学_高等教育_教育专区。常微分方程边值问题Matlab程序 Matlab求解...
  • 地球上两点最短距离及计算方法

    万次阅读 2014-01-18 14:11:09
    地球上两点最短距离及走法 一、为什么说“地球表面两地之间的最短距离是通过这两点的大圆的劣弧段”?                              如上左图所示:AB两点最短距离是线段AB,即图...
  • 使用python实现最短距离聚类

    千次阅读 2022-03-26 14:50:35
    使用python实现最短距离聚类
  • 谁教教我反比例函数距离公式?

    千次阅读 2021-02-05 19:03:07
    形如 y=k/x(k≠0的常数,x≠0,y≠0) 的函数,叫做反比例函数.y=k/x=k·1/x=kx-1反比例函数的特点:y=k/x→xy...另外,从反比例函数的解析式可以得出,在反比例函数的图像上任取一点,向个坐标轴作垂线,这个垂足...
  • 到线段的最短距离算法

    千次阅读 2019-07-09 11:25:35
    到线段最短距离的运算与到直线的最短距离的运算二者之间存在一定的差别,即求到线段最短距离时需要考虑参考在沿线段方向的投影是否在线段上,若在线段上才可采用到直线距离公式,如图1所示。 图1(a...
  • 最短路径-任意两点间最短距离-Floyd算法的matlab实现(详细教程) 目录 简介 核心思路 优缺点分析 算法过程 简介 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的...
  • Java根据经纬度计算两点之间的距离

    万次阅读 多人点赞 2019-05-27 14:15:25
      在我们平时使用美团,饿了么等app进行订餐,或者使用猫眼进行订电影票的时候,都有一个距离的排序,表明该家店距离我们当前的位置,这种基于地理位置的服务,统一被称为LBS(Location Based Service),而LBS的...
  • 到圆的最近距离公式推导

    千次阅读 2014-12-16 18:35:32
    P到圆上最短距离公式? 推导过程: (1)由圆一般方程形式可以推导出圆的标准方程形式:  ,且有:,即:  圆心坐标: ;半径: (2)到圆的最短距离:  到圆的最短距离等于到圆心的距离减去...
  • 地图上到范围的最短距离算法

    万次阅读 2016-08-09 16:34:50
    以这2个+外点 做三角形算最短距离 var points = polygon.getPath(); var disArray = [] ; for ( var i= 0 ;i;i++){ var disI = map.getDistance(point,points[i]); //计算地图上到点的距离 ...
  • 用MATLAB实现求椭球上任意两点的最短弧长

    千次阅读 多人点赞 2020-04-09 22:44:38
    基于法向矢量导向的求椭球上两点的最短弧长 ...求椭球上两点短路,很容易想到用传统的短路算法如迪杰斯特拉算法或弗洛伊德算法求解,但是在椭球将步长离散化后,构造以及运用邻接矩阵十分复杂,在保证...
  • 已知两点经纬度,求两点距离; 已知两点经纬度,求一点相对于另一点航向; 已知一点经纬度及与另一点距离和航向,求另一点经纬度; 总声明: 因为地球偏心率极低,所以此处将地球看做球体,以下所有公式在适用...
  • 使用了 geotools3.5.2.jar 包,创建个几何图形,通过JAR方法,返回个面之间的最短距离。import com.vividsolutions.jts.geom.*; import com.vividsolutions.jts.io.ParseException; import ...
  • 做建模或者研究空间数据,可能会遇到“根据经纬度计算两点间的球面距离”的问题,网上的资料很多,都是各种公式推导,但是一旦按公式编程计算,很可能得不到正确的距离。根本原因是在“角度-弧度的转化”与“软件...
  • 文章目录主要内容聚合聚类的具体过程聚合聚类算法与案例系统聚类...最短距离法与最长距离法:定义距离与递推公式 中间距离法:几何意义与递推公式 类平均法与可变类平均法:定义距离与递推公式 离差平方和法与可变法:
  • 欧几里得度量(欧氏距离

    千次阅读 2020-12-23 01:11:43
    欧几里得度量,或者说欧氏距离,Euclidean Distance,这个名字来自著名的古希腊数学家欧几里得。欧几里得(公元前330年—公元前275年),古希腊数学家。他活跃于托勒密一世(公元前364年-公元前283年)时期的亚历山大...
  • 作者:xxw9485 时间:2017/6/20 参考资料:参考资料1、参考资料2 之前遇到过这样的问题:手里有一批患者的具体居住地点以及对应...球面上任意两点距离计算公式可以参考维基百科上的下述文章。 Great-circle...
  • 但是其实你在初中的时候就用过,只是那时还没给他一个官方的名字,你肯定做过这样的题,在直角坐标系中给定两点A(x1,y1),B(x2,y2)A(x_1,y_1),B(x_2,y_2)A(x1​,y1​),B(x2​,y2​)然后让你计算两个点之间的距离。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,338
精华内容 9,735
关键字:

两点最短距离公式