Access

 MS Access i OpenLayers i ślad (track) GPS Garmin w formacie GPX.

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.

Garmin GPSMAP 62s 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.

Znak Informacja dodatkowa 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


Prosty ślad w formacie GPX
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.


Ślad w formacie GPX na mapach
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>