www.gmapsapi.com

Kompleksowy kurs podstaw API, po którym mapowianie nie będzie miało przed Tobą żadnych tajemnic!

Setki przykładów, kursów i poradników z kodem gotowym do skopiowania i korzystania.

Największa strona o Google Maps API w Polsce, największe źródło informacji w języku polskim.

Wczytywanie danych z programu MS Excel

Ten artykuł dotyczy API w wersji 2

« powrót do listy poradników

Dane do Google Maps (np. współrzędne markerów) można wczytywać z różnych źródeł. Stosunkowo prosto można napisać skrypt, wyciągający współrzędne z bazy danych, pliku tekstowego, pliku XML itp. W tym przykładzie pokazane zostanie (dość unikatowe) pobieranie danych z plików w formacie MS Excel.

Na potrzeby poradnika przygotowałem arkusz kalkulacyjny markery.xls. Składa się on z jednego arkusza, w którym dane zapisane są w postaci tabeli z nagłówkiem w trzech kolumnach razem z nazwą markera.

Do oczytania danych z pliku XLS skorzystam z dostępnej za darmo biblioteki PHP-ExcelReader, dzieki której po stronie serwera będzie można wyciągnąć wartości z komórek. Wszystkie niezbędne pliki tej biblioteki oraz kod skryptów, który zostanie przedstawiony w tym poradniku znajduje się pod tym adresem: http://gmapsapi.com/examples/070/markery_excel.zip. Częściowa dokumentacja metod i własności dostępna jest pod tym adresem: http://sourceforge.net/docman/display_doc.php?docid=22092&group_id=99160 - w tym poradniku przedstawię jedynie najpotrzebniejsze z nich.

Wyciąganie danych z pliku MS Excel

Zaczynamy od ustawienia odpowiednich nagłówków (kodowanie utf-8, plik typu javascript, gdyż dane będziemy przesyłać w formacie JSON). Dołączamy odpowiednie pliki PHP biblioteki PHP-ExcelReader a także pliki klasy JSONEncoder.

header('Content-Type: text/javascript; charset=utf-8'); 
require_once 'Excel/reader.php';
require_once 'jsonencoder.php';

$daneXLS = new Spreadsheet_Excel_Reader();
$daneXLS->setOutputEncoding('CP1250'); // arkusz markery.xls zapisany w domyślnym kodowaniu dla polskich znaków (CP1250)
$daneXLS->read('markery.xls');
error_reporting(E_ALL ^ E_NOTICE);

Następne cztery linijki to standardowa procedura otwierania pliku XLS do odczytu - warto zwrócić uwagę, że w linijce 6 ustawiamy kodowanie na windows-1250 (aby zachować polskie litery) a w linijce 8 określamy nazwę pliku xls na serwerze, który będzie odczytany.

Teraz, gdy plik jest już otwarty można odczytać z niego dane.

$tablica = array();

// zaczynamy od rekordu 2, ponieważ w pierwszym znajdują się nagłówki
for($i=2; $i<=$daneXLS->sheets[0]['numRows']; $i++)
{
	$rekord = array();
	$rekord['lat'] = (double) $daneXLS->sheets[0]['cells'][$i][2];
	$rekord['lng'] = (double) $daneXLS->sheets[0]['cells'][$i][3];
	$rekord['nazwa'] = win2utf($daneXLS->sheets[0]['cells'][$i][1]); 
	// numerowanie kolumn zaczyna się od 1!
	array_push($tablica,$rekord);
}

Powyższy kod jest dość prosty do zrozumienia. Każdy obiekt klasy Spreadsheet_Excel_Reader posiada szereg własności, z których nas interesuje własność sheet. Jest to tablica, której każdym elementem jest kolejny arkusz. Każdy z arkuszów reprezentowany jest kolejną tablicą asocjacyjną, z której nas interesuje element cells, zawierający wartości komórek. $i odpowiada za numer wiersza, a wartość w ostatnim nawiasie kwadratowym za numer kolumny.

Warto zauważyć, że numerowanie arkuszy zaczyna się od 0, podczas gdy numerowanie kolumn i wierszy od jedynki. Odpowiednio pobrane wartości długości i szerokości geograficznej konwertowane są na typ double - ułatwi to późniejsze parsowanie danych. Zwróć uwagę na zapis w linii 9 - ponieważ w polu nazwa mogą znajdować się polskie litery kodowane w windows-1250, to należy je wcześniej skonwertować na utf-8. Robi się to za pomocą funkcji win2utf():

function win2utf($tekst)
{
	$tabela = Array
	(
		"\xb9" => "\xc4\x85",
		"\xa5" => "\xc4\x84",
		"\xe6" => "\xc4\x87",
		"\xc6" => "\xc4\x86",
		"\xea" => "\xc4\x99",
		"\xca" => "\xc4\x98",
		"\xb3" => "\xc5\x82",
		"\xa3" => "\xc5\x81",
		"\xf3" => "\xc3\xb3",
		"\xd3" => "\xc3\x93",
		"\x9c" => "\xc5\x9b",
		"\x8c" => "\xc5\x9a",
		"\x9f" => "\xc5\xbc",
		"\xaf" => "\xc5\xbb",
		"\xbf" => "\xc5\xba",
		"\xac" => "\xc5\xb9",
		"\xf1" => "\xc5\x84",
		"\xd1" => "\xc5\x83"
	);
	return strtr($tekst,$tabela);
}

Ostatnim elementem jest zakodowanie tablicy $tabela w notacji JSON, co robi się po prostu:

$json = new Services_JSON();  
$wynik = $json->encode($tablica);  
print($wynik); 

Oto rezultat odpalenia skryptu dla przygotowanego przeze mnie pliku XLS: zobacz. Pozostaje odpowiednie przeparsowanie danych i wstawienie na mapę Google już po stronie klienta. Jest to robione niemal identycznie jak w poradniku Wczytywanie danych z pliku JSON, więc nie będę tego omawiał osobno. Kod skryptu możesz zobaczyć, oglądając źródło przykładu 1: przykład 1pokaż kod przykładu

Uwagi

Zakładam, że liczby zmiennoprzecinkowe, wyrażające długość i szerokość geograficzną są zapisane w arkuszu w formacie liczbowym. Jeśli jest inaczej, to trzeba stworzyć własną funkcję do konwersji, np. zamieniającą przecinek na kropkę i konwertującą taki ciąg na liczbę.

Polecane artykuły

Dodaj stronę do ulubionego serwisu społecznościowego

Oto, co najczęściej czytają internauci, którzy przeczytali ten artykuł:

Dodawanie markerów przez użytkownika

API v2

Poradnik pokazuje, w jaki sposób stworzyć formularz, pozwalający na dodawanie markerów


Wczytywanie danych z pliku XML

API v2

Kurs podstaw cz. X: Omówienie wczytywania danych z pliku XML za pomocą AJAXa


Pobieranie danych z bazy MySql

API v2

Zobacz, jak pobrać dane markerów, zawarte w bazie MySql i wyświetlić je na mapie


Wyszukiwanie markerów as-you-type

API v2

Jak stworzyć wyszukiwanie i filtrowanie markerów as-you-type przy użyciu bazy danych