Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
Nowa wersja
Both sides next revision
|
pl:dydaktyka:sbd:2009:projekty:mpk-gis:raport_koncowy [2010/03/09 00:38] sbd09 |
pl:dydaktyka:sbd:2009:projekty:mpk-gis:raport_koncowy [2010/03/09 11:22] sbd09 |
* Załadowanie podpowiedzi do PostGIS //psql -d [yourdatabase] -f postgis_comments.sql// | * Załadowanie podpowiedzi do PostGIS //psql -d [yourdatabase] -f postgis_comments.sql// |
=== Python === | === Python === |
| Ten uniwersalny język skryptowy wykorzystywany jest w module importującym dane z OpenStreetMap. W związku z tym, że sporo bibliotek (w tym używana do połączenia z bazą danych psycopg) nie zostało jeszcze przeportowancych do standardu 3.0, wykorzystano starszą "linię" 2.6 interpretera. Poza wspomnianym modułem psycopg2, używanym do połączenia z bazą danych, skrypt wykorzystuje również moduł xml.sax, będący częścią biblioteki standardowej, do parsowania plików XML. |
=== Php === | === Php === |
Jest to język skryptowy działający po stronie serwera służący do dynamicznego generowania stron internetowych. W projekcie został wykorzystany jako "pośrednik" do interakcji pomiędzy klientem a bazą danych. Wykorzystano Php w wersji 5.32. Pakiet można pobrać z strony [[http://www.php.net/downloads.php]]. Istnieje możliwość skorzystania z XAMPP który zawiera Php, Apache, Perl. Przydatny do testowania aplikacji. | Jest to język skryptowy działający po stronie serwera służący do dynamicznego generowania stron internetowych. W projekcie został wykorzystany jako "pośrednik" do interakcji pomiędzy klientem a bazą danych. Wykorzystano Php w wersji 5.32. Pakiet można pobrać z strony [[http://www.php.net/downloads.php]]. Istnieje możliwość skorzystania z XAMPP który zawiera Php, Apache, Perl. Przydatny do testowania aplikacji. |
=== CSS === | === CSS === |
Pozwala sformatować informację zawarte na stronie ( prezentacja wyników). | Pozwala sformatować informację zawarte na stronie ( prezentacja wyników). |
| |
| ====-. OSM a komunikacja publiczna ==== |
| === Linie komunikacji miejskiej === |
| Informacje o komunikacji publiczna w OpenStreetMap zapisane są przy wykorzystaniu znacznika Relation:route: http://wiki.openstreetmap.org/wiki/Relation:route Pozwala on na zapisanie informacji o typie połączenia (key:route): autobusowym (value:bus) i tramwajowym (value:tram). Ważną informacją (choć niestety nieobowiązkową przy wprowadzaniu) jest nazwa linii (key:ref). OSM prawdopodobnie zakłada, że linie komunikacji miejskiej w obu kierunkach wyglądają jednakowo, w związku z czym nie ma znacznika opowiadającego za kierunek linii. Stanowi to (dla Krakowa) pewien problem, co można by rozwiązać np. poprzez dodanie do numeru linii litery - 173a, 173b. Niestety w chwili obecnej w danych dla Krakowa takiego rozróżnienia nie ma.\\ |
| W skład relacji powinny wchodzić również przystanki. Najnowsze API 0.6 nie uwzględnia możliwości numerowania przystanków - powinny być one umieszczone w relacji w odpowiedniej kolejności. Niestety w przypadku danych dla Krakowa przystanki funkcjonują zupełnie niezależnie od linii komunikacji miejskiej, co uniemożliwiło import części danych (o czym innej części raportu).\\ |
| Inne informacje, jakie może zawrzeć dla odpowiednich linii, to rozróżnienie operatorów ją obsługujących czy też możliwość korzystania z niej przez niepełnosprawnych. |
| === Przystanki === |
| Przystanki w OSM występują w oparciu o tag highway:bus_stop http://wiki.openstreetmap.org/wiki/Tag:highway%3Dbus_stop Poza informacją o nazwie (tag:name) pozwala na określenie kierunku (towards), w którym zmierza autobus z danego przystanku. |
| === Dane dla Krakowa === |
| Aktualne informacje o naniesionych na mapę liniach krakowskiej komunikacji miejskiej można znaleźć na stronie: http://wiki.openstreetmap.org/wiki/WikiProject_Poland/Ma%C5%82opolska |
====-. Pozyskiwanie danych ==== | ====-. Pozyskiwanie danych ==== |
=== Automatyczne === | === Automatyczne === |
| W związku z tym, że ręczne wprowadzenie danych o całej krakowskiej sieci komunikacji miejskiej stanowiłoby nie lada problem stworzony został moduł importujący odpowiednie informacje z OSM. Mimo, że ilość danych dotyczących krakowskiego MPK nie jest zbyt duża (i nie do końca poprawnie zebrana - więcej na ten temat w dalszej części raportu), to moduł pozwala na zebranie części potrzebnych nam informacji.\\ |
| Parsowanie pliku XML wykonywane jest w oparciu o model zdarzeniowy - przy użyciu interfejsu SAX (ang. Simple API for XML czyli Proste API dla XML-a), dostępnego w bibliotece standardowej Pythona. Podyktowane to zostało przede wszystkim sporymi rozmiarami pliku wyjściowego z OSM, co w przypadku chyba wygodniejszego modelu DOM (ang. Document Object Model) mogłoby stanowić nie lada problem.\\ |
| Samo użycie modułu jest dość intuicyjne: |
| <code> |
| src % ./test.py |
| Usage: test.py [options] |
| |
| Options: |
| -h, --help show this help message and exit |
| -f FILENAME, --file=FILENAME |
| name of input XML file, default: map.osm |
| -d DBNAME, --dbname=DBNAME |
| database name, default: db_gis_project |
| -u DBUSER, --user=DBUSER |
| database username, default: kml |
| -c, --create creates db structure |
| -p, --print prints data from xml file |
| -i, --import imports data from xml file to database |
| --update_distance updates time of transfer between small_stops |
| </code> |
| To, czego potrzebujemy, to wyeksportowany z OSM plik XML oraz baza danych z rozszerzeniem PostGIS. Skrypt pozwala na wyświetlenie informacji dotyczących połączeń i przystanków zawartych w pliku XML, stworzenie struktury bazy danych oraz import danych z pliku do bazy. Dodatkową funkcją jest "--update_distance" - wyszukuje ona najbardziej oddalone od siebie "części przystanków" (small_stop) i oblicza czas potrzebny na przemieszczenie się w ich obrębie (na podstawie dystansu między nimi i prędkości poruszania się).\\ |
| Przykład wyświetlenia danych (fragment): |
| <code > |
| Linie tarmwajowe |
| Linia: 4 |
| Identyfikator: 223307 |
| Węzły: |
| [u'477002182', u'477002183', u'470643346', u'470643342'] |
| Droga 22424924 z wezlow: |
| nie ma drogi w bazie:( |
| Droga 28593666 z wezlow: |
| nie ma drogi w bazie:( |
| Droga 28593667 z wezlow: |
| nie ma drogi w bazie:( |
| |
| Przystanki tramwajowe |
| (u'206372224', u'Basztowa LOT', u'50.0663142', u'19.9394981') |
| (u'261677483', u'Wawel', u'50.0545631', u'19.9395643') |
| (u'378365430', u'\u015awi\u0119tej Gertrudy', u'50.0586702', u'19.9410279') |
| (u'378365902', u'Miodowa', u'50.0533232', u'19.9488683') |
| (u'378365907', u'Starowi\u015blna', u'50.0568776', u'19.9455381') |
| (u'378365918', u'Starowi\u015blna', u'50.0571036', u'19.9459501') |
| </code> |
| Informacje, jakie jesteśmy w stanie "wydobyć" z OSM to nazwy i położenia przystanków oraz "drogi" (ways) i "węzły" (nodes), z których składają się poszczególne linie (opisane w OSM jako relacje). Dane te zakodowane są w standardzie UTF-8 i w takiej właśnie formie zapisywane w bazie danych. Niestety, w związku z pewnymi brakami w bazie OSM (o których później), tylko informacje o przystankach mogły być zaimportowane do bazy i wykorzystane w pozostałej części projektu. |
| |
===Ręczne wprowadzanie === | ===Ręczne wprowadzanie === |
Więcej informacji o ręcznym wprowadzeniu danych w punkcie 3. | Więcej informacji o ręcznym wprowadzeniu danych w punkcie 4. |
====-.Interfejs do prezentacji i obsługi danych w oparciu o diagramy FHF, DFD, STD ==== | ====-.Interfejs do prezentacji i obsługi danych w oparciu o diagramy FHF, DFD, STD ==== |
=== Interfejs użytkownika === | === Interfejs użytkownika === |
\\ | \\ |
== Aplikacja służąca dodawaniu tras linii komunikacyjnych== | == Aplikacja służąca dodawaniu tras linii komunikacyjnych== |
Aplikacja działa na podobnej zasadzie jak aplikacja do dodawania nowych linii (rys. poniżej).\\ | Aplikacja działa na podobnej zasadzie jak aplikacja do dodawania nowych linii. Jako numer linii należy wpisać id linii w bazie danych. Jest to wartość pomiędzy nawiasami "( )". (rys. poniżej) \\ |
{{http://student.agh.edu.pl/~marcinon/bazy/mpk_add_route.png?210x300}} | {{:pl:dydaktyka:sbd:2009:projekty:mpk-gis:mpk_gis_polyline.png}} |
| ====-. Wdrożenie i utrzymanie ==== |
| Warunkiem koniecznym poprawnego działania aplikacji jest posiadanie serwera wraz z oprogramowaniem zamieszczonym w 1 punkcie. Serwer musi być posiadać opcję umożliwiającą zastosowanie ModRewrite w pliku .htaccess. Służy to do posługiwania się adreasami URL przyjaznym użytkownikom. |
| === Konfiguracja bazy danych === |
| Należy uruchomić skrypt "create_db" który jako parametr przyjmuję nazwę nowej tabeli. Należy również wskazać miejsce gdzie znajdują się pliki SQL powiązane z PostGIS. |
| <code> |
| echo $1; |
| createdb $1; |
| createlang plpgsql $1; |
| psql -d $1 -f /usr/local/pgsql/share/contrib/postgis.sql ; |
| psql -d $1 -f /usr/local/pgsql/share/contrib/spatial_ref_sys.sql ; |
| psql -d $1 -f /usr/local/pgsql/share/contrib/postgis_comments.sql ; |
| </code> |
| Po pomyślnym stworzeniu nowej tabeli, należy utworzyć pustą tabelę używając komend zawartych w projekcie logicznym. |
| |
| === Konfiguracja części aplikacji odpowiedzialnej za prezencję danych === |
| W tej części należy dostosować plik include.php. Znajdują się w nim informacje konfiguracyjne dotyczące połączenia z bazą danych. |
| <code php> |
| $name="post_test"; |
| $password=""; |
| $name_db="aa2"; |
| $help="pgsql:host=localhost port=5432 dbname=$name_db user=$name password=$password"; |
| </code> |
| |
| |
====-. Wdrożenie i utrzymanie ==== | |
====-. Napotkane problemy ==== | ====-. Napotkane problemy ==== |
| |
| Większość problemów, z jakimi zetknięto się podczas tworzenia projektu, dotyczyła wykorzystania danych dostępnych w OpenStreetMap. Mimo, że baza danych dotycząca krakowskiej komunikacji miejskiej jest dość obszerna, to jednak nie jest ona należycie przygotowana. Podstawowym problemem jest brak powiązania istniejących relacji autobusowych (i tramwajowych) z przystankami. Sam OSM daje taką możliwość, jednak jego krakowscy użytkownicy (poza nami samymi w celach testowych) nie korzystali z tej możliwości. Tym sposobem import istniejących linii oraz dróg stał się niemożliwy: nie można było określić przystanków początkowych i końcowych linii. W związku z tym pierwszym krokiem, jaki należałoby uczynić, jest uzupełnienie tychże danych. Sam parser jest do tego (częściowo) przygotowany.\\ |
| Kolejny, wspomniany wcześniej problem, to nieuwzględnienie przez twórców możliwości różnic w trasie przejazdu w poszczególnych kierunkach. Oznacz to, że należałoby albo wprowadzić dodatkowe taki, albo rozróżnić w nazwie (np. poprzez a/b) kierunek relacji.\\ |
| Można również odnieść wrażenie, że moduł eksportujący dane z OSM ma pewne niedociągnięcia - eksportując dane dotyczące jakiegoś obszaru może okazać się, że są one niekompletne. W relacjach znajdują się bowiem drogi (ways), ale brak jest informacji o ich przebiegu.\\ |
| Jeśli chodzi o problemy typowo techniczne, to pewne problemy pojawiły się podczas przetwarzania danych zakodowanych poprzez moduł pygresql w Pythonie, w związku z czym wykorzystano psycopg2, który radzi sobie z tym bez problemów (wysyła dane jako "escape strings", poprzedzone prefiksem E). |
| |
====-. Wnioski ===== | ====-. Wnioski ===== |
| Zrealizowany projekt został zakończony połowicznym sukcesem. Cześć aplikacji oparta o prezencję danych udało się nam zrealizować w 100 %. Użytkownik uzyskał możliwość podglądu danych dotyczących funkcjonowania komunikacji miejskiej w Krakowie. Administrator ma możliwość prostego i intuicyjnego wprowadzania danych przez wizualny edytor. Niestety nie udało się nam do końca zrealizować importu i eksportu danych zawartych w [[www.openstreetmap.org]]. Import przystanków działa bez zarzutu, z kolei część projektu odpowiadająca za import danych związanych z trasami linii tramwajowych i autobusowych działa nie do końca tak jak sobie tego życzyliśmy. Związane jest to z faktem, że relacje wprowadzane przez użytkowników do bazy w serwisie [[www.openstreetmap.org]] są niepełne. Owszem można pobrać trasę linii, ale ta trasa jest nierozróżnialna w sensie czy to jest linia X z A->B czy z B->A. Dokładnie ten problem został opisany w punkcie 6 raportu końcowego. Podsumowując udało się stworzyć aplikację uniwersalną, która jest w stanie pracować w różnych miastach, a nie tylko w Krakowie. Użycie PostGIS pozwoliło w łatwy sposób konstruować zapytania geolokacyjne. |
| |
====-. Rozwój ==== | ====-. Rozwój ==== |
| Rozważając perspektywy rozwoju projektu można wyróżnić kilka |
| potencjalnych kierunków dalszych prac. Jedną z możliwość jest |
| skupienie się na lepszym przystosowaniu systemu do wykorzystania na |
| urządzeniach mobilnych. Zastosowana obecnie w systemie wersja API |
| Google Maps umożliwia bardzo łatwą lokalizację na mapie urządzeń, |
| które są świadome swojego położenia (iPhone, telefony z systemem |
| Google Android lub Windows Mobile/Phone). Zatem, kolejnym krokiem w |
| tym kierunku mogłoby być wyświetlanie kontekstowych informacji o |
| liniach i przystankach w zależności od położenia użytkownika, tak aby |
| włączając stronę projektu ma urządzeniu mobilnym można było od razu |
| zorientować się odnośnie znajdujących się w okolicy przystanków oraz |
| tras. |
| |
| Inna możliwością rozwoju systemu jest stworzenie na jego bazie |
| zupełnie innej warstwy informacyjnej. Warstwę tę może stanowić np |
| informacja o rozmieszczeniu bankomatów czy też innych, istotnych z |
| punktu widzenia określonej grupy docelowej przydatnych miejsc. Ta |
| droga rozwoju jest o tyle prostsza od pozostałych iż z punktu widzenia |
| administratora systemu wymaga właściwie zaznaczania na mapie |
| pojedynczych punktów a nie całych ścieżek. |
| |
| Odrębną warstwę informacyjną można również zbudować wykorzystując cały |
| dostępny potencjał systemu. Zamiast wyświetlania tras komunikacyjnych |
| mogłyby to być warte przejścia trasy widokowe, ścieżki kulturalne lub |
| spacerowe, co przy uwzględnieniu liczby turystów odwiedzających Kraków |
| i daniu im np. możliwości głosowania na najlepsze trasy mogłoby |
| rozwinąć się w ciekawy, niezależny projekt. |
| |
| Jeżeli chodzi o możliwości rozwoju systemu związane z trasami |
| komunikacyjnymi bardzo pożądaną funkcjonalnością była by możliwość |
| zaplanowania tras łączących dowolne punkty w mieście. Użytkownik |
| miałby wpływ na punkty pośrednie oraz możliwość wybrania najszybszej |
| lub najkrótszej opcji, których to inteligentne wyliczenie należałoby |
| do zadań systemu. |
| |
| ====-. Pliki źródłowe ==== |
| {{:pl:dydaktyka:sbd:2009:projekty:mpk-gis:bazy_danych.zip}} |
| {{:pl:dydaktyka:sbd:2009:projekty:mpk-gis:import.tar.gz|}} |
| |
====-. Żrodło ==== | ====-. Żrodło ==== |
*[[http://postgis.refractions.net/]] | *[[http://postgis.refractions.net/]] |