C# 三角测量公式(3个参考和距离)
我正在尝试实现一个函数,该函数将为我提供给定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个朋友在某个秘密的地方相遇。每个人只能告诉我
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英里。那样的话,他们就不是朋友了。他们充其量只是熟人。在那么长的距离内保持友谊是不可能的。此外,如果这次会面如此秘密,他们为什么要告诉你!?