Linie w Google Earth (KML)

Ostatnio była mowa o punktach - teraz czas na elementy charakterystyczne dla grafiki dwuwymiarowej - czyli liniach ale oczywiście w trójwymiarze. Dzięki temu oprócz x (wysokości) i y (szerokości) mamy dostęp do osi z czyli wysokości oraz innych bonusów płynących z 3D jak np. odniesienie linii do powierzchni, tworzenie "ścian" na podstawie linii, a co za tym idzie generowanie prostych modeli 3D.


Definiowanie linii sprowadza się na dodaniu dodatkowego znacznika do definicji <Placemark>. Znacznik <LineString> zawiera w sobie definicje współrzędnych <coordinates> (wymagane), a także dodatkowe opcje takie jak wyrównanie do powierzchni, sposobu odniesienia się do powierzchni czy utworzenia "ściany" od powierzchni do wyznaczonej linii. Możliwe jest także umieszczenie kilku definicji LineString w jednym Placemark'u - wówczas w przypadku dołączenia opisu do Placemark'a dla wszystkich tych linii będzie jeden opis.

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Placemark>
    <LineString>
      ...
    </LineString>
  </Placemark>
</kml>

Współrzędne

Definicja współrzędnych sprowadza się do wprowadzenia wartości do znacznika <coordinates>. Poszczególne punkty linii muszą być rozdzielone znakiem/znakami białymi (może być znak nowej linii, spacja itd.).
Kolejność współrzędnych to wysokość geo., szerokość geo., [wysokość]. Podawanie wysokości jest opcjonalne. W zależności od typu odniesienia do powierzchni wysokość może oznaczać wysokość absolutną albo zależną od powierzchni albo może być całkiem ignorowana.

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Placemark>
    <LineString>
      <coordinates>
        16.35346031188965,50.37306213378906,0
        16.352632522583008,50.37587356567383,0
      </coordinates>
    </LineString>
  </Placemark>
</kml>

Odniesienie do powierzchni

W standardowym KML odniesienie definiuje się w znaczniku <altitudeMode> i istnieją trzy sposoby interpretowania wysokości podanej w znaczniku współrzędnych:
  • w odniesieniu do globu - absolute
  • w odniesieniu do powierzchni - relativeToGround
  • położony na powierzchni - clampToGround - domyślnie
Dodatkowo Google wprowadził rozszerzenie znacznika altitudeMode w namespace'ie gx (gx:altitudeMode), który pozwala na dwa dodatkowe odniesienia względem dna morza:
  • w odniesieniu do dna morza (w przypadku, kiedy punkt nie będzie leżał na morzu punkt odniesienia zostanie przyjęty tak jak w przypadku relativeToGround) - relativeToSeaFloor
  • położony na powierzchni dna morza (w przypadku, kiedy punkt nie będzie leżał na morzu punkt odniesienia zostanie przyjęty tak jak w przypadku clampToGround) - clampToSeaFloor
Należy pamiętać, że korzystając z namespace'ów gx należy dodać informację o tym w znaczniku inicjalizującym KML.

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

Wyrównanie do powierzchni

Znacznik <tessellate> określa, czy linia ma być wyrównana do powierzchni. W przypadku zastosowania jednocześnie znacznika <extrude> z tego co zauważyłem tesselate jest pomijany. Wartości dostępne dla tej właściwości to 0 (domyślne) lub 1.

W odróżnieniu od ustawień odniesienia do powierzchni (clampToGround) linia jest dodatkowo dzielona na mniejsze fragmenty, aby przypasować się do terenu - w przypadku odniesienia do powierzchni tworzona jest tylko prosta linia pomiędzy wyszczególnionymi punktami na powierzchni.

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Placemark>
    <LineString>
      <tessellate>1</tessellate>
      <coordinates>
        16.35346031188965,50.37306213378906,0
        16.352632522583008,50.37587356567383,0
      </coordinates>
    </LineString>
  </Placemark>
