给定点(纬度,经度),距离和方位角,如何获取新的纬度和经度 [英] Given point of (latitude,longitude), distance and bearing, How to get the new latitude and longitude

查看:178
本文介绍了给定点(纬度,经度),距离和方位角,如何获取新的纬度和经度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在网上找到了一段代码.它通过给定的纬度/经度点和距离来计算最小边界矩形.

I found a piece of code on web. It calculates the Minimum bounding rectangle by a given lat/lon point and a distance.

private static void GetlatLon(double LAT, double LON, double distance, double angle, out double newLon, out double newLat)
        {     
            double dx = distance * 1000 * Math.Sin(angle * Math.PI / 180.0);
            double dy = distance * 1000 * Math.Cos(angle * Math.PI / 180.0);
            double ec = 6356725 + 21412 * (90.0 - LAT) / 90.0;
            double ed = ec * Math.Cos(LAT * Math.PI / 180);
            newLon = (dx / ed + LON * Math.PI / 180.0) * 180.0 / Math.PI;
            newLat = (dy / ec + LAT * Math.PI / 180.0) * 180.0 / Math.PI;

            }

    public static void GetRectRange(double centorlatitude, double centorLogitude, double distance,
                                  out double maxLatitude, out double minLatitude, out double maxLongitude, out double minLongitude)
{       
            GetlatLon(centorlatitude, centorLogitude, distance, 0, out temp, out maxLatitude);
            GetlatLon(centorlatitude, centorLogitude, distance, 180, out temp, out minLatitude);
            GetlatLon(centorlatitude, centorLogitude, distance, 90, out minLongitude, out temp);
            GetlatLon(centorlatitude, centorLogitude, distance, 270, out maxLongitude, out temp);
}



double ec = 6356725 + 21412 * (90.0 - LAT) / 90.0; //why?
double ed = ec * Math.Cos(LAT * Math.PI / 180);    // why?
dx / ed                                            //why?
dy / ec                                            //why?

6378137是赤道半径,6356725是极半径,21412 = 6378137 -6356725. 从链接中,我知道一些意义.但是这四行,我不知道为什么.您能帮忙提供更多信息吗?您能帮我知道公式的推导吗?

6378137 is the equator radius, 6356725 is polar radius, 21412 =6378137 -6356725. from the link, I know a little of the meanings. But these four lines, I don't know why. Could you please help to give more information? Could you please help to let me know the derivation of the formula?

链接的给定目标点"部分中距离和距起点的方位",它给出了另一个公式来得到结果.公式的推导是什么?

From the link, in the section "Destination point given distance and bearing from start point", it gives another formula to get the result. What is the derivation of the formula?

通过此链接,我知道Haversine公式的推导,这是非常有用的.我认为给定距离和距起点的目标点"部分中的公式并不是Haversine的简单转换.

From this link , I know the derivation of the Haversine Formula, it's very informative. I don't think the formula in the section of "Destination point given distance and bearing from start point" is just a simple reversion of Haversine.

非常感谢!

推荐答案

这是为什么注释您的代码使其更具可读性和可维护性的主要示例.数学上,您正在查看以下内容:

This is a prime example of why commenting your code makes it more readable and maintainable. Mathematically you are looking at the following:

double ec = 6356725 + 21412 *(90.0-LAT)/90.0; //为什么?

double ec = 6356725 + 21412 * (90.0 - LAT) / 90.0; //why?

这是一种偏心度的度量,以某种方式解释了赤道隆起.如您所知,21412是赤道和极点之间的地球半径之差. 6356725是极半径. (90.0 - LAT) / 90.0在赤道上是1,在极点上是0.该公式只是估算在任何给定纬度下会出现多少凸起.

This is a measure of eccentricity to account for the equatorial bulge in some fashion. 21412 is, as you know, the difference in earth radius between the equator and pole. 6356725 is the polar radius. (90.0 - LAT) / 90.0 is 1 at the equator, and 0 at the pole. The formula simply estimates how much bulge is present at any given latitude.

double ed = ec * Math.Cos(LAT * Math.PI/180); //为什么?

