Обратное геокодирование

Установка последней версии Docker Compose на CentOS 7

Сообщение от вас:

Чтобы установить последнюю версию Docker Compose на CentOS 7, выполните следующие шаги:

  1. Установите Docker:

    • Установите репозиторий Docker:
      sudo yum install -y yum-utils
      sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      
    • Установите Docker:
      sudo yum install -y docker-ce docker-ce-cli containerd.io
      
    • Запустите и активируйте Docker:
      sudo systemctl start docker
      sudo systemctl enable docker
      
  2. Установите Docker Compose:

    • Загрузите последнюю версию Docker Compose:
      sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
      
    • Дайте права на выполнение файлу Docker Compose:
      sudo chmod +x /usr/local/bin/docker-compose
      
    • Создайте символическую ссылку:
      sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
      
  3. Проверьте установку Docker Compose:

    docker-compose -v
    

Теперь вы должны увидеть версию Docker Compose, которую вы установили.

 

Быстрый, самостоятельно размещённый сервис обратного геокодирования, построенный на основе данных OpenStreetMap. Имея координаты широты и долготы, он возвращает ближайший адрес улицы, включая номер дома, название улицы, город, штат, округ, почтовый индекс и страну.

Особенности

  • Обратное геокодирование на уровне улицы на основе данных OSM
  • Поиск по адресной точке, названию улицы и интерполяции по адресу
  • Определение административных границ (страна, штат, округ, город, почтовый индекс)
  • Субмиллисекундная задержка запросов с индексными файлами, отображаемыми в памяти
  • Автоматический HTTPS с Let's Encrypt
  • Поддержка Docker с автоматической загрузкой и индексацией PBF

Быстрый старт

Docker Compose

services:
  geocoder:
    image: traccar/traccar-geocoder
    environment:
      - PBF_URLS=https://download.geofabrik.de/europe/monaco-latest.osm.pbf
    ports:
      - "3000:3000"
    volumes:
      - geocoder-data:/data

volumes:
  geocoder-data:
 
docker compose up
 

Docker

# All-in-one: download, build index, and serve
docker run -e PBF_URLS="https://download.geofabrik.de/europe-latest.osm.pbf" \
  -v geocoder-data:/data -p 3000:3000 traccar/traccar-geocoder

# Build index only
docker run -e PBF_URLS="https://download.geofabrik.de/europe-latest.osm.pbf" \
  -v geocoder-data:/data traccar/traccar-geocoder build

# Serve only (from pre-built index)
docker run -v geocoder-data:/data -p 3000:3000 traccar/traccar-geocoder serve

# Multiple PBF files
docker run -e PBF_URLS="https://download.geofabrik.de/europe/france-latest.osm.pbf https://download.geofabrik.de/europe/germany-latest.osm.pbf" \
  -v geocoder-data:/data -p 3000:3000 traccar/traccar-geocoder

# With automatic HTTPS
docker run -e PBF_URLS="https://planet.openstreetmap.org/pbf/planet-latest.osm.pbf" \
  -e DOMAIN=geocoder.example.com \
  -v geocoder-data:/data -p 443:443 traccar/traccar-geocoder
 

Файлы PBF можно скачать с Geofabrik.

Полный индекс Земли займёт около 18 ГБ дискового пространства, поэтому для высокой производительности нужен компьютер с минимум 16 ГБ оперативной памяти или быстрый NVME-носитель.

API

GET /reverse

Параметры запроса:

  • lat - широта (требуется)
  • lon - долгота (требуется)
  • key - Ключ API (обязательно)

Пример запроса:

GET /reverse?lat=43.7384&lon=7.4246&key=YOUR_API_KEY
 

Ответы следуют формату Nominatim:

{
  "display_name": "Avenue de la Costa 42, 98000 Monaco, Monaco",
  "address": {
    "house_number": "42",
    "road": "Avenue de la Costa",
    "city": "Monaco",
    "state": "Monaco",
    "county": "Monaco",
    "postcode": "98000",
    "country": "Monaco",
    "country_code": "MC"
  }
}
 

