wladich / nakarte

Source code of site http://nakarte.me
MIT License
159 stars 38 forks source link

Отображение GPX-трека по URL, передаваемому в качестве входного параметра при вызове сайта #131

Closed ancrane closed 5 years ago

ancrane commented 6 years ago

Предлагаю реализовать возможность передачи URL сайту через параметры, передаваемые при вызове сайта, например, методом GET: https://nakarte.tk?url=mysite.com/trek.xml

wladich commented 6 years ago

Только не через url-параметры, через параметры закодированные в хеше (часть после #), как и всё остальное.

Сделать, конечно, можно, но я пока не понимаю, что улучшится по сравнению со сценарием:

  1. Открываем сайт.
  2. Загружаем трек с диска / по ссылке
  3. Получаем ссылку на трек, расшариваем её.

Внятного автообновления отображения при изменении содержимого файла (то, что хотел @slazav) мы так всё равно не полуичим, это более масштабная задача.

slazav commented 6 years ago

Да, я как раз такое хотел,. https://nakarte.tk?url=mysite.com/trek.xml Насчет масштабности задачи я, видимо, не очень понимаю, как все устроено. Мое наивное понимание примерно такое:

slazav commented 6 years ago

С другой стороны, для простых задач меня вполне устраивает то, как сейчас все устроено. А для сложных (например, автоматически генерить ссылку на nakarte, либо с со ссылкой на свой url с треком, либо с хэшем) я пока не добрался - хотя и собираюсь когда-нибудь.

ancrane commented 6 years ago
  1. Открываем сайт.
  2. Загружаем трек с диска / по ссылке
  3. Получаем ссылку на трек, расшариваем её.

Обнаружил недавно, что ссылка на трек, созданная таким образом, через какое-то время перестаёт показывать сам трек, а лишь только область на карте вокруг него. Я так понимаю, сайт NaKarte не сохраняет треки. Если же трек лежал бы на стороннем ресурсе, то ссылка была бы постоянной.

Также непонятно, в чём причина невозможности автообновления: при каждом вызове сайт просто должен заново обращаться по указанному URL и считывать оттуда файл трека. В чём тут глобальность?

Польза от подобной возможности была бы в том, что пользователям можно было бы очень удобно опубликовывать (визуализировать) треки, заливая их на свои сервера и создавая обычную ссылку для вставки на форумах, в почте и т.п. По такой ссылке адресат мог бы легко увидеть сам трек на карте.

wladich commented 6 years ago

Как есть сейчас: Треки передаются в виде кода в значении параметра nktl в хеше. По сути это значение почти что ссылка на трек, т.е. при ссылке https://nakarte.tk/#m=13/54.86268/37.15267&l=O&nktl=1nVLQk_zsNlYXtZGnJgE8g на сервер уходит запрос https://tracks.nakarte.tk/track/1nVLQk_zsNlYXtZGnJgE8g. После загрузки трека параметр nktl из текущего адреса страницы удаляется. В принципе, можно было бы добавить ещё какой-нибудь параметр и передавать в нём ссылки на сторонние сайты. И так же надо будет удалять ссылку на этот трек из хеша.

Проблема со сценарием @slazav: После обновления содержимого файла надо будет очень внятно говорить пользователям, что надо именно заново открыть ссылку, а не просто обновить страницу в браузере (т.к. в хеше ссылки уже нет и при перезагрузке достанется версия из localStorage). Это не стандартно для веба и поэтому, подозреваю, будет много недопониманий, почему "ничего не обновилось", к тому же ещё и старая версия трека будет оставаться в списке, причём с тем же именем, что и новая. Поэтому я и говорю, что не вижу внятного способа, т.е. такого, чтобы пользователям было понятно.

Почему надо удалять ссылки из хеша (и вообще из текущего адреса):

  1. пользователь в любой момент может нажать F5 и должен получить то же самое состояние страницы.
  2. пользователь может изменить любой загруженный трек.
  3. Если трек не убрать из адреса, и пользователь изменит трек, то при обновлении страницы он должен либо потерять изменения, либо получит два трека, т.е. нарушаем требование из п.1

Решением могло бы быть введение новой сущности "неизменяемый трек", т.е. отмена п.2, но мне это делать не хочется, причём именно с точки зрения придумывания интерфейса.

@ancrane, если треки перестают грузиться, то это страшный баг, дайте пожалуйста примеры таких неработающих ссылок. Сайт как раз хранит треки и пропадать они не должны.

Польза от подобной возможности была бы в том, что пользователям можно было бы очень удобно опубликовывать (визуализировать) треки, заливая их на свои сервера и создавая обычную ссылку для вставки на форумах, в почте и т.п. По такой ссылке адресат мог бы легко увидеть сам трек на карте.

Если задачи автообновления нет, то в принципе и сейчас вроде неплохо (как в сценарии из первого комента), всё равно перед публикацией нужно выбрать слой и область карты и зум, а для этого всё равно надо открывать сайт.

slazav commented 6 years ago

А в чем url отличается о хэша? И там и там надо получить информацию, загрузить трек и удалить параметр из url. И там и там трек потом можно потом редактировать. А откуда он изначально взялся - не важно.

wladich commented 6 years ago

Я про это же и пишу -- добавить можно, непонятно зачем

ancrane commented 6 years ago

Посмотрел внимательнее, исчезновение трека из ссылки вызвано некорректной передачей ссылки пользователем.

Расширю вопрос @slazav: а каков алгоритм создания параметра nktl в хэше? Как я понимаю, "короткую" ссылку может сгенерировать лишь сайт NaKarte. То есть пользователю в любом случае нужно заходить сюда и открывать тут свой трек... А если передавать URL, то этого делать не потребуется. Что касается других необходимых параметров отображения трека, по почему их тоже нельзя передать по ссылке? У каждого слоя и каждого зума же есть свой id, область карты характеризуется координатами центра...

slazav commented 6 years ago

Задача - не делать руками в интерфейсе, а делать ссылку скриптом. При загрузке она будет загружать актуальный файл, что потом с ним будет делать пользователь - не важно. Всегда можно будет повторить загрузку исходной ссылки, если надо.

Но, действительно, через url не передашь центровку, масштаб, слои карты и т.п., это, и правда, кажется аргументом за то, что такая опция будет не слишком полезна. Так что, видимо, все равно в скрипте придется учиться делать правильные хэши, вместо того, чтобы передавать url.

slazav commented 6 years ago

Еще, видимо, у нас разные методы работы: я вообще не забочусь о localStorage (пока его нельзя сохранять в файл, читать из файла и т.п. - мне он не интересен), мне важнее источники: этот трек прочитать оттуда, этот отсюда, потом что-то поредактировать и результат сохранить куда-то. Когда я открываю nakarte я всегда начинаю с удаления всего мусора, который остался с прошлого раза.

ancrane commented 6 years ago

Но, действительно, через url не передашь центровку, масштаб, слои карты и т.п., это, и правда, кажется аргументом за то, что такая опция будет не слишком полезна. Так что, видимо, все равно в скрипте придется учиться делать правильные хэши, вместо того, чтобы передавать url.

Почему же не передашь? Для передачи этих данных надо объявить специальные параметры и правила их задания.

wladich commented 6 years ago

для расшаривания ссылки на nakarte с треком всё равно надо отцентровать и зазумить карту, выбрать слои -- это всё равно надо делать руками в интерфейсе, заодно можно и трек загрузить через контрол и сгенерировать "короткую" ссылку.

Что касается других необходимых параметров отображения трека, по почему их тоже нельзя передать по ссылке? У каждого слоя и каждого зума же есть свой id, область карты характеризуется координатами центра...

Я всё ещё не понимаю, для чего это нужно: если делать ссылку руками, то не нужно. Или это для какого-то автоматического генерирования?

Про создание коротких ссылок: их может генерировать кто угодно, но сейчас генерирует только nakarte. Если интересно, то примерно так:

  1. Tрек, точки и настройки отображения сериализуются в протобуф
  2. Полученные байты кодируются в base64.
  3. Считаем md5 от полученной строки, берём его двоичное представление и кодируем в web-safe base64.
  4. Загружаем строку из п.2 на сервер
  5. Показываем пользователю ссылку, в которой nktl= строке из п.3
wladich commented 6 years ago

Еще, видимо, у нас разные методы работы: я вообще не забочусь о localStorage

А о нём и не надо заботиться :) Он в первую очередь используется чтобы не потерять треки при случайной перезагрузке или закрытии страницы.

