Я пытаюсь реализовать функцию, которая даст мне местоположение GEO (Lat, Long) с учетом 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 таких ориентира (из всех трех друзей), у меня должна быть достаточная информация, чтобы рассчитать эту секретную точку встречи как географическую локацию.
Эта проблема очень похожа на проблему с мобильными/башнями, где вы триангулируете мобильный телефон, измеряя отдельные уровни сигнала от нескольких башен.
Я пытался найти формулы онлайн уже довольно давно, поэтому я размещаю свой вопрос здесь, в разделе «Переполнение стека».
Буду признателен, если вы могли бы помочь мне заполнить формулу (метод треугольника) - Спасибо.
код, который я до сих пор:
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;
}
}
Привет @roryap. Это не вопрос работы. Я попытался найти формулу онлайн, но не смог. Я также пытался получить его сам, без успеха. Я могу сказать вам, что формула не проста (у меня есть степень в B.Science/Physics и еще в B.Engineering). Это не 2D-пространство, это трехмерная проблема, связанная с широтой и долготой. Я вообще не считаю ваш комментарий конструктивным. Пожалуйста, прочтите мой полный вопрос. – z0mbi3
Святое дерьмо. Как далеко от места встречи живут эти люди !? –
Приблизительно в 50 милях вы получаете довольно неточные значения, если вы предполагаете двумерную карту. Кроме того, формулы не работают тогда, вы должны добавить дельта-ошибку, иначе вы не получите решение. Это усложняет задачу. – z0mbi3