Эта утилита работает с открытыми данными по Санкт-Петербургу в формате csv-таблиц, размещенными на сайте http://data.gov.spb.ru/. Она анализирует файлы с музеями и достопримечательностями.
Компиляция утилиты осуществлется с помощью подключения в командной строке директории, которая содержит исходный код и выполнения команды make. Дальнейший запуск осуществляется командой:
./opendata_search.out <ключи>
. Формат ключа -key, далее через пробел передается значение ключа, например -geosearch 30.624,59.895,65
.
Поддерживаемые ключи: -file, -search, -geosearch, -limit, -complexsearch, -complexgeosearch.
Файлы для поиска передаются в утилиту с помощью ключа -file:
./opendata_search.out -file test_data.csv
Если файл не задан явно, поиск осуществляется в файлах по умолчанию (./data/data-museums.csv и ./data/data-sights.csv). Сначала загружается файл с музеями, потом - с достопримечательностями.
Утилита имеет искать файлы по фрагменту названия, описания или исторической справки.
Для использования этой функции вызовите утилиту с ключом -search <фрагмент>.
Например, следующий запуск: ./opendata_search.out -search памятник
вернет все объекты, содержащие слово "памятник" в названии, описании или исторической справке. Если в поисковом запросе содержится несколько слов, необходимо заключить запрос в двойные кавычки, например -search "Аничков дворец".
Также утилита умеет искать объекты по заданным координатам и радиусу поиска, задаваемому в метрах.
Следующая команда: ./opendata_search.out -geosearch 56.389,30.689,4000
вернет объекты, находящиеся в радиусе 4 километров от точки с координатами 56.389, 30.689 (в долях градусов), напечатав их название, адрес и расстояние от заданной точки.
Обратите внимание, что разделителем является знак запятой, пробелы между координатами, радиусом не допускаются!
Утилита использует специальный ключ -limit для работы в режиме ограниченной памяти. Ключ limit ограничивает количество десериализованных объектов, которые могут одновременно хранится в оперативной памяти компьютера.
Пример использования: ./opendata_search.out -limit 50
- количество хранящихся в памяти объектов не будет превышать 50 в любой момент исполнения.
В утилите присутствует ключ -complexsearch для специального режима поиска по полям объектов. В этом режиме перед выполнением поиска все культурные объекты преобразуются в несколько коллекций (по одной коллекции на каждое из полей для поиска - имя, адрес, описание и историческая справка): std::map<std::string, std::vector<CulturalObject *>>
, где ключами являются все слова, содержащиеся в поле объекта (например, для строки "Невский пр-т, д.37" такими словами будут "Невский", "пр-т," и "д.37"), а значением - массив (вектор) указателей на объекты, которые содержат это слово в заданном поле. После такого преобразованияполученный поисковый запрос разбивается на слова по пробельному символу и осуществляется быстрый поиск по добавленным ключам. Пример вызова: ./opendata_search.out -complexsearch "Меншиковский дворец"
. Поиск в этом режиме не поддерживает ключ -limit, а также, если был получен поисковый запрос с ключом -search, то он будет сброшен и перезаписан запросом -complexsearch.
Последний из ключей, распознаваемых утилитой - -complexgeosearch. Формат вызова и результат совпадает с вызовом -search, но утилита перед поиском разбивает город на квадраты с размером стороны 1000 метров, и далее получает список квадратов, граничащих с переданной точкой, и осуществляет поиск только в них. Обратите внимание, что в этом режиме карта города ограничена территорией Санкт-Петербурга, и поиск за его пределами (например, в Ленинградской области) в общем случае не будет осуществляться.
Утилита поддерживает комбинации ключей (-file, -search и -limit); (-file, -geosearch и -limit); (-complexsearch и -geosearch). При вызове -search и -geosearch одновременно будут последовательно найдены сначала объекты, поля которых совпадают с полученным объектом, а затем - будут найдены объекты по координатам. При этом, если был использован также ключ -limit , результаты будут выводится на печать последовательно и порционно: сначала поиск по полям N объектов, затем поиск по координатам N объектов, и так далее до конца файла.
Утилита начинает свою работу сразу после вызова ее в комнадной строке, найденные объекты распечатываются в стандартный консольный вывод непосредственно после обнаружения совпадений. Во время чтения файла, а также преобразования файлов в структуру вектора карт в случае вызова утилиты с ключом -complexsearch в консоли отображается простой прогресс-бар, показывающий прогресс в процентах от количества требуемых объектов, которые нужно считать или преобразовать. Во время исполнения программы результаты выводятся на печать незамедлительно в случае нахождения объектов, поэтому прогресс-бар на этом этапе не предусмотрен.