Введение
В современном мире конкуренция на рынке розничной торговли становится все более интенсивной. Для успешного ведения бизнеса компаниям необходимо не только привлекать новых клиентов, но и эффективно анализировать деятельность своих конкурентов. Одним из ключевых инструментов в этом процессе является анализ торговых точек конкурентов, который позволяет выявить их сильные и слабые стороны, а также определить потенциальные возможности для собственного развития [1].
Геолокационные данные играют важную роль в этом анализе, так как позволяют точно определить местоположение торговых точек, их доступность для клиентов и другие важные параметры. Однако сбор и обработка таких данных требуют использования специализированных информационных систем, которые могут эффективно обрабатывать большие объемы информации и предоставлять их для дальнейшего анализа [2–4].
В 2016 г. обязанность применять при расчетах в торговле онлайн-кассы охватила практически всех предпринимателей [5]. Для фискализации платежей бизнесу необходимо подключение к оператору фискальных данных (ОФД) – компании, которая принимает информацию с онлайн-касс, передает сведения о продажах в федеральную налоговую службу (ФНС) [6]. При регистрации/перерегистрации кассы в ФНС ей присваивается уникальный идентификатор ФИАС ID, необходимый для идентификации конкретного адреса в базе данных Федеральной информационной адресной системы (ФИАС), и заполняются координаты здания, в котором она находится. В итоге получают множество торговых точек, каждая из которых имеет свои геокоординаты, хранящиеся в базе данных.
Личный кабинет клиента (ЛКК) и партнера на сайте ОФД оснащены уникальным функционалом, позволяющим создавать нужные шаблоны всевозможных данных по статистике продаж в автоматическом режиме. Все чеки кассы проходят через ОФД, из этого складывается возможность на основе данных предоставлять различную аналитику продаж клиенту. Также в ЛКК реализована логика сравнения торговых точек клиента на основе их выручки. Адрес установки подтягивается автоматически из последнего отчета с данными о регистрации/перерегистрации кассы.
В настоящее время для анализа торговых точек конкурентов можно использовать известные приложения-аналоги, например 2GIS, Wikimapia, OpenStreetMap, Яндекс Карты и др. [7, 8]. Однако следует отметить, что они не обладают достаточной функциональностью, необходимой для анализа торговых точек конкурентов по следующим критериям: возможность просмотра своих торговых точек, разделение на свои и чужие, информация об удаленности точки, просмотр конкурентов из другой области бизнеса, частота актуализации информации, поиск конкурентов в определенном радиусе.
Цель исследования – вычислительное моделирование месторасположения торговых объектов, позволяющее предоставить клиенту необходимые данные для анализа торговых точек конкурентов на основе их геолокационных данных в виде встраиваемого в приложения виджета.
Для достижения цели требуется решить следующие задачи:
1) cформулировать требования к разрабатываемой модели и алгоритмам;
2) разработать математическую и алгоритмическую модели поиска точек на карте в заданном радиусе от исходной, провести их тестирование;
3) разработать программную реализацию модели в виде клиент-ориентированного виджета.
Материалы и методы исследования
Реализация функционала виджета «Maps» – отображение и сравнение торговых точек конкурентов по коду общероссийского классификатора видов экономической деятельности (ОКВЭД) и удаленности от торговых точек клиента в ЛКК на сайте осуществлялась по результатам вычислительного моделирования месторасположения торговых объектов на основе их географических координат. Разработка такого геоаналитического виджета требует реализации клиент-серверной архитектуры с агрегацией данных на бэкенде [9]. Для обеспечения скорости загрузки не более 15 с, все вычисления, привязку к кодам ОКВЭД и фильтрацию следует проводить на стороне сервера.
При реализации данной архитектурно-технической структуры исходили из следующих требований к виджету: 1) возможность выбора кода ОКВЭД для поиска торговых точек конкурентов; 2) возможность скрытия отображения своих торговых точек; 3) возможность выбора радиуса отображения точек конкурентов, совпадающих коду ОКВЭД, заданному в поиске; 4) время отображения данных в разделе должно занимать не более 15 с.
Использование в виджете алгоритма поиска точек в заданном радиусе от исходной с применением предлагаемых в работе ограничений позволит уменьшить время обработки данных и понизить нагрузку на систему.
Исследования основаны на использовании методов математического моделирования и объектно-ориентированного программирования.
Моделирование месторасположения объектов на карте и определение расстояний между ними. Задача определения расстояний между объектами на земной поверхности по географическим координатам (широта и долгота) имеет огромное значение в различных областях человеческой деятельности. Однако особенности формы Земли, используемые на практике методы расчета расстояний, каждый из которых обладает своими преимуществами и недостатками, уменьшение длины градуса долготы по направлению к полюсам не позволяют точно определять расстояния между объектами [10–12].
Исходя из физической формы Земли при выполнении расчетов полагали, что расстояние между двумя параллелями, отличающимися на 1° по широте, равно 111,11 км, а длина 1° долготы уменьшается к полюсам в зависимости от широты и составляет
Lп = Lэ ∙ cos(φ),
где Lп – длина дуги 1° параллели, Lэ – длина дуги 1° экватора, равная 111,3 км, φ – географическая широта точки [13, с. 25].
Моделирование процедуры поиска точек объектов от исходной в заданном радиусе. Задача моделирования заключается в том, чтобы из имеющегося множества точек объектов, имеющих географические координаты, отобрать все те, которые попадают в заданный радиус R от исходной. Тогда расстояние между двумя точками (φi, λi) и (φj, λj) можно рассчитать по следующему выражению:
, (*)
где (φi, λi) – географические координаты (широта, долгота) точки объекта А, (φj, λj) – географические координаты точки объекта B, Rзем – средний радиус Земли, равный 6371 км. Вычислительная сложность модели определяется используемым алгоритмом отбора точек из имеющегося множества точек, находящихся на земной поверхности.
Классический алгоритм полного перебора обеспечивает поиск всех вариантов решений за приемлемое время при относительно небольших размерах множества искомых точек. Однако при увеличении количества торговых объектов, вычислительная сложность данного алгоритма возрастает, что делает его малопригодным для больших наборов данных [14]. В связи с этим для сужения множества проверяемых точек и уменьшения вычислительной сложности принято решение использовать алгоритм, в основе которого лежит перебор элементов множества и их проверка на соответствие определенным ограничениям.
Алгоритм с применением ограничений
Полагали, что долготу (λ2) точки, расположенной на земной поверхности на расстоянии S от заданной, можно определить как
,
,
где (φ1, λ1) – широта и долгота заданной точки, Δλ – изменение долготы, S – расстояние от заданной точки.
Все точки, расположенные в пределах круга радиуса Rкр от заданной точки (φn, λn), попадают в прямоугольную область, ограниченную по широте φn ± Δφ и долготе λn ± Δλ. При этом Rкр = S, а Δφ зависит только от значения радиуса Rкр. Такой подход позволяет сократить объем проверок, поскольку достаточно рассмотреть только точки внутри области, ограниченной внешним квадратом со стороной 2∙Rкр, в который вписан данный круг.
Внутри этого круга можно выделить вписанный в него квадрат, длина стороны которого равна
∙Rкр. Следовательно, все точки, принадлежащие внутреннему квадрату, попадают в область, ограниченную
по широте 
и долготе
.
Рассмотрим особенности функционирования алгоритма.
1. Ввод исходных данных. Вводятся координаты заданной точки (φi, λi), определяется множество точек, из которых будет осуществлен отбор, задается радиус поиска Rкр.
2. Задание внешних ограничений в виде квадрата. Точки, находящиеся за его границами, исключаются из рассмотрения.
3. Задание внутренних ограничений в виде квадрата. Точки, находящиеся внутри его границ, будут отобраны без проверки.
4. Из множества оставшихся точек, расположенных между внешним и внутренним квадратами, выбираются координаты очередной непроверенной точки (φj, λj).
5. С помощью выражения (*) вычисляется расстояние между этими точками.
6. Проверяется условие попадания очередной точки в область с радиусом Rкр (L ≤ Rкр).
7. В случае выполнения условия очередная точка (φj, λj) выбирается для отображения.
8. Повторение этапов 4–7 до тех пор, пока множество точек не станет пустым.
Таким образом, для каждой исходной точки можно сразу определить подмножество точек, удовлетворяющих условию L ≤ Rкр, и не тратить время и вычислительные ресурсы на проверку неподходящих, что приводит к уменьшению количества итераций этапов 4–7 алгоритма. В итоге необходимо лишь проверить небольшую часть площади внешнего квадрата на присутствие требуемых точек, применяя формулу (*).
Разработанная модель предоставляет механизм для поиска всех точек объектов из множества возможных, находящихся в пределах заданного радиуса от начальной точки.
Результаты исследования и их обсуждение
Реализация алгоритма с применением ограничений. Программные эксперименты по исследованию предлагаемой модели проведены в СУБД Oracle с использованием средств интегрированной среды PL/SQL Developer. Так как в Oracle отсутствует специализированный тип данных для хранения градусов, информация о них представлена в числовом формате (geo_lat, geo_lon), совпадающем с форматом хранения данных в БД ФИАС.
Для корректного выполнения тригонометрических вычислений числовые данные переводятся в радианы с использованием функции RADIANS:

Поиск расстояния L между двумя точками с использованием выражения (*) реализован функцией GET_DISTANCE_KM:

Пример реализации алгоритма для поиска точек в радиусе 3 км от заданной:

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


а) б)
Рис. 1. Нагрузка при выполнении: а) алгоритма полного перебора, б) алгоритма с ограничениями Примечание: составлен авторами по результатам данного исследования
Таким образом, изменяя значение радиуса поиска Rкр в рассмотренном примере, можно найти географические координаты всех точек в любом радиусе от исходной точки с минимальными затратами вычислительных ресурсов [15].
Определение вычислительной сложности алгоритма с применением ограничений. На одном и том же наборе данных из БД одновременно были запущены два запроса: с использованием алгоритма полного перебора и алгоритма с применением ограничений. Оба алгоритма выдали одинаковые результаты в ответе. После их завершения были получены планы работы запросов с соответствующей нагрузкой (рис. 1).

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

Рис. 3. Выбор кода ОКВЭД Примечание: составлен авторами по результатам данного исследования
Время выполнения запроса (A-Time) алгоритмом полного перебора составило почти 2 мин. Время выполнения алгоритмом с ограничениями составило 3 с. Так же на основе полученной экспериментальным путем статистики используемых вычислительных ресурсов (Buffers, OMem, 1Mem) видно, что во втором случае сокращается нагрузка на БД.