ancrane commented 6 years ago

Я всё ещё не понимаю, для чего это нужно: если делать ссылку руками, то не нужно. Или это для какого-то автоматического генерирования?

Да, имеется желание делать такое автоматическое генерирование для своего проекта.

Про создание коротких ссылок: их может генерировать кто угодно, но сейчас генерирует только nakarte. Если интересно, то примерно так:

  1. Tрек, точки и настройки отображения сериализуются в протобуф
  2. Полученные байты кодируются в base64.
  3. Считаем md5 от полученной строки, берём его двоичное представление и кодируем в web-safe base64.
  4. Загружаем строку из п.2 на сервер
  5. Показываем пользователю ссылку, в которой nktl= строке из п.3

В целом ясно. Если понадобится, можно ли будет отдельно обратиться за примером реализации подобного алгоритма?

wladich commented 6 years ago

В общем, я подумаю, и возможно всё-таки добавлю. Вроде выяснили, что никто не ожидает автообновления, но нужна автогенерация.

Вспомнил ещё один аргумент против внешних ссылок -- треки по "коротким" ссылкам будут рабочими пока жив проект nakarte. A по внешним файлы имеют свойство исчезать.

Про воспроизведение алгоритма -- не уверен, что это хорошая идея, может лучше маленький сервис для этого написать. В любом случае всё есть в коде

