2015-04-03 222 views
-2

我试图实现一个函数,该函数给出GEO位置(纬度,长度)给定3 GEO参考点和距离每个点的半径。三角测量公式(3参考值+距离)

为我要找的功能的签名是:

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

作为例子,3个朋友见面某处的秘密。每个人只能告诉我他/她住在哪里(GeoLocation = lat,long)以及他们与他们的房子会面的距离(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; 
    } 
} 
+0

嗨@roryap。这不是不工作的问题。我试图在网上找到配方,但不能。我也试图自己得出结论,但没有成功。我可以告诉你这个公式并不简单(我在B.Science/Physics有一个学位,在B.Engineering有另一个学位)。这不是2D空间,这是一个涉及经纬度的3D问题。我没有发现你的评论是有建设性的。请阅读我的完整问题。 – z0mbi3 2015-04-03 12:31:45

+0

圣洁的废话。这些人居住在离会场多远的地方!? – 2015-04-03 12:36:18

+0

在约50英里的地方,如果你推测一个2D地图,你会得到相当不准确的值。此外,这些公式无法正常工作,您必须添加delta错误,否则您将无法获得解决方案。这使问题变得更加复杂。 – z0mbi3 2015-04-03 12:39:32

回答

0

看来这是解决毕竟。

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

...远比学校几何@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`