Путешествия в KML

Оглавление

Введение

В Google Планете Земля 5.0 появилась новая функция – путешествия, позволяющая выполнять следующее:

  • определять время перемещения между двумя точками;
  • реализовать плавное движение сквозь точки без остановки;
  • воспроизводить звуковые файлы в заданные моменты времени;
  • обновлять компонентов KML в рамках путешествия.

Чтобы лучше понять, как пользователь Google Планеты Земля работает с путешествиями, обратитесь к Руководству пользователя.

Пространство имен расширений Google

Элементы KML, относящиеся к путешествиям, задаются с помощью расширений стандарта OGC KML. Для этого служит префикс gx. Чтобы использовать их, добавьте в открывающий тег <kml> KML-файла нужный URI пространства имен:

<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">

Набор расширений gx включает следующие элементы, относящиеся к путешествиям:

<gx:Tour> <gx:playMode>
<gx:Playlist> <gx:Wait>
<gx:Flyto> <gx:AnimatedUpdate>
<gx:flyToMode> <gx:SoundCue>
<gx:TourControl> <gx:duration>

Путешествия поддерживаются в Google Планете Земля 5.0, но могут не работать в других геобраузерах. Данные неподдерживаемых расширений в этом случае будут игнорироваться, а остальное содержание KML-файла должно загружаться без ошибок.

Термины

Базисный элемент путешествия определяет конкретное действие в рамках путешествия. Примером служит действие FlyTo, определяемое элементом <gx:FlyTo> и его дочерними элементами.

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

Структура путешествия

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

В примере ниже полностью показан код путешествия, а также папка с метками. Путешествие начинается на Южном острове Новой Зеландии и заканчивается на пике Таранаки. В примере демонстрируется применение <flyToMode> с параметрами smooth и bounce, а также элемента <gx:balloonVisibility>, служащего для отображения всплывающих окон с описанием. Отдельные элементы подробно описаны ниже.

 complete_tour_example.kml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">

