2015-04-03 86 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`