VirtualPlanetBuilder (VPB) – приложение с открытым исходным кодом для генерации 3д-модели рельефа на основе разнообразных геопространственных изображений (спутниковых снимков) и высотных данных. Рельеф создается в виде множества тайлов с разными уровнями детализации в формате библиотеки OpenSceneGraph. Рельеф оптимизирован для использования в интерактивных приложениях. В зависимости от исходных данных поддерживается создание рельефов разных размеров - до нескольких терабайт, размещенных на кластере компьютеров. Рельеф может быть либо «плоским», либо геоцентрическим.

VPB разработан Робертом Осфилдом, который также является разработчиком библиотеки OpenSceneGraph.

VPB понимает большое количество форматов геопространственных изображений и высотных данных. Для этого внутри VPB использует библиотеку GDAL (Geospatial Data Abstraction Library). GDAL – библиотека для работы с растровыми географическими форматами файлов данных. Помимо этого в состав GDAL входит набор вспомогательных программ, вызываемых из командной строки, для преобразования и обработки данных.

Подготовка исходных данных

Обычные изображения в форматах jpg, png не могут быть использованы напрямую для генерации рельефа. Для этого нужно осуществить их геопривязку – указать долготу и широту границ изображения. Это можно сделать с помощью программы gdal_translate, входящей в состав GDAL:

gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr ulx uly lrx lry input.jpg output.tif

где вместо ulx, uly, lrx, lry нужно подставить долготу и широту в градусах верхнего левого и правого нижнего углов изображения. На выходе получится файл output.tif в формате GeoTIFF.

Например, для геопривязки изображений NASA Blue Marble Next Generation нужно использовать следующие команды:

gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr -180 90 -90 0 world.topo.bathy.200407.3x21600x21600.A1.jpg A1.tif
gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr -90 90 0 0 world.topo.bathy.200407.3x21600x21600.B1.jpg B1.tif
gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr 0 90 90 0 world.topo.bathy.200407.3x21600x21600.C1.jpg C1.tif
gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr 90 90 180 0 world.topo.bathy.200407.3x21600x21600.D1.jpg D1.tif
gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr -180 0 -90 -90 world.topo.bathy.200407.3x21600x21600.A2.jpg A2.tif
gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr -90 0 0 -90 world.topo.bathy.200407.3x21600x21600.B2.jpg B2.tif
gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr 0 0 90 -90 world.topo.bathy.200407.3x21600x21600.C2.jpg C2.tif
gdal_translate -of GTiff -a_srs "+proj=latlong +datum=WGS84" -a_ullr 90 0 180 -90 world.topo.bathy.200407.3x21600x21600.D2.jpg D2.tif

В зависимости от размеров исходных данных генерация может занимать от нескольких секунд до нескольких часов-дней-недель. Поэтому имеет смысл оптимизировать имеющиеся файлы.

Разные изображения могут храниться в разных картографических проекциях и могут иметь разные датумы. Поэтому их нужно привести к единой системе координат и единому датуму. Для построения геоцентрического рельефа (виртуального глобуса) обычно используют географическую систему координат (долгота, широта и высота) и датум WGS84. Для преобразования изображения можно использовать утилиту gdalwarp, которая входит в состав GDAL. Вот пример вызова этой утилиты:

gdalwarp -t_srs epsg:4326 input.tif output.tif

Для более быстрого доступа к отдельным частям очень больших файлов имеет смысл хранить данные внутри файла в виде набора тайлов:

gdal_translate -of GTiff -co "TILED=YES" intput.tif output.tif

Также для очень больших файлов удобно заранее сгенерировать уменьшенные варианты изображений, которые бы использовались для низких уровней детализации. Для этого можно использовать утилиту gdaladdo, которая входит в состав GDAL:

gdaladdo -r average file.tif 2 4 8 16 32

Сборка приложения

Получить исходники приложения можно можно из GIT-репозитория: https://github.com/openscenegraph/VirtualPlanetBuilder

Необходимые зависимости: OpenSceneGraph и GDAL. Для генерации проектов Visual Studio используется CMake.

Генерация рельефа

В состав VPB входит несколько утилит. Основная – osgdem. Через аргументы командной строки на вход передаются имена файлов с геопространственными изображениями и другие параметры, описывающие характеристики рельефа. На выходе получается множество файлов с формате ive.

Утилита vpbmaster – более развитый аналог osgdem. Она умеет дополнительно распараллеливать процесс генерации базы данных, используя все ядра процессора, а также другие компьютеры, входящие в кластер. Также эта утилита может возобновлять прерванный процесс генерации и добавлять наложения к уже существующим рельефам.

У osgdem и vpbmaster большая часть аргументов командной строки одинаковая. Вот самые основные:

-d <filename> файл с высотными данными
-t <filename> файл с изображением
--geocentric геоцентрический рельеф
-l <numOfLevels> число уровней детализации

Пример построения глобуса на основе данных NASA Blue Marble Next Generation:

osgdem –geocentric -t A1.tif -t B1.tif -t C1.tif -t D1.tif -t A2.tif -t B2.tif -t C2.tif -t D2.tif -o earth.ive

Структура получившихся файлов

На выходе получается множество файлов, каждый из которых содержит тайл рельефа с определенным уровнем детализации. Все файлы соединены ссылками и образуют дерево. На рисунке изображена структура корневого файла и одного обычного регулярного файла. Каждый TerrainTile содержит текстуру в формате dds и высотные данные в виде osg::HeightField.

Граф сцены рельефа