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

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

Похожие вопросы
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
19 янв. 2025, в 02:12
70000 руб./за проект
19 янв. 2025, в 01:58
20000 руб./за проект
18 янв. 2025, в 23:27
50000 руб./за проект