Руководства

Добавление данных о высоте в GPX-файл маршрута

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

Извлечение точек

Разберите точки трека в GPX-файле, извлеките для каждой только широту и долготу и отбросьте имеющиеся значения высоты, которые вы собираетесь заменить.

<trkpt lat="45.8326" lon="6.8652"><ele>1050</ele></trkpt>

Получение правильной высоты

Отправьте извлечённые координаты в /v1/elevation: через параметр points для небольшого файла или массивом в пакетном POST-запросе для большого.

POST /v1/elevation
Content-Type: application/json

[{"lat": 45.8326, "lon": 6.8652}, {"lat": 45.8400, "lon": 6.8700}]
{
  "status": "ok",
  "results": [
    {"lat": 45.8326, "lon": 6.8652, "elevation_m": 1035},
    {"lat": 45.8400, "lon": 6.8700, "elevation_m": 1210}
  ]
}

Второй пример: проверка одной начальной точки маршрута

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

GET /v1/elevation?lat=45.8326&lon=6.8652

Он возвращает результат той же структуры с одной записью. Это удобно для выборочной проверки высоты в начале или конце маршрута, указанной в описании, без необходимости трогать весь GPX-файл.

Запись значений обратно

Результаты возвращаются в том же порядке, что и отправленные координаты, поэтому записывайте elevation_m обратно в тег ele каждой точки трека по позиции, заменяя исходное записанное значение полученным.

<trkpt lat="45.8326" lon="6.8652"><ele>1035</ele></trkpt>

Распространённая ошибка, которой стоит избегать

Не смешивайте в рамках одной задачи формат параметра запроса points и тело пакетного POST-запроса, если не соблюдаете единый способ сопоставления результатов с точками трека. И параметр points, и JSON-массив возвращают результаты в заданном порядке, но если получать координаты одной точки через параметр запроса, а остальных через пакетный POST-запрос, а затем объединять два набора ответов по предположению, а не по явному сопоставлению координат, легко внести ошибку смещения на единицу в записанный файл.

Сколько точек обогащать

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

Пограничный случай: прибрежные и низменные точки

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

Сколько это стоит

Каждая обогащённая точка равна одному запросу. Небольшой пеший трек из нескольких сотен точек, прореженный из гораздо более крупной исходной записи, спокойно укладывается в 2 500 бесплатных запросов в день, входящих в каждый ключ.

Такая очистка данных о высоте превращает неровный трек, записанный телефоном, в то, чем стоит поделиться или что стоит проанализировать. В документации по определению высоты описаны и параметр points, и формат пакетного запроса.