Рис. 4. Торговые точки клиента на карте Примечание: составлен авторами по результатам данного исследования

Рис. 5. Отрисовка торговых точек конкурентов в радиусе 3 км Примечание: составлен авторами по результатам данного исследования

Рис. 6. Фрагмент трассировочного файла Примечание: составлен авторами по результатам данного исследования

Рис. 7. Схема алгоритма процедуры поиска точек Примечание: составлен авторами по результатам данного исследования
Программная реализация модели в виде виджета. Для доступа к карте с главной страницы ЛКК сайта был реализован виджет «Maps», содержащий информацию о количестве зарегистрированных касс клиента в каждом федеральном округе. Режим отображения точек имеет 4 различных параметра (рис. 2): 1) торговые точки клиента; 2) конкуренты, расположенные в пределах 3 км от торговых точек клиента; 3) конкуренты, расположенные в пределах от 3 до 10 км от торговых точек клиента; 4) конкуренты, расположенные в пределах от 10 до 20 км от торговых точек клиента. Необходимый код ОКВЭД выбирается из выпадающего списка (рис. 3) и определяется через связь в системе «онлайн-касса → ИНН → основной код ОКВЭД». Следует отметить, что поиск по коду ОКВЭД происходит по верхнему уровню.
После загрузки на карте отображаются торговые точки клиента (рис. 4). Отрисовка конкурентов в радиусе 3 км от торговой точки клиента изображена на рис. 5. При уменьшении масштаба точки группируются для удобства отображения их на карте. При поиске в радиусе 10 и 20 км круги визуально не выделяются. При выборе своей точки отобразится адрес, юрлицо, бренд, описание кода ОКВЭД и количество касс в данной точке. В торговых центрах, сдающих свои площади в аренду, адреса установки торговых точек разных предпринимателей совпадают. Для таких случаев предусмотрена логика объединения торговых точек в список, точки группируются по ФИАС ID.
Тестирование и оптимизация. Уменьшение времени загрузки карты. При открытии виджета спустя продолжительное время отображаются точки на карте. У клиентов с малым количеством касс загрузка происходит за пару секунд. На клиентах с числом касс близким к тысяче время ожидания занимает более 30 с. Если ожидание ответа превышает 60 с, сервер автоматически прервет выполнение метода и данные не отображаются.
На рис. 6 приведен фрагмент трассировочного файла, в котором виден SQL_ID запроса с самым долгим временем выполнения (elapsed total = 39.5).
Анализ плана запроса показал, что процедура Oracle, отвечающая за поиск точек для отрисовки на карте виджета, выполняется долго из-за большого числа исходных точек клиента, рядом с которыми происходит поиск других точек. Чем больше исходных точек, тем больше время выполнения процедуры.
Поскольку известно, что кассы редко меняют свое местоположение и проходят регистрацию, данные для ответа виджета меняются нечасто. Вследствие этого предлагается рассчитывать и обновлять их в фоновом режиме и после при необходимости подгружать их.
Таким образом, сокращается время ответа процедуры и, следовательно, время загрузки карты. На рис. 7 представлена схема алгоритма, реализующего данную процедуру после проведения оптимизации.
Необходимо отметить, что после доработки алгоритма время работы процедуры сократилось почти в 13 раз и не превысило 3 с, что отвечает изначально заданным требованиям к скорости отображения данных в виджете.
Заключение
Таким образом, разработаны математическая и алгоритмическая модели, позволяющие предоставить клиенту данные для анализа торговых точек конкурентов на основе их геоданных. Для поиска торговых точек конкурентов предложены и реализованы алгоритм поиска с применением предлагаемых в работе ограничений и позволяющий найти торговые точки конкурентов в любом радиусе от исходной точки за наименьшее время и с минимальными затратами вычислительных ресурсов; алгоритм отображения торговых точек конкурентов на карте, позволяющий сократить время их загрузки; структура хранения данных и функции СУБД Oracle для эффективного нахождения торговых объектов на карте.
Созданный на основе полученных моделей программный продукт в виде клиент-ориентированного виджета позволяет предоставить информацию для проведения анализа торговых точек конкурентов на основе геолокационных данных, информации из базы ОКВЭД и удаленности от торговых точек клиента. Пользователи могут использовать виджет в личном кабинете на сайте или интегрировать его в свою систему с помощью API.
Основные преимущества разработанного программного продукта заключаются в возможности выбора кода ОКВЭД для поиска торговых точек конкурентов; адаптивном выборе радиуса отображения точек конкурентов, совпадающих по коду ОКВЭД, заданному в поиске; возможности получения результатов поиска за меньшее время (время отображения данных на карте не превышает 15 с).