<Document>
  <name>Путешествие и его компоненты</name>
  <open>1</open>

  <gx:Tour>
    <name>Начать!</name>
    <gx:Playlist>

      <gx:FlyTo>
        <gx:duration>5.0</gx:duration>
        <!-- по умолчанию для flyToMode устанавливается значение bounce -->
        <Camera>
          <longitude>170.157</longitude>
          <latitude>-43.671</latitude>
          <altitude>9700</altitude
          <heading>-6.333</heading>
          <tilt>33.5</tilt>
        </Camera>
      </gx:FlyTo>

      <gx:Wait>
        <gx:duration>1.0</gx:duration>
      </gx:Wait>

      <gx:FlyTo>
        <gx:duration>6.0</gx:duration>
        <Camera>
          <longitude>174.063</longitude>
          <latitude>-39.663</latitude>
          <altitude>18275</altitude>
          <heading>-4.921</heading>
          <tilt>65</tilt>
          <altitudeMode>absolute</altitudeMode>
        </Camera>
      </gx:FlyTo>

      <gx:FlyTo>
        <gx:duration>3.0</gx:duration>
        <gx:flyToMode>smooth</gx:flyToMode>
        <LookAt>
          <longitude>174.007</longitude>
          <latitude>-39.279</latitude>
          <altitude>0</altitude>
          <heading>112.817</heading>
          <tilt>68.065</tilt>
          <range>6811.884</range>
          <altitudeMode>relativeToGround</altitudeMode>
        </LookAt>
      </gx:FlyTo>

      <gx:FlyTo>
        <gx:duration>3.0</gx:duration>
        <gx:flyToMode>smooth</gx:flyToMode>
        <LookAt>
          <longitude>174.064</longitude>
          <latitude>-39.321</latitude>
          <altitude>0</altitude>
          <heading>-48.463</heading>
          <tilt>67.946</tilt>
          <range>4202.579</range>
          <altitudeMode>relativeToGround</altitudeMode>
        </LookAt>
       </gx:FlyTo>

      <gx:FlyTo>
        <gx:duration>5.0</gx:duration>
        <LookAt>
          <longitude>175.365</longitude>
          <latitude>-36.523</latitude>
          <altitude>0</altitude>
          <heading>-95</heading>
          <tilt>65</tilt>
          <range>2500</range>
          <altitudeMode>relativeToGround</altitudeMode>
        </LookAt>
      </gx:FlyTo>

      <gx:AnimatedUpdate>
        <gx:duration>0.0</gx:duration>
        <Update>
          <targetHref/>
          <Change>
            <Placemark targetId="pin2">
              <gx:balloonVisibility>1</gx:balloonVisibility>
            </Placemark>
          </Change>
        </Update>
      </gx:AnimatedUpdate>

      <gx:Wait>
        <gx:duration>6.0</gx:duration>
      </gx:Wait>

    </gx:Playlist>
  </gx:Tour>

  <Folder>
    <name>Точки и многоугольники</name>

    <Style id="pushpin">
      <IconStyle>
        <Icon>
          <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
        </Icon>
      </IconStyle>
    </Style>

    <Placemark id="mountainpin1">
      <name>Новозеландские Альпы</name>
      <styleUrl>#pushpin</styleUrl>
      <Point>
        <coordinates>170.144,-43.605,0</coordinates>
      </Point>
    </Placemark>

    <Placemark id="pin2">
      <name>Конец</name>
      <description>
        Подробные сведения: http://developers.google.com/kml/documentation
      </description>
      <styleUrl>pushpin</styleUrl>
      <Point>
        <coordinates>175.370,-36.526,0</coordinates>
      </Point>
    </Placemark>

    <Placemark id="polygon1">
      <name>Многоугольник</name>
      <Polygon>
        <tessellate>1</tessellate>
        <outerBoundaryIs>
          <LinearRing>
            <coordinates>
              175.365,-36.522,0
              175.366,-36.530,0
              175.369,-36.529,0
              175.366,-36.521,0
              175.365,-36.522,0
            </coordinates>
          </LinearRing>
        </outerBoundaryIs>
      </Polygon>
    </Placemark>

  </Folder>
</Document>
</kml>

Временная шкала путешествия

Путешествия формируются из последовательностей базисных элементов: FlyTo, Wait, TourControl, AnimatedUpdate и SoundCue. Некоторые из них воспроизводятся только по очереди, т. е. для запуска последующего необходимо дождаться завершения предыдущего, а некоторые могут выполняться одновременно.

Базисные элементы, выполняемые последовательно

  • <gx:FlyTo>
  • <gx:Wait>
  • <gx:TourControl>

Эти элементы воспроизводятся один за другим: прежде чем запускать следующий, необходимо дождаться завершения предыдущего. Таким образом, одновременно может выполняться только одна последовательность базисных элементов (FlyTo, Wait, TourControl). До ее завершения нельзя запускать другие элементы SoundCue или AnimatedUpdate.

Базисные элементы, выполняемые параллельно

  • <gx:AnimatedUpdate>
  • <gx:SoundCue>

Эти базисные элементы запускаются в моменты, определенные в плейлисте. Чтобы запустить следующий элемент, не нужно дожидаться завершения предыдущего. Это означает следующее:

  • одновременно можно запустить любое количество элементов SoundCue и/или AnimatedUpdate, разместив их в плейлисте друг за другом;
  • SoundCue или AnimatedUpdate может воспроизводиться (но не может быть запущен) во время выполнения последовательно выполняемых элементов.

Этот принцип проиллюстрирован на схеме ниже. Нажмите на картинку, чтобы увеличить ее и просмотреть KML-код, определяющий базисные объекты в плейлисте.


 

Как показано на схеме, каждому элементу FlyTo отведено определенное время (оно задается с помощью элемента <gx:duration>). Следующий базисный элемент может быть запущен только по истечении этого времени.