double ed = ec * Math.Cos(LAT * Math.PI / 180); // why?

(LAT * Math.PI / 180)是纬度从度到弧度的转换. cos (0) = 1cos(1) = 0,因此在赤道上您要施加全部的偏心率,而在极点上则不施加任何量.与上一行类似.

(LAT * Math.PI / 180) is a conversion of latitude from degrees to radians. cos (0) = 1 and cos(1) = 0, so at the equator, you are applying the full amount of the eccentricity while at the pole you are applying none. Similar to the preceding line.

dx/ed//为什么?

dx / ed //why?

dy/ec//为什么?

dy / ec //why?

以上似乎是在xy方向上距离的小数加法,这归因于newLon newLat中使用的任何给定 lat/lon 处的凸起计算以到达新位置.

The above seems to be the fractional additions to distance in both the x and y directions attributable to the bulge at any given lat/lon used in the newLon newLat computation to arrive at the new location.

我还没有对您发现的代码片段进行任何研究,但是从数学上讲,这就是正在发生的事情.希望这将引导您朝正确的方向前进.

I haven't done any research into the code snippet you found, but mathematically, this is what is taking place. Hopefully that will steer you in the right direction.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double m2ft (double l) {            /* convert meters to feet       */
    return l/(1200.0/3937.0);
}

double ft2smi (double l) {          /* convert feet to statute miles*/
    return l/5280.0;
}

double km2smi (double l) {          /* convert km to statute mi.    */
    return ft2smi(m2ft( l * 1000.0 ));
}

static const double deg2rad = 0.017453292519943295769236907684886;
static const double earth_rad_m = 6372797.560856;

typedef struct pointd {
    double lat;
    double lon;
} pointd;

/* Computes the arc, in radian, between two WGS-84 positions.
   The result is equal to Distance(from,to)/earth_rad_m
      = 2*asin(sqrt(h(d/earth_rad_m )))
   where:
      d is the distance in meters between 'from' and 'to' positions.
      h is the haversine function: h(x)=sin²(x/2)
   The haversine formula gives:
      h(d/R) = h(from.lat-to.lat)+h(from.lon-to.lon)+cos(from.lat)*cos(to.lat)
   http://en.wikipedia.org/wiki/Law_of_haversines
 */
double arcradians (const pointd *from, const pointd *to)
{
    double latitudeArc  = (from-> lat - to-> lat) * deg2rad;
    double longitudeArc = (from-> lon - to-> lon) * deg2rad;

    double latitudeH = sin (latitudeArc * 0.5);
    latitudeH *= latitudeH;

    double lontitudeH = sin (longitudeArc * 0.5);
    lontitudeH *= lontitudeH;

    double tmp = cos (from-> lat * deg2rad) * cos (to-> lat * deg2rad);

    return 2.0 * asin (sqrt (latitudeH + tmp*lontitudeH));
}

/* Computes the distance, in meters, between two WGS-84 positions.
   The result is equal to earth_rad_m*ArcInRadians(from,to)
 */
double dist_m (const pointd *from, const pointd *to) {
    return earth_rad_m * arcradians (from, to);
}

int main (int argc, char **argv) {

    if (argc < 5 ) {
        fprintf (stderr, "Error: insufficient input, usage: %s (lat,lon) (lat,lon)\n", argv[0]);
        return 1;
    }

    pointd points[2];

    points[0].lat = strtod (argv[1], NULL);
    points[0].lon = strtod (argv[2], NULL);

    points[1].lat = strtod (argv[3], NULL);
    points[1].lon = strtod (argv[4], NULL);

    printf ("\nThe distance in meters from 1 to 2 (smi): %lf\n\n", km2smi (dist_m (&points[0], &points[1])/1000.0) );

    return 0;
}

/* Results/Example.
    ./bin/gce 31.77 -94.61 31.44 -94.698
    The distance in miles from Nacogdoches to Lufkin, Texas (smi): 23.387997 miles
 */

这篇关于给定点(纬度,经度),距离和方位角,如何获取新的纬度和经度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