Punkty na śladzie GPX.
Wygląd rysowanych punktów na śladzie GPX możemy zdefiniować używając własnego stylu, wzorując się na przykładzie Ślad GPX na mapie UMP i OSM, w którym zdefiniowany został styl linii tworzącej ślad GPX. Więcej informacji o stylu warstwy OpenLayers.Layer.Vector i atrybutach punktu OpenLayers.Geometry.Point można uzyskać na stronie OpenLayers.Feature.Vector.style
Poniżej przedstawiam niektóre (moim zdaniem najistotniejsze) atrybuty wyświetlanego punktu.
Atrybuty te można będzie zmieniać dla każdego tworzonego punktu przekazując wartości atrybutów
w funkcji tworzącej nowy punkt.
Mniej istotne (jak dla mnie) atrybuty punktu zostaną zdefiniowane jako domyślne,
w „publicznych” tablicach asocjacyjnych styleLabel{...} oraz
stylePoint{...}.
Niektóre atrybuty punktu (OpenLayers.Geometry.Point
)label:
{String} tekst etykiety, która ma być wyświetlona.labelAlign:
{String} Sposób wyrównanie etykiety. Określa punkt wstawienia etykiety względem tekstu. Jest to ciąg złożony z dwóch znaków. Pierwszy znak służy do wyrównania w poziomie, a drugi do wyrównania w pionie.
Poprawne wartości dla wyrównania w poziomie: "l" = do lewej, "c" = centralnie, "r" = do prawej.
Poprawne wartości dla wyrównania pionowego: "t" = do góry, "m" = po środku, "b" = na dół.
Przykładowe wartości: "lt", "cm", "rb". Domyślna wartość to "cm".labelXOffset:
{Number} Poziome przesunięcie etykiety (w pikselach).labelYOffset:
{Number} Pionowe przesunięcie etykiety (w pikselach).graphicName:
{String} Nazwa rodzaju (kształtu) grafiki jaki ma zostać zastosowany do wyświetlenia punktu. Obsługiwane wartości to: circle (domyślny), square, star, x, cross, triangle.
Uwaga: Istnieje możliwość zdefiniowania własnych kształtów (grafiki) wyświetlanych punktów.stroke:
{Boolean} Należy ustawić na false, jeżeli pędzel nie jest potrzebny.strokeColor :
{String} Kolor pędzla w zapisie heksadecymalnym. Domyślnym kolorem pędzla jest kolor '#ee9900' (*).strokeWidth:
{Number} Szerokość pędzla (w pikselach) Domyślnie 1 piksel.fillColor:
{String} Kolor wypełnienie w zapisie heksadecymalnym. Domyślnym kolorem wypełnienia jest kolor '#ee9900'(*)strokeDashstyle:
{String} Styl linii. Domyślna wartość = 'solid'.- dot - linia wielopunktowa (.....),
- dash - linia kreskowa (-----),
- dashdot - linia punktowa (-.-.-),
- longdash - linia kreskowa długa, (— — — — —),
- longdashdot - linia kreskowo-punktowa długa, (—.—.—.),
- solid - linia ciągła (_____).
strokeOpacity:
{Number} Stopień krycia pędzla w zakresie 0÷1. Domyślnie = 1 (nieprzezroczysty).strokeWidth:
{Number} Szerokość pędzla wyrażona w pikselach. Domyślnie = 1.pointRadius:
{Number} Promień punktu (w pikselach), domyślnie 6 pikseli.-
rotation:
{Number} Obrót graficznego punktu zgodnie z ruchem wskazówek zegara wokół jego punktu środkowego, lub punktu poza środkiem, określonym przez atrybuty GraphicXOffset i graphicYOffset.
(*) To nie jest VBA. Wartość koloru nie jest liczbą, tylko ciągiem znaków i dlatego wartość kolor należy ująć w cudzysłów lub apostrofy.
Styl (wygląd) punktów w warstwie OpenLayers.Layer.Vector
Aby utworzyć styl definiujący wygląd punktu musimy określić poszczególne atrybuty punktu. Mniej istotne atrybuty punktu zdefiniowane są jako domyślne, w „publicznych” tablicach asocjacyjnych styleLabel{...} oraz stylePoint{...}. Ważniejsze atrybuty punktu będą zmieniane poprzez przypisanie wartość atrybutu przekazanego w argumentach funkcji createPoint(...).
// deklaracja warstwy wektorowej zawierającej punkty 'myPoint' var vectorPointsLayer; var myPoint; // mniej istotne (domyślne) atrybuty punktu var stylePoint = { 'strokeOpacity': 0.75, 'fillOpacity':0.90, 'strokeDashstyle':'solid', 'cursor': 'pointer' }; // mniej istotne (domyślne) atrybuty etykiety przypisanej do punktu var styleLabel={ 'fontColor':'#800', 'fontOpacity':0.7, 'fontFamily':'', 'fontSize':'1em', 'fontStyle':'italic', 'fontWeight':'bold' } // utwórz domyślny styl punktu, // zapis 'atrybut': '${nazwaAtrybutu}' oznacza, że można dla każdego punktu // zmieniać wartość atrybutu przypisując mu wartość przekazaną w argumentach funkcji var stylePointDefault =new OpenLayers.Style({ 'label': '${label}', 'labelAlign':'${labelAlign}', 'labelXOffset':'${labelXOffset}', 'labelYOffset':'${labelYOffset}', 'strokeColor': '${strokeColor}', 'strokeOpacity': stylePoint['strokeOpacity'], 'strokeWidth': '${strokeWidth}', 'strokeDashstyle':stylePoint['strokeDashstyle'], 'fillColor': '${fillColor}', 'fillOpacity':stylePoint['fillOpacity'], 'pointRadius': '${pointRadius}', 'graphicName': '${graphicName}', 'rotation': '${rotation}', 'fontColor':styleLabel['fontColor'], 'fontOpacity':styleLabel['fontOpacity'], 'fontFamily':styleLabel['fontFamily'], 'fontSize':styleLabel['fontSize'], 'fontStyle':styleLabel['fontStyle'], 'fontWeight':styleLabel['fontWeight'], 'cursor': stylePoint['cursor'] });
Tworzenie punktów w warstwie wektorowej.
Biblioteka OpenLayers umożliwia utworzenie 6 różnych punktów o zdefiniowanych kształtach:
circle (domyślny), square, star, x,
cross, triangle.
1. Zdefiniowane kształty punktów.
Aby utworzyć nowe punkty, musimy wcześniej, za pomocą funkcji createPointsLayer(...) utworzyć warstwę OpenLayers.Layer.Vector, a następnie za pomocą funkcji createPoint(...) utworzyć na tej warstwie punkty z indywidualnie dopasowanymi atrybutami, przekazywanymi w argumentach funkcji.
// utwórz warstwę wektorową na przyjęcie punktów o domyślnym stylu punktów 'stylePointDefault' function createPointsLayer(id, nameLayer, displayInLayerSwitcher, setVisibility){ vectorPointsLayer = new OpenLayers.Layer.Vector(nameLayer, { styleMap: new OpenLayers.StyleMap({ 'default': stylePointDefault}) }); // przypisz identyfikator warstwy vectorPointsLayer.id = id; // pokaż warstwę w oknie przełącznika warstw vectorPointsLayer.displayInLayerSwitcher = displayInLayerSwitcher; // pokaż warstwę na mapie vectorPointsLayer.setVisibility(setVisibility); } // funkcja tworząca pojedyncze punkty w warstwie wektorowej 'vectorPointsLayer' // o atrybutach określonych w argumentach funkcji function createPoint(lon, lat, label, labelAlign, labelXOffset, labelYOffset, pointRadius, rotation, strokeColor, strokeWidth, fillColor, graphicName){ var point = new OpenLayers.Geometry.Point(lon, lat).transform(epsg4326, epsg900913); myPoint = new OpenLayers.Feature.Vector(point); myPoint.attributes={ 'label': label, 'labelAlign':labelAlign, 'labelXOffset':labelXOffset, 'labelYOffset':labelYOffset, 'pointRadius':pointRadius, 'rotation':rotation, 'strokeColor':strokeColor, 'strokeWidth':strokeWidth, 'fillColor':fillColor, 'graphicName':graphicName }; // dodaj punkt do warstwy 'vectorPointsLayer' vectorPointsLayer.addFeatures(myPoint); }
Uwaga: W dalszym ciągu aktualne jest, że oglądając przykład offline, tzn. korzystając z zasobów lokalnych, śladu GPX nie zobaczymy w przeglądarce Chrome, Internet Explorer oraz Opera. Jedynie przeglądarka Firefox umożliwia lokalne oglądanie śladów GPX.
W przypadku przeglądarki „badzIEw” funkcję rysującą ślad GPX fDrawTrack() należy wywołać jako ostatnią, gdyż występuje poniżej przedstawiony błąd i „badzIEw” odmawia dalszej współpracy, nie przetwarzając następnych instrukcji.
Niestety, nie wszystko wychodzi tak, aby było dobrze. Formant Microsoft Web Browser nie wiem czemu, nie wyświetla etykiet przypisanych do punktów, a właściwie wyświetla je, ale jako 2-3 pikselowę punkty. No trudno, widocznie tak ma być.
2. MS Access - niewidoczne etykiety przy punktach
3. Firefox - przy każdym punkcie widoczna etykieta
function fDrawPoints(id, nameLayer){ // utwórz warstwę wektorową o domyślnym stylu punktów 'stylePointDefault' createPointsLayer(id, nameLayer,true, true); // tworzenie poszczególnych punktów w warstwie wektorowej 'vectorPointsLayer' createPoint(22.50059,51.287121,'<= Start','lm',10,-3,6,17,'#000',2,'#ff0','triangle'); createPoint(22.50610,51.2921,'Cmentarz wojenny, \n kapliczka, \n krzyż', 'lm',15,0,12,0,'#000',2,'#f00','star'); createPoint(22.50503,51.29536,'Sklep','lm',12,0,5,0,'#080',2,'#f00','square'); createPoint(22.50423,51.29688,'Krzyż','rm',-12,0,10,0,'#f0f',2,'#088','cross'); createPoint(22.50310,51.30102,'Wysypisko','lm',12,0,10,0,'#f0f',2,'#080','circle'); createPoint(22.50162,51.30518,'Krzyż','lm',12,0,10,0,'#f00',2,'#088','triangle'); createPoint(22.49047,51.30705,'Krzyż','rm',-8,-10,10,0,'#f0f',2,'#080','star'); createPoint(22.49197,51.30215,'Kapliczka','rm',-12,0,10,0,'#088',2,'#0f0','circle'); createPoint(22.49300,51.29900,'Przystanek \n Snopków','lm',-65,0,10,0,'#f00',2,'#080','cross'); createPoint(22.49544,51.29239,'Parking','lm',10,0,10,0,'#088',2,'#800','x'); createPoint(22.49716,51.28763,'Dom Ojców Białych \n Misjonarzy Afryki w Lublinie', 'rm',-20,5,10,0,'#f0f',2,'#080','square'); createPoint(22.49834,51.28675,'Koniec =>','lm',-55,0,6,0,'#f00',2,'#0ff','x'); // dodaj warstwę 'vectorPointsLayer' do obiektu 'map' map.addLayer(vectorPointsLayer); }