SoundCue, наоборот, может выполняться параллельно с другими. Следующий базисный элемент на временной шкале запускается одновременно со звуковым файлом. Звуковой файл воспроизводится целиком либо до завершения путешествия (в зависимости от того, что закончится раньше – путешествие или файл). Одновременно можно запускать любое количество звуковых файлов, т. к. каждый из них находится на собственной временной шкале.

Обновления анимации ведут себя подобным образом. Например, если значок метки должен увеличиваться в размерах в течение пяти секунд, это может происходить параллельно с выполнением последующих базисных элементов.

FlyTo и flyToMode

Смысл путешествия заключается в перемещении из точки А в точку Б, что представлено элементом <gx:FlyTo>. Он содержит элемент <AbstractView> (<Camera> или <LookAt>), определяющий точку, угол и высоту камеры.

Кроме того, элемент flyToMode позволяет определить, каким образом переместиться к точке. До представления элемента <gx:Tour> путешествия выглядели в браузере как скачки от метки к метке: скорость полета (определяемая браузером) снижалась по мере приближения к конечной точке и падала до нуля, прежде чем начиналось движение к следующей метке. Такое поведение по-прежнему можно запрограммировать с помощью свойства <gx:flyToMode>bounce</gx:flyToMode>.

Свойство smooth элемента flyToMode отвечает за равномерное движение в пространстве. Скорость полета определяется с помощью элемента <gx:duration>, который сообщает браузеру время, необходимое на перемещение между точками. Непрерывное движение составляется из нескольких последовательных элементов FlyTo и flyToMode со свойством smooth. Геобраузер интерполирует скорость и траекторию движения между точками так, чтобы проходить каждую из них в момент, указанный в KML-коде. В отличие от свойства bounce элемента flyToMode, скорость никогда не снижается до нуля. Исключение составляют следующие события:

  • конец путешествия;
  • точка, для элемента flyToMode которой задано свойство bounce;
  • ожидание.

Паузы, обновления анимации и звуковые эффекты не прерывают полет.

Первый элемент FlyTo

Первый элемент <gx:FlyTo>, встречающийся в плейлисте, выполняется из текущего положения пользователя в Google Планете Земля. Скорость перемещения к первой точке зависит от того, как далеко от нее находится пользователь, поскольку длительность перемещения строго задана. Чтобы движение выглядело максимально естественно, рекомендуем задавать для первого элемента FlyTo длительность не менее пяти секунд и определять для него свойство bounce.

Если для элемента <gx:flyToMode> в первом FlyTo определено свойство smooth, а за ним следуют другие FlyTo со свойством smooth, исходное положение пользователя интерпретируется как точка на кривой и влияет на форму траектории, соединяющей первую точку с остальными. Это означает, что первый элемент FlyTo может выполняться по-разному в зависимости от того, где именно в Google Планете Земля находился пользователь перед началом путешествия. Если вам все же требуется плавный переход к первой точке, добавьте элемент <gx:Wait> после первого FlyTo, чтобы отделить исходное положение пользователя от последующих точек.

Примеры

В примерах ниже проиллюстрирована разница между свойствами bounce и smooth элемента flyToMode. Оба маршрута проходят через одинаковые точки, но используют разные режимы. Чтобы воспроизвести путешествия в Google Планете Земля, перейдите по ссылкам над фрагментами кода, а затем дважды нажмите на название путешествия в панели Метки в геобраузере.

 bounce_example.kml

<gx:FlyTo>
  <gx:duration>4.0</gx:duration>
  <!-- по умолчанию для flyToMode устанавливается значение bounce -->
  <LookAt>
    <longitude>-121.303179</longitude>
    <latitude>45.993041</latitude>
    <altitude>0</altitude>
    <heading>-27.923387</heading>
    <tilt>71.600075</tilt>
    <range>22570.546801</range>
    <altitudeMode>relativeToGround</altitudeMode>
  </LookAt>
</gx:FlyTo>

<!-- ...вырезано... -->

 smooth_example.kml

