三角剖分公式(3 个参考值 + 距离) [英] Formula for triangulation (3 references + distances)

查看:52
本文介绍了三角剖分公式(3 个参考值 + 距离)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试实现一个函数,该函数将为我提供给定 3 个 GEO 参考点和距离每个点的半径的 GEO 位置(纬度、经度).

I am trying to implement a function that will give me the GEO location (Lat,Long) given 3 GEO reference points and radius away from each point.

我正在寻找的函数的签名是:

The signature for the function I'm looking for is:

public static GeoLocation Triangle(GeoLocation pos1, double r1, GeoLocation pos2,
                                   double r2, GeoLocation pos3, double r3)

例如,3 个朋友在某个秘密会面.每个人只能告诉我他/她住在哪里(GeoLocation = lat,long)以及他们离家多远(r = 半径).给定 3 个这样的参考点(来自所有 3 个朋友),我应该有足够的信息来计算这个秘密会面点作为 GeoLocation.

As example, 3 friends meet up somewhere secret. Each one can only tell me where he/she lives (GeoLocation = lat,long) and how far they are meeting from their house (r = radius). Given 3 such reference points (from all 3 friends), I should have sufficient information to calculate this secret meeting point as a GeoLocation.

这个问题与手机/信号塔问题非常相似,您可以通过测量几个信号塔的信号强度对手机进行三角测量.

This problem is very similar to the mobile / towers problem where you triangulate a mobile by measuring individual signal strengths from a few towers.

我尝试在网上查找公式已经有一段时间了,这就是我在 Stack Overflow 上发布我的问题的原因.

I have tried to find formulas online for quite some time now, which is why I'm posting my question here on Stack Overflow.

如果您能帮我填写公式(三角法),我将不胜感激.

I will appreciate it if you could help me fill in the formula (Triangle method) - Thanks.

我到目前为止的代码:

public class GeoLocation
{
    private double _latitude;
    private double _longitude;

    public GeoLocation(double latitude, double longitude)
    {
        this._latitude = latitude;
        this._longitude = longitude;
    }

    //Tested and working!
    public double DistanceToKm(GeoLocation loc)
    {
        double lat1, lon1, lat2, lon2;
        lat1 = this._latitude;
        lon1 = this._longitude;
        lat2 = loc._latitude;
        lon2 = loc._longitude;
        var R = 6371; // Radius of the earth in km
        var dLat = deg2rad(lat2 - lat1); // deg2rad below
        var dLon = deg2rad(lon2 - lon1);
        var a =
            Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
            Math.Cos(deg2rad(lat1))*Math.Cos( deg2rad(lat2))*
            Math.Sin(dLon / 2) * Math.Sin(dLon / 2)
            ;
        var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
        var d = R*c; // Distance in km
        return d;
    }
}

我认为不需要但值得的代码:

Code which I think is not needed, but for what it's worth:

public static Coords ToCoord(GeoLocation pos)
{
    var x = Math.Cos(pos._longitude) * Math.Cos(pos._latitude);
    var y = Math.Sin( pos._longitude) * Math.Cos(pos._latitude);
    var z = Math.Sin(pos._latitude);
    return new Coords(x,y,z);
}

class Coords
{
    public double x;
    public double y;
    public double z;

    public Coords(double x, double y, double z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

推荐答案

看来这毕竟是解决方案.

Seems this is the solution after all.

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-longitude-points-and-3-distances

...比学校几何学复杂得多@DrKoch

... far more complicated than school geometry @DrKoch

这是 Python 解决方案:

Here is the Python solution:

yC = earthR *(math.cos(math.radians(LatC)) * math.sin(math.radians(LonC)))
zC = earthR *(math.sin(math.radians(LatC)))

P1 = array([xA, yA, zA])
P2 = array([xB, yB, zB])
P3 = array([xC, yC, zC])

#from wikipedia
#transform to get circle 1 at origin
#transform to get circle 2 on x axis
ex = (P2 - P1)/(numpy.linalg.norm(P2 - P1))
i = dot(ex, P3 - P1)
ey = (P3 - P1 - i*ex)/(numpy.linalg.norm(P3 - P1 - i*ex))
ez = numpy.cross(ex,ey)
d = numpy.linalg.norm(P2 - P1)
j = dot(ey, P3 - P1)

#from wikipedia
#plug and chug using above values
x = (pow(DistA,2) - pow(DistB,2) + pow(d,2))/(2*d)
y = ((pow(DistA,2) - pow(DistC,2) + pow(i,2) + pow(j,2))/(2*j)) - ((i/j)*x)

# only one case shown here
z = sqrt(pow(DistA,2) - pow(x,2) - pow(y,2))

#triPt is an array with ECEF x,y,z of trilateration point
triPt = P1 + x*ex + y*ey + z*ez

#convert back to lat/long from ECEF
#convert to degrees
lat = math.degrees(math.asin(triPt[2] / earthR))
lon = math.degrees(math.atan2(triPt[1],triPt[0]))

print lat, lon`

这篇关于三角剖分公式(3 个参考值 + 距离)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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