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
(не вписал ещё получение длины, между первой и последней)
Ещё бы разобраться с азимутами, но я думаю если этот вопрос решится, то и с ними быстро разберусь, спасибо
Помогите, пожалуйста(
  • Вопрос задан
  • 171 просмотр
Решения вопроса 1
NeiroNx
@NeiroNx
Программист
Незнаю откуда вы взяли 147.20 - там меньше 250 ну никак не получается. Формула правильная.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 40 000 до 80 000 ₽
iCode Москва
от 90 000 до 200 000 ₽
SwapZilla.co Москва
от 200 000 ₽
14 июл. 2020, в 19:07
6000 руб./за проект
14 июл. 2020, в 19:02
1000 руб./за проект
14 июл. 2020, в 18:41
1000 руб./за проект