<gx:FlyTo>
  <gx:duration>4.0</gx:duration>
  <gx:flyToMode>smooth</gx:flyToMode>
  <LookAt>
    <longitude>-121.303179</longitude>
    <latitude>45.993041</latitude>
    <altitude>0</altitude>
    <heading>-27.923387</heading>
    <tilt>71.600075</tilt>
    <range>22570.546801</range>
    <altitudeMode>relativeToGround</altitudeMode>
  </LookAt>
</gx:FlyTo>

<!-- ...вырезано... -->

Паузы и ожидание

Ожидание приостанавливает движение в пространстве, но звуковые эффекты и обновления анимации продолжают воспроизводиться. Длительность ожидания определяется в KML-коде.

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

Ожидание

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

<gx:Wait>
    <gx:duration>10.0</gx:duration>   <!-- время ожидания в секундах -->
</gx:Wait>

Время ожидания задается в секундах с помощью элемента <gx:duration>. После его истечения начинает выполняться следующее действие в плейлисте. Ожидание разбивает плавную траекторию полета, т. е. скорость камеры снижается до нуля непосредственно перед началом ожидания, даже если для элемента flyToMode определено свойство smooth.

Пауза

Паузы, которые может делать пользователь, определяются с помощью элемента <gx:TourControl> и его дочернего элемента <gx:playMode>. Последний может иметь только одно значение – pause. Вызов этого действия равноценен нажатию пользователем кнопки приостановки в интерфейсе геобраузера. Путешествие не возобновляется до тех пор, пока не будет нажата кнопка Воспроизвести. Во время паузы пользователь может свободно перемещаться в среде Планеты Земля. После нажатия кнопки Воспроизвести он вернется к точке, в которой путешествие было приостановлено.

Паузы не влияют на плавность движения, т. е. скорость до и после паузы рассчитывается браузером так, будто паузы вовсе нет.

<gx:TourControl>
    <gx:playMode>pause</gx:playMode>
</gx:TourControl>

Примеры

Ниже показан пример ожидания. Сначала запускается звуковой файл (10-секундное приветствие). Сразу после него в плейлисте добавлено 10-секундное ожидание, чтобы последующий элемент FlyTo не выполнялся, пока приветствие не завершится.

 wait_example.kml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">   

<gx:Tour>
  <gx:Playlist>

    <gx:SoundCue>
      <href>
        http://dev.keyhole.com/codesite/cntowerfacts.mp3
      </href>   <!-- 10-секундный файл -->
    </gx:SoundCue>

    <gx:Wait>
      <gx:duration>10</gx:duration>
    </gx:Wait>

    <gx:FlyTo>
      <gx:duration>5</gx:duration>
      <gx:flyToMode>bounce</gx:flyToMode>
      <LookAt>
        <longitude>-79.387</longitude>
<latitude>43.643</latitude
<altitude>0</altitude> <heading>-172.3</heading> <tilt>10</tilt> <range>1200</range> <altitudeMode>relativeToGround</altitudeMode>
</LookAt> </gx:FlyTo> </gx:Playlist> </gx:Tour> </kml>

Ниже показан пример паузы. Пользователь перемещается в заданную точку, затем в путешествии наступает пауза. В это время пользователь может свободно перемещаться в среде Планеты Земля. Чтобы возобновить путешествие, пользователю потребуется нажать кнопку Воспроизвести на панели управления, после чего он перенесется в ту точку, в которой путешествие было приостановлено, и оно будет продолжено.

 pause_example.kml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">  

<gx:Tour>
  <gx:Playlist>

    <gx:FlyTo>
<gx:duration>5</gx:duration>
<gx:flyToMode>bounce</gx:flyToMode>
<LookAt>
<longitude>-79.387</longitude>
<latitude>43.643</latitude
<altitude>0</altitude>
<heading>-172.3</heading>
<tilt>10</tilt>
<range>1200</range>
<altitudeMode>relativeToGround</altitudeMode>
</LookAt>
</gx:FlyTo> <gx:TourControl> <gx:playMode>pause</gx:playMode> </gx:TourControl> <gx:SoundCue> <href> http://dev.keyhole.com/codesite/cntowerfacts.mp3 </href> <!-- 10-секундный файл --> </gx:SoundCue> <gx:Wait> <gx:duration>10.0</gx:duration> </gx:Wait> </gx:Playlist> </gx:Tour> </kml>