</kml>

Ściana na podstawie linii

Znacznik <extrude> pozwala na opuszczanie na powierzchnię linii wskazujących poszczególne punkty - a w przypadku linii powoduje to także tworzenie się "ściany" wzdłuż wyznaczonych współrzędnych. Wartości dopuszczalne dla extrude to 1 (włączone) lub 0 (domyślnie wyłączony). Definiowanie kolorów ścian odbywa się tak samo jak w przypadku wieloboków, o czym w kolejnym podrozdziale.

Aby extrude zadziałał odniesienie do powierzchni musi być ustawione jako absolute, relativeToGround lub relativeToSeaFloor.

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Placemark>
    <LineString>
      <extrude>1</extrude>
      <altitudeMode>absolute</altitudeMode>
      <coordinates>
        16.35346031188965,50.37306213378906,900
        16.352632522583008,50.37587356567383,900
      </coordinates>
    </LineString>
  </Placemark>
</kml>

Zauważyłem też, że ściana czasem jest niedociągana do powierzchni - dzieje się tak w przypadku, kiedy odniesienie jest ustawione jako relativeToGround lub relativeToSeaFloor i próbujemy połączyć punkty umieszczone np. z dwóch stron kotliny - wówczas podstawą ściany jest linia wyznaczona przez połączenie rzutów tych punktów na powierzchnię - czyli tak jak poniżej :)

Stylowanie linii

Stylowanie zostało przeniesione poza znacznik <lineString> i jest zdefiniowane w znaczniku Placemark. Google proponuje, żeby styli nie definiować inline'owo tylko poza znacznikiem, a zamiast tego zastosować odwołanie <styleUrl>#id_stylu</styleUrl> - zupełnie jak w definicji dla pojedynczych Placemark'ów.

Znacznik stylu dla linii to <LineStyle> umieszczany bezpośrednio w <Style>. Dopuszczalne właściwości dla linii to:
  • kolor - color - podawany jako 8 znaków w systemie heksadecymalnym, gdzie dwie pierwsze to przezroczystość, a pozostałe to bbggrr
  • tryb koloru - colorMode - wartości to normal (domyślne) oraz random (jeżeli została podana wartość color wówczas wartość koloru jest generowana jako jego modyfikacja; w innym przypadku kolor jest losowy)
  • szerokość - width
<Style id="linia">
 <LineStyle>
   <color>aa0000ff</color>
   <width>7</width>
 </LineStyle>
</Style>

W przypadku stosowania znacznika <extrude> możemy dodatkowo skorygować style dla utworzonych powierzchni. W tym celu wykorzystujemy znacznik <PolyStyle> - jak dla obiektu Polygon.

Oprócz właściwości color i colorMode w przypadku trybu dla extrude mamy jedną dodatkową własność:
  • wypełnienie - fill - czy powierzchnia ma być wypełniona - wartości 0 lub 1
Niestety obramowania dla powierzchni są związane ze stylem samej linii.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <Style id="liniasciana">
      <LineStyle>
        <color>7f00ffff</color>
        <width>4</width>
      </LineStyle>
      <PolyStyle>
        <color>7f00ff00</color>
      </PolyStyle>
    </Style>
    <Placemark>
      <styleUrl>#liniasciana</styleUrl>
      <LineString>
        <extrude>1</extrude>
        <altitudeMode>absolute</altitudeMode>
        <coordinates>
          16.35346031188965,50.37306213378906,900
          16.352632522583008,50.37587356567383,900
        </coordinates>
      </LineString>
    </Placemark>
  </Document>
</kml>

Testy

Zachęcam też do skorzystania z narzędzia KML Interactive Sampler, w którym mamy całkiem niezły zbiór przykładowych plików KML automatycznie z podglądem i możliwością edycji plików.

Prześlij dalej:

1 komentarz:

Prześlij komentarz