计算沿点相交的纬线长矢量的距离

问题描述

由于我还没有评论,因为我没有足够的声誉,所以我不得不问另一个问题。 有了这篇出色的文章Distance from Lat/Lng point to Minor Arc segment,我已经用C#和C实现了代码。 现在,对于情况2.1,我需要知道:相对方位角是锐角,并且p4落在我们的圆弧上,如何计算点相交沿线段的距离(以米为单位!)。 不幸的是,我不是数学天才,所以对我来说,使用实变量名的代码示例将是一个优势。 MatLab示例很容易转换为C#和C-我在下面包括了C代码

// GeoSpatial.h Header file containing....
typedef enum _calculationResultType
{
    Undefined,Obtuse,BeyondArc,Crosstrack
} CalculationResultType;

typedef struct  _coordinate
{
    //int Id;
    int FeatureId;
    double Latitude;
    double Longitude;
    int SpeedLimit;
} CoordinateObject,* Coordinate;

double GeoSpatial_bearing(double latA,double lonA,double latB,double lonB);
double GeoSpatial_Calculate(Coordinate c1,Coordinate c2,Coordinate c3,CalculationResultType * resultType);
double GeoSpatial_distance(double latA,double lonB);
double GeoSpatial_Toradians(double degrees);

// C Module....
#include <math.h>
#include "GeoSpatial.h"

const double EarthRadius = 6371000.0L;
const double PI = 3.14159265358979L;

double
GeoSpatial_bearing(double latA,double lonB)
{
    return atan2(sin(lonB - lonA) * cos(latB),cos(latA) * sin(latB) - sin(latA) * cos(latB) * cos(lonB - lonA));
}

double
GeoSpatial_Calculate(Coordinate c1,CalculationResultType * resultType)
{
    double lat1 = GeoSpatial_Toradians(c1->Latitude);
    double lat2 = GeoSpatial_Toradians(c2->Latitude);
    double lat3 = GeoSpatial_Toradians(c3->Latitude);
    double lon1 = GeoSpatial_Toradians(c1->Longitude);
    double lon2 = GeoSpatial_Toradians(c2->Longitude);
    double lon3 = GeoSpatial_Toradians(c3->Longitude);

    // Earth's radius in meters

    // Prerequisites for the formulas
    double bearingC1C2 = GeoSpatial_bearing(lat1,lon1,lat2,lon2);
    double bearingC1C3 = GeoSpatial_bearing(lat1,lat3,lon3);
    double distanceC1C3 = GeoSpatial_distance(lat1,lon3);

    // Is relative bearing obtuse?
    if (fabs(bearingC1C3 - bearingC1C2) > (PI / 2))
    {
        double distanceC2C3 = GeoSpatial_distance(lat2,lon2,lon3);
        *resultType = Obtuse;
        return distanceC1C3 < distanceC2C3 ? distanceC1C3 : distanceC2C3;
    }

    // Find the cross-track distance.
    double distanceCrosstrack = asin(sin(distanceC1C3 / EarthRadius) * sin(bearingC1C3 - bearingC1C2)) * EarthRadius;

    // Is p4 beyond the arc?
    double distanceC1C2 = GeoSpatial_distance(lat1,lon2);
    double distanceC1C4 = acos(cos(distanceC1C3 / EarthRadius) / cos(distanceCrosstrack / EarthRadius)) * EarthRadius;

    if (distanceC1C4 > distanceC1C2)
    {
        // distance C2 - C3
        *resultType = BeyondArc;
        return GeoSpatial_distance(lat2,lon3);
    }

    *resultType = Crosstrack;
    return fabs(distanceCrosstrack);
}

double
GeoSpatial_distance(double latA,double lonB)
{
    return acos(sin(latA) * sin(latB) + cos(latA) * cos(latB) * cos(lonB - lonA)) * EarthRadius;
}

double
GeoSpatial_Toradians(double degrees)
{
    return degrees * (acos(-1) / 180);
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)