Поля опускаются, когда они недоступны.

Коды статуса:

  • 200 - успех
  • 401 - отсутствующий или некорректный ключ API
  • 429 - превышенный лимит ставки

Аутентификация

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

Архитектура

Проект состоит из двух компонентов:

  • Builder (C++) — парсирует файлы OSM PBF и создаёт компактный бинарный индекс с использованием ячеек геометрии S2 для пространственного поиска.
  • Server (Rust) — отображает файлы индекса памяти и отправляет запросы через HTTP/HTTPS с задержкой до миллисекунды.

Структура индекса

Сборщик создаёт 14 бинарных файлов:

Файл Описание
geo_cells.bin Объединённый индекс ячеек S2 для улиц, адресов и интерполяций
street_entries.bin Уличные идентификаторы на ячейку
street_ways.bin Заголовки уличных путей (смещение узлов, название)
street_nodes.bin Координаты уличных узлов
addr_entries.bin ID адресных точек на ячейку
addr_points.bin Данные адресных точек (координаты, номер дома, улица)
interp_entries.bin ID путей интерполяции на ячейку
interp_ways.bin Интерполяционные заголовки пути
interp_nodes.bin Координаты узла интерполяции
admin_cells.bin Индекс ячеек S2 для границ администратора
admin_entries.bin Идентификаторы полигонов администратора на ячейку
admin_polygons.bin Метаданные админских полигонов
admin_vertices.bin Вершины админ-полигонов
strings.bin Дедупликационный пул струн

Строительство из источника

Предварительные условия

Builder (C++):

  • CMake 3.16+
  • Компилятор C++17
  • libosmium, protozero, s2geometry, zlib, bzip2, expat

Сервер (Rust):

  • Инструментарий Rust

Строительство

# Build the indexer
mkdir build && cd build && cmake ../builder && make

# Build the server
cargo build --release --manifest-path server/Cargo.toml
 

Беги

# Create index from PBF file
./build/build-index output-dir input.osm.pbf [input2.osm.pbf ...]

# Start the server
./server/target/release/query-server output-dir [bind-address]

# Start with automatic HTTPS
./server/target/release/query-server output-dir --domain geocoder.example.com
 

Переменные среды (Docker)

Переменная Описание По умолчанию
PBF_URLS Разделённый по пробелу список URL для загрузки PBF (требуется для авто/сборки)
DOMAIN Доменное имя для автоматического HTTPS через Let's Encrypt (отключённый)
BIND_ADDR HTTP-адрес связи 0.0.0.0:3000
DATA_DIR Каталог данных для PBF-файлов и индекса /data
CACHE_DIR Каталог кэша сертификатов ACME acme-cache

Движение, поездки и остановки

 

Стандартизированный атрибут движения был введен для обеспечения универсального способа обработки движения устройства для всех протоколов. Некоторые устройства сообщают об этом атрибуте напрямую. Для других устройств он автоматически рассчитывается на основе значения скорости и параметра speedThreshold . Также возможно переопределить его с помощью вычисляемых атрибутов .

Система анализирует положение и переключает состояние движения в соответствии с конфигурацией. Traccar переключает состояние с «остановился» на «двигался» , если устройство сообщает о движении как об истинном в течение более minimalTripDuration секунд или если пройденное расстояние превышает minimalTripDistance метров. Traccar переключает состояние с «двигался» на «остановился» , если устройство сообщает о движении как о ложном в течение более minimalParkingDuration секунд или если включена функция useIgnition , а зажигание выключено. Переключение состояния возможно только в течение непрерывных периодов; любые колебания приводят к сбросу обнаружения.