Обновления

Во время путешествия компоненты KML в Google Планете Земля можно создавать или модифицировать, в том числе изменять размер, стиль и положения меток, добавлять наложения на земную поверхность, геометрические элементы и т. д. Подробные сведения приведены в разделе Обновления в Руководстве разработчика.

Обновления компонентов KML можно выполнять во время путешествия с помощью элемента <gx:AnimatedUpdate>. Обновление во время путешествия отличается от обновления по сетевой ссылке:

  • оно отменяется после окончания путешествия;
  • оно не учитывается при сохранении текущего состояния.

Кроме того, все изменения, подлежащие интерполяции (т. е. содержащие промежуточные состояния, например изменения размера) анимируются в течение строго определенного времени. Изменения, не подразумевающие промежуточных состояний (например, отображение и скрытие всплывающих окон с описанием), выполняются по истечении указанного времени. Если время не указано, обновление происходит сразу же (значение <gx:duration> по умолчанию – 0.0).

За исключением описанных выше особенностей элемент <Update> внутри <gx:AnimatedUpdate> работает точно так же, как внутри <NetworkLinkControl>. С его помощью можно менять размеры, внешний вид и положения меток, добавлять модели и наложения на земную поверхность, а также скрывать и отображать описания, определенные элементом <gx:balloonVisibility>.

Элемент <gx:AnimatedUpdate> и временная шкала путешествия

Обновления анимации могут выполняться параллельно с остальными базисными элементами, т. е. дожидаться их завершения не требуется. Элемент <gx:duration> определяет длительность обновления, но никак не влияет на время запуска следующего базисного элемента.

Если вы не хотите, чтобы следующее действие начиналось до завершения обновления, вставьте между ними элемент <gx:Wait>, определив для него такую же длительность, как для обновления.

Также обратите внимание на то, что обновление анимации будет прекращено, если его длительность превышает время выполнения последнего элемента <gx:FlyTo> или <gx:Wait>. Чтобы этого не произошло, либо измените значение <gx:duration>, либо добавьте в конец плейлиста элемент <gx:Wait> – это даст обновлению время завершиться.

Подробные сведения о временной шкале приведены в разделе Временная шкала путешествия выше.

Пример

В примере ниже показано изменение размера значка метки с 1.0 до 10.0. Анимация занимает 6,5 секунды, в течение которых значок плавно увеличивается.

Обратите внимание на то, что в конце путешествия добавлен элемент <gx:Wait>. Само по себе обновление анимации не продлевает время путешествия; его могут продлевать только последовательно выполняемые базисные элементы. Именно по этой причине в конце добавлено ожидание длительностью 2,4 секунды. Выполнение FlyTo занимает 4,1 секунды, Wait – ещё 2,4 секунды. Таким образом, обновление успевает завершиться до окончания путешествия.

 animatedupdate_example.kml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"> <Document> <name>gx:AnimatedUpdate example</name> <open>1</open> <Style id="style"> <IconStyle id="iconstyle"> <scale>1.0</scale> </IconStyle> </Style> <Placemark id="mountainpin1"> <name>Новозеландские Альпы</name> <styleUrl>#style</styleUrl> <Point> <coordinates>170.144,-43.605,0</coordinates> </Point> </Placemark> <gx:Tour> <name>Начать!</name> <gx:Playlist> <!-- Порядок базисных компонентов важен; в этом примере для выполнения AnimatedUpdate требуется 6,5 секунды. FlyTo выполняется 4,1 секунды, а Wait – ещё 2,4 секунды. Таким образом, обновление завершается раньше, чем путешествие. AnimatedUpdate не может продлить путешествие, в отличие от FlyTo или Wait. Подробные сведения: http://developers.google.com/kml/documentation/touring.html#tourtimelines --> <gx:AnimatedUpdate> <gx:duration>6.5</gx:duration> <Update> <targetHref></targetHref> <Change> <IconStyle targetId="iconstyle"> <scale>10.0</scale> </IconStyle> </Change> </Update> </gx:AnimatedUpdate> <gx:FlyTo> <gx:duration>4.1</gx:duration> <Camera> <longitude>170.157</longitude> <latitude>-43.671</latitude> <altitude>9700</altitude> <heading>-6.333</heading> <tilt>33.5</tilt> <roll>0</roll> </Camera> </gx:FlyTo> <!-- ждем завершения AnimatedUpdate --> <gx:Wait> <gx:duration>2.4</gx:duration> </gx:Wait> </gx:Playlist> </gx:Tour> </Document> </kml>

