Трилатерация (или мультилатерация) с использованием 4 точек широты / долготы (станций) и 4 расстояний?

Я хотел бы узнать неизвестное местоположение цели (координаты широты и долготы). Имеется 4 известных точки (пары координат широты и долготы станций внутри здания), и для каждой точки расстояние в метрах до целевого местоположения. Как я могу рассчитать в Python координаты целевого местоположения?

Я проверил следующий код (с сомнением относительно значения параметра "initial_location", может быть любая станция?). Поэтому я проверил в ArcGIS результаты, создав буфер, окружающий каждую станцию ​​(используя расстояния алгоритма в качестве радиуса), и пересекал результаты буфера и, похоже, не логично.

from scipy.optimize import minimize
import math

def mse(x, locations, distances):
    mse = 0.0
    for location, distance in zip(locations, distances):
        distance_calculated = great_circle_distance(x[0], x[1], location[0], location[1])
        mse += math.pow(distance_calculated - distance, 2.0)
    return mse / len(locations)

EARTH_CIRCUMFERENCE = 6378137     # earth circumference in meters


def great_circle_distance(lat1,lon1,lat2,lon2):

    dLat = math.radians(lat2 - lat1)
    dLon = math.radians(lon2 - lon1)
    a = (math.sin(dLat / 2) * math.sin(dLat / 2) +
            math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * 
            math.sin(dLon / 2) * math.sin(dLon / 2))
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    d = EARTH_CIRCUMFERENCE * c

    return d

initial_location = (41.828286,1.759349) # (lat, long)
locations = [(41.828286,1.759349),(41.827988,1.759572),(41.827891,1.75934),(41.828189,1.759117)] # [ (lat1, long1), ... ]
distances = [10,10,10,10] # [ distance1, ... ] 
result = minimize(
 mse,                         # The error function
 initial_location,            # The initial guess
 args=(locations, distances), # Additional parameters for mse
 method='L-BFGS-B',           # The optimisation algorithm
 options={
 'ftol':1e-5,                 # Tolerance
 'maxiter': 1e+7              # Maximum iterations
 })
location = result.x

print("Location",location)

Скриншот из ArcGIS

0 ответов

Другие вопросы по тегам