1. Введение
В этой статье мы поймем основную архитектуру и важные элементы геопространственного приложения. Мы начнем с понимания того, что такое геопространственное приложение, и типичных проблем при его создании.
Одним из важных аспектов геопространственного приложения является представление полезных данных на интуитивно понятных картах. Хотя в этой статье мы в основном сосредоточимся на обработке геопространственных данных в серверной части и возможностях, доступных нам сегодня в отрасли.
2. Что такое геопространственные приложения?
Давайте начнем с понимания того, что мы подразумеваем под геопространственным приложением. В основном это приложения, использующие геопространственные данные для реализации своих основных функций .
Проще говоря, геопространственные данные — это любые данные, которые представляют места, местоположения, карты, навигацию и т. д. Даже без какого-либо причудливого определения мы довольно окружены этими приложениями. Например, наши любимые приложения для совместного использования, приложения для доставки еды и приложения для бронирования фильмов — все это геопространственные приложения.
Геопространственные данные — это, в основном , информация, описывающая объекты, события или другие объекты, расположенные на поверхности земли или вблизи нее . Например, подумайте о приложении, которое может предложить нам ближайшие театры, где сегодня вечером идут наши любимые пьесы Шекспира. Это можно сделать, объединив информацию о местоположении театров с информацией об атрибутах пьес и временной информацией о событиях.
Есть несколько других полезных применений геопространственных данных, которые приносят нам повседневную пользу — например, когда мы пытаемся найти поблизости такси в любое время дня, которое готово доставить нас к месту назначения. Или когда мы не можем дождаться прибытия этого важного груза и, к счастью, можем определить, где именно он находится в пути.
Фактически, это стало фундаментальным требованием нескольких приложений, которые мы довольно часто используем в наши дни.
3. Геопространственные технологии
Прежде чем мы поймем нюансы создания геопространственного приложения, давайте рассмотрим некоторые основные технологии, которые расширяют возможности таких приложений. Это базовые технологии, которые помогают нам генерировать, обрабатывать и представлять геопространственные данные в полезной форме.
Дистанционное зондирование (ДЗ) — это процесс обнаружения и мониторинга физических характеристик области путем измерения ее отраженного и излучаемого излучения на расстоянии. Обычно это делается с помощью спутников дистанционного зондирования. Он широко используется в области геодезии, разведки, а также в коммерческих целях.
Глобальные системы позиционирования (GPS) относятся к спутниковой навигационной системе, основанной на сети из 24 спутников, летающих на средней околоземной орбите (СОО). Он может передавать информацию о местоположении и времени на подходящий приемник в любой точке Земли, где он имеет беспрепятственную прямую видимость для четырех или более спутников GPS.
Географические информационные системы (ГИС) — это система, которая создает, управляет, анализирует и отображает все типы данных . Например, это помогает нам интегрировать данные о местоположении с более описательной информацией, например о том, что находится в этом месте. Это помогает улучшить коммуникацию и принятие решений в нескольких отраслях.
4. Проблемы при создании геопространственного приложения
Чтобы понять, какой выбор дизайна мы должны сделать при создании геопространственного приложения, важно знать связанные с этим проблемы. Как правило, геопространственные приложения требуют анализа большого объема геопространственных данных в режиме реального времени . Например, поиск кратчайшего альтернативного маршрута к месту недавнего стихийного бедствия имеет решающее значение для служб быстрого реагирования.
Таким образом, одним из основных требований геопространственного приложения является хранение большого количества геопространственных данных и выполнение произвольных запросов с очень низкой задержкой . Теперь также важно понять природу пространственных данных и почему они требуют специальной обработки. По сути, пространственные данные представляют собой объекты, определенные в геометрическом пространстве.
Давайте представим, что у нас есть несколько достопримечательностей в городе. Местоположение обычно описывается широтой, долготой и (возможно) высотой над уровнем моря:
Теперь, что нас действительно интересует, так это найти близлежащие местоположения к заданному местоположению. Итак, нам нужно вычислить расстояние от этого места до всех возможных мест. Такие запросы совершенно нетипичны для обычных запросов к базе данных, с которыми мы знакомы. Они известны как пространственные запросы. Они включают геометрические типы данных и учитывают пространственные отношения между этими геометрическими формами.
Мы уже знаем, что ни одна производственная база данных, вероятно, не выживет без эффективных индексов. Это также верно для пространственных данных. Однако из-за своей природы обычные индексы не очень эффективны для пространственных данных и типов пространственных запросов, которые мы хотим выполнять . Следовательно, нам нужны специальные индексы, известные как пространственные индексы, которые могут помочь нам более эффективно выполнять пространственные операции.
5. Пространственные типы данных и запросы
Теперь, когда мы понимаем проблемы, возникающие при работе с пространственными данными, важно отметить несколько типов пространственных данных. Более того, мы можем выполнить несколько интересных запросов для удовлетворения уникальных требований. Мы рассмотрим некоторые из этих типов данных и операции, которые мы можем с ними выполнять.
Обычно мы говорим о пространственных данных по отношению к системе пространственной привязки . Он состоит из системы координат и датума. Существует несколько систем координат, таких как аффинная, цилиндрическая, декартова, эллипсоидальная, линейная, полярная, сферическая и вертикальная. База представляет собой набор параметров, определяющих положение начала координат, масштаб и ориентацию системы координат.
Вообще говоря, многие базы данных, поддерживающие пространственные данные, делят их на две категории: геометрию и географию :
Геометрия хранит пространственные данные в плоской системе координат. Это помогает нам представлять фигуры, такие как точки, линии и области, с их координатами в декартовом пространстве. География хранит пространственные данные на основе системы координат вокруг Земли. Это полезно для представления одних и тех же форм на поверхности Земли с координатами широты и долготы.
Есть два основных типа запросов, которые мы можем сделать с пространственными данными. В основном это поиск ближайших соседей или отправка различных типов запросов диапазона . Мы уже видели примеры запросов для поиска ближайших соседей ранее. Общая идея состоит в том, чтобы определить определенное количество элементов, ближайших к точке запроса.
Другим важным типом запроса является запрос диапазона. Здесь нам интересно знать все элементы, попадающие в диапазон запроса. Диапазон запроса может быть прямоугольником или кругом с определенным радиусом от точки запроса. Например, мы можем использовать такой запрос, чтобы идентифицировать все итальянские рестораны в радиусе двух миль от того места, где мы находимся.
6. Структуры данных для пространственных данных
Теперь мы поймем некоторые структуры данных, которые больше подходят для построения пространственных индексов. Это поможет нам понять, чем они отличаются от обычных индексов и почему они более эффективны при выполнении пространственных операций. Неизменно почти все эти структуры данных являются вариациями древовидной структуры данных.
6.1. Обычный индекс базы данных
Индекс базы данных — это, по сути , структура данных, которая повышает скорость операций извлечения данных . Без индекса нам пришлось бы просмотреть все строки, чтобы найти интересующую нас строку. Но для таблицы значительного размера даже просмотр индекса может занять значительное время.
Однако важно сократить количество шагов для получения ключа и уменьшить количество дисковых операций для этого. B-дерево или сбалансированное дерево — это самобалансирующаяся древовидная структура данных, которая хранит несколько отсортированных пар ключ-значение в каждом узле . Это помогает извлечь больший набор ключей из кэша процессора за одну операцию чтения с диска.
Хотя B-дерево работает довольно хорошо, обычно мы используем B+дерево для построения индекса базы данных . B+дерево очень похоже на B-дерево, за исключением того факта, что оно хранит значения или данные только в листовых узлах:
Здесь все листовые узлы также связаны и, следовательно, обеспечивают упорядоченный доступ к парам ключ-значение. Преимущество здесь в том, что листовые узлы обеспечивают первый уровень индекса, а внутренние узлы обеспечивают многоуровневый индекс.
Обычный индекс базы данных фокусируется на упорядочении ключей в одном измерении. Например, мы можем создать индекс для одного из атрибутов, таких как почтовый индекс, в нашей таблице базы данных. Это поможет нам запросить все местоположения с определенным почтовым индексом или в диапазоне почтовых индексов.
6.2. Индекс пространственной базы данных
В геопространственных приложениях нас часто интересуют запросы ближайшего соседа или диапазона. Например, мы можем захотеть найти все местоположения в пределах 10 миль от определенной точки. Обычный индекс базы данных здесь не очень полезен. На самом деле существуют и другие более подходящие структуры данных для построения пространственных индексов.
Одной из наиболее часто используемых структур данных является R-дерево . R-дерево было впервые предложено Антонином Гуттманом в 1984 году и подходит для хранения пространственных объектов, таких как местоположения. Фундаментальная идея R-дерева состоит в том, чтобы сгруппировать близлежащие объекты и представить их с их минимальным ограничивающим прямоугольником на следующем более высоком уровне дерева:
Для большинства операций R-дерево мало чем отличается от B-дерева. Ключевое отличие заключается в использовании ограничивающих прямоугольников, чтобы решить, следует ли искать внутри поддерева или нет. Для повышения производительности мы должны убедиться, что прямоугольники не закрывают слишком много пустого пространства и не слишком сильно перекрываются. Самое интересное, что R-дерево может охватывать три или даже больше измерений!
Другой структурой данных для построения пространственного индекса является Kd-дерево , представляющее собой небольшую вариацию R-дерева. Kd - дерево разбивает пространство данных на две части, а не на несколько прямоугольников . Следовательно, узлы дерева в Kd-дереве представляют собой разделяющие плоскости, а не ограничивающие рамки. Хотя Kd-дерево оказывается проще в реализации и быстрее, оно не подходит для данных, которые постоянно меняются.
Основная идея этих структур данных заключается в разделении данных на области, выровненные по осям, и их хранении в узлах дерева. На самом деле существует довольно много других таких структур данных, которые мы можем использовать, например, BSP-дерево и R*-дерево.
7. Базы данных с собственной поддержкой
Мы уже видели, чем пространственные данные отличаются от обычных данных и почему они нуждаются в специальной обработке. Следовательно, для создания геопространственного приложения нам требуется база данных, которая может изначально поддерживать хранение пространственных типов данных и эффективно выполнять пространственные запросы. Мы называем такую систему управления базами данных системой управления пространственными базами данных.
Почти все основные базы данных начали обеспечивать некоторый уровень поддержки пространственных данных. Сюда входят некоторые популярные системы управления базами данных, такие как MySQL , Microsoft SQL Server , PostgreSQL , Redis , MongoDB , Elasticsearch и Neo4J . Однако также доступны некоторые специализированные пространственные базы данных, такие как GeoMesa , PostGIS и Oracle Spatial .
7.1. Редис
Redis — это хранилище структур данных в памяти, которое мы можем использовать в качестве базы данных, кэша или брокера сообщений . Он может минимизировать нагрузку на сеть и задержку, поскольку эффективно выполняет операции в памяти. Redis поддерживает различные структуры данных, такие как Hash, Set, Sorted Set, List и String. Особый интерес для нас представляют Sorted Sets, которые добавляют упорядоченное представление к членам, отсортированным по баллам.
Геопространственное индексирование реализовано в Redis с использованием отсортированных наборов в качестве базовой структуры данных. Redis фактически кодирует широту и долготу в счет Sorted Set , используя алгоритм geohash . Geo Set — это ключевая структура данных, реализованная с помощью Sorted Set, которая поддерживает геопространственные данные в Redis на более абстрактном уровне.
Redis предоставляет простые команды для работы с геопространственным индексом и выполнения стандартных операций , таких как создание новых наборов и добавление или обновление элементов в наборе. Например, чтобы создать новый набор и добавить в него элементы из командной строки, мы можем использовать команду GEOADD:
GEOADD locations 20.99 65.44 Vehicle-1 23.99 55.45 Vehicle-2
Здесь мы добавляем местоположение нескольких транспортных средств в набор географических данных, который называется «местоположения».
Redis также предоставляет несколько способов чтения индекса, например ZRANGE, ZSCAN и GEOPOS. Кроме того, мы можем использовать команду GEODIST для вычисления расстояния между элементами в наборе. Но самые интересные команды — это те, которые позволяют нам искать индекс по местоположению. Например, мы можем использовать команду GEORADIUSYMEMBER для поиска элементов, которые находятся в пределах диапазона радиуса определенного элемента:
GEORADIUSBYMEMBER locations Vehicle-3 1000 m
Здесь нас интересует поиск всех других транспортных средств в радиусе одного километра от третьего транспортного средства.
Redis достаточно мощен и прост в обеспечении поддержки хранения большого объема геопространственных данных и выполнении геопространственных запросов с малой задержкой.
7.2. MongoDB
MongoDB — это система управления базами данных, ориентированная на документы, которая использует документы, подобные JSON, с дополнительной схемой для хранения данных. Он предоставляет несколько способов поиска документов, таких как запросы полей, запросы диапазона и регулярные выражения. Мы даже можем индексировать документы по первичным и вторичным индексам. Более того, MongoDB с шардингом и репликацией обеспечивает высокую доступность и горизонтальную масштабируемость.
Мы можем хранить пространственные данные в MongoDB либо как объекты GeoJSON, либо как устаревшие пары координат . Объекты GeoJSON полезны для хранения данных о местоположении на поверхности, похожей на Землю, тогда как устаревшие пары координат полезны для хранения данных, которые мы можем представить в евклидовой плоскости.
Чтобы указать данные GeoJSON, мы можем использовать встроенный документ с полем с именем type
для указания типа объекта GeoJSON и другим полем с именем координаты
для указания координат объекта:
db.vehicles.insert( {
name: "Vehicle-1",
location: { type: "Point", coordinates: [ 83.97, 70.77 ] }
} )
Здесь мы добавляем в коллекцию документ с именем Vehicles
. Вложенный документ представляет собой объект GeoJSON типа Point
с его координатами долготы и широты.
Кроме того, MongoDB предоставляет несколько типов геопространственных индексов, таких как 2dsphere
и 2d
, для поддержки геопространственных запросов. 2dsphere поддерживает запросы, вычисляющие геометрию земной
сферы:
db.vehicles.createIndex( { location : "2dsphere" } )
Здесь мы создаем индекс 2dsphere для поля
местоположения
нашей коллекции.
Наконец, MongoDB предлагает несколько операторов геопространственных запросов для облегчения поиска в геопространственных данных . Некоторыми из операторов являются geoIntersects
, geoWithin
, Near
и NearSphere
. Эти операторы могут интерпретировать геометрию на плоской поверхности или сфере.
Например, давайте посмотрим, как мы можем использовать оператор Near :
db.places.find(
{
location:
{ $near:
{
$geometry: { type: "Point", coordinates: [ 93.96, 30.78 ] },
$minDistance: 500,
$maxDistance: 1000
}
}
}
)
Здесь мы ищем документы, которые находятся на расстоянии не менее 500 и не более 1000 метров от упомянутой точки
GeoJSON .
Возможности представления JSON-подобных данных с гибкой схемой, эффективностью масштабирования и встроенной поддержкой геопространственных данных делают MongoDB вполне подходящим для геопространственных приложений.
7.3. ПостГИС
PostgreSQL — это система управления реляционными базами данных, обеспечивающая совместимость с SQL и поддерживающая ACID-транзакции . Он достаточно универсален для поддержки широкого спектра рабочих нагрузок. PostgreSQL включает встроенную поддержку синхронной репликации и встроенную поддержку обычных индексов B-деревьев и хеш-таблиц. PostGIS — это расширитель пространственной базы данных для PostgreSQL.
По сути, PostGIS добавляет поддержку хранения геопространственных данных в PostgreSQL и выполнения запросов о местоположении в SQL. Он добавляет типы геометрии для Point
s, LineString
s, Polygon
s и т. д. Кроме того, он предоставляет пространственные индексы с использованием R-tree-over-GiST (обобщенное дерево поиска). Наконец, он также добавляет пространственные операторы для геопространственных измерений и операций над наборами.
Мы можем создать базу данных в PostgreSQL , как всегда, и включить расширение PostGIS, чтобы начать ее использовать. По сути, данные хранятся в строках и столбцах, но PostGIS вводит столбец геометрии с данными в определенной системе координат, определяемой идентификатором пространственной привязки (SRID). PostGIS также добавляет множество опций для загрузки различных форматов данных ГИС.
PostGIS поддерживает как геометрические, так и географические типы данных . Мы можем использовать обычные SQL-запросы для создания таблицы и вставки типа данных geography:
CREATE TABLE vehicles (name VARCHAR, geom GEOGRAPHY(Point));
INSERT INTO vehicles VALUES ('Vehicle-1', 'POINT(44.34 82.96)');
Здесь мы создали новую таблицу «транспортные средства» и добавили местоположение конкретного транспортного средства, используя геометрию точки .
PostGIS добавляет довольно много пространственных функций для выполнения пространственных операций с данными. Например, мы можем использовать пространственную функцию ST_AsText
для чтения данных геометрии в виде текста:
SELECT name, ST_AsText(geom) FROM vehicles;
Конечно, для нас более полезным запросом будет поиск всех транспортных средств в непосредственной близости от заданной точки:
SELECT geom FROM vehicles
WHERE ST_Distance( geom, 'SRID=4326;POINT(43.32 68.35)' ) < 1000
Здесь мы ищем все транспортные средства в радиусе одного километра от указанной точки.
PostGIS добавляет пространственные возможности в PostgreSQL, позволяя нам использовать хорошо известную семантику SQL для пространственных данных. Более того, мы можем воспользоваться всеми преимуществами использования PostgreSQL.
8. Отраслевые стандарты и спецификации
Хотя мы видели, что поддержка пространственных данных растет на уровне базы данных, что насчет прикладного уровня? Для создания геопространственных приложений нам необходимо написать код, способный эффективно обрабатывать пространственные данные.
Более того, нам нужны стандарты и спецификации для представления и передачи пространственных данных между различными компонентами. Кроме того, языковые привязки могут помочь нам в создании геопространственного приложения на таком языке, как Java.
В этом разделе мы рассмотрим некоторую стандартизацию, имевшую место в области геопространственных приложений, разработанные ими стандарты и доступные для использования библиотеки.
8.1. Усилия по стандартизации
В этой области было много разработок, и благодаря совместным усилиям нескольких организаций было установлено несколько стандартов и лучших практик. Давайте сначала пройдемся по некоторым организациям, которые способствуют развитию и стандартизации геопространственных приложений в различных отраслях.
Институт экологических систем (ESRI) , возможно, является одним из старейших и крупнейших международных поставщиков программного обеспечения для географических информационных систем (ГИС) и приложений для управления базами геоданных. Они разрабатывают пакет программного обеспечения ГИС под названием ArcGIS, предназначенный для нескольких платформ , таких как настольные, серверные и мобильные. Он также установил и продвигает форматы данных как для векторных, так и для растровых типов данных, например, Shapefile, File Geodatabase, Esri Grid и Mosaic.
Open Geospatial Consortium (OGC) — это международный отраслевой консорциум, в который входят более 300 компаний, государственных учреждений и университетов, участвующих в процессе согласования разработки общедоступных спецификаций интерфейса. Эти спецификации делают комплексную пространственную информацию и сервисы доступными и полезными для всех типов приложений . В настоящее время стандарт OGC включает более 30 стандартов, включая идентификатор системы пространственной привязки (SRID), язык географической разметки (GML) и простые функции — SQL (SFS).
Open Source Geospatial Foundation (OSGeo) — это некоммерческая неправительственная организация, которая поддерживает и продвигает совместную разработку открытых геопространственных технологий и данных. Он продвигает геопространственные спецификации, такие как Tile Map Service (TMS). Кроме того, он также помогает в разработке нескольких геопространственных библиотек, таких как GeoTools и PostGIS . Он также работает с такими приложениями, как QGIS , настольная ГИС для просмотра, редактирования и анализа данных. Это лишь некоторые из проектов, которые OSGeo продвигает под своей эгидой.
8.2. Геопространственные стандарты: OGC GeoAPI
Стандарт реализации GeoAPI через библиотеку GeoAPI определяет API языка Java, включая набор типов и методов, которые мы можем использовать для управления географической информацией. Базовая структура географической информации должна соответствовать спецификации, принятой Техническим комитетом 211 Международной организации по стандартизации (ISO) и OGC.
GeoAPI предоставляет интерфейсы Java, которые не зависят от реализации. Прежде чем мы сможем использовать GeoAPI, нам нужно выбрать из списка сторонних реализаций . Мы можем выполнять несколько геопространственных операций с помощью GeoAPI. Например, мы можем получить систему отсчета координат (CRS) из кода EPSG. Затем мы можем выполнить операцию координат, например проекцию карты, между парой CRS:
CoordinateReferenceSystem sourceCRS =
crsFactory.createCoordinateReferenceSystem("EPSG:4326"); // WGS 84
CoordinateReferenceSystem targetCRS =
crsFactory.createCoordinateReferenceSystem("EPSG:3395"); // WGS 84 / World Mercator
CoordinateOperation operation = opFactory.createOperation(sourceCRS, targetCRS);
double[] sourcePt = new double[] {
27 + (59 + 17.0 / 60) / 60, // 27°59'17"N
86 + (55 + 31.0 / 60) / 60 // 86°55'31"E
};
double[] targetPt = new double[2];
operation.getMathTransform().transform(sourcePt, 0, targetPt, 0, 1);
Здесь мы используем GeoAPI для выполнения картографической проекции для преобразования одной точки CRS.
Существует несколько сторонних реализаций GeoAPI, доступных в качестве оболочек для существующих библиотек, например NetCDF Wrapper, Proj.6 Wrapper и GDAL Wrapper.
8.3. Геопространственные библиотеки: OSGeo GeoTools
GeoTools — это проект OSGeo, предоставляющий библиотеку Java с открытым исходным кодом для работы с геопространственными данными . Структура данных GeoTools в основном основана на спецификациях OGC. Он определяет интерфейсы для ключевых пространственных концепций и структур данных. Он также поставляется с API-интерфейсом доступа к данным, поддерживающим доступ к функциям, рендерингом малой памяти без сохранения состояния и технологией синтаксического анализа с использованием схемы XML для привязки к содержимому GML.
Чтобы создать геопространственные данные в GeoTools, нам нужно определить тип объекта. Самый простой способ — использовать класс SimpleFeatureType
:
SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
builder.setName("Location");
builder.setCRS(DefaultGeographicCRS.WGS84);
builder
.add("Location", Point.class);
.length(15)
.add("Name", String.class);
SimpleFeatureType VEHICLE = builder.buildFeatureType();
Как только у нас будет готовый тип функции, мы можем использовать его для создания функции с помощью SimpleFeatureBuilder
:
SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(VEHICLE);
DefaultFeatureCollection collection = new DefaultFeatureCollection();
GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
Мы также создаем экземпляр коллекции для хранения наших функций и класс фабрики GeoTools для создания точки
для местоположения. Теперь мы можем добавить определенные местоположения в нашу коллекцию в качестве объектов:
Point point = geometryFactory.createPoint(new Coordinate(13.46, 42.97));
featureBuilder.add(point);
featureBuilder.add("Vehicle-1");
collection.add(featureBuilder.buildFeature(null))
Это лишь малая часть того, что мы можем делать с библиотекой GeoTools. GeoTools обеспечивает поддержку работы как с векторными, так и с растровыми типами данных . Это также позволяет нам работать с данными в стандартном формате, таком как шейп
-файл .
9. Заключение
В этом уроке мы рассмотрели основы создания геопространственного приложения. Мы обсудили природу и проблемы создания такого приложения. Это помогло нам понять различные типы пространственных данных и структур данных, которые мы можем использовать.
Кроме того, мы рассмотрели некоторые базы данных с открытым исходным кодом со встроенной поддержкой хранения пространственных данных, построения пространственных индексов и выполнения пространственных операций. Наконец, мы также рассказали о некоторых отраслевых проектах, направленных на стандартизацию геопространственных приложений.