Звуковые эффекты

В путешествия можно добавлять звуковые файлы и воспроизводить их в любой момент времени с помощью элемента <gx:SoundCue>. На аудиофайлы указывают дочерние элементы <href>. Поддерживаемые форматы зависят от кодеков, установленных в системе, и включают, как минимум, следующие:

  • mp3
  • aac

Длительность файлов не ограничена.

Звуковые файлы могут воспроизводиться параллельно, не задерживая выполнение последующих базисных элементов. Подробные сведения приведены в разделе Временная шкала путешествия. Обратите внимание на то, что воспроизведение звукового файла не продлевает время путешествия; продлить его могут только последовательно выполняемые базисные элементы. Если путешествие закончится раньше, чем аудиофайл, воспроизведение звука остановится.

Воспроизведение нескольких звуковых файлов

В Google Планете Земля можно воспроизводить сразу несколько звуковых файлов. Например, в самом начале путешествия начинает играть фоновая музыка, а в заданные моменты времени на нее накладывается закадровый голос.

Завершение звукового файла до запуска следующего базисного элемента

Если вы хотите, чтобы воспроизведение звука было завершено до запуска следующего базисного элемента, добавьте элемент <gx:Wait> сразу после <gx:SoundCue>. Укажите для <gx:Wait> время в секундах, на которое требуется отложить запуск следующего элемента.

Если путешествие закончится, воспроизведение звука прекратится. Чтобы дать аудиофайлу возможность завершиться, добавьте в конец плейлиста ожидание соответствующей длительности.

Пример

Ниже показано 15-секундное путешествие, длительность которого складывается из времени выполнения <gx:FlyTo> и <gx:Wait>. Первый звуковой фрагмент занимает 15 секунд и воспроизводится в течение всего путешествия. Второй фрагмент запускается через 5 секунд после начала путешествия и оставшиеся 10 секунд воспроизводится вместе с первым. Элемент <gx:Wait> добавлен для того, чтобы путешествие не закончилось раньше, чем звуковые файлы.

 soundcue_example.kml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">

<gx:Tour>
  <gx:Playlist>
 
    <gx:SoundCue>
      <href>
        http://dev.keyhole.com/codesite/AJsBlues.mp3
      </href>    <!-- 15-секундный аудиофрагмент -->
    </gx:SoundCue>
 
    <gx:FlyTo>
      <gx:duration>5</gx:duration>
      <gx:flyToMode>bounce</gx:flyToMode>
      <LookAt>
        <longitude>-79.387</longitude>
<latitude>43.643</latitude
<altitude>0</altitude>
<range>1200</range>
<tilt>10</tilt>
<heading>-172.3</heading>
<altitudeMode>relativeToGround</altitudeMode>
</LookAt> </gx:FlyTo> <gx:SoundCue> <href> http://dev.keyhole.com/codesite/cntowerfacts.mp3 </href> <!-- 10-секундный аудиофрагмент --> </gx:SoundCue> <gx:Wait> <gx:duration>10</gx:duration> <!-- продлевает путешествие на 10 секунд --> </gx:Wait> <!-- чтобы аудиофрагмент успел завершиться --> </gx:Playlist> </gx:Tour> </kml>

