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);
}
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.
Do pobrania: