Создание сценария

Материал из FlightGear.ru.

Перейти к: навигация, поиск

Создание сценария с использованием TerraGear.

Англоязычный оригинал — по адресу [1].

ВНИМАНИЕ! Эта статья — просто перевод, какой-либо проверки в ней написанного при переводе не производилось. Поэтому если при её использовании появятся какие-либо расхождения, не стесняйтесь её корректировать.

Эта статья описывает создание собственного сценария с использованием TerraGear и некоторых инструментов, разработанных FlightGear Custom Scenery Project. Эти же самые инструменты используются для создания официального сценария в каждом релизе ФГ.

Подразумевается, что у вас машина с каким-нибудь юниксом, вы установили TerraGear из CVS и приложили к нему (к TerraGear'у) патчи с сайта Custom Scenery Project, добавляющие некоторые возможности и фиксящие некоторые баги. Также потребуется немало места на диске — например, для генерирования куска поверхности размером с Шотландию надо около 5 гигабайт.

Содержание

Установка и настройка

Перед началом работы необходимо определить границы куска поверхности, с которым предстоит работать, в виде прямоугольника, заданного широтой и долготой. Чем меньше область поверхности, которую вы хотите генерировать, тем меньше количество обрабатываемых данных, и тем меньше машинного времени потребуется на их обработку. Например, если вам нужно всего лишь описать структуру нового аэропорта с координатами 34.4°N 12.3°W, то достаточно будет сгенерировать сценарий между 34°N 12°W и 35°N 13°W.

Запишите граничные координаты (минимальную и максимальную широту и долготу) сценария, который вы хотите сгенерировать. Помните, что юг и запад имеют отрицательные координаты — то есть 10°S 4°W будет -10, -4. Постарайтесь не запутаться, иначе окажется, что вы обсчитываете сценарий или аэропорты на другой стороне планеты.

Вы будете работать со многими типами данных в разных форматах. Создайте новый каталог для работы со сценарием. В нём создайте следующие поддиректории:

  • data для исходных и предобработанных данных
  • work для обработанных (обычно shape-decode) и готовых ко включению в сценарий данных
  • output для готовых файлов сценария, который вы создадите.

TerraGear требует три набора данных для создания сценария:

  • Отметки высот (берутся из SRTM)
  • Расположение и раскладка аэропортов (берутся из apt.dat)
  • Является ли точка с заданными координатами морем, землёй, городом, лесом, дорогой и т.д. (берётся из VMAP0)

Мы пройдёмся по каждому из этих наборов данных по очереди, от получения их через предобработку к формированию данных, которые могут быть использованы FlightGear'ом.

Порядок выполнения шагов по обработке данных важен — например, данные по аэропортам зависят от данных по высотам для того, чтобы можно было определить возвышения аэропортов.

Возвышение

Наилучшие доступные на сегодняшний день данные по возвышениям получены от Shuttle Radar Topography Mission (SRTM). Есть два типа данных SRTM:

  • Высокоточные данные с разрешением в 1 угловую секунду, известные как SRTM-1, только для континентальной территории США.
  • Менее точные данные (разрешение 3 угловые секунды), известные как SRTM-3.

С этого момента мы принимаем, что вы используете данные SRTM-3. Если не указано иначе, процесс для SRTM-1 идентичен.

Вы можете скачать нужные данные с адреса http://dds.cr.usgs.gov/srtm/version2_1 . Вам требуются все файлы .hgt.zip, попадающие в интересующую вас область. В зависимости от размера вашего сценария, их объём может сильно различаться. Складывайте их в каталог data/SRTM3.

Теперь, после получения данных, надо сконвертировать их во что-то более подходящее для использования TerraGear'ом. Перво-наперво, надо распаковать все .hgt-файлы. Например:

for i in *.zip
do
  unzip $i
done

(Примечание: это необязательный шаг. Комманде hgtchop можно указать hgt файл c расширением .zip)

Сейчас, когда данные распакованы, их надо конвертировать в формат TerraGear в директорию work. Команда, которой это делается — hgtchop. Сначала создайте каталог work/SRTM-30. Затем с помощью скрипта конвертируйте все файлы по очереди:

for i in *.hgt
do
  hgtchop 3 <scenery>/data/SRTM-3/$i <scenery>/work/SRTM-30
done

где <scenery> — полный путь к вашему сценарному каталогу (по каким-то причинам hgtchop не любит относительные пути).

Если вы используете односекундные данные (SRTM-1), замените вызов hgtchop на "hgtchop 1 $i work/SRTM-1".

Если вы сейчас посмотрите в каталог work/SRTM-30, то, что вы увидите, будет похоже на привычное дерево сценария, с каталогом на каждый квадрат 10x10 градусов, и каждый такой каталог содержит подкаталоги для каждого квадрата 1x1 градус, а каждый из них в свою очередь содержит файлы .arr.gz.

Мы ещё не закончили с возвышениями. Сейчас они в очень неэффективной форме — точки равномерно разбросаны по широте и долготе. Это неэффективно, потому что большие площади земли имеют одинаковое возвышение. Мы используем для оптимизации данных скрипт terrafit.py.

Смените каталог в work/SRTM-30 и выполните

terrafit.py .

Он пробежится по всем подкаталогам и создаст файлы .fit.gz с подогнанными данными возвышений. Если же не появилось ни одного .fit.gz файла то скрипт отработал с ошибкой. По сути для конвертации скрипт использует утилиту terra, поэтому одной из причин может быть неправильный путь к утилите terra. Для того чтоб все исправить найдите фаил terrafit.py, откройте его в любом текстовом редакторе, найдите строку 41, она выглядит примерно так:

command = "/media/disk2Tb/tg-bin/bin/terra -e %f -n %d -p %d -h %f -o %s obj %s"%(thresh, minnodes, count, factor, objName, pgmName)

Проверьте чтобы путь к файлу terra был правильным, и повторите все заново.

С возвышениями всё.

Аэропорты

После формирования данных по высотам мы можем формировать аэропорты. Сначала создайте каталог data/airports и скопируйте в него свой файл apt.dat. Он может быть прямо из комплекта данных FG (сначала его надо будет раззиповать) или модифицированным с помощью TaxiDraw.

Программа, создающая аэропорты — genapts. Запустите её без аргументов для просмотра опций командной строки.

Если она просто запущена с указанием apt.dat и рабочего каталога, то сварит раскладку для каждого аэропорта, который есть в файле, что может занять длительное время.

Если же вы хотите создать только один а/п и знаете его идентификатор ИКАО, используйте как указано ниже из каталога сценария (то есть из того, который содержит каталоги data, work и output.

genapts --input=data/airports/apt.dat --work=./work --airport=<AIRPORT_ID>

(Примечание: genapts может читать заархивированный apt.dat.gz)

Если вы генерируете больший кусок, можете указать минимальную и максимальную широту и долготу.

genapts создаст два подкаталога в каталоге workAirportArea и AirportObj. В них определяются раскладка аэропортов и присутствующих объектов (например, флюгеров).

Вроде и с аэропортами расправились.

Земля

Последний набор данных, нужный нам для генерации — данные о поверхности (в оригинале "land-use data"). В общем случае они берутся из набора данных VMAP0 в виде шейпфайлов с мапсервера базы данных сценария, но может быть использован и другой источник.

Данные о поверхности можно поделить на несколько типов:

  • Суша. Разделяют землю и море. Используются в качестве маски для всех остальных данных. В основном используется VMAP0 Landmass, но можно пользовать и GSHHS.
  • Тип поверхности. Определяет, является ли кусок земли лесом, городом, песком, лавой, ледником и т.д. Обычно это данные VMAP0, определённые в виде многоугольников.
  • Данные о линиях. Включают железные дороги, потоки, дороги. Обычно VMAP0, но для дорог можно и Open Street Map.
  • Данные о точках. В настоящее время используется только для определения мелких поселений.

Самый простой путь получения этих данных — слить шейпфайлы с чудесного урла http://mapserver.flightgear.org. Он предоставляет доступ к базе данных с интересующей информацией и позволяет получать определённые шейпфайлы для области вашего сценария. Щёлкните на линке "Download Shapefiles" (или идите прямо на http://mapserver.flightgear.org/download.psp). Введите крайние координаты сценария, который вы хотите создать, выберите желаемые шейпфайлы и щёлкните "Download". Для первой генерации вашего сценария вам потребуются все файлы, относящиеся к VMAP0 (с префиксом "v0_").

Скачивайте их в каталог data/shapefiles.

Вы можете открыть эти файлы на просмотр или редактирование в редакторе ГИС, такой как QGIS или GRASS. Это удобно для проверки правильности файлов.

Позднее можно поэкспериментировать с заменой разных шейпфайлов другими версиями (GSHHS для побережья, OSM для дорог etc.).

Сейчас нужно декодировать эти файлы в формат TerraGear. Это делается командой shape-decode.

У неё есть три важных аргумента командной строки.

  • имя шейпфайла (без расширения .shp), который вы хотите декодировать;
  • каталог, в который вы хотите писать данные;
  • имя используемого материала

Каждый шейпфайл соответствует одному из материалов, определённых в файле materials.xml. Соответствие весьма понятное, например, v0_mixedcroppasturecover соответствует MixedCropPastureCover. Обратите внимание, что материалы чувствительны к регистру, поэтому удобно будет иметь materials.xml под рукой для проверки. Исключение — v0_landmass, который ДОЛЖЕН соответствовать типу "Default".

Вдобавок, есть несколько добавочных аргументов для указания ширины линейных данных (для дорог, потоков, железных дорог), для указания, насколько большими делать точечные данные (для сёл), а также для указания того, насколько длинной может быть наидлиннейшая прямая линия.

Для примера, для декодирования шейпфайла v0_landmass используется следующая команда:

shape-decode --max-segment 500 data/shapefiles/v0_landmass work/Landmass Default

Для создания потоков шириной 10 метров

shape-decode --max-segment 500 --line-width 10 data/shapefiles/v0_stream work/Stream Stream

Для создания нескольких городков около 1 км в поперечнике

shape-decode --point-width 500 data/shapefiles/v0_town work/Town Town

Выполните команду для каждого шейпфайла в наборе.

Финальная сборка

Сейчас в рабочем каталоге у вас должно быть что-то вроде этого:

AirportArea           SRTM-30
AirportObj            Stream
Bog                   IrrCropPastureCover    Town
Lake                  Urban                  Landmass
Railroad              DryCropPastureCover    Road
EvergreenBroadCover   Marsh                  Sand
MixedCropPastureCover ScrubCover
GrassCover            MixedForestCover       Shared

Сейчас мы можем генерировать собственно сценарий. Это делается командой fgfs-construct. Запустите её с "--help" для получения информации об использовании.

Нам надо определить:

  • рабочий (--work-dir) и результирующий (--output-dir) каталоги
  • центр сценария, который мы хотим генерировать (--lat, --lon)
  • радиус (--xdist, --ydist), до которого генерировать
  • все каталоги для включения в сценарий

Например:

fgfs-construct --work-dir=./work --output-dir=./output --lon=55 --lat=60 --xdist=3 --ydist=3 \
AirportArea SRTM-30 AirportObj Stream Bog IrrCropPastureCover Town Lake Urban Landmass Railroad \
DryCropPastureCover Road EvergreenBroadCover Marsh Sand MixedCropPastureCover ScrubCover GrassCover \
MixedForestCover

По окончании работы, каталог output будет содержать поддерево сценария (или подкаталог scenery? Из контекста оригинала ("will contain a scenery sub-tree") не понятно — SashaP 08:07, 22 апреля 2008 (CDT))

Укажите на него fgfs'у либо установкой переменной окружения $FG_SCENERY, либо с помощью ключа --fg-scenery, и испытайте ваш новый сценарий!

Модификация сценария

Одна из интересных вещей, которые можно делать с помощью TerraGear — испытывать новые источники данных для сценария, или изменять сами данные сценария. Вот пара указивок:

  • суша в VMAP0 не очень точна. Есть более точный набор данных по побережью, называющийся GSHHS. Однако, в настоящее время он не совпадает с нашим сценарием, поэтому не используется. С использованием ГИС-редактора вы можете подогнать данные VMAP под соответствие побережью GSHHS для создания более точной суши. Так как линия побережья (тип сценария Default) используется как маска для всех остальных типов сценария, не так уж важно, чтобы ваши изменения были абсолютно точными.
  • мапсервер включает информацию из проекта Open Street Map. Вы можете использовать эти шейпфайлы прямо вместо v0_road. Они хороши.
  • вы можете использовать редактор ГИС типа QGIS или GRASS для редактирования шейпфайлов, например, для добавления пропущенных дорог или деревень.

Отладка и траблошутинг

Ниже — список частых проблем и решений. Сомневаетесь — гугль в помощь.

  • Падения genapts. Иногда genapts падает при обработке определённого аэропорта. В этом случае, попробуйте запустить его снова с ключами --start-id для запуска с аэропорта, на котором случилась авария, и с ключом --nudge, который пытается подталкивать вычисления в правильном направлении.
  • fgfs-construct Killed. На Ubuntu процесс fgfs-construct может быть убит ядром из-за использования слишком многих системных ресурсов. Простое решение состоит в генерации меньших блоков сценария путём задания меньших аргументов --xdist and --ydist.
  • Аэропорты появляются на дне провалов, или наблюдаются пробелы между аэропортами и террайном. Это обычно случается, когда genapts не может найти нужных данных о возвышениях, или когда данные о возвышениях изменились между проходами genapts и shape-decode. Попробуйте сгенерировать один аэропорт в области вашего сценария и посмотрите на вывод. В частности, убедитесь в существовании каталога work/SRTM-30
  • В сценарии появляются только аэропорты. Есть три типичных причины:
    • Вы не скачали нужных шейпфайлов для области;
    • Вы не запустили shape-decode на v0_landmass как Default;
    • Вы не включили правильные каталоги в fgfs-construct
  • Сгенерированный сценарий включает данные, удалённые из шейпфайлов. Если вы редактируете шейпфайлы, необходимо удалить соответствующую рабочую поддиректорию перед запуском shape-decode. Иначе ваши изменения будут дополнениями к тому, что уже присутствует.
Личные инструменты