Отображение всплывающих окон с описаниями

Во время путешествия можно отображать и скрывать всплывающие окна с описаниями меток. Для этого используется обновление анимации с элементом <gx:balloonVisibility>. Отображение окна не анимируется, т. е. оно не отрисовывется постепенно в течение указанного времени, а моментально открывается по его истечении. Если значение <gx:duration> не задано, используется значение по умолчанию 0.0 (окно отображается или скрывается немедленно).

Пример

 balloonvisibility_tourexample.kml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">
  
  <Document>
    <name>Пример balloonVisibility</name>
    <open>1</open>

    <gx:Tour>
      <name>Начать</name>
      <gx:Playlist>
 
        <gx:FlyTo>
          <gx:duration>5.0</gx:duration>
          <!-- по умолчанию для flyToMode устанавливается значение bounce -->
          <LookAt>
            <longitude>-119.748584</longitude>
            <latitude>33.736266</latitude>
            <altitude>0</altitude>
            <heading>-9.295926</heading>
            <tilt>84.0957450</tilt>
            <range>4469.850414</range>
            <gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
          </LookAt>
        </gx:FlyTo>

        <gx:AnimatedUpdate>
          <!-- по умолчанию устанавливается длительность 0.0 -->
          <Update>
            <targetHref/>
            <Change>
              <Placemark targetId="underwater1">
                <gx:balloonVisibility>1</gx:balloonVisibility>
              </Placemark>
            </Change>
          </Update>
        </gx:AnimatedUpdate>

        <gx:Wait>
          <gx:duration>4.0</gx:duration>
        </gx:Wait>

        <gx:AnimatedUpdate>
          <Update>
            <targetHref/>
            <Change>
              <Placemark targetId="underwater1">
                <gx:balloonVisibility>0</gx:balloonVisibility>
              </Placemark>
            </Change>
          </Update>
        </gx:AnimatedUpdate>

        <gx:FlyTo>
          <gx:duration>3</gx:duration>
          <gx:flyToMode>smooth</gx:flyToMode>
          <LookAt>
            <longitude>-119.782630</longitude>
            <latitude>33.862855</latitude>
            <altitude>0</altitude>
            <heading>-19.314858</heading>
            <tilt>84.117317</tilt>
            <range>6792.665540</range>
            <gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
          </LookAt>
        </gx:FlyTo>

        <gx:AnimatedUpdate>
          <Update>
            <targetHref/>
            <Change>
              <Placemark targetId="underwater2">
                <gx:balloonVisibility>1</gx:balloonVisibility>
              </Placemark>
            </Change>
          </Update>
        </gx:AnimatedUpdate>

        <gx:Wait>
          <gx:duration>4.0</gx:duration>
        </gx:Wait>

        <gx:AnimatedUpdate>
          <Update>
            <targetHref/>
            <Change>
              <Placemark targetId="underwater2">
                <gx:balloonVisibility>0</gx:balloonVisibility>
              </Placemark>
            </Change>
          </Update>
        </gx:AnimatedUpdate>

        <gx:FlyTo>
          <gx:duration>3</gx:duration>
          <gx:flyToMode>smooth</gx:flyToMode>
          <LookAt>
            <longitude>-119.849578</longitude>
            <latitude>33.968515</latitude>
            <altitude>0</altitude>
            <heading>-173.948935</heading>
            <tilt>23.063392</tilt>
            <range>3733.666023</range>
            <altitudeMode>relativeToGround</altitudeMode>
          </LookAt>
        </gx:FlyTo>

        <gx:AnimatedUpdate>
          <Update>
            <targetHref/>
            <Change>
              <Placemark targetId="onland">
                <gx:balloonVisibility>1</gx:balloonVisibility>
              </Placemark>
            </Change>
          </Update>
        </gx:AnimatedUpdate>

        <gx:Wait>
          <gx:duration>4.0</gx:duration>
        </gx:Wait>

      </gx:Playlist>
    </gx:Tour>

    <Placemark id="underwater1">
      <name>Под водой у побережья Калифорнии</name>
      <description>
        Путешествия начинается у желоба Санта-Крус 
        недалеко от побережья Калифронии.
      </description>
      <Point>
        <gx:altitudeMode>clampToSeaFloor</gx:altitudeMode>
        <coordinates>-119.749531,33.715059,0</coordinates>
      </Point>
    </Placemark>

    <Placemark id="underwater2">
      <name>Все ещё плывем…</name>
      <description>Вскоре мы вынырнем и переместимся на сушу…</description>
      <Point>
        <gx:altitudeMode>clampToSeaFloor</gx:altitudeMode>
        <coordinates>-119.779550,33.829268,0</coordinates>
      </Point>
    </Placemark>

    <Placemark id="onland">
      <name>Конец</name>
      <description>
        <![CDATA[Путешествие подошло к концу. 
        Используйте <gx:balloonVisibility>1</gx:balloonVisibility>, 
        чтобы отобразить всплывающие окна с описанием.]]>
      </description>
      <Point>
        <coordinates>-119.849578,33.968515,0</coordinates>
      </Point>
    </Placemark>

  </Document>
</kml>

Добавление исторических изображений

Если пользователь включил в геобраузере исторические изображения, вы можете определить в рамках путешествия дату, изображения за которую будут показываться. Для этого добавьте в AbstractView элемент <gx:TimeStamp>. Обратите внимание на то, что <gx:TimeStamp> также влияет на поведение компонентов KML, привязанных ко времени и солнечного света.

Для показа изображений используется последняя из указанных дат.

Пример

 historicalimagery_example.kml

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
 xmlns:gx="http://www.google.com/kml/ext/2.2">

<gx:Tour>
  <name>История одного городка</name>
  <gx:Playlist>
    <gx:FlyTo>
      <gx:duration>5.0</gx:duration>
      <Camera>
        <gx:TimeStamp>
          <when>1990-08-04</when>
        </gx:TimeStamp>
        <longitude>-121.991</longitude>
        <latitude>47.857</latitude>
        <altitude>7000</altitude>
        <altitudeMode>absolute</altitudeMode>
      </Camera>
    </gx:FlyTo>

    <gx:FlyTo>
      <gx:duration>3.0</gx:duration>
      <gx:flyToMode>smooth</gx:flyToMode>
      <Camera>
        <gx:TimeStamp>
          <when>2009</when>
        </gx:TimeStamp>
        <longitude>-121.991</longitude>
        <latitude>47.857</latitude>
        <altitude>7000</altitude>
        <altitudeMode>absolute</altitudeMode>
      </Camera>
    </gx:FlyTo>

  </gx:Playlist>
</gx:Tour>
</kml>

Известные проблемы

Клиент "Google Планета Земля" в настоящее время поддерживает функцию путешествий лишь частично. Ниже перечислены некоторые известные проблемы, которые планируется решить в последующих версиях.

  • Элементы <gx:AnimatedUpdate> и <gx:TourControl> разбивают кривую, созданную последовательностью плавных переходов (элементов FlyTo со свойством smooth). Точки FlyTo, лежащие до и после этих элементов, соединяются прямой линией.
  • Звуковые файлы, загруженные с помощью <gx:SoundCue>, продолжают воспроизводиться во время паузы, определенной элементом <gx:TourControl>. При возобновлении путешествия воспроизведение возвращается к тому моменту в файле, в котором началась пауза.
  • При использовании любого режима высоты, кроме абсолютного, траектория движения между двумя FlyTo может смещаться вверх или вниз, когда камера приближается к точке. Это вызвано обновлением данных местности: по мере приближения к точке клиент получает все более подробную информацию о ней. В результате может быть обновлен рельеф земной поверхности, что приведет к смещению траектории.

    По этой причине записывающий механизм Google Планеты Земля задает абсолютный режим высоты для всех элементов FlyTo. Если вы наблюдаете подобные скачки траектории в своем путешествие, преобразуйте все значения высоты в абсолютные.