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

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

Войти через центр авторизации
Похожие вопросы
YLab Тольятти
от 90 000 до 150 000 руб.
от 60 000 до 120 000 руб.
16 июл. 2019, в 00:49
15000 руб./за проект
15 июл. 2019, в 23:17
3000 руб./за проект
15 июл. 2019, в 23:03
1000 руб./за проект