Доклад - ovcharik/TravelFoot GitHub Wiki

Геоинформационный сервис для пеших прогулок "TravelFoot".

Выполнили студенты группы ПС-427:

  • Лукманова Альфия
  • Никульшин Андрей
  • Овчарик Максим

Содержание.

1. База данных.

1.1. Выбор базы данных.

Для хранения данных используется документо-ориентированная система управления базами данных MongoDB.

Основные возможности:

  • Документо-ориентированное хранение (JSON-подобная схема данных)
  • Достаточно гибкий язык для формирования запросов
  • Динамические запросы
  • Поддержка индексов

MongoDB имеет функционал для работы с гео-пространственными запросами.

Для получения объектов расположенных в выбранном полигоне используется запрос "GeoWithIn".

Синтаксис запроса:

db.<collection>.find({
  <location field>: {
    $geoWithin: {
      $geometry: {
        type: "Polygon",
        coordinates: [
          [ [<lng1>, <lat1>] , [<lng2>, <lat2>], [...] ]
        ]
      }
    }
  }
})

Здесь, в качестве координат, в запрос передаются координаты, рассчитанного по полученному маршруту, полигона. Используются 2d-сферические координаты.

1.2. Схема данных.

Схема данных

1.3. Получение данных.

Заполнение данных в базу происходит с помощью парсинга ответов в JSON формате, по гео-запросам к сервису "Яндекс карты". Хостом для запроса является psearch-maps.yandex.ru.

Примерный запрос:

{
  "format" : "json",                // формат ответа
  "results": "100",                 // количество результатов
  "ll"     : "61.407778,55.160556", // координаты
  "spn"    : "0.5,0.5"              // протяженность области выбора
}

Область, в районе которой предположительно находятся искомые объекты.

Параметр ll задаёт долготу и широту центра области (в градусах), а spn - её протяженность (в градусах).

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

Поиск производится по следующим запросам:

  • памятник
  • фонтан
  • парк
  • мечеть
  • церковь
  • синагога
  • музей
  • театр

2. Пространственный запрос.

2.1. Описание.

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

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

2.2. Входные данные.

Входными данными является массив сегментов линий, получаемый от API Google, координаты точек начала и конца маршрута, типы достопримечательностей.

2.3. Выходные данные.

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

Алгоритм.

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

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

Для этого используются полярные координаты. Для того чтобы обойти полукруг необходимо взять угол обхода от 0 до PI / 2. Чтобы он отображался в нужном месте добавим к координатам, получаемым при обходе координаты центра полуокружности (точки начала и конца попеременно). Просчет координат выполняется в соответствии с длиной рассматриваемой прямой и угла, который она образует с осью x.

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

Теперь осталось только применить запрос.

2.4. Технологии.

Для выполнения геопространственного запроса используются возможности mongodb, в которой существует возможность создания географических данных в соответствии со стандартом OpenGIS. А также геопространственные запросы.

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

Параметрами запроса являются:

  • поле с геопространственным индексом (2d или 2dsphere)
  • тип геометрии, используемой для поиска (circle, box, polygon, ...)
  • координаты геометрической фигуры, заданной в виде массива координат

3. Общее описание.

3.1. Описание проекта.

Сервис для поиска оптимального маршрута по основным достопримечательностям города.

3.2. Зачем он нужен?

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

3.3. Пример.

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

3.4. Как он будет работать?

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

⚠️ **GitHub.com Fallback** ⚠️