wladich commented 5 years ago

Частично сделал, будет примерно так, если есть идеи, комментируйте

  1. Простой способ загрузить трек: параметр url, значение -- заурленкоженный URL. URL может быть на файл, включая zip или на сервис типа gpsies или strava. Можно передать несколько заурлэнкоженных URL-ов, соединённых прямым слешем. Цвет трека назначается автоматически, показ трека включён, отметки расстояния выключены.
  2. Простой способ сделать одну точку: pt=LAT/LON/NAME. Имя опционально, если не указано, то будет "Point". Имя трека такое же, как имя точки. Цвет назначается автоматически, показ трека включён.
  3. Более сложный способ: можно настроить отображение трека, задать несколько точек или задать небольшой трек прямо в значении параметра, задать несколько треков.
    • Каждый трек описывается словарём.
    • Словари треков объединяются в список (даже если трек один)
    • Список сериализуется в JSON
    • Полученная строка кодируется в URL-safe Base64.
    • Итоговая строка передаётся как значение параметра trk

Ключи словаря трека:

При наличии ключа u ключи p и t игнорируются. Т.е. в описании трека должен быть либо url, либо данные.

Описание точек: список из словарей, ключи:

Описание треков: список сегментов. Каждый сегмент -- список точек. Каждая точка -- список из двух элементов [широта, долгота].

В ссылке могут быть все параметры вместе, а так же nktk и nktl. Треки можно загрузить как при открытии страницы по ссылке, так и вставив ссылку в поле ввода над списком треков.

Пример описания треков для параметра trk:

[
    {
        n: "Track name",
        p: [{n: 'Point1', lt: 24.56, ln: 34.56}],
        t: [[[56.24, 45.67], [57.24, 46.67]]]
    },
    {
        n: "Another track",
        c: 3,
        v: false,
        m: true,
        u: 'https://www.strava.com/activities/1989612737'
    }
]

Дополнительная фича: если в ссылке нет параметра m (позиция карты и зум), то позиция и зум будут установлены так, чтобы все загруженные треки и точки помещались на экране.

sikmir commented 5 years ago
  1. Простой способ сделать одну точку: pt=LAT/LON/NAME. Имя опционально, если не указано, то будет "Point". Имя трека такое же, как имя точки. Цвет назначается автоматически, показ трека включён.

То есть это сделает возможным поставить точку по координатам #72, хотя бы без интерфейса.

wladich commented 5 years ago

Это немного geeky-way, но да. Я надеюсь, что #72 я сделаю следующей.

slazav commented 5 years ago

Это и #157 вполне закрывает...

ancrane commented 5 years ago
  1. Простой способ загрузить трек: параметр url, значение -- заурленкоженный URL. URL может быть на файл, включая zip или на сервис типа gpsies или strava. Можно передать несколько заурлэнкоженных URL-ов, соединённых прямым слешем. Цвет трека назначается автоматически, показ трека включён, отметки расстояния выключены.

