Как я разработал Geo Collector: бесплатная мобильная ГИС для iPhone без рекламы и обязательных подписок

React Native, Expo, GPS-трекинг, геоданные и немного размышлений о том, какой должна быть модель распространения небольшого независимого приложения.
Привет, Хабр!
Некоторое время назад я решил попробовать себя в разработке мобильных приложений. До этого основная часть моих проектов была связана с анализом данных, геоинформационными системами, образовательным программным обеспечением и серверными решениями.
Одним из результатов стал Geo Collector – мобильное приложение для iPhone, предназначенное для сбора географических данных непосредственно на местности.
Недавно приложение прошло проверку Apple и стало доступно в App Store.
Скачать Geo Collector: https://apps.apple.com/tr/app/geo-collector/id6822998937
В этой статье хочу рассказать, зачем я вообще решил разрабатывать собственное ГИС-приложение, какие технические задачи пришлось решать, почему особое внимание уделил работе с локальными данными и GPS-трекингу, а также почему отказался от рекламы и обязательных подписок.
Сразу оговорюсь: Geo Collector не претендует на замену QGIS или профессиональных геодезических комплексов. Это инструмент для другого сценария – когда нужно быстро собрать пространственные данные, имея под рукой только смартфон.
1. С чего всё началось
Геоинформационные технологии — одно из направлений, которыми я занимаюсь в образовательной и исследовательской деятельности.
При работе с пространственными данными довольно часто возникает необходимость не только анализировать готовые наборы данных, но и самостоятельно собирать информацию о реальных объектах.
Например, необходимо обследовать определённую территорию и зафиксировать:
Расположение отдельных объектов.
Протяжённость дорожек или маршрутов.
Границы интересующих участков.
Дополнительные характеристики объектов.
Фотографии, сделанные непосредственно на местности.
В идеальном случае процесс выглядит следующим образом:
Выходим на местность со смартфоном.
Создаём проект.
Фиксируем необходимые объекты.
При необходимости записываем GPS-маршрут.
Возвращаемся за компьютер.
Открываем собранные данные в настольной ГИС и продолжаем работу.
Конечно, приложения для подобных задач существуют. Есть как профессиональные решения, так и достаточно простые мобильные инструменты.
Однако мне хотелось реализовать собственный вариант, в котором основной упор будет сделан на несколько принципов.
Первый — минимальный порог входа.
Пользователь не должен разбираться в сложной структуре проекта или проходить регистрацию ради того, чтобы поставить несколько точек на карте.
Второй — работа с локальными данными.
Для сбора координат и хранения результатов не должен быть необходим собственный сервер разработчика.
Третий — возможность свободно выгрузить результаты.
Собранные данные должны быть доступны в распространённых географических форматах.
Четвёртый — отсутствие искусственных ограничений.
Мне не хотелось делать приложение, в котором создание первых пяти объектов бесплатно, а за шестой нужно платить.
Так постепенно сформировалась концепция Geo Collector.
2. Что представляет собой Geo Collector
Geo Collector — приложение для сбора, организации и экспорта пространственных данных. В его основе лежит достаточно простая модель:
Проект → Слои → Географические объекты
Проект объединяет данные, относящиеся к определённой задаче или территории. Например, можно создать отдельные проекты для обследования туристического маршрута, инвентаризации зелёных насаждений или учебной полевой практики.
Внутри проекта объекты распределяются по слоям. Это позволяет не смешивать совершенно разные типы информации и управлять их отображением.
Три основных типа геометрии
На текущем этапе приложение поддерживает три базовых типа пространственных объектов.
Точки
Используются для фиксации отдельных объектов, положение которых можно представить одной парой координат.
Например:
Родник.
Дерево.
Здание.
Туристическая стоянка.
Место проведения измерений.
Контрольная точка маршрута.
Для точек предусмотрены различные маркеры, позволяющие визуально различать категории объектов.
Линии
Предназначены для объектов, которые характеризуются протяжённостью.
Например:
Пешеходные дорожки.
Туристические маршруты.
Участки дорог.
Линейные элементы инфраструктуры.
Линия формируется из последовательности вершин.
Полигоны
Позволяют обозначать территории и площадные объекты.
Например:
Участок леса.
Территорию обследования.
Площадку для проведения исследований.
Границы интересующего объекта.
Для полигонов можно рассчитывать площадь и периметр.
В результате пользователь получает небольшой набор базовых инструментов, достаточный для решения многих задач полевого сбора географической информации.

3. Почему React Native и Expo
Для разработки Geo Collector я выбрал React Native с использованием Expo. Причин было несколько.
Во-первых, мне хотелось получить полноценное мобильное приложение, не разрабатывая интерфейс полностью на Swift.
Во-вторых, важным аргументом была возможность в дальнейшем использовать общую кодовую базу для iOS и Android.
В-третьих, Expo предоставляет инструменты для взаимодействия с возможностями мобильного устройства, включая геолокацию и работу с файлами.
При этом у такого подхода есть особенности. Пока приложение ограничивается обычными экранами, формами и локальными данными, разработка относительно прямолинейна. Но когда появляются задачи вроде продолжительной записи GPS-координат при заблокированном экране, приходится значительно внимательнее разбираться в жизненном цикле приложения и ограничениях операционной системы. Именно GPS-трекинг стал одной из наиболее интересных технических частей Geo Collector.
4. Географические данные: почему важна структура
На первый взгляд создание географического объекта – достаточно простая операция. Пользователь нажал на карту, получил координаты и сохранил результат. Но если рассматривать приложение как инструмент для реальной работы, одной пары координат оказывается недостаточно.
У объекта есть как минимум несколько характеристик:
Уникальный идентификатор.
Тип геометрии.
Координаты.
Название.
Дополнительные атрибуты.
Принадлежность к проекту.
Принадлежность к слою.
Визуальные настройки.
Для отдельных объектов также могут быть предусмотрены фотографии. При этом разные типы геометрии требуют разного представления.
Точечный объект
Для точки достаточно одной пары координат:
latitude, longitude
Линейный объект
Для линии необходима последовательность координат:
[(lat1, lon1), (lat2, lon2), ..., (latN, lonN)]
Причём порядок вершин имеет значение.
Если его изменить, изменится и сама линия.
Полигональный объект
Для полигона также используется последовательность координат, но она описывает замкнутую границу.
Здесь уже необходимо учитывать корректность геометрии.
Например, недостаточно иметь две вершины и считать такой объект полноценным полигоном.
При дальнейшем развитии приложения возникает множество дополнительных вопросов:
Что делать с самопересекающимися полигонами?
Как правильно рассчитывать площадь?
Как отображать геометрию, пересекающую 180-й меридиан?
Как выбирать масштаб карты для очень протяжённых объектов?
Как избежать потери точности при преобразовании координат?
Не все эти задачи одинаково актуальны для первой версии, но сама структура приложения должна позволять развивать геометрическую функциональность без полной переработки проекта.
5. Работа с картой: недостаточно просто нарисовать объект
Одна из особенностей разработки картографических приложений заключается в том, что даже привычные пользовательские действия требуют дополнительной логики. Возьмём простую кнопку «Показать на карте». Казалось бы, достаточно открыть экран карты. Однако если объект расположен в другой части территории, пользователь его просто не увидит.
Поэтому поведение должно зависеть от типа геометрии. Для точки логично переместить центр карты на её координаты. Для линии необходимо определить границы всей геометрии и подобрать масштаб так, чтобы линия целиком помещалась на экране. Аналогично для полигона.
При этом нужно учитывать размеры экрана, отступы от краёв и элементы интерфейса, которые могут перекрывать карту. Это один из примеров того, как небольшая на первый взгляд функция превращается в самостоятельную задачу. В Geo Collector я стараюсь придерживаться подхода, при котором пользователь взаимодействует не с абстрактным набором координат, а с понятными географическими объектами. Поэтому для линий и полигонов также предусмотрено отображение геометрических характеристик: длины, площади, периметра, количества вершин и координат центроида. Последний показатель требует отдельного пояснения.
Центроид не всегда находится непосредственно внутри объекта или на его геометрии.
Например, для вогнутого полигона он может располагаться за пределами фигуры. Поэтому центроид полезен как справочная характеристика, но для отображения объекта на карте лучше использовать границы всей геометрии.
6. GPS-трекинг: самая интересная техническая задача
Отдельно хочу остановиться на записи маршрутов. Изначально кажется, что реализация GPS-трекинга должна быть простой:
Получаем координаты устройства.
Сохраняем их.
Добавляем очередную точку к линии.
Повторяем процесс.
Пока приложение находится на экране, такой подход действительно позволяет получить маршрут. Но возникает вопрос: что произойдёт, если пользователь заблокирует телефон или переключится на другое приложение?
Для полевого инструмента это совершенно обычная ситуация. Человек может идти несколько часов, периодически открывать другие приложения, фотографировать объекты или просто держать смартфон в кармане. Если запись маршрута при этом автоматически останавливается, инструмент становится значительно менее полезным.
Передний и фоновый режимы
В Expo для получения координат предусмотрены разные механизмы. Например, watchPositionAsync() позволяет подписаться на обновления местоположения, пока приложение работает в активном режиме. Однако для полноценной фоновой записи необходим другой подход.
В стандартном Expo Location для этого предусмотрен механизм startLocationUpdatesAsync() совместно с expo-task-manager.
Фоновая задача должна существовать независимо от конкретного React-компонента, поскольку интерфейс приложения может быть выгружен или приостановлен операционной системой. Это принципиально отличается от подхода, когда вся логика записи находится внутри одного экрана.
Состояния записи
Ещё одна важная задача – корректное управление состояниями.
Я выделяю несколько логических состояний:
Запись не запущена.
Запись выполняется.
Запись приостановлена пользователем.
Запись завершена.
Ключевой момент: сворачивание приложения само по себе не должно означать пользовательскую паузу.
Если пользователь начал записывать маршрут, запись должна продолжаться в пределах возможностей iOS. Именно здесь особенно важно отделить состояние интерфейса от состояния фонового процесса.
Что делать с незавершёнными маршрутами
Есть и другая проблема. Предположим, пользователь записывает маршрут, но приложение неожиданно завершается. Если все координаты хранились только в оперативной памяти, результаты могут быть потеряны. Поэтому для подобных приложений важно сохранять полученные точки по мере записи и предусматривать восстановление незавершённого маршрута. При повторном запуске пользователь должен иметь возможность решить, что делать дальше: продолжить запись или завершить её.
Ограничения iOS
Важно понимать, что фоновая запись не означает абсолютной независимости от операционной системы. iOS управляет жизненным циклом приложений и может ограничивать их работу. Например, принудительное завершение приложения пользователем – отдельный сценарий, который нельзя считать обычным переключением в фоновый режим.
Также необходимо учитывать разрешения на использование геолокации и энергопотребление.
Постоянная работа GPS требует ресурсов, поэтому здесь приходится искать баланс между точностью маршрута и расходом аккумулятора. И ещё один практический вывод: фоновую запись необходимо проверять на физическом устройстве.
Симулятор полезен для отладки интерфейса и отдельных сценариев, но он не заменяет реальную прогулку с телефоном в кармане.
7. Почему я сделал ставку на локальное хранение
Сейчас многие приложения строятся вокруг облачной инфраструктуры. Пользователь регистрируется, создаёт учётную запись, а данные синхронизируются с сервером. У такого подхода есть преимущества, особенно если речь идёт о совместной работе. Но для Geo Collector я решил начать с другой концепции.
Пользователь должен иметь возможность собирать и хранить собственные географические данные без обязательной регистрации и подключения к моему серверу.
Это даёт несколько преимуществ.
Независимость от сервера разработчика
Если приложение не требует постоянного обращения к облачной инфраструктуре, пользователь не зависит от её доступности для работы с уже сохранёнными проектами.
Минимальные требования к инфраструктуре
Для независимого разработчика это также означает отсутствие необходимости постоянно поддерживать сервер, который хранит пользовательские проекты.
Контроль над данными
Пользователь может экспортировать результаты своей работы и использовать их в других программах. При этом нужно различать локальное хранение данных и доступность картографических подложек.
Сами сохранённые объекты могут быть доступны без интернета, но отображение онлайн-карт зависит от подключения и наличия необходимых картографических данных.
Это важное ограничение, о котором не стоит забывать. В дальнейшем я рассматриваю возможность облачной синхронизации, но не хочу делать её обязательным условием использования основных функций.
8. Экспорт: почему GeoJSON и другие открытые форматы так важны
Для меня одним из принципиальных требований была возможность выгрузки результатов. Представим, что пользователь провёл несколько часов на местности, собрал десятки точек и записал маршрут. Если все эти данные можно просматривать только внутри мобильного приложения, их практическая ценность заметно снижается. Поэтому Geo Collector поддерживает экспорт в несколько форматов.
Формат | Основное назначение |
|---|---|
GeoJSON | Обмен векторными геоданными, работа с ГИС и веб-картами |
GPX | GPS-маршруты, треки и путевые точки |
KML | Представление географических объектов, в том числе в Google Earth |
KMZ | Упакованные KML-данные и связанные ресурсы |
CSV | Табличное представление данных для последующей обработки |
Особенно важным я считаю GeoJSON.
Это достаточно удобный формат для обмена пространственными данными между различными системами.
Он позволяет описывать геометрию и связанные с ней атрибуты.
Например, точечный объект в GeoJSON может выглядеть следующим образом:
{ "type": "Feature", "geometry": { "type": "Point", "coordinates": [91.442, 53.720] }, "properties": { "name": "Точка наблюдения", "category": "field_research" }
}Обратите внимание, что в GeoJSON координаты записываются в порядке долгота, широта.
Это важно, поскольку во многих пользовательских интерфейсах принято сначала отображать широту, а затем долготу. Подобные различия необходимо учитывать при реализации экспорта. В дальнейшем GeoJSON можно открыть в QGIS, использовать в Python, JavaScript или загрузить в пространственную базу данных. Таким образом, мобильное приложение становится только первым этапом обработки информации.
9. Работа с фотографиями и атрибутами
Одних координат часто недостаточно.
Например, если пользователь фиксирует состояние туристической инфраструктуры, ему может понадобиться сохранить не только положение объекта, но и его характеристики. Допустим, на местности обнаружен информационный стенд.
Для него можно сохранить:
Название.
Географическое положение.
Описание.
Дополнительные атрибуты.
Фотографию.
В результате точка на карте превращается в небольшой структурированный набор данных. Это особенно удобно для образовательных и исследовательских задач. Например, студентам можно предложить создать собственный географический набор данных определённой территории, а затем использовать его для пространственного анализа. При этом важен не только сбор информации, но и последующая возможность проверить её качество, исправить ошибки и повторно использовать результаты.
10. Что оказалось сложнее, чем я ожидал
При разработке Geo Collector обнаружилось несколько моментов, которые на первый взгляд казались второстепенными.
Локализация интерфейса
Приложение поддерживает русский и английский языки.
И здесь проблема не ограничивается переводом названий кнопок.
Например, в русском языке необходимо учитывать склонение существительных:
1 объект.
2 объекта.
5 объектов.
21 объект.
25 объектов.
Если интерфейс формирует такие подписи неправильно, это сразу бросается в глаза. Ещё один момент – длина текста.
Английское Finish значительно короче русского «Завершить маршрут». Если размеры элементов интерфейса подобраны только под один язык, в другой локализации появляются обрезанные подписи. Поэтому даже небольшое приложение требует проверки интерфейса на разных языках и размерах экранов.
Масштабирование карты
Для точки достаточно выбрать координаты центра. Для линии или полигона нужно учитывать всю геометрию. Если просто перейти на экран карты, не изменив положение камеры, пользователь может вообще не увидеть выбранный объект.
Сохранность данных
В приложении для заметок потеря одной записи неприятна. Но в приложении для полевых исследований потеря нескольких часов собранных координат может означать необходимость повторного выхода на местность. Поэтому сохранность пользовательских данных – одна из важнейших задач.
Работа с разрешениями
Геолокация, фотографии и фоновая запись требуют взаимодействия с системными механизмами iOS. Необходимо объяснять пользователю, зачем приложению нужен доступ к определённым функциям устройства. При этом желательно не запрашивать разрешения, которые не нужны для текущей операции.
Проверка на реальном устройстве
Наконец, оказалось, что часть ошибок невозможно полноценно воспроизвести без физического iPhone. Особенно это касается фоновой записи маршрутов и поведения приложения при блокировке экрана.
11. Почему я отказался от рекламы
Теперь немного о модели распространения.
Когда речь заходит о бесплатных мобильных приложениях, практически неизбежно возникает вопрос монетизации. Наиболее очевидные варианты:
Реклама.
Платная установка.
Подписка.
Ограниченная бесплатная версия с платными функциями.
Добровольная поддержка.
Я решил начать с последнего варианта.
Geo Collector распространяется бесплатно, без рекламы и без обязательной подписки.
Почему?
Во-первых, приложение предназначено прежде всего для выполнения конкретной задачи. Пользователь выходит на местность, открывает карту, фиксирует объекты и записывает координаты. В таком сценарии рекламные объявления выглядят особенно неуместно.
Во-вторых, мне не хотелось искусственно ограничивать количество создаваемых объектов или проектов. Представим учебную группу, которая использует приложение для полевой практики. Было бы странно, если бы студенты могли бесплатно создать только десять точек, а затем были вынуждены покупать подписку.
В-третьих, локальная архитектура позволяет избежать части постоянных расходов, характерных для облачных сервисов. Если приложение не хранит пользовательские проекты на моих серверах, мне не нужно оплачивать инфраструктуру пропорционально количеству сохранённых точек и полигонов. Конечно, это не означает полного отсутствия расходов. Остаются затраты на разработку, тестирование, публикацию, поддержку и дальнейшее развитие. Но на текущем этапе мне кажется более правильным развивать продукт и получать обратную связь, а не пытаться монетизировать каждую его функцию.
12. Добровольная поддержка вместо обязательной подписки
Для тех, кто хочет поддержать проект, я предусмотрел возможность добровольной подписки через Boosty.
Поддержать разработку: https://boosty.to/golubnichij
Принцип простой. Пользователь может бесплатно установить Geo Collector и пользоваться его основными возможностями. Если приложение оказалось полезным и есть желание поддержать дальнейшую разработку, это можно сделать добровольно.
При этом отсутствие подписки не должно мешать работе с собственными географическими данными. Я понимаю, что такая модель не обязательно позволит окупить разработку. Но пока для меня важнее получить работающее приложение, которое будет действительно использоваться.
В будущем ситуация может измениться.
Например, облачная синхронизация или совместная работа над проектами потребуют серверной инфраструктуры. Для таких возможностей платная модель может оказаться обоснованной. Однако основные инструменты локального сбора геоданных я планирую сохранить бесплатными.
13. Публикация в App Store
Отдельным этапом стала публикация приложения. Это мой первый опыт выпуска собственного мобильного приложения в App Store. Помимо разработки пришлось разобраться с настройками Apple Developer, подготовкой сборок, тестированием через TestFlight и требованиями к публикации.
Необходимо было подготовить:
Название и описание приложения.
Иконку.
Скриншоты.
Информацию о конфиденциальности.
Страницу поддержки.
Сведения об используемых разрешениях.
Сборку приложения для проверки.
Отдельное внимание пришлось уделить тому, как приложение работает с геолокацией. После отправки приложение находилось на проверке дольше, чем я первоначально ожидал. В моём случае ожидание составило 12 дней.
Для первого приложения такой процесс оказался немного непривычным, поскольку до этого я в основном распространял собственные программы напрямую. В конечном итоге Geo Collector прошёл проверку и появился в App Store. Для меня это стало важным этапом: проект перестал быть просто приложением, которое работает на моём устройстве, и превратился в публично доступный продукт.
14. Где можно использовать Geo Collector
Хотя приложение создавалось как универсальный инструмент, я вижу несколько особенно интересных сценариев.
Образовательные полевые практики
Студенты могут самостоятельно собирать пространственные данные, формировать тематические слои и затем анализировать результаты в QGIS. Например, можно предложить исследовать определённый городской квартал и создать собственный набор данных об объектах инфраструктуры.
Экологические исследования
Можно фиксировать точки наблюдений, обследуемые участки, маршруты и связанные с ними характеристики. При этом смартфон не заменяет специализированное измерительное оборудование, но может использоваться для географической привязки наблюдений.
Туризм
Приложение позволяет записывать маршруты, отмечать интересные места и сохранять их характеристики.
Инвентаризация объектов
Можно использовать точки и полигоны для предварительного обследования территории.
Личные картографические проекты
Наконец, никто не мешает использовать Geo Collector просто для создания собственной карты интересных мест. Мне особенно интересен образовательный сценарий, поскольку он позволяет объединить полевой сбор информации и последующий анализ данных.
15. Что планируется дальше
Сейчас Geo Collector – это первая публичная версия проекта, которую я собираюсь постепенно развивать.
Среди направлений, которые рассматриваю:
Версия для Android.
React Native позволяет использовать общую кодовую базу, хотя платформенные особенности всё равно потребуют отдельной реализации и тестирования.
Улучшение инструментов работы с геометрией.
Более удобное редактирование объектов, дополнительные измерения и инструменты пространственного анализа.
Импорт и экспорт.
Расширение совместимости с другими ГИС-инструментами.
Синхронизация проектов.
Возможность переносить данные между устройствами.
Совместная работа.
Потенциально интересный сценарий для учебных групп и исследовательских коллективов. При этом не хочется превращать приложение в перегруженный инструмент, в котором простая операция требует прохождения нескольких экранов. Основная идея остаётся прежней: пользователь должен иметь возможность быстро открыть карту и начать собирать данные.
16. Несколько выводов после разработки
Работа над Geo Collector позволила мне сделать несколько выводов.
Первый. Даже небольшое мобильное приложение может содержать достаточно сложную предметную логику.
Особенно если оно работает с геометрией, геолокацией и данными, которые пользователь собирает в реальных условиях.
Второй. Ограничения операционной системы иногда оказываются важнее сложности интерфейса.
Фоновый GPS-трекинг — хороший пример задачи, где недостаточно просто написать обработчик координат.
Третий. Открытые форматы существенно повышают практическую ценность приложения.
Возможность выгрузить GeoJSON и продолжить работу в QGIS делает мобильный инструмент частью более широкого процесса обработки географической информации.
Четвёртый. Не каждое бесплатное приложение обязательно должно показывать рекламу.
По крайней мере, на начальном этапе независимый проект может развиваться за счёт собственных ресурсов и добровольной поддержки пользователей. Насколько жизнеспособной окажется такая модель в долгосрочной перспективе – покажет время.
Заключение
Geo Collector стал для меня интересным опытом разработки мобильного приложения, в котором соединились несколько направлений: геоинформационные технологии, программирование, работа с мобильными устройствами и организация пространственных данных.
Сейчас приложение доступно в App Store.
Geo Collector: https://apps.apple.com/tr/app/geo-collector/id6822998937
Также я записал видеообзор, в котором показываю основные возможности приложения:
Видео: https://www.youtube.com/watch?v=DzH6yzpTYu4
Если вы работаете с ГИС, занимаетесь полевыми исследованиями или используете пространственные данные в образовании, буду рад, если попробуете приложение.
Особенно интересны замечания о том, каких функций не хватает для реальной работы. И отдельно хотелось бы обсудить вопрос монетизации.
Как вы считаете, насколько жизнеспособна модель небольшого специализированного приложения без рекламы и обязательной подписки, которое развивается за счёт добровольной поддержки?
Мне кажется, что для некоторых категорий программного обеспечения такой подход заслуживает внимания.
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.