NtOwl
@NtOwl
Прости за Спагетти-код, просто я верую в пастафари

Как вычислить расстояние между gps координат и их азимут(либо румбы)?

Добрый день, пишу сейчас программу для заполнения документации по средствам kml файла, но возникли проблемы...

import urllib.request
import math
from pykml import parser

cos = math.cos
sqrt = math.sqrt
sin = math.sin
arctan = math.atan
asin = math.asin
acos = math.acos
radians = math.radians
def toFixed(numObj, digits=0):
    return f"{numObj:.{digits}f}"

def haversine(lat1, lon1, lat2, lon2):
    # Конвертируем в список
    lon1, lat1, lon2, lat2 = map(radians, (lon1, lat1, lon2, lat2))

    # Формула
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    c = 2 * asin(sqrt(a))
    km = 6367 * c
    km = km*1000
    km = toFixed(km, '2')
    print ('Расстояние в метрах:', km)

url = 'https://berezca.com/test.kml'
fileobject = urllib.request.urlopen(url)
root = parser.parse(fileobject).getroot()
i = 0
print('=======НАЧАЛА ОБРАБОТКИ==========')
while i<20:
    try:
        namet = (str(f'Имя точки: {root.Document.Folder.Placemark[i].name}'))
        coordt = str(root.Document.Folder.Placemark[i].Point.coordinates).split(',')
        coordt2 =  str(root.Document.Folder.Placemark[i+1].Point.coordinates).split(',')
        sh1= (float(coordt[0]))
        dg1= (float(coordt[1]))
        sh2= (float(coordt2[0]))
        dg2= (float(coordt2[1]))
        print (namet)
        print (coordt[0], coordt[1])
        haversine(sh1,dg1,sh2,dg2)
        i = i+1
    except (IndexError):
        if i == 0 or i >= 5:
            tchk = 'точек'
        elif i == 1:
            tchk = 'точка'
        elif i == 2 or i == 3:
            tchk = 'точки'
        print ('Найдено:',(i+1),tchk)
        print('========КОНЕЦ ОБРАБОТКИ========')
        break


То что кот не ахти - знаю, но сейчас не об этом.
Программа нормально принимает файл и выводит информацию о точках, то есть парсит их имена/координаты и выводит длину между точек, вот с ней и возникли проблемы, перебрал уже с десяток формул, сейчас нашёл функцию в паблике поставил её в свой код, но вывод меня не радет, допустим между 1-ой и 2-ой точкой должно получится 147,20, а программа выводит 250.50...
5d26f6a9f3488213785931.png
(не вписал ещё получение длины, между первой и последней)
Ещё бы разобраться с азимутами, но я думаю если этот вопрос решится, то и с ними быстро разберусь, спасибо
Помогите, пожалуйста(
  • Вопрос задан
  • 446 просмотров
Решения вопроса 1
NeiroNx
@NeiroNx
Программист
Незнаю откуда вы взяли 147.20 - там меньше 250 ну никак не получается. Формула правильная.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы