C# 三角测量公式(3个参考和距离)

C# 三角测量公式(3个参考和距离),c#,algorithm,triangulation,C#,Algorithm,Triangulation,我正在尝试实现一个函数,该函数将为我提供给定3个地理参考点的地理位置(纬度、长度)以及距离每个点的半径 我正在寻找的函数的签名是: public static GeoLocation Triangle(GeoLocation pos1, double r1, GeoLocation pos2, double r2, GeoLocation pos3, double r3) 例如,3个朋友在某个秘密的地方相遇。每个人只能告诉我

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

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

public static GeoLocation Triangle(GeoLocation pos1, double r1, GeoLocation pos2,
                                   double r2, GeoLocation pos3, double r3)
例如,3个朋友在某个秘密的地方相遇。每个人只能告诉我他/她住在哪里(地理位置=纬度,经度),以及他们距离家有多远(r=半径)。给定3个这样的参考点(来自所有3个朋友),我应该有足够的信息来计算这个秘密会面点作为地理位置

这个问题与移动/塔台问题非常相似,在移动/塔台问题中,通过测量几个塔台的单个信号强度来对移动设备进行三角测量

我已经尝试在线查找公式很长一段时间了,这就是为什么我在Stack Overflow上发布我的问题

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

到目前为止,我掌握的代码是:

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;
    }
}
我认为不需要的代码,但它的价值是:

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;
    }
}

看来这毕竟是解决办法

。。。远比学校几何复杂@DrKoch

以下是Python解决方案:

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`

你好,罗雅普。这不是不工作的问题。我试着在网上找到这个公式,但是找不到。我自己也尝试过,但没有成功。我可以告诉你这个公式并不简单(我有理学士学位,还有一个工程学士学位)。这不是2D空间,而是3D问题,涉及纬度和经度。我觉得你的评论毫无建设性。请看我的全部问题,天哪。这些人住的地方离会议地点有多远!?在大约50英里处,如果假设是2D贴图,则会得到相当不准确的值。此外,公式无法计算,您必须添加一个delta错误,否则将无法得到解决方案。这使问题变得更加复杂。那么我拒绝你的前提。如果他们每个人都住在离会议地点大约50英里的地方,那么他们之间的距离将超过50英里。那样的话,他们就不是朋友了。他们充其量只是熟人。在那么长的距离内保持友谊是不可能的。此外,如果这次会面如此秘密,他们为什么要告诉你!?