Трилатерация (или мультилатерация) с использованием 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)