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>
1 komentarz:
very good!!
Prześlij komentarz