Прошу прощения за возобновление вопроса, только сейчас добрался, чтобы посмотреть, как это работает. И ничего не понял( Я ввожу в браузере запрос с передаваемым хеш-параметром url в urlencoded виде: https://nakarte.me/#url=http%3A%2F%2Fvelotrex.ru%2Ffiles%2F1545821256_5c235c4824f4b.xml Но ничего не происходит, трек в nakarte.me не загружается. Что я делаю не так? Нельзя ли привести пример полного запроса для загрузки трека на основе URL?

wladich commented 5 years ago

@ancrane, да параметры немного поменялись. Объявление о релизе: http://about.nakarte.me/2018/12/movescount-gpslib.html Документация: https://docs.nakarte.me/hashParams.html

ancrane commented 5 years ago

Спасибо! Заработало)

ancrane commented 5 years ago

Добрый день!

Обнаружил такой глюк: проставка километража вдоль трека сбивается несколько раз, начинается набор заново с нуля.  Вот здесь это проявляется:  https://nakarte.me/#m=12/52.14476/37.15250&l=O&nktl=bOpEGVs0-CjAVwFBFEPNdw   Подозреваю, что дело в многосегментном треке. Но общий километраж же считается правильно!

Воскресенье, 30 декабря 2018, 18:11 +02:00 от Sergej Orlov notifications@github.com:

@ancrane , да параметры немного поменялись. Объявление о релизе: http://about.nakarte.me/2018/12/movescount-gpslib.html Доскументация: https://docs.nakarte.me/hashParams.html — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub , or mute the thread .

-- Антон Журавлёв

sikmir commented 5 years ago

Километраж для каждого сегмента отдельно проставляется, так что тут все by design.

ancrane commented 5 years ago

Ну тогда как минимум нелогично, что общий километраж считается суммарный, а на треке возникают обнуления. Простому юзверю невдомёк, что это из-за того, что у него трек из нескольких сегментов состоит. Ему это видится как баг. Предлагаю всё же это поправить.

Вторник, 30 июля 2019, 21:43 +02:00 от Nikolay Korotkiy notifications@github.com:

Километраж для каждого сегмента отдельно проставляется, так что тут все by design. — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub , or mute the thread .

-- Антон Журавлёв

sikmir commented 5 years ago

Ну тогда как минимум нелогично, что общий километраж считается суммарный, а на треке возникают обнуления.

На то он и "суммарный". А трек на сегменты например часто намеренно разбиваю, чтобы видеть километровые отметки отдельно для каждого сегмента. Как раз таки логично.

Простому юзверю невдомёк, что это из-за того, что у него трек из нескольких сегментов состоит. Ему это видится как баг. Предлагаю всё же это поправить.

А смысл ориентироваться на условного "простого юзверя"? Он может просто не использовать сегменты.

ancrane commented 5 years ago

Если честно, не вижу задач, когда может понадобиться принудительная разбивка на сегменты с отображением километража каждого сегмента... В этом случае проще сделать несколько треков, ИМХО. И каждый из них настраивать уже по-своему... А вот когда на одном треке внезапно обнуляется километраж - это по меньшей мере странно. Тогда уж надо предусмотреть возможность настраивания отображения таких треков посегментно, если продолжать логику.

Вторник, 30 июля 2019, 22:17 +02:00 от Nikolay Korotkiy notifications@github.com:

Ну тогда как минимум нелогично, что общий километраж считается суммарный, а на треке возникают обнуления. На то он и "суммарный". А трек на сегменты например часто намеренно разбиваю, чтобы видеть километровые отметки отдельно для каждого сегмента. Как раз таки логично. Простому юзверю невдомёк, что это из-за того, что у него трек из нескольких сегментов состоит. Ему это видится как баг. Предлагаю всё же это поправить. А смысл ориентироваться на условного "простого юзверя"? Он может просто не использовать сегменты. — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub , or mute the thread .

-- Антон Журавлёв

ancrane commented 5 years ago

И, раз уж зашёл разговор: проверил исходный трек ДО загрузки на nakarte.me - он был моносегментным. Т.е. сегменты по какой-то причине возникли на Nakarte.me

Вот ссылка на исходный трек:  http://velotrex.ru/get_gpx.php?file=1563822553_5d3609d97bf90  

Вторник, 30 июля 2019, 22:24 +02:00 от Антон Журавлёв cybercrane@mail.ru:

Если честно, не вижу задач, когда может понадобиться принудительная разбивка на сегменты с отображением километража каждого сегмента... В этом случае проще сделать несколько треков, ИМХО. И каждый из них настраивать уже по-своему... А вот когда на одном треке внезапно обнуляется километраж - это по меньшей мере странно. Тогда уж надо предусмотреть возможность настраивания отображения таких треков посегментно, если продолжать логику.

Вторник, 30 июля 2019, 22:17 +02:00 от Nikolay Korotkiy < notifications@github.com >:

Ну тогда как минимум нелогично, что общий километраж считается суммарный, а на треке возникают обнуления. На то он и "суммарный". А трек на сегменты например часто намеренно разбиваю, чтобы видеть километровые отметки отдельно для каждого сегмента. Как раз таки логично. Простому юзверю невдомёк, что это из-за того, что у него трек из нескольких сегментов состоит. Ему это видится как баг. Предлагаю всё же это поправить. А смысл ориентироваться на условного "простого юзверя"? Он может просто не использовать сегменты. — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub , or mute the thread .

-- Антон Журавлёв

-- Антон Журавлёв

sikmir commented 5 years ago

Если честно, не вижу задач, когда может понадобиться принудительная разбивка на сегменты с отображением километража каждого сегмента... В этом случае проще сделать несколько треков, ИМХО. И каждый из них настраивать уже по-своему...

Например есть у нас трек похода дней на 10, я всегда разбиваю каждый день - отдельный сегмент, делать 10 треков вместо этого не логично (все дни - суть одно мероприятие) и не удобно (нельзя загрузить одним файлом), к тому же тогда общий километраж вообще не будет виден. С другой стороны километровые маркеры интересуют в большей степени для каждого дня с нуля, а не глобальные на весь поход.

sikmir commented 5 years ago

Вот ссылка на исходный трек: http://velotrex.ru/get_gpx.php?file=1563822553_5d3609d97bf90

Проверил, у меня все корректно оборажается, один сегмент, маркеры не обнуляются.

ancrane commented 5 years ago

Вот это и странно - у меня тоже один сегмент... Видимо, тот первый трек был изначально мультисегментным, а потом уже преобразован в односегментный, после заливки на Nakarte.me.

Ладно, вроде бы разобрались, спасибо)

Вторник, 30 июля 2019, 22:39 +02:00 от Nikolay Korotkiy notifications@github.com:

Вот ссылка на исходный трек: http://velotrex.ru/get_gpx.php?file=1563822553_5d3609d97bf90 Проверил, у меня все корректно оборажается, один сегмент, маркеры не обнуляются. — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub , or mute the thread .

-- Антон Журавлёв

tarwirdur commented 5 years ago

Можно, например, отображать оба числа как segment (total). E.g. 11км (120км)

myadzel commented 5 years ago

делать 10 треков вместо этого не логично (все дни - суть одно мероприятие) и не удобно (нельзя загрузить одним файлом)

Если верить схеме GPX (https://www.topografix.com/gpx/1/1/gpx.xsd), то вполне логично.

Узел trkseg:

A Track Segment holds a list of Track Points which are logically connected in order. To represent a single GPS track where GPS reception was lost, or the GPS receiver was turned off, start a new Track Segment for each continuous span of track data.

Узел trk:

A list of tracks.

См. также #248.

myadzel commented 5 years ago

Я предлагаю визуально как-то размечать сегменты, как на карте, так и на профиле.

slazav commented 5 years ago

Про сегменты у меня есть две явно разные задачи:

Мне было бы удобно, если бы километраж по сегментам считался отдельно, как сейчас, но была бы возможность объединить все сегменты трека (как отдельный пункт меню). В большинстве случаев реальный трек удобно склеить в один сегмент.

sikmir commented 5 years ago

Если сегментов много, то склеивать их вручную долго.

Just in case, I use gpxtools for that:

$ gpxcat --help
Usage: gpxcat [OPTION].. [FILE]
Concat the track segments in a GPX-file.

   -?, --help              display this help and exit
       --version           display version and exit
   -d, --distance=METRES   concat only if both segments are less than METRES apart

Concatenate the track segments in a GPX-file and display the resulting GPX-file on standard output.
slazav commented 5 years ago

Ну, локально я и сам умею. И фильтровать лишние точки тоже. Хочется разделять треки "для хранения", с высотами, временами и т.п. и "для показа" в nakarte.me. Делать и хранить у себя локально еще одну версию "для показа" не очень хочется.