OpenLayers - prezentacja śladu w formacie *.gpx na mapie.
Co to ślad (track) w formacie *.gpx ?
Jeżeli dysponujemy urządzeniem GPS umożliwiającym rejestrowanie w określonych odstępach czasu danych o aktualnym położeniu
urządzenia, to tak zarejestrowane punkty tworzą zestaw danych określanych mianem ślad (track).
- Format zapisu danych może być różny, przykładowo:
-
an1, asc, bcr, binary, csv, dat, dxf, g7t, gdb, gpb, gpi, gpx, html, hwr, ikt, itn, jpg, kml, kmz, loc, log, mps, ov2, pdb,
postgissql, ppc, rte, rwf, sdf, sql, ssz, tk, tpg, tpo, trk, trl, txt, URL, vcard, wp, wpo, wpr, wpt, xml
Ponieważ jestem posiadaczem urządzenia GPS firmy Garmin, ograniczę się do formatu *.gpx. W przypadku innego formatu zapisu śladów,
można skorzystać z
listy konwerterów śladów GPS pomiędzy różnymi formatami, by wybrać odpowiedni konwerter.
Co to jest: „format pliku GPX” ?
GPX (GPS eXchange Format) został opracowany w oparciu o standardowy format XML. Pliki w tym formacie
służą do wymiany danych GPS pomiędzy odbiornikami GPS, komputerami stacjonarnymi, urządzeniami mobilnymi i usługami opartymi o sieci Web.
Dane GPS obejmują m.in. ślady (ang. track), trasy (ang. route), POI (użyteczne miejsca, ang. Point of interest),
punkty nawigacyjne (ang. waypoint) i inne. Format GPX definiuje wspólny zbiór znaczników do opisywania danych GPS
i danych geograficznych w formacie XML. Pozwala także definiować własne prywatne obiekty i atrybuty.
-
-
Informacje na temat pliku GPX można znaleźć na
oficjalnej stronie standardu GPX,
a szczegółowa dokumentacja przedstawiona jest na:
GPX 1.1 Documentation
Jaka jest struktura pliku GPX ?
Poniżej w sposób opisowy przedstawiony jest początek pliku *.gpx zawierający „prolog XML”
oraz minimalną, wymaganą zawartość otwierającego znacznika <gpx>.
Uwaga: W tej części pliku *.gpx nie mogą znajdować się komentarze!
Prolog XML, deklaracje przestrzeni XML Schema, przestrzeni i wersji GPX Schema oraz kreatora.
- <!-- Deklaracja typu dokumentu i kodowania znaków -->
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Pojedynczy znacznik <gpx> zawierający minimum dwie deklaracje przestrzeni nazw: -->
- <gpx
- <!-- 1. Przestrzeń XML Schema definiująca strukturę dokumentu XML -->
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- <!-- 2. Przestrzeń GPX definiująca strukturę pliku *.gpx -->
- xsi:schemaLocation="http://www.topografix.com/GPX/1/1
- http://www.topografix.com/GPX/1/1/gpx.xsd"
- xmlns="http://www.topografix.com/GPX/1/1"
- <!-- oraz wymagane w znaczniku <gpx>: -->
- <!-- 1. numer wersji GPX Schema -->
- version="1.1"
- <!-- 2. nazwa programu tworzącego plik -->
- creator="gps-accdb-pl"
- >
- <!--
- UWAGA: Komentarze znajdujące się powyżej należy bezwzględnie usunąć.
Nie usunięcie wszystkich komentarzy, uniemożliwia otwarcie pliku
w programach MapSource i BaseCamp !
- -->
Poniżaj zamieszczam bardzo uproszczoną strukturę pliku GPX, zawierającego jeden, czteropunktowy ślad o nazwie „Jakiś ślad”,
podzielony na dwa segmenty, zawierające po dwa punkty. Każdy punkt określony jest przez współrzędne geograficzne:
długość geograficzną (longitude) i szerokość geograficzną (latitude), datę i czas rejestracji punktu
w systemie UTC oraz wysokość wyrażoną w metrach.
<?xml version="1.0" encoding="UTF-8"?>
<gpx
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.topografix.com/GPX/1/1
http://www.topografix.com/GPX/1/1/gpx.xsd"
xmlns="http://www.topografix.com/GPX/1/1"
version="1.1"
creator="gps-accdb-pl"
>
<trk>
<name>Jakiś ślad</name>
<trkseg>
<trkpt lat="49.183661341667175" lon="22.399444486945868">
<ele>616.34000000000003</ele>
<time>2012-05-26T06:42:33Z</time>
</trkpt>
<trkpt lat="49.183670645579696" lon="22.399536268785596">
<ele>616.82000000000005</ele>
<time>2012-05-26T06:42:38Z</time>
</trkpt>
</trkseg>
<trkseg>
<trkpt lat="49.183696210384369" lon="22.399614052847028">
<ele>616.82000000000005</ele>
<time>2012-05-26T06:44:43Z</time>
</trkpt>
<trkpt lat="49.183758404105902" lon="22.399634169414639">
<ele>616.34000000000003</ele>
<time>2012-05-26T06:44:48Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
Aby zapoznać się ze strukturą pliku *.gpx najlepiej pobrać go z własnego urządzenia GPS na dysk, zmienić jego rozszerzenie
z *.gpx na *.xml i otworzyć go za pomocą przeglądarki M$ Internet Explorer. W tym miejscu mogę usłyszeć
wiele oburzonych głosów. Przecież to badzIEw. No to spróbujcie w Firefoxie, Chrome lub w Operze.
Życzę sukcesów. Ja osobiście korzystam z aplikacji Notepad++ i sobie ją bardzo chwalę.
Można także zainstalować program obsługujący XML itd.
UWAGA: Nie zawsze operacja otwarcia pliku *.gpx się uda. W przypadku niektórych urządzeń Garmina nie można
w bezpośredni sposób otworzyć pliku Current.xml. Próba otwarcia pliku kończy się komunikatem o błędzie:
Znaleziono nieprawidłowy znak w zawartości tekstowej.
Pliku Current.gpx nie otworzą nawet dedykowane programy Garmina. Program MapSource może zgłosić komunikat:
Plik „...Current.gpx” to nie jest prawidłowy plik MapSource i nie można go otworzyć.
A program BaseCamp zakomunikuje :
Podczas otwierania zaimportowanego pliku wystąpił nieznany błąd.
W bardzo prosty sposób można dostosować plik Current.gpx z urządzenia Garmin Nuvi 1300 (już dawno nie używanego), by był prawidłowo
interpretowany przez M$ IE oraz inne programy. Otwieramy plik Current.gpx w Notatniku lub innym edytorze tekstu
i usuwamy znacznik <wpt> ... </wpt> wraz z całą zawartością i zapisujemy zmiany
(przy zapisie należy wybrać kodowanie:UTF-8).
Usunięty znacznik(<wpt> ... </wpt>) zawiera informację odnośnie punktów pośrednich (waypointów),
punktów interesujących (POI) i innych punktów tego typu.
Od paru ładnych lat korzystam z urządzenia Garmin GPSMAP® 62s i praktycznie
odczyt danych z plików *.gpx dostosowuję do formatu plików GPX Garmina.
Jak narysować na mapie ślad GPX za pomocą OpenLayers ?
W starszej bibliotece OpenLayers (v. 2.11) można wykorzystać warstwę OpenLayers.Layer.GML
(Geography Markup Language),
będącą podklasą warstwy wektorowej OpenLayers.Layer.Vector i zaprojektowaną do odczytu danych
geograficznych nie tylko z plików GML. Format czytanych danych przekazuje się za pomocą opcji 'Format'.
Prostszy sposób to utworzenie nowej warstwy wektorowej OpenLayers.Layer.Vector, która korzystając z wbudowanych
funkcji w sposób automatyczny sposób odczyta i przetworzy nasz plik w formacie GPX i przedstawi graficznie ślad na mapie.
Metoda ta działa w OpenLayers v. 2.11 i wersji nowszej 2.13.
Aby zobaczyć swój pierwszy ślad (track) na mapie, należy poniższy kod dopisać na samym końcu funkcji init() w przykładzie
Kontrolki OpenLayers na mapach OSM i UMP.
// utwórz nową warstwę wektorową o nazwie 'ślad Marysin'
// w celu przetworzenia pliku 'gpx/trackMarysin.gpx'
var gpx = new OpenLayers.Layer.Vector('ślad Marysin', {
// utwórz prostą podklasę strategii
strategies: [new OpenLayers.Strategy.Fixed()],
//Utwórz nową instancję protokołu HTTP
protocol: new OpenLayers.Protocol.HTTP({
url: 'gpx/trackMarysin.gpx',
// utwórz parser GPX, by przetworzyć plik *.gpx
format: new OpenLayers.Format.GPX()
})
})
// dodaj utworzoną warstwę do obiektu map
map.addLayer(gpx);
Zobacz pierwszy przykład użycia warstwy wektorowej z biblioteki OpenLayers wyświetlającej
ślad GPX.
Uwaga: 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. Dlaczego tak jest, nie wiem.
Prawdopodobnie chodzi o dostęp do pliku *.gpx.
Internet Explorer zgłasza błąd:
SCRIPT5: Odmowa dostępu.
OpenLayers.js, wiersz 1616 Znak 1 this._object.open(sMethod,sUrl,bAsync,sUser,sPassword)
,
Firefox komunikuje, że:
Cross origin requests are only supported for HTTP.1
a Opery nie jestem w stanie zrozumieć. Czepia się haków w arkuszu stylów *.css
Obraz.1 Ślad GPX na mapach OSM i UMP.
Widząc wyświetlony na mapie ślad GPX można się załamać. Tak naprawdę na mapie nie jest widoczny narysowany ślad.
Dopiero przy dużym powiększeniu mapy można zauważyć, zlewający się z tłem mapy ślad GPX. Dzieje się tak, ponieważ
warstwa OpenLayers.Layer.Vector korzysta z domyślnych ustawień pędzla używanego do rysowania śladu. By to zmienić,
trzeba odwiedzić stronę:
Style w OpenLayers
i zapoznać się z podstawowymi informacja na temat możliwości zmiany wyglądu rysowanych elementów śladu GPX.
Niektóre właściwości pędzla (Stroke Properties)
-
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' .
Uwaga: 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.
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 (_____)
strokeLinecap:
{
String} Rodzaj zakończenia linii. Domyślnie przyjmuje wartość
'round',
- butt - linia zakończona płasko, ucięta dokładnie na końcach,
- round - linia zaokrąglona na końcach, ale obramowanie na końcach linii wychodzi poza ścieżkę o połowę szerokości linii,
- square - podobnie jak typ 'butt' zakończona płasko, ale obramowanie na końcach
linii wychodzi poza ścieżkę o połowę szerokości linii,
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,
// utwórz nową warstwę wektorową o nazwie 'ślad Marysin'
// w celu przetworzenia pliku 'gpx/trackMarysin.gpx'
var gpx = new OpenLayers.Layer.Vector('ślad Marysin', {
// utwórz prostą podklasę strategii
strategies: [new OpenLayers.Strategy.Fixed()],
//Utwórz nową instancję protokołu HTTP
protocol: new OpenLayers.Protocol.HTTP({
url: 'gpx/trackMarysin.gpx',
// utwórz parser GPX, by przetworzyć plik *.gpx
format: new OpenLayers.Format.GPX()
}),
style: {
// użyj pędzla
stroke:true,
// kolor linii
strokeColor: '#00b',
// styl linii (ciągła)
strokeDashstyle: 'solid',
// styl końców linii (zaokrąglone),
strokeLinecap:'round',
// stopień krycia pędzla (nieprzezroczystość)
strokeOpacity: .6,
// szerokość pędzla w pikselach
strokeWidth: 3
},
});
// dodaj utworzoną warstwę do obiektu map
map.addLayer(gpx);
Kod z powyższego przykładu należy wkleić na końcu funkcji init() z przykładu
Kontrolki OpenLayers na mapach.
Zobacz Demo
- 03. Styl śladu GPX na mapach OSM i UMP-pcPl.
W podobny sposób jak w przykładzie Kontrolki OpenLayers osadzone na mapach OSM i UMP
możemy zaimplementować powyższy kod, by wyświetlić ślad GPX na mapie OpenStreetMap i UMP-pcPL
w formularzu MS Access. Kod ten należy wkleić na końcu funkcji init() w źródle strony 02_accOpenLayers.html
i zapisać ją w folderze roboczym bazy MS Access jako plik 03_accTrackGPX.html.
W bazie danych MS Access znajduje się ten sam formularz startowy, co w poprzednim przykładzie, zawierający
osadzony formant Microsoft Web Browser. W kodzie VBA należy zmienić jedynie ścieżkę dostępu do pliku *.html na:
sHtmlPath = CurrentProject.Path & "\03_accTrackGPX.html".
Plik ze śladem trackMarysin.gpx powinien znajdować się w folderze gpx.
Private Sub Form_Open(Cancel As Integer)
Dim sHtmlPath As String
sHtmlPath = CurrentProject.Path & "\03_accTrackGPX.html"
' załaduj dokument do formantu WebBrowser
Call Me.oMsWebBrowser.Object.Navigate(sHtmlPath)
End Sub
Po uruchomieniu formularza startowego możemy cieszyć się kolorowym śladem GPX na darmowych mapach OpenStreetMap i UMP-pcPL
osadzonych w formularzu MS Access.
Obraz.2 Ślad GPX na mapach OSM i UMP.
Jak widać na obrazku, ślad GPX na mapie wygląda dość mizernie. Nie wiemy gdzie jest początek śladu, a gdzie koniec, jaki jest kierunek śladu.
Brak jakiejkolwiek informacji o ciekawych i użytecznych punktach śladu. Plik śladu trackMarysin.gpx zawiera 1110 zarejestrowanych punktów
i zajmuje 255 KB na dysku. Tak duża wielkość pliku wynika ze zbyt dużej ilości informacji zapisanych w pliku. Do wykreślenia
śladu potrzebne są tylko współrzędne geograficzne punktu, a w pliku *.gpx każdy zarejestrowany punkt zawiera następujace informacje:
// współrzędne geograficzne
<trkpt lat="51.287055" lon="22.500549">
// wysokość
<ele>232.78</ele>
// czas rejestracji danych
<time>2011-10-22T10:10:41Z</time>
// rozszerzone dane punktu
<extensions>
<gpxtpx:TrackPointExtension>
// szybkość przemieszczania
<gpxtpx:speed>1.37</gpxtpx:speed>
<gpxtpx:course>273.88</gpxtpx:course>
</gpxtpx:TrackPointExtension>
</extensions>
</trkpt>