Для настройки логики обнаружения можно использовать следующие параметры:

  • report.trip.minimalTripDuration - поездки меньшей продолжительности и расстояния, чем минимальная продолжительность, игнорируются. По умолчанию 300 секунд и 500 метров.
  • report.trip.minimalTripDistance — поездки меньшей продолжительности и расстояния, чем минимальное значение, игнорируются. По умолчанию — 300 секунд и 500 метров.
  • report.trip.minimalParkingDuration - остановки с продолжительностью менее минимальной не отображаются как остановки. По умолчанию 300 секунд.
  • report.trip.minimalNoDataDuration — промежутки в сообщаемых позициях, превышающие это значение, считаются остановками (только в отчетах). По умолчанию 3600 секунд.
  • report.trip.useIgnition - принудительно переводит переключатель в состояние "стоп", если сообщается о выключенном зажигании. По умолчанию отключено.

Новая логика поездки

Если параметр report.trip.newLogic включен, Traccar использует альтернативную модель движения, основанную на пространственной кластеризации, вместо того, чтобы полагаться только на изменения скорости. Движение начинается после того, как устройство достаточно далеко отходит от последней точки отсчета движения, и останавливается после того, как устройство остается в ограниченной области в течение минимального времени. Такой подход уменьшает количество ложных срабатываний при коротких паузах. Длительные перерывы в поступающих данных также могут разделять интервалы движения, чтобы сделать временные рамки поездок более реалистичными.

  • report.trip.minDistance - минимальное расстояние, необходимое для переключения в режим движения. По умолчанию 200 метров.
  • report.trip.minDuration - минимальное время простоя, необходимое для перехода в состояние "остановка". По умолчанию 180 секунд (3 минуты).
  • report.trip.stopGap - продолжительность перерыва, по истечении которого перемещение может быть разделено в зависимости от отсутствующих данных. По умолчанию 3600 секунд (1 час).

Поездки и остановки

Traccar предоставляет два расширенных типа отчетов: «Поездки» и «Остановки». Для определения поездок и остановок в этих отчетах используется один и тот же алгоритм обнаружения движения. Отчет об остановках может обнаруживать промежутки между указанными положениями и рассматривать их как остановку.

Примеры

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

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

Поездка 1 обнаружена, поскольку период начался с нулевой скорости (инициализированной как остановка), расстояние превышает стандартные 500 метров или продолжительность превышает 5 минут, и за ней следует остановка, продолжительность которой превышает minimalParkingDuration .

Остановка 1 обнаружена, поскольку ее продолжительность превышает minimalParkingDuration , а скорость близка к нулю.

Поезд 2 определяется из строки 27; строки 24–25 игнорируются как колебания. Параметры превышают минимальные, и ему предшествуют и следуют позиции с нулевой скоростью.

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

Параметр report.trip.minimalNoDataDuration установлен на 600 (10 минут). Видно, что скорость никогда не бывает меньше значения speedThreshold , но промежуток (строки 15–28) составляет более 10 минут. Это интерпретируется как остановка. Предыдущая поездка определяется корректно. Последующий период движения не определяется как поездка, поскольку алгоритм не может определить, когда он заканчивается. Записываются только полные остановки или поездки.

Геозоны

 

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

Поддерживаются три типа геометрии:

Многоугольник

Полилайн

Круг

Разрешения

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

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

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

Календари можно привязать к геозонам. Это позволит ограничить генерацию событий расписанием календаря.

Прочая информация

Расстояние вокруг полилинейной геозоны, если устройство считается находящимся внутри геозоны, можно настроить с помощью параметра конфигурации geofence.polylineDistance (по умолчанию 25 метров).

Цвет геозоны на карте можно задать в атрибуте ` color` геозоны . Допускаются любые допустимые HTML-цвета.

Если вам необходимо контролировать перемещение устройства по заданному маршруту, вы можете использовать геозону из полилиний. Кроме того, если вам необходимо контролировать начало и конец маршрута, вы можете добавить дополнительные геозоны в начале и в конце маршрута.

События и уведомления

Fornavi поддерживает несколько различных типов событий . Большинство событий генерируются на стороне сервера на основе данных, сообщаемых устройствами. Существует специальный тип события «тревога» , который представляет собой события, непосредственно сообщаемые устройствами.

Каждый пользователь может настроить уведомления для определенных типов событий. Уведомления могут отправляться по одному или нескольким каналам, таким как электронная почта, push-уведомления, SMS и другие. Уведомление может быть включено для всех устройств или привязано к отдельным устройствам или группам устройств. События генерируются и доступны для просмотра в отчете о событиях, даже если для определенного устройства и типа события не настроены уведомления. Уведомления можно настроить в меню настроек:

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

Также можно ограничить время уведомлений с помощью календаря .

Типы событий

Тип Описание
Результат выполнения команды Результат выполнения команды на устройстве. Поддержка результатов зависит от протокола. Подробная информация о результате хранится в атрибуте result .
Статус онлайн Устройство подключено к серверу. Этот тип события не связан с местоположением.
Статус неизвестен Устройство подключено, но в течение некоторого времени не передавало никаких данных. Это также может указывать на то, что устройство не завершило соединение корректно.
Статус: Не в сети Устройство отключилось от сервера.
Устройство неактивно Устройство не передавало данные о местоположении в течение очень длительного периода времени. Это событие необходимо явно включить, используя атрибуты deviceInactivityStart и deviceInactivityPeriod .
Перемещение устройства Устройство находится в движении. Более подробную информацию о логике см. в документации по поездкам и остановкам .
Устройство остановлено Устройство остановлено. Более подробную информацию о логике см. в документации по поездкам и остановкам .
Превышена разрешенная скорость Это событие генерируется, когда устройство превышает установленный лимит скорости. Пороговое значение можно установить с помощью атрибута speedLimit устройства, группы или сервера .
Сброс топлива Резкое падение уровня топлива выше порогового значения fuelDropThreshold . Для корректной работы этого события устройство должно поддерживать отображение уровня топлива.
Увеличение расхода топлива Резкое повышение уровня топлива сверх порогового значения fuelIncreaseThreshold . Для корректной работы этого события устройство должно поддерживать отображение уровня топлива.
Геозона введена Устройство вошло в геозону. Геозона должна быть связана с устройством или группой устройств.
Геозона закрыта Устройство вышло за пределы геозоны. Геозона должна быть связана с устройством или группой устройств.
Тревога Этот тип события представляет собой любые события/сигналы тревоги, зарегистрированные устройством. Существует большое количество подтипов. Некоторые сигналы тревоги могут дублировать события, но они генерируются непосредственно на устройстве, в отличие от событий, генерируемых на стороне сервера. Примеры сигналов тревоги приведены в разделе ниже.
Зажигание включено Значение напряжения зажигания изменилось с «выключено» на «включено». Это событие требует от устройства непрерывной передачи значения напряжения зажигания.
Зажигание выключено Значение параметра «зажигание» изменилось с «включено» на «выключено». Это событие требует от устройства непрерывной передачи значения параметра «зажигание».
Требуется техническое обслуживание Событие для периодического технического обслуживания. Для его выполнения требуется специальная настройка параметров обслуживания в параметрах. График технического обслуживания может быть привязан к устройству или группе устройств.
Водитель сменился. Это событие генерируется при изменении идентификатора драйвера. Идентификатор драйвера должен быть передан устройством. Простого указания драйвера в настройках недостаточно.
СМИ Событие, указывающее на то, что устройство загрузило медиаданные. Это может быть изображение, видео или аудиофайл. Поддержка зависит от протокола.

Типы сигналов тревоги

Список наиболее часто используемых сигналов тревоги. Список не является исчерпывающим.

Тип Описание
Общий Типичный случай, когда устройство не указывает тип тревоги.
СОС Паническая сигнализация. Этот тип сигнализации обычно срабатывает при нажатии кнопки на устройстве, но зависит от конкретной модели устройства.
Вибрация Обычно этот сигнал тревоги срабатывает, когда неподвижное устройство начинает двигаться. Часто он основан на показаниях акселерометра, встроенного в устройство.
Превышение скорости Сигнализация превышения скорости. Она похожа на оповещение о превышении скорости , но генерируется самим устройством, поэтому может быть более точной, если ваше устройство поддерживает эту функцию.
Низкое энергопотребление Напряжение внешнего источника питания низкое.
Низкий заряд батареи Уровень заряда внутренней батареи низкий.
Геозона Аналогично серверному событию, но генерируется на устройстве, поэтому может быть более точным, если ваше устройство его поддерживает.
Выход из геозоны Аналогично серверному событию, но генерируется на устройстве, поэтому может быть более точным, если ваше устройство его поддерживает.
Вмешательство Устройство подвергается несанкционированному вмешательству. Обычно это указывает на то, что кто-то вскрыл корпус устройства, но тип датчика и механизм срабатывания зависят от конкретной модели устройства.

Управление пользователями

 

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

Основные роли пользователей

Администратор — суперпользователь с полным неограниченным доступом ко всему серверу Traccar.

Менеджер — пользователь с расширенными возможностями, позволяющими ему управлять подмножеством пользователей и регистрировать новых.

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

Ограниченные роли пользователей

Пользователь с правами только для чтения — это пользователь, который не может добавлять, редактировать или удалять что-либо в системе. Он может только отслеживать назначенные ему объекты. Может быть полезен для публичного/встроенного доступа.

Пользователь с правами только для чтения — обычный пользователь с ограничениями на управление устройством. Другие настройки можно редактировать без ограничений.

Ограничения для пользователей

Ограничение на количество устройств — лимит на число устройств, которые может иметь пользователь. Пользователь не может добавить больше устройств, чем позволяет его лимит .

Если параметр «ограничение на количество устройств» установлен на -1 , это означает, что у пользователя нет ограничений на количество устройств.

Если лимит устройств установлен на 0 , это означает, что пользователь не может добавлять устройства, но может редактировать или удалять существующие.

Ограничение на количество пользователей — лимит на число пользователей, которое может иметь менеджер. Менеджер не может добавить больше пользователей, чем позволяет его лимит .

Если лимит пользователей установлен на -1 , это означает, что у менеджера нет ограничений.

Если лимит пользователей установлен на 0 , это означает, что пользователь не является менеджером. Разница между менеджером и обычным пользователем заключается в значении лимита пользователей . У менеджера лимит пользователей не равен 0 .

Изменять эти поля может только администратор .

У пользователя, созданного менеджером, оба лимита всегда будут иметь нулевое значение.

Для самостоятельно зарегистрированных пользователей ограничение на количество устройств будет установлено на -1 или значение из параметра users.defaultDeviceLimit в конфигурации сервера .

Срок действия — время, по истечении которого пользователь не может войти в систему.

Отключено — пользователь не сможет войти в систему, если его учетная запись отключена .

Пользователь или менеджер не могут редактировать эти два поля в своих учетных записях.

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

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

Встроенный или публичный просмотр

Начнём с создания пользователя:

  • Зарегистрировать нового пользователя
  • Предоставьте пользователю доступ только для чтения.
  • Сгенерировать токен для пользователя.

Теперь пользователь может войти в систему, используя токен в URL-адресе. Например: http://hosting.fornavi.ru/?token=ABCDEFGHIJKLMN .

Traccar как сервис

Администратор сервиса может создать одного пользователя -менеджера для каждого клиента, установить ограничение на количество пользователей и устройств в соответствии с подпиской. Например, 5 пользователей и 50 устройств. Он также может установить время истечения срока действия подписки.

В приведенном выше примере клиент может добавить 5 пользователей и 50 устройств, связать устройства с пользователями, создавать и связывать группы, геозоны и все остальное в пределах указанных ограничений.

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