• Keine Ergebnisse gefunden

Erweiterung der csxPOI-Anwendung um Eventbasierte Points of Interests [01/2010]

N/A
N/A
Protected

Academic year: 2021

Aktie "Erweiterung der csxPOI-Anwendung um Eventbasierte Points of Interests [01/2010]"

Copied!
46
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Erweiterung der csxPOI-Anwendung um

Event-basierte Points of Interests

Daniel Schmeiß

Institute for Computer Science

University of Koblenz-Landau

Zusammenfassung

Ziel dieser Studienarbeit ist es, die mobile POI-Verwaltungssoft-ware csxPOI um POIs mit zeitlicher Ausdehnung – Events – zu erwei-tern. Dabei geht es um die Modellierung der Events und die

Entwick-lung eines Konzeptes f¨ur die ¨ubersichtliche Darstellung der Events auf

dem mobilem Endger¨at. Hierf¨ur wurde eine neuartige

Interaktionsme-tapher f¨ur das Einstellen und Browsen des Zeitaspektes implementiert

und in die bestehende Anwendung integriert. F¨ur die Erweiterung um

Events wurden die zugrunde liegenden Konzepte, die Ontologie und die Benutzungsschnittstelle erweitert und angepasst. Mit dem

Ergeb-nis dieser Arbeit ist es nun m¨oglich mit der csxPOI-Anwendung Events

(2)
(3)

Studienarbeit

vorgelegt von Daniel Schmeiß im Januar 2010 zum Thema

Erweiterung der csxPOI-Anwendung um Event-basierte Points of Interests

an der Universit¨at Koblenz-Landau.

Gutachter

Prof. Dr. Steffen Staab Dr. Ansgar Scherp Institut WeST Fachbereich 4

Universit¨at Koblenz-Landau

Erkl¨

arung

Ich versichere, dass ich die vorliegende Arbeit selbst¨andig verfasst und keine

anderen als die angegebenen Quellen und Hilfsmittel benutzt habe. Mit der Einstellung dieser Arbeit in die Bibliothek bin ich einverstanden.

Der Ver¨offentlichung dieser Arbeit im Internet stimme ich zu.

Koblenz, den 31. Januar 2010

(4)
(5)

Inhaltsverzeichnis

Abbildungsverzeichniss 1 1 Einf¨uhrung 2 2 Szenarien 3 2.1 Notfallmanagement . . . 3 2.2 Urlaubsplanung . . . 3 2.3 Ausstellungsbesuch . . . 4 3 Verwandte Arbeiten 5 3.1 Events und Objekte . . . 5

3.2 Zeitdarstellung auf mobilen Endger¨aten . . . 5

3.3 Zusammenfassung . . . 8 4 Anforderungen 9 4.1 Funktionale Anforderungen . . . 9 4.2 Nichtfunktionale Anforderungen . . . 10 4.3 Weitere Anforderungen . . . 10 5 Konzept 13 5.1 Event-basierte POIs . . . 13

5.2 Visualisierung von Events . . . 16

6 Implementierung 21 6.1 Erweiterung von csxPOI um Events . . . 21

6.1.1 Client-seitig . . . 21

6.1.2 Server-seitig . . . 22

6.2 Zeitauswahl-Widget . . . 25

6.3 Anzeige der Events . . . 29

6.4 Grafische Benutzungsoberfl¨ache . . . 32

7 Prototyp 34 7.1 Zeitauswahl-Widget . . . 34

7.2 Events anlegen und editieren . . . 35

7.3 Events suchen und anzeigen . . . 36

7.4 Fazit des Prototyps . . . 38

8 Zusammenfassung 39

9 Ausblick 40

(6)

1

Abbildungsverzeichnis

1 TimeZoom-Zeitleiste mit verschiedenen Granularit¨aten [4] . . 6

2 Zeitleistenansicht im Photobrowser [6] . . . 7

3 Links: Suche nach POIs - Rechts: Erstellen eines POIs . . . . 11

4 Links: Detail-Ansicht eines POIs - Rechts: Ontologie-Editor . . 12

5 geo located event Ontologie, welche einen Event mit Start-und Enddatum Start-und einer gle:belongsTo-Beziehung, visualisiert 14 6 Erster Entwurf der Zeitleistenansicht . . . 16

7 Zweiter Entwurf der Zeitleistenansicht . . . 17

8 Dritter Entwurf der Zeitvisualisierung- und auswahl . . . 18

9 Verfeinerung des Konzepts des Zeitauswahl-Widgets . . . 20

10 SeekBar-Widget des Android SDK . . . 25

11 Angepasste SeekBar . . . 26

12 Abstufungen der Event-Symbole nach Zeit . . . 30

13 Hauptansicht (links), Popup zum W¨ahlen des Datums (rechts) 34 14 Erstellen eines Events (links), Ge¨andertes Datum (rechts) . . . 35

15 Suchdialog (links), In Abbildung 14 erstellter Event (rechts) . 36 16 Erl¨auterung der Symbole (links), Visualisierung sehr vieler POIs und Events (rechts) . . . 37

(7)

1 EINF ¨UHRUNG 2

1

Einf¨

uhrung

In seiner Diplomarbeit [3] hat Max Braun die csxPOI

Android-Smartphone-Anwendung entwickelt, welche es dem Benutzer erm¨oglicht auf einer Karte

Points of Interest zu platzieren und mit anderen Benutzern zu tauschen. Die Besonderheit liegt darin, dass diese POIs mit semantischen Konzepten

annotiert werden k¨onnen. Die zugrunde liegende Ontologie kann ebenfalls

von den Anwendern kollaborativ editiert und erweitert werden, so dass diese Anwendung durch die Benutzer beliebig um Konzepte erweitert werden kann

und somit auch f¨ur spezielle Einsatzgebiete interessant macht.

Diese POIs zeichnen sich durch einen Namen, den Ort an dem sie plat-ziert wurden und durch die annotierten Konzepte aus. Jedoch wird dabei

nicht die zeitliche Dimension der Punkte in Betracht gezogen. Dies w¨urde

der Anwendung einen erheblichen Mehrwert liefern und es so dem Anwender

erm¨oglichen, nicht nur nach zeitlich konstanten Points of Interest zu suchen,

sondern auch nach Events.

Diese Erweiterung soll im Rahmen dieser Studienarbeit umgesetzt

wer-den. Wobei zuerst Szenarien in Kapitel 2 f¨ur die Nutzung einer solchen

An-wendung betrachtet werden, aus denen dann die Anforderungen aus Kapitel

4 abgeleitet werden. Gleichzeitig werden ¨ahnliche Anwendungen und Ans¨atze

beleuchtet um somit einen ¨Uberblick und Anregungen zu erhalten (siehe

Ka-pitel 3). Dann soll ein Konzept in KaKa-pitel 5 f¨ur die Umsetzung geschaffen

werden. Anschließend soll die bestehende Anwendung so erweitert werden,

dass sich die Erweiterung nahtlos in die Anwendung einf¨ugt und der

Be-nutzer mit Events arbeiten kann. Besondere Aspekte der Implementierung werden dann in einem separaten Kapitel 6 beschrieben. Abschließend wird dann der in Rahmen dieser Arbeit weiterentwickelte Prototyp (siehe Kapitel 7) in Bezug auf die neuen Funktionen vorgestellt.

(8)

2 SZENARIEN 3

2

Szenarien

Im Folgenden sollen nun einige Szenarien f¨ur die m¨ogliche Verwendung der

um Events erweiterten csxPOI-Anwendung vorgestellt werden. Daraus sollen

dann Anforderungen f¨ur die Anwendung generiert werden. Die beiden

Sze-narien

”Notfallmanagement“ und ”Urlaubsplanung“ sind angelehnt an die

Szenarien des WeKnowIt-Projektes1.

2.1

Notfallmanagement

Im Notfallmanagement-Szenario liegt der Fokus auf der schnellen und

einfa-chen Erstellung von Events. Die Anwendung k¨onnte auf mobilen Endger¨aten

von Polizei-und Feuerwehrmitarbeitern installiert sein und sie so in die Lage

versetzen Notf¨alle schnell zu melden und im System einzutragen. Somit

lie-gen die Anforderunlie-gen hier auf einem einfachen Hinzuf¨ugen von Events und

deren Visualisierung auf einer Karte. Folgender Ablauf ist hier denkbar:

• Ein mobiler Mitarbeiter der Polizei entdeckt ein Feuer.

• Er markiert dies in seiner Notfallmanagement-Anwendung auf seinem

mobilen Endger¨at. Dazu platziert er einen

”Feuer-Event“ an seiner

ak-tuellen Stelle und f¨ugt zus¨atzlich einen Zeitstempel f¨ur Log-Zwecke

hin-zu.

• Nun k¨onnen weitere Mitarbeiter, mit Zugriff auf dieses System, ¨uber

dieses Feuer informiert werden.

• Jedoch sollte auch die M¨oglichkeit bestehen nach gewissen Begriffen, wie zum Beispiel

”Feuer“, in der Anwendung zu suchen und sich so

einen ¨Uberblick zu verschaffen ¨uber Vorkommnisse in Zeitr¨aumen in

der Vergangenheit.

2.2

Urlaubsplanung

Das zweite Szenario – Urlaubsplanung – beschreibt, wie eine Gruppe von Per-sonen einen Urlaubstrip in eine fremde Stadt planen. Dabei wollen sie sich ¨

uber m¨ogliche Aktivit¨aten und Ereignisse, die w¨ahrend ihres Aufenthalts in

der Stadt angeboten werden, informieren. Aber auch eine Verwendung der

(9)

2 SZENARIEN 4

Anwendung vor Ort, um einen schnellen und einfachen ¨Uberblick ¨uber

Ver-anstaltungen zu bekommen, sollte m¨oglich sein. Somit ist dieses Szenario

nicht so kurzfristig wie das Notfallmanagement-Szenario zu sehen, sondern es fokussiert sich auf die Planung in der Zukunft.

Folgender Ablauf ist hier denkbar:

• Ein Mitglied der Reisegruppe sucht in der Anwendung die Stadt aus und navigiert dort hin.

• Nun setzt er den Zeitraum auf den Reisezeitraum, also auf einen Zeit-raum in der Zukunft.

• Anschließend sollte es ihm m¨oglich sein nach eingetragenen Events und

Aktivit¨aten, die w¨ahrend dem ausgesuchten Zeitraum stattfinden, zu

suchen und ihm die Ergebnisse auf der Karte pr¨asentiert werden.

• Wenn die Reisegruppe dann vor Ort ist, sollte es m¨oglich sein mit der

mobilen Anwendung sich nochmals ¨uber Ereignisse am aktuellen Ort

zu informieren.

2.3

Ausstellungsbesuch

Das nun letzte, hier aufgef¨uhrte Szenario soll ein Ausstellungsbesuch sein.

Hierbei besucht eine Person eine Ausstellung und m¨ochte diese in seiner

csxPOI-Anwendung vor Ort eintragen. Folgender Ablauf ist nun hier denkbar:

• Nach dem Besuch einer Ausstellung m¨ochte die Person diese in cxsPOI abspeichern.

• Daf¨ur erstellt er nach dem ¨ublichem Muster einen Event und platziert

ihn auf der Karte.

• Jedoch kann es nun sein, dass er weder das Anfangs- noch das Endda-tum der Ausstellung kennt. Nun sollte dies aber kein Problem bei der

Erstellung des Events sein. Er w¨ahlt einfach ab

”heute“ und l¨asst das

Enddatum offen. Dieses kann dann zum Beispiel ein weiterer Besucher nachtragen.

(10)

3 VERWANDTE ARBEITEN 5

3

Verwandte Arbeiten

Dieses Kapitel soll einen ¨Uberblick ¨uber die bereits bestehenden Konzepte

zu den einzelnen Teilen dieser Arbeit geben – Events und die Zeitdarstellung

auf mobilen Endger¨aten.

3.1

Events und Objekte

Eine Grundlage f¨ur die Erweiterung der csxPOI-Anwendung um Events ist

es, zu kl¨aren wie wir Events definieren. Dies kann man zum Beispiel ¨uber

einen Zeitpunkt oder ein Zeitintervall definieren [1]. Anhand unserer

Anwen-dungsf¨alle aus Kapitel 2 wird aber ein Zeitintervall ben¨otigt, so dass wir f¨ur

diese Arbeit folgende Festlegung treffen:

Festlegung 1 (Event) Ein Event in unserem Sinne ist eine Entit¨at, welche

sich ¨uber einen Zeitraum erstreckt. Dabei besitzt sie einen Start- und einen

Endzeitpunkt.

H¨aufige Aufgaben, die im Zusammenhang mit Events vorkommen sind

das Finden von Events vor, nach oder w¨ahrend eines Zeitraums oder

Zeit-punktes [9]. Diese Aufgaben fallen genau in die beschriebenen

Anwendungs-f¨alle und sind somit in den Anforderungen in Kapitel 4 zu finden.

Komplexere Modellierungen von Events, wie zum Beispiel das

”Event

Mo-del F“ [7], welches die Korrelation von Events und auch ihre beteiligten

En-tit¨aten modelliert, ben¨otigen wir f¨ur die Erweiterung der csxPOI-Anwendung

nicht. Events sind im Kontext dieser Arbeit also nur als Ereignisse, die ” pas-sieren“, zu sehen. Die beteiligten Objekte, werden nicht modelliert [7]. Jedoch

haben Events einen Ortsbezug ¨uber die entsprechende Geokoordinate auf der

Karte.

3.2

Zeitdarstellung auf mobilen Endger¨

aten

Um innerhalb der Anwendung einen ¨Uberblick ¨uber die zeitliche Anordnung

der Events zu erhalten eignet sich eine Zeitleistenansicht. Diese wird dann

zus¨atzlich zur bestehenden Kartenansicht angeboten und der Anwender hat

die Wahl zwischen diesen beiden Ansichten.

Tufte [11] beschreibt Zeitleisten als ¨ubliche und hilfreiche Form der

Dar-stellung von chronologischen Daten. Dabei repr¨asentiert bei seinen vielen

Beispielen die horizontale Achse die Zeit und in der vertikalen Achse werden

die Events aufgetragen. Eine Verwendung dieser Zeitleiste ist somit f¨ur den

(11)

3 VERWANDTE ARBEITEN 6

Abbildung 1: TimeZoom-Zeitleiste mit verschiedenen Granularit¨aten [4]

Diese Zeitleisten sind in vielen Anwendungen zu finden. So stellt zum Beispiel TimeZoom [4] eine solche dar. Der Fokus liegt hierbei auf dem Design der Zeitleiste und nicht, wie man mit ihr Daten darstellt. Die TimeZoom-Zeitleiste ist horizontal angeordnet. In der Vertikalen bietet sie verschiedene

zeitliche Granularit¨aten. Diese reichen von Jahren bis zu Stunden und sind

flexibel (siehe Abbildung 1).

Als Interaktionsm¨oglichkeit mit dieser Zeitleiste stellen die Autoren das

horizontale Scrollen in einer Region der Zeitleiste heraus. Somit kann der

Anwender genau den Zeitraum ausw¨ahlen, den er sucht und die Anwendung

ist einfach zu bedienen. Problematisch bei der TimeZoom-Zeitleiste ist die

Komplexit¨at dieser und die Abbildung dieser auf einem kleinen Display eines

mobilen Endger¨ats. Außerdem bleibt die Darstellung der Daten bei dieser

Arbeit außen vor.

David Fran¸cois Huynh vom Massachusetts Institute of Technology stellt mit

”TimeLine“ [5] eine Webanwendung vor, die es erm¨oglicht Events zu

vi-sualisieren. Es gibt einerseits eine kleinere Scrollleiste am unteren Rand der Anwendung, mit der der Anwender schnell durch die Zeitleiste scrollen kann. Wenn er dies tut, passt sich die chronologische Anzeige der Events an und zeigt die Events als kleine Punkte mit Beschreibung an. Beim Anklicken eines

Events erh¨alt der Benutzer weitere Informationen. Der grundlegende Ansatz

ist ¨ahnlich wie bei TimeZoom. Es gibt verschiedene Granularit¨aten von Zeit

und der Anwender kann je nach seinen Bed¨urfnissen Scrollen und

Brow-sen. Jedoch ist dies eine Webanwendung und verbraucht sehr viel Fl¨ache auf

dem Bildschirm. Auf einem kleinen Bildschirm eines Mobiltelefons

funktio-niert diese Darstellung nicht. Gut funktiofunktio-niert hierbei aber das ¨ubersichtliche

Browsen durch die Anzeige der verschiedenen Granularit¨aten von Zeit und

man erh¨alt schnell einen ¨Uberblick ¨uber die vorhandenen Events.

(12)

3 VERWANDTE ARBEITEN 7

Abbildung 2: Zeitleistenansicht im Photobrowser [6]

der PhotoBrowser [6]. Hier stellen die Autoren eine Anwendung vor, die auch eine Zeitleistenansicht der Photos beinhaltet. Die Zeitleiste ist hier nicht – wie

sonst ¨ublich – horizontal, sondern vertikal angeordnet. Links und rechts von

ihr befinden sich geclusterte Sammlungen von Photos, die einen bestimmten Zeitraum abdecken (siehe Abbildung 2).

Bei dieser Darstellung wird dem Benutzer sofort ersichtlich, welchen Zeit-raum er gerade sieht und welche zeitliche Ausdehnung die einzelnen Photo-alben haben. Die Photos werden zu Alben geclustert, damit nur maximal zehn Alben gleichzeitig angezeigt werden. Diese geclusterte Visualisierung

der Photos k¨onnte man auch auf Events ¨ubertragen und so auch viele Events

auf einem begrenzten Bildschirm darstellen.

F¨ur die Darstellung der Zeitleiste auf einem mobilem Endger¨at mit

be-schr¨ankter Bildschirmgr¨oße bedarf es jedoch weiterer konzeptueller ¨

Uberle-gungen. Denn einerseits muss die Anwendung ¨ubersichtlich dargestellt

wer-den, andererseits auch gut mit dem Finger bedienbar sein. Die einfache Be-dienung mit einem Finger ist die Grundlage des Betriebssystems Android

(13)

3 VERWANDTE ARBEITEN 8

3.3

Zusammenfassung

Um die bestehende csxPOI-Anwendung um Events zu erweitern werden die

Ereignisse, wie wir sie soeben festgelegt haben, in die Anwendung ¨ubertragen.

Dabei soll die Zeitleisten-Darstellung einen ¨Uberblick ¨uber die Events geben.

Es gibt die M¨oglichkeit diese Zeitleiste horizontal oder vertikal anzuordnen.

Wir haben uns nach einem iterativem Entscheidungsprozess und der

Erstel-lung verschiedener alternativer Varianten f¨ur die horizontale Ansicht

ent-schieden, wie sie von Tufte empfohlen und von weiteren Arbeiten verwendet wird. Das Design der Anwendung wird an die Darstellung von TimeZoom angelehnt (siehe Konzept 5.2).

(14)

4 ANFORDERUNGEN 9

4

Anforderungen

Anhand der Anwendungsf¨alle aus Kapitel 2 und der Vorstellung der

ver-wandten Arbeiten in Kapitel 3 ergeben sich bestimmte Anforderungen f¨ur

die Umsetzung der Erweiterung der csxPOI-Anwendung. Diese Anforderun-gen sind unterteilt in AnforderunAnforderun-gen, die die Erweiterung der Anwendung um

Events betreffen und in Anforderungen f¨ur die allgemeine Verfeinerung der

Anwendung. Diese sind jeweils in funktionale und nichtfunktionale Require-ments unterteilt [10]. Desweiteren sind die Anforderungen als obligatorisch

mit einem Pluszeichen (+) oder als optional mit einem Minuszeichen (−)

gekennzeichnet.

4.1

Funktionale Anforderungen

Die funktionalen Anforderungen beschreiben die Anforderungen an die

Be-nutzungsoberfl¨ache, um die Erstellung, Anzeige und Manipulation von Events

zu erm¨oglichen.

R1+ Der Anwender kann zu einem POI einen Zeitraum hinzuf¨ugen,

in-dem er Datum und Zeit ausw¨ahlt.

R2+ Die Auswahl von Datum und Zeit wird auf die Bedienung mit dem

Finger auf einem Touchscreen optimiert.

R3+ Es gibt die M¨oglichkeit, die Daten – Datum und Zeit – sowohl

mittels der Benutzungsoberfl¨ache, als auch direkt mit der Tastatur

einzugeben.

R4+ Events unterscheiden sich auf der Karte anhand des Icons von

nor-malen POIs.

R5+ Wenn man Events innerhalb eines bestimmten Zeitraums gesucht

hat, sollte dieser Suchzeitraum auch stets angezeigt werden (zum Beispiel oberhalb der Karte).

R6+ Innerhalb der Informationen eines Events sollte dieser als solcher

klar gemacht werden und auch der Zeitraum angezeigt werden.

R7+ Bei einem Klick auf einen Event erscheinen weitere Informationen

in einem Fenster.

R8+ Der Anwender kann den Zeitraum eines Events editieren und

(15)

4 ANFORDERUNGEN 10

R9+ Das Zeitauswahl-Widget blendet sich ein, wenn man auf die Karte

tippt und blendet sich nach einer gewissen Zeit der Nichtbenutzung wieder aus.

R10+ Beim Starten der Anwendung wird der anzuzeigende Zeitpunkt

auf den aktuellen Tag gesetzt.

4.2

Nichtfunktionale Anforderungen

Die nichtfunktionalen Anforderungen legen fest, wie die Anwendung erweitert

werden muss, um mit Events umgehen zu k¨onnen.

R11+ Ein Zeitraum besteht aus Start- und Endzeitpunkt, welche ¨uber

das Datum und die Zeit (nur Stunden und Minuten) genau be-stimmt sind.

R12+ Ein Event besitzt die Eigenschaften eines Points of Interest, der

um einen Zeitraum erweitert wurde.

R13+ Die Zeit wird im 24-Stunden-Format angezeigt und gespeichert

und das Datum nach britischer Norm (dd-mm-yyyy) angezeigt.

R14+ Die Ontologien werden erweitert, um Events zu erm¨oglichen.

• Zur POI-Ontologie werden die Attribute hasStartDateTime

und hasEndDateTime zu einem POI hinzugef¨ugt, falls er einen

Event darstellt.

• Zur Base-Ontologie werden hasStartDateTime und hasEnd-DateTime zur Range des base:changesPoiProperty damit

der Zeitraum eines Events ge¨andert werden kann.

R15+ Anpassung der Methoden des Servers um Anfragen mit zeitlichem

Kontext durchzuf¨uhren.

4.3

Weitere Anforderungen

Die Anwendung soll an mehreren Stellen verfeinert werden, um die Anwen-dung besser benutzbar zu machen und den Anwender bei den einzelnen

(16)

4 ANFORDERUNGEN 11

Abbildung 3: Links: Suche nach POIs - Rechts: Erstellen eines POIs

R16+ In der POI-Suche ist es m¨oglich nach allen POIs im

Kartenaus-schnitt zu suchen, indem man das Suchfeld frei l¨asst. Dies ist nicht

intuitiv und so w¨are hier ein zus¨atzlicher Button

”Show all POIs“

angebracht (siehe Abbildung 3, linke Seite). Zudem sollte bei der Suche nach allen POIs ab einer bestimmten Zoomstufe eine War-nung an den Benutzer gegeben werden, dass nicht mehr alle Points of Interest angezeigt werden.

R17+ Nach dem Erstellen des POIs kann man in einer Detail-Ansicht

die zugeh¨origen Kategorien ansehen. Nicht klar wird hierbei, dass

es sich um Links handelt. So ¨offnet zum Beispiel ein Klick auf

” sta-dium“ den Ontologie-Editor. Diese Hyperlinks innerhalb der An-wendung sollten klarer hervorgehoben werden (siehe Abbildung 4,

linke Seite). Außerdem k¨onnte zum Beispiel ein zus¨atzliches Favicon

dem Benutzer anzeigen, wohin er mit dem Link springt.

R18+ Ein bestimmtes Konzept im Ontologie-Editor zu suchen ist

rela-tiv schwierig, da man eine sehr lange, zu scrollende Liste vorfindet (siehe Abbildung 4, rechte Seite). Hier sollte entweder eine textuelle

Suche m¨oglich sein, oder das Einschr¨anken durch Eingabe einzelner

(17)

4 ANFORDERUNGEN 12

Abbildung 4: Links: Detail-Ansicht eines POIs - Rechts: Ontologie-Editor

R19+ An der aktuellen Position - also der Mitte der Karte - sollte zur

Orientierung f¨ur den Benutzer ein Fadenkreuz eingeblendet werden.

R20+ All¨ubergreifend soll noch die Erh¨ohung der Stabilit¨at der

Anwen-dung im Fokus stehen. So dass zum Beispiel nicht beim kurzen Ver-bindungsabbruch des Internets die Anwendung sich komplett neu

synchronisiert und so den Arbeitsfluss des Anwenders st¨ort oder

komplett abbricht.

R21− Beim Erstellen eines Point of Interest k¨onnte eine Liste von

pas-senden Konzepten anhand des eingegebenen Namens vorgeschlagen werden. So dass in diesem Beispiel beim Klick in das leere

Ca-tegory“-Feld die Konzepte

”Soccer“ und ”Stadium“ aus dem

csx-Vokabular am Anfang der Vorschlagliste erscheinen (siehe Abbil-dung 3, rechte Seite).

R22− Auf Instanzdatenebene k¨onnte man eine Verkn¨upfung von POIs

mit weiteren Hintergrundinformation realisieren. So dass man f¨ur

Instanzen, wie zum Beispiel das Stadion aus dem obigen Beispiel

mit einem Link zur DBPedia mit weiteren Informationen f¨ur den

Benutzer anzureichern. Diese w¨urde man dann ¨uber die

sameAs-Beziehung mit den Instanzdaten verkn¨upfen (zum Beispiel: poi:

(18)

5 KONZEPT 13

5

Konzept

In diesem Kapitel werden die konzeptuellen Grundlagen f¨ur die Umsetzung

der Anforderungen festgelegt und erl¨autert. Der Fokus liegt auf der

Umset-zung der Events und der Entwurf der Zeitleistenansicht.

5.1

Event-basierte POIs

In Kapitel 3 haben wir festgelegt, dass sich Events ¨uber einen Zeitraum

defi-nieren. Dieser besteht aus einem Start- und einen Endpunkt. Sie bestehen aus

einem Datum und einer Uhrzeit, wobei die Granularit¨at der Zeit auf Stunden

und Minuten beschr¨ankt wird. Es entspricht keinem Szenario Sekunden oder

noch kleinere Zeiteinheiten zu bestimmen, w¨are jedoch problemlos m¨oglich,

da wir die ISO8601-Kodierungsstandard2ur das Speichern eines Zeitpunktes

verwenden.

Um die Events von den bisher ¨ublichen Points of Interest abzuheben und

deutlich zu machen, dass es sich um eine Erweiterung handelt, f¨uhren wir den

neuen Namespace gle, was f¨ur

”geo located event“ steht, ein. Dabei soll dies

klar machen, dass es sich um einen Event handelt, der sowohl eine zeitliche

Ausdehnung besitzt, als auch r¨aumlich klar definiert ist. F¨ur die r¨aumliche

Ausdehnung und die weiteren bestehenden Eigenschaften eines bisherigen

POIs ¨ubernehmen wir die bisherigen Attribute. Neu hinzu kommt die

zeitli-che Ausdehnung und dies modellieren wir, indem wir zu einem POI zwei neue

Attribute gle:hasStartDateTime und gle:hasEndDateTime hinzuf¨ugen.

Festlegung 2 (Unterscheidung POI - Event) Wenn ein Point of Inte-rest die beiden Attribute gle: hasStartDateTime und gle: hasEndDateTime besitzt, so handelt es sich um einen Event. Er kann entweder keines der At-tribute besitzen oder beide.

In der Abbildung 5 ist eine Instanz eines Events dargestellt. Dort sind die

bisherigen Attribute eines Points of Interest vorhanden und zus¨atzlich der

Start- und Endzeitpunkt. Die Abfrage, ob ein POI ein Event ist wird somit ¨

uber das Vorhandensein eines der beiden Attribute gepr¨uft. Die zeitlichen

Attribute zeigen auf xsd:dateTime-Knoten, welche nach ISO 8601 Norm formatiert sind2.

Dadurch, dass die ¨Anderungen nur zus¨atzlich sind, bedarf es keiner

An-passung bei der Verwendung von bisherigen POIs. Auch wenn die ¨Anderungen

nur aus zwei zus¨atzlichen Attributen bestehen, bieten sie den vollen

Funkti-onsumfang, den wir in den Anforderungen definiert haben.

(19)

5 KONZEPT 14

... gle:199 gle:200 gle:201 … "62.40"^^xsd:decimal

"7.605639696"^^xsd:decimal

"50.364100268"^^xsd:decimal „2009-11-01 08:00:00"^^xsd:dateTime

"Gauklerfest am deutschen Eck"^^xsd:string http://linkedgeodata.org/triplify/way/27426031#id voc:Celebration „2009-12-01 08:00:00"^^xsd:dateTime geo:lat geo:long geo:alt gle:hasStartDateTime rdf:type owl:sameAs rdfs:label gle:hasEndDateTime gle:141 gle:hasSubevent

Abbildung 5: geo located event Ontologie, welche einen Event mit Start- und Enddatum und einer gle:belongsTo-Beziehung, visualisiert

Falls f¨ur einen Event eines der beiden Daten unbekannt ist und der

An-wender aber trotzdem einen Zeitraum angeben m¨ochte (siehe 2.3), wird der

Startzeitpunk auf das Jahr 0 gesetzt bzw. der Endzeitpunkt auf das Jahr 3000, welche als Konstanten im System abgelegt sind. Damit ist sicherge-stellt, dass die allgemeine Festlegung eingehalten wird, aber auch Events

mit maximal einem offenen Zeitpunkt angelegt werden k¨onnen. Innerhalb

der Anwendung und auch der Visualisierung m¨ussen diese Events jedoch

be-sonders behandelt werden. So sollte zum Beispiel bei der Visualisierung des Zeitraums nicht angezeigt werden, dass dieser Event den Endpunkt im Jahr 3000 besitzt, sondern, dass dieser unbestimmt ist.

M¨oglich ist es aber auch, einen Event anzulegen, der keine zeitliche

Aus-dehnung besitzt, sondern nur einen Zeitpunkt markiert. Dies wird in der

An-wendung dadurch erm¨oglicht, dass der Benutzer nur einen Zeitpunkt eingibt.

Dieser Zeitpunkt wird dann sowohl in den Start- als auch in den Endzeit-punkt eingetragen.

Durch diese Konzipierung der Events sind alle Szenarien abgedeckt und

es ergeben sich f¨ur den Anwender beliebige M¨oglichkeiten den

Zeitpunkt-bzw. Raum festzulegen.

Eine Erweiterung dieses Konzeptes der Events ist m¨oglich, indem

(20)

5 KONZEPT 15

So k¨onnte man als Beispiel ein Festival mit mehreren B¨uhnen und

Veranstal-tungsorten annehmen, welches aus mehreren Auftritten und Shows besteht und so einen großen Event, der die einzelnen Events beinhaltet, darstellt. Die Umsetzung dieser Idee auf Ontologie-Basis sieht dann so aus, dass ein Event

ein optionales Attribut gle:hasSubevent erh¨alt, welches auf einen weiteren

Event zeigt (siehe Abbildung 5). Durch die Anordnung der Teile Subjekt,

Pr¨adikat und Objekt eines Tripels kann man eine Richtung ablesen. So geh¨ort

der Teilevent im Subjekt zu dem gr¨oßeren Event im Objekt. Somit ist auch

eine ¨Uberpr¨ufung, welches der Teilevent ist und welches der ¨ubergeordnete

Event ist, m¨oglich. Die Kardinalit¨at des Attributs gle:hasSubevent ist

be-liebig. Das heißt, dass ein Event keine bis unendlich viele solcher Beziehungen

haben kann. Wobei nat¨urlich eine große Anzahl von diesen Beziehungen f¨ur

(21)

5 KONZEPT 16 csxPOI-TimeLine 8:35 PM 1/1/ 2008 20091/1/ < > < > Back to mapview

Abbildung 6: Erster Entwurf der Zeitleistenansicht

5.2

Visualisierung von Events

Um Events zu visualisieren und mit ihnen zu interagieren bedarf es einer

In-tegration dieser in csxPOI. Daf¨ur wurde eine

”Zeitleistenansicht“ entwickelt,

die dem Benutzer eine chronologische ¨Ubersicht ¨uber gesuchte Ereignisse

lie-fern soll. Folgende Eigenschaften sollen beim Konzipieren im Vordergrund stehen:

• Schneller ¨Uberblick ¨uber die gesuchten Events.

• Darstellung der Events entsprechend ihrer zeitlichen Ausdehnung.

• Einfache Bedienung der Zeitleiste und keine ¨Uberfrachtung mit

Be-dienelementen.

Um diesen Anforderungen an die Zeitleiste gerecht zu werden, wurden

mehrere Entw¨urfe f¨ur diese erstellt. Der erste Entwurf ist in Abbildung 6

zu sehen. Es wurde nach dem Grundsatz

”Overview first, zoom and filter,

details on demand“ von Shneiderman [8] konzipiert. Dies wird klar, da zuerst

eine ¨Ubersicht ¨uber alle Events im gesuchten Zeitraum dargestellt wird und

der Anwender mit den Bedienelementen weiter nach seinen Bed¨urfnissen die

Ansicht einschr¨anken kann. Die Zeitleistenansicht besteht aus einem großen

Visualisierungsbereich und einer Zeitleiste mit Bedienelementen. Die Zeitlei-ste am unteren Rand beZeitlei-steht aus dem Start- und Endpunkt und dazwischen

einer Skala. Die Bedienelemente zur Einstellung der Zeitpunkte f¨ur Start

(22)

5 KONZEPT 17

Abbildung 7: Zweiter Entwurf der Zeitleistenansicht

man den Zeitpunkt einfach verschieben kann. Das aktuelle Datum wird im mittleren Button angezeigt. Bei einem Druck auf den Button mit der Zeit ¨

offnet sich ein Popup, welches es erm¨oglicht, Datum und Zeit mittels der

Android-Widgets DatePicker3 und TimePicker4 genau einzugeben. Oberhalb

dieser Skala befinden sich die Events, welche mit einem Stern gekennzeichnet

sind und ¨uber einen Balken die L¨ange des Zeitraums darstellen. Durch einen

Klick auf einen Event ist es m¨oglich weitere Details abzufragen. Die vertikale

Anordnung der Events besitzt keine Semantik und ist so nicht logisch. Des-weiteren ist es schwierig die Bedienelemente der Zeitleiste mit einem Finger

auf einem kleinen Display zu bet¨atigen. So dass sich dieser Designentwurf f¨ur

die Umsetzung der Zeitleiste nicht eignet.

Ein weiterer Entwurf, der die Schw¨achen des ersten Ansatzes beachtet

und probiert diese zu vermeiden ist in Abbildung 7 zu finden. Diese An-sicht ist zweigeteilt. Im oberen Teil befindet sich der Zeitstrahl, auf dem die Events platziert sind. Die Ausdehnung des Zeitstrahls ist flexibel und

um-fasst in diesem Beispiel einen Tag. Unter dem Zeitstrahl sind drei gr¨oßere

Bedienelemente zu sehen, welche einem Rad nachempfunden sind und sich

nach links und rechts unbegrenzt scrollen lassen. Sie stehen f¨ur die Auswahl

des Monats, der Woche oder des Tages, der auf dem Zeitstrahl angezeigt wird. Diese Dreiteilung ist der TimeZoom-Anwendung [4] nachempfunden,

3

http://developer.android.com/reference/android/widget/DatePicker.html

4

(23)

5 KONZEPT 18 csxPOI 8:35 PM 04 Feb Jan Mar 03 05 2010

Abbildung 8: Dritter Entwurf der Zeitvisualisierung- und auswahl

welche auch eine vertikale Anordnung der verschiedenen Granularit¨aten

be-sitzt. Somit l¨asst sich die Aufl¨osung des Zeitstrahls anpassen und kann also

einen dieser Zeitr¨aume umfassen. Die jeweils aktuelle Zeitspanne wird

farb-lich markiert. Die einzelnen Scrollbalken sind aneinander gekoppelt, so dass wenn man zum Beispiel das Monatsrad um einen Monat weiterdreht, das

Wochenrad sich anpasst. Links neben den Scrollr¨adern ist die Anzeige des

aktuell eingestellten Wertes zu finden. Dieser Ansatz l¨asst sich durch die

gr¨oßeren Bedienelemente leichter bedienen und ist somit f¨ur die Darstellung

auf einem mobilem Endger¨at besser geeignet. Jedoch kann man die zu

vi-sualisierende Zeitspanne nicht mehr so genau einstellen und ist auf die drei

vordefinierten Zeitr¨aume Tag, Woche, Monat angewiesen. Außerdem kann

es problematisch werden, sehr viele Events auf dieser Zeitleiste darzustellen,

da diese sich dann ¨uberlappen und eine genaue Auswahl eines Events sehr

schwer m¨oglich sein wird. Die Dauer eines Events wird in diesem Entwurf

auch nicht mehr dargestellt, l¨asst sich aber ¨uber einen Klick auf den Event

anzeigen.

Jedoch beherbergt auch dieser zweite Entwurf, wie eben erw¨ahnt, einige

Probleme, so dass das dritte Design die Zeitleistenansicht in die Kartenan-sicht integriert (siehe Abbildung 8). In dieser AnKartenan-sicht sind nun die Karten-und Zeitansicht verschmolzen. Wenn man mit dem Finger auf den oberen

Bereich der Karte klickt, erscheinen die Zeitr¨ader am oberen Rand des

(24)

5 KONZEPT 19

wieder. Diese Zeitr¨ader sind Bedienelemente, die sich beliebig schnell und

weit horizontal in beide Richtungen drehen lassen. Innerhalb dieser wird der

aktuell gew¨ahlte Zeitpunkt visualisiert. Dabei ist die eingestellte Zeitspanne

immer die, die auf dem unteren R¨adchen zu erkennen ist. In dem Beispiel

aus der Abbildung 8 w¨are dies nun der Zeitraum von Januar bis M¨arz 2010.

Points of Interest – als Punkte ohne Zeitausdehnung – werden wie gewohnt

als gelbe Sterne dargestellt und ¨andern sich auch nicht bei der Ver¨anderung

des Zeitraums am oberen Rand.

Die Events unterscheiden sich von den POIs auf der Karte durch die unterschiedliche Farbe. Sie sind blau dargestellt und je nach zeitlicher Di-stanz zum eingestellten Zeitraum opak bis transparent. Wobei Events, die vor dem eingestellten Zeitraum beginnen, nicht dargestellt werden. Durch

diese Kodierung kann der Benutzer ein Gef¨uhl daf¨ur bekommen, wann ein

Event stattfindet. Außerdem ist die Lage des Events gleich ersichtlich.

Also haben wir in diesem Entwurf die St¨arken des ersten Entwurfs – ¨

uber-sichtliche Darstellung der Events und Visualisierung des Zeitpunkts und des

Zeitraums eines Events – und die St¨arken des zweiten Entwurfs – einfache

Bedienung und eine klare ¨ubersichtliche Darstellung – vereint. Außerdem

be-steht f¨ur den Anwender nun nicht mehr die Notwendigkeit zwischen mehreren

Ansichten zu wechseln und erm¨oglicht damit einen runderen Arbeitsablauf.

Es gibt aber immer noch Schwachstellen, wie zum Beispiel die unflexiblere

Einstellung des Anzeigezeitraums. Diesen k¨onnte man aber als eine

Einstel-lung im Optionenmen¨u f¨ur den Anwender ausw¨ahlbar machen.

Somit ist die Zeitleistenansicht – urspr¨unglich als eigene Ansicht gedacht

– mit der Kartenansicht verschmolzen und bietet nach dieser Evolution der

Ansichten einen guten Kompromiss f¨ur den Anwender zwischen Bedienung,

Visualisierung und Einfachheit.

Bei der prototypischen Entwicklung dieses Widgets wurde ersichtlich, dass das dritte, soeben vorgestellte Konzept nicht gut zu bedienen ist. So zeigte

sich, dass die r¨aumlich nahe Anzeige des ausgew¨ahlten Zeitpunktes auf dem

Touchscreen unpraktikabel ist. Der Benutzer verdeckt mit seinem Finger die

Anzeige des Datums und kann somit die R¨uckmeldung nicht sehen.

Bes-ser ist es hier, die R¨uckkopplung getrennt von der Eingabe anzuzeigen. Aus

demselben Grund – dass man die R¨uckmeldung nicht sehen kann – ist es

nicht praktikabel, das Zeitauswahl-Widget am oberen Rand der Anwendung zu platzieren. Denn der Anwender verdeckt dann die Karte und kann somit nicht die, sich bei Interaktion erneuernde, Anzeige der Events wahrnehmen.

(25)

5 KONZEPT 20

Abbildung 9: Verfeinerung des Konzepts des Zeitauswahl-Widgets Also wurde das Zeitauswahl-Widget an den unteren Rand der Anwendung

verschoben, wobei die Anzeige des aktuell gew¨ahlten Datums am oberen

Rand bestehen bleibt. Dadurch kann der Benutzer den aktuellen Zeitpunkt

ausw¨ahlen und gleichzeitig die sich aktualisierende Anzeige der Events und

die R¨uckkopplung der Anzeige in Form des gew¨ahlten Datums wahrnehmen.

Der Einfachheit und der Anwenderfreundlichkeit halber besteht das Zeit-auswahl-Widget nur noch aus einem Balken (siehe Abbildung 9). Denn der

zweite Balken bietet dem Benutzer keine zus¨atzliche Funktionalit¨at, sondern

verbraucht nur zus¨atzlichen Anzeigeraum. Außerdem ist es auf dem

Touchs-creen schwer zu bedienen, wenn man zwei solche Bereiche ¨ubereinander setzt.

So kann es vorkommen, dass man aus Versehen den falschen Bereich scrollt. Letztendlich besteht das Zeitauswahl-Widget also nur noch aus einem sensitivem Balken, mit dem man einen Zeitpunkt festlegen kann. Auf der Karte werden die Events dargestellt, die innerhalb von 30 Tagen nach diesem

Zeitpunkt stattfinden. Das aktuell gew¨ahlte Datum wird am oberen Rand

(26)

6 IMPLEMENTIERUNG 21

6

Implementierung

In diesem Kapitel wird die Implementierung und Umsetzung des Konzep-tes beschrieben. Dabei wird auf interessante Teile des Quellcodes genauer

eingegangen und dieser erl¨autert.

6.1

Erweiterung von csxPOI um Events

Dieser erste Teil der Implementierung besch¨aftigt sich mit der grundlegenden

Erweiterung der Anwendung – sowohl auf Client- als auch auf Serverseite

– um die M¨oglichkeit Events anzulegen, zu speichern, darzustellen und zu

ver¨andern.

6.1.1 Client-seitig

In Kapitel 3.1 wurde festgelegt, dass Events sich durch einen Start- und End-zeitpunkt auszeichnen. Nicht klar ist jedoch bis jetzt, wie dieser Java-seitig gespeichert wird. Hier in diesem Fall werden sie als private String-Attribute

der PoiWrapper-Klasse gespeichert. Dies ist deswegen so gew¨ahlt worden,

damit das Datum leicht per Http und innerhalb der Android-Anwendung als

primitiver Datentyp ¨ubertragen werden kann. Damit innerhalb der

Anwen-dung mit den Daten gearbeitet werden kann, gibt es die Helfermethoden:

1 p u b l i c s t a t i c S t r i n g f o r m a t T o I s o D a t e T i m e S t r i n g (int year , int month , int

day , int hour , int m i n u t e s )

2 p u b l i c s t a t i c S t r i n g f o r m a t I s o S t r i n g T o N i c e F o r m a t ( S t r i n g i s o S t r i n g )

3 p u b l i c s t a t i c C a l e n d a r g e t C a l e n d a r O f I s o S t r i n g ( S t r i n g i s o S t r i n g )

Diese formatieren entweder einzelne Datumsangaben zu einem String in ISO8601-Norm, einen solchen String in ein menschenlesbares Format oder ex-trahieren ein java.util.Calendar-Objekt aus einem ISO-formatierten String. Mithilfe dieser Methoden werden die Datums-Aufgaben innerhalb der

An-wendung gel¨ost. Zu beachten ist hierbei jedoch, dass die Monate eines

Calen-dar-Objekts von 0 (Januar) bis 11 (Dezember) laufen5.

Jede PoiWrapper-Instanz besitzt nun also die beiden Attribute

mStart-Date und mEndmStart-Date, welche standardm¨aßig mit einem leeren String

initia-lisiert werden.

Die csxPOI-Anwendung besteht aus mehreren Activities, welche die ein-zelnen Bestandteile – zum Beispiel die Kartenansicht, der POI-Inspector und der POI-Editor – der Anwendung ausmachen. Activities stellen die

Schnitt-stelle der Anwendung zum Benutzer dar: sie Schnitt-stellen Oberfl¨achen dar, k¨ummern

5

(27)

6 IMPLEMENTIERUNG 22

sich um Anwendereingaben und behandeln diese [2]. Um zwischen diesen

Ac-tivities die aktuelle Instanz des POIs zu ¨ubertragen, muss die

PoiWrapper-Klasse das Parcelable-Interface6 implementieren. Mit diesem Mechanismus

wird ein komplexes Objekt, hier in unserem Beispiel eine PoiWrapper-Instanz, in ihre Grunddatentypen aufgesplittet und kann so zwischen den Activities versendet werden. Hier musste also auch eine Erweiterung um die Start- und Endzeitpunkte vorgenommen werden.

Beim Speichern eines POIs m¨ussen nun auch Start- und Endzeitpunkt zur

HTTP-POST-Anfrage hinzugef¨ugt werden. Daf¨ur werden die Daten zwischen

den Geokoordinaten und den Kategorien eines Events mittels der Schl¨

ussel-w¨orter

”start“ und ”end“ hinzugef¨ugt:

1 S t r i n g u r l S t r i n g = C o n s t a n t s . R E S T _ A D D R E S S + " p o i s " + " ? n a m e = "

2 + E n c o d e r . u r l E n c o d e ( m N e w P o i . g e t N a m e () ) + " & u s e r = "

3 + E n c o d e r . u r l E n c o d e ( m U s e r I d ) + " & lat = " + m N e w P o i . g e t L a t i t u d e ()

4 + " & l o n g = " + m N e w P o i . g e t L o n g i t u d e () + " & alt = " + a l t i t u d e

5 + " & s t a r t = " + m N e w P o i . g e t S t a r t D a t e () + " & end = " + m N e w P o i . g e t E n d D a t e () ;

Also k¨onnen jetzt die Event-Daten in einer PoiWrapper-Instanz als

lo-kale Variablen gespeichert werden, mithilfe des Parcelable-Interfaces

zwi-schen den Activities der Anwendung ¨ubertragen werden und nun auch zum

Server hin ¨ubermittelt werden. Auf Client-Seite fehlt f¨ur die grundlegende

Erweiterung der Anwendung um Events noch das Empfangen von Server-Nachrichten. Hier wurde die Klasse PoiResponseHandler um zwei weitere

Abfragen bez¨uglich des Start- und Endzeitpunktes erweitert. Damit ist die

Erweiterung um Events auf Client-Seite vollst¨andig.

6.1.2 Server-seitig

Auch Teile des Servers mussten erweitert werden, um mit Events umgehen

zu k¨onnen. Auf dem Server csxpoi.isweb.uni-koblenz.de l¨auft ein

Apa-che Tomcat Servlet Container, welApa-cher die csxPOI-Serverkomponente und das Sesame Repository beinhaltet. Diese csxPOI-Serverkomponente kann per

HTTP-REST-Interface angefragt werden. Daf¨ur gibt es definierte Interfaces:

• GET Anfordern einer Ressource vom Server

• POST Neue Daten zu einer Ressource hinzuf¨ugen

• PUT Anlegen oder ¨Andern einer Ressource

• DELETE L¨oschen einer Ressource

6

(28)

6 IMPLEMENTIERUNG 23

Diese Anfragen werden mittels HTTP ¨ubertragen und die Antwort an den

Client wird als XML-Struktur ¨ubermittelt. F¨ur das Speichern eines Events

muss die doPost-Methode des Servlets angepasst werden. So werden die Da-ten des Events aus dem HttpServletRequest extrahiert und dann in der aktu-ellen PoiWrapper-Instanz auf dem Server gespeichert. Sind diese Daten

un-gleich dem leeren String – wurden also Zeitpunkte ¨ubertragen – werden die

Tripel f¨ur das Sesame-Repository generiert und der RepositoryConnection

hinzugef¨ugt. Somit sind die Zeitpunkte eines Events im Repository

gespei-chert.

Das ¨Andern eines Zeitpunktes bedurfte keiner Anpassung, da aufgrund

des kollaborativen Ansatzes der Anwendung vorhandene Attribute nicht

ge-l¨oscht werden, sondern nur das neue Attribut zus¨atzlich gespeichert wird.

Ei-ne zentrale Methode des Servers ist die intern h¨aufig benutzte

createFromUri-Methode: 1 p u b l i c s t a t i c P o i W r a p p e r c r e a t e F r o m U r i ( S t r i n g uri , 2 R e p o s i t o r y C o n n e c t i o n c o n n e c t i o n ) t h r o w s R e p o s i t o r y E x c e p t i o n , 3 M a l f o r m e d Q u e r y E x c e p t i o n , Q u e r y E v a l u a t i o n E x c e p t i o n , 4 N u m b e r F o r m a t E x c e p t i o n { 6 P o i W r a p p e r poi = n u l l; 8 // R e t r i e v e name , l a t i t u d e , l o n g i t u d e , a l t i t u d e , and o p t i o n a l e v e n t 9 // s t a r t and end : 10 T u p l e Q u e r y q u e r y = c o n n e c t i o n . p r e p a r e T u p l e Q u e r y ( Q u e r y L a n g u a g e . SPARQL , 11 " P R E F I X b a s e : < " + C o n s t a n t s . N S _ B A S E + " > " + " P R E F I X geo : < " 12 + C o n s t a n t s . N S _ G E O + " > " + " P R E F I X r d f s : < " 13 + C o n s t a n t s . N S _ R D F S + " > " + " P R E F I X gle : < " 14 + C o n s t a n t s . N S _ G L E + " > "

15 + " S E L E C T ? n a m e ? lat ? l o n g ? alt ? s t a r t ? end "

16 + " W H E R E { " + " ? poi a b a s e : Poi ; "

17 + " r d f s : l a b e l ? n a m e ; " + " geo : lat ? lat ; "

18 + " geo : l o n g ? l o n g ; " + " geo : alt ? alt . "

19 + " O P T I O N A L { ? poi gle : h a s S t a r t D a t e T i m e ? s t a r t . } "

20 + " O P T I O N A L { ? poi gle : h a s E n d D a t e T i m e ? end . } "

21 + " O P T I O N A L { ? r e m o v a l a b a s e : P o i R e m o v a l ; " 22 + " b a s e : a f f e c t s P o i ? poi . } " 23 + " F I L T E R (! b o u n d (? r e m o v a l ) ) " + " F I L T E R (? poi = < " 24 + uri + " >) } " + " L I M I T 1 ") ; 25 T u p l e Q u e r y R e s u l t r e s u l t = q u e r y . e v a l u a t e () ; 26 try { 27 if ( r e s u l t . h a s N e x t () ) { 28 B i n d i n g S e t b i n d i n g S e t = r e s u l t . n e x t () ; 29 poi = new P o i W r a p p e r () ; 30 poi . s e t U r i ( uri ) ; 31 poi . s e t N a m e ( b i n d i n g S e t . g e t V a l u e (" n a m e ") . s t r i n g V a l u e () ) ; 32 poi . s e t L a t i t u d e ( D o u b l e . v a l u e O f ( b i n d i n g S e t . g e t V a l u e (" lat ") 33 . s t r i n g V a l u e () ) ) ; 34 poi . s e t L o n g i t u d e ( D o u b l e . v a l u e O f ( b i n d i n g S e t . g e t V a l u e (" l o n g ") 35 . s t r i n g V a l u e () ) ) ; 36 poi . s e t A l t i t u d e ( D o u b l e . v a l u e O f ( b i n d i n g S e t . g e t V a l u e (" alt ") 37 . s t r i n g V a l u e () ) ) ; 38 if ( b i n d i n g S e t . h a s B i n d i n g (" s t a r t ") ) 39 poi . s e t S t a r t D a t e ( b i n d i n g S e t . g e t V a l u e (" s t a r t ") . s t r i n g V a l u e () ) ; 40 if ( b i n d i n g S e t . h a s B i n d i n g (" end ") )

(29)

6 IMPLEMENTIERUNG 24 41 poi . s e t E n d D a t e ( b i n d i n g S e t . g e t V a l u e (" end ") . s t r i n g V a l u e () ) ; 42 } 43 } f i n a l l y { 44 r e s u l t . c l o s e () ; 45 }

Zur SPARQL-Query wurden nun die optionalen Statement-Abfragen f¨ur

den Start- und den Endzeitpunkt hinzugef¨ugt. Diese m¨ussen mit dem Schl¨

ussel-wort

”OPTIONAL“ markiert sein, damit auch weiterhin POIs, welche genau

diese Attribute gle:hasStartDateTime und gle:hasEndDateTime nicht besit-zen trotzdem mit der Query gefunden werden. Und nur wenn die Variablen start oder end bei der Query gebunden worden sind, werden sie auch gespei-chert.

Als Antworten des Servers an den Client werden XML-Dateien verschickt. Diese beinhalten alle Daten, die der Client angefordert hat. Die Struktur die-ser XML-Dateien wird mittels eines

”Document Type Definition“-Dokumentes

(DTD) festgelegt. Auch dieses musste angepasst werden, so dass es nun wie-folgt aussieht:

1 < !E L E M E N T poi ( id , name , lat , long , alt , start , end , c a t e g o r i e s , e q u i v a l e n t s )? >

2 < !A T T L I S T poi s t a t u s ( s u c c e s s | f a i l u r e ) #R E Q U I R E D> 3 < !E L E M E N T id (#P C D A T A) > 4 < !E L E M E N T n a m e (#P C D A T A) > 5 < !E L E M E N T lat (#P C D A T A) > 6 < !E L E M E N T l o n g (#P C D A T A) > 7 < !E L E M E N T alt (#P C D A T A) > 8 < !E L E M E N T s t a r t (#P C D A T A) > 9 < !E L E M E N T end (#P C D A T A) > 10 < !E L E M E N T c a t e g o r i e s ( c a t e g o r y *) > 11 < !E L E M E N T c a t e g o r y ( n a m e ) > 12 < !A T T L I S T c a t e g o r y id C D A T A #R E Q U I R E D> 13 < !E L E M E N T e q u i v a l e n t s ( e q u i v a l e n t *) > 14 < !E L E M E N T e q u i v a l e n t E M P T Y> 15 < !A T T L I S T e q u i v a l e n t id C D A T A #R E Q U I R E D>

Hierbei werden die beiden Attribute start und end als zwingend voraus-gesetzt. Dies ist deswegen der Fall, da, auch wenn ein POI weder Start- noch Endzeitpunkt besitzt, diese mit einem leeren String vorinitialisiert worden

sind und hier dieser einfach ¨ubertragen wird. Dies bedeutet nicht viel

Over-head, aber erspart in der Programmierung etliche Abfragen auf den Wert

null. Außerdem k¨onnen so viele Methoden einfacher umgesetzt werden, da

diese lokalen Attribute immer vorhanden sind, jedoch halt dem leeren String entsprechen, wenn sie nicht vorhanden sein sollen.

Dies waren nun die gr¨oßeren Anpassungen auf Server-Seite. Events werden

mittels der doPost-Anfrage gespeichert und als Tripel im Sesame Repository

abgelegt. Außerdem k¨onnen diese nun aus der Datenbank gelesen und per

(30)

6 IMPLEMENTIERUNG 25

6.2

Zeitauswahl-Widget

Das Zeitauswahlwidget soll es dem Benutzer erm¨oglichen auf der

Kartenan-sicht nicht nur den Kartenausschnitt mit dem Finger zu scrollen, sondern auch

”durch die Zeit“ zu scrollen. Dies soll m¨oglichst intuitiv und einfach f¨ur

den Benutzer zu bedienen sein.

Dieses in Kapitel 5.2 beschriebene Zeitauswahl-Widget ist in dieser Form nicht im Android SDK vorhanden. Deswegen muss es selbst entwickelt

wer-den. Daf¨ur bietet es sich an, ein vorhandenes Widget zu erweitern um die

gew¨unschte Funktionalit¨at zu erreichen.

Die Anforderung an dieses Widget ist ein Balken, der vom Benutzer

ge-scrollt werden kann. Den Anforderungen am n¨achsten kommt das

SeekBar-Widget (siehe Abbildung 10). Diese SeekBar-Klasse wird erweitert und stellt dann die neue Klasse DateSeekBar dar.

Abbildung 10: SeekBar-Widget des Android SDK

Diese SeekBar7 verf¨ugt ¨uber einen aktuell gew¨ahlten Wert und einen

Be-reich, aus dem die Werte kommen. Der Benutzer kann den Knopf auf der

SeekBar verschieben und somit den gew¨ahlten Wert ver¨andern. F¨ur unsere

Anwendung ist es nicht sinnvoll, das Datum ¨uber einen begrenzten Slider

darzustellen. Denn das Datum soll ja beliebig weit ver¨andert werden und

nicht nur bis zu einem bestimmten Punkt, wie es die Ansicht der SeekBar suggeriert.

Somit bedarf es also zuerst einer grafischen Anpassung dieser SeekBar. Der Knopf soll nicht dargestellt werden und der Hintergrund angepasst wer-den. Dies kann mit den Befehlen aus Listing 1 erreicht werwer-den.

Listing 1: Anpassung der Darstellung der SeekBar

1 // set b a c k g r o u n d i m a g e 2 D r a w a b l e d = g e t R e s o u r c e s (). g e t D r a w a b l e ( R . d r a w a b l e . d a t e _ c h o o s e r ); 3 t h i s. s e t P r o g r e s s D r a w a b l e ( d ); 5 // r e m o v e t h u m b i m a g e 6 t h i s. s e t T h u m b (n u l l); 8 // set m a x i m u m v a l u e 9 t h i s. s e t M a x ( C o n s t a n t s . S E E K B A R _ R E S O L U T I O N );

In Abbildung 11 ist die Auswirkung dieser Anpassung der Darstellung zu sehen.

7

(31)

6 IMPLEMENTIERUNG 26

Abbildung 11: Angepasste SeekBar

Was nun noch fehlt ist die Implementierung der Funktionalit¨at. Dabei soll

es dem Anwender m¨oglich sein, auf einem beliebigen Punkt der angepassten

SeekBar eine

”Wischbewegung“ bzw. ein Scrollen in eine beliebige Richtung

vorzunehmen. Bei jedem ver¨anderten Wert soll die Karte aktualisiert und die

Darstellung der Events dem aktuell gew¨ahlten angepasst werden. Um diese

Interaktion mit der SeekBar zu verwirklichen, implementiert die angepasste

SeekBar-Klasse das OnSeekBarChangeListener-Interface8.

Listing 2: Implementierung des OnSeekBarChangeListener-Interface

1 p r i v a t e b o o l e a n f i r s t ; 2 p r i v a t e int s t a r t ; 4 @ O v e r r i d e 5 p u b l i c v o i d o n P r o g r e s s C h a n g e d ( S e e k B a r seekBar , int p r o g r e s s , 6 b o o l e a n f r o m U s e r ) { 7 // o n l y r e a c t to u s e r i n p u t 8 if ( f r o m U s e r ) { 9 // if it is the f i r s t c h a n g e of p r o g r e s s , r e m e m b e r the s t a r t p o i n t 10 if ( f i r s t ) { 11 f i r s t = f a l s e; 12 }

13 // a f t e r the f i r s t change , a d j u s t the c a l e n d a r and u p d a t e the v i e w

14 e l s e { 15 C s x P o i A c t i v i t y . m C a l . add ( C a l e n d a r . D A Y _ O F _ Y E A R , p r o g r e s s - s t a r t ); 16 C s x P o i A c t i v i t y . u p d a t e M a p O v e r l a y (); 17 C s x P o i A c t i v i t y . u p d a t e D a t e T e x t (); 18 } 19 s t a r t = p r o g r e s s ; 20 } 21 } 23 @ O v e r r i d e 24 p u b l i c v o i d o n S t a r t T r a c k i n g T o u c h ( S e e k B a r s e e k B a r ) { 25 f i r s t = t r u e; 26 }

F¨ur die Implementierung der Funktionalit¨at werden die drei Methoden

des OnSeekBarChangeListener-Interfaces onProgressChanged,

onStartTrack-ingTouch und onStopTrackonStartTrack-ingTouch ¨uberschrieben. Die Funktion

onProgress-Changed wird immer aufgerufen, wenn der Wert der SeekBar aktualisiert

wurde, jedoch aber auch beim ersten Ber¨uhren. Deswegen muss in der

Me-thode onStartTrackingTouch das Flag first auf wahr gesetzt werden. Wenn nun die Methode onStartTrackingTouch aufgerufen wird, muss dieses Flag abgefragt werden und falls es wahr ist, soll nur der Startwert gemerkt

wer-8

http://developer.android.com/reference/android/widget/SeekBar. OnSeekBarChangeListener.html

(32)

6 IMPLEMENTIERUNG 27

den. Bei jedem weiteren Ver¨andern des SeekBar-Wertes ist das Flag dann auf

falsch gesetzt und es wird die java.util.Calendar-Instanz der

CsxPoiActivi-ty, welche das aktuelle Datum beinhaltet, ver¨andert. Anschließend wird das

MapOverlay, welches die Grafiken f¨ur die POIs und Events darstellt, und die

Anzeige des Datums aktualisiert.

Somit ist sichergestellt, dass die Anzeige der Events bei jeder ¨Anderung

der SeekBar neu gezeichnet wird. Außerdem kann der Benutzer nun an einem beliebigen Punkt der SeekBar mit dem Scrollen starten und beliebig nach rechts oder links scrollen.

Um dann diese DateSeekBar auf der Kartenansicht darzustellen bedarf es einer Anpassung der Layout-XML-Datei der Kartenansicht. Mittels dieser Datei wird das Layout der einzelnen Activities von Android festgelegt. Die Anpassung des Layouts ist in Listing 3 dargestellt.

Listing 3: XML-Layout der Kartenansicht

1 ... 2 < de . u n i k o b l e n z . i s w e b . c s x p o i . I n t e r a c t i v e M a p V i e w 3 a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t " 4 a n d r o i d : l a y o u t _ h e i g h t =" f i l l _ p a r e n t " 5 a n d r o i d : e n a b l e d =" t r u e " 6 a n d r o i d : c l i c k a b l e =" t r u e " 7 a n d r o i d : i d =" @ + id / m a p _ v i e w " 8 a n d r o i d : a p i K e y =" 09 V 5 9 5 d I G r G S M P c 2 u b o - b q H 3 g v O o x q 0 t k E v F R O w "/ > 10 < R e l a t i v e L a y o u t x m l n s : a n d r o i d =

11 " h t t p : // s c h e m a s . a n d r o i d . com / apk / res / a n d r o i d "

12 a n d r o i d : o r i e n t a t i o n =" v e r t i c a l " 13 a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t " 14 a n d r o i d : l a y o u t _ h e i g h t =" w r a p _ c o n t e n t " 15 a n d r o i d : b a c k g r o u n d =" @ a n d r o i d : c o l o r / t r a n s p a r e n t " 16 a n d r o i d : p a d d i n g =" 5 px "> 17 < R e l a t i v e L a y o u t 18 a n d r o i d : o r i e n t a t i o n =" h o r i z o n t a l " 19 a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t " 20 a n d r o i d : l a y o u t _ h e i g h t =" w r a p _ c o n t e n t " 21 a n d r o i d : l a y o u t _ a l i g n P a r e n t T o p =" t r u e "> 22 < B u t t o n 23 a n d r o i d : i d =" @ + id / t e x t D a t e " 24 a n d r o i d : g r a v i t y =" c e n t e r _ h o r i z o n t a l " 25 a n d r o i d : l a y o u t _ w i d t h =" w r a p _ c o n t e n t " 26 a n d r o i d : l a y o u t _ h e i g h t =" w r a p _ c o n t e n t " 27 a n d r o i d : t e x t C o l o r =" @ a n d r o i d : c o l o r / b l a c k " 28 a n d r o i d : t e x t S i z e =" 9 pt " 29 a n d r o i d : l a y o u t _ a l i g n P a r e n t L e f t =" t r u e "/ > 30 < de . u n i k o b l e n z . i s w e b . c s x p o i . H e l p B u t t o n 31 a n d r o i d : i d =" @ + id / h e l p B u t t o n " 32 a n d r o i d : g r a v i t y =" c e n t e r _ h o r i z o n t a l " 33 a n d r o i d : l a y o u t _ w i d t h =" w r a p _ c o n t e n t " 34 a n d r o i d : l a y o u t _ h e i g h t =" w r a p _ c o n t e n t " 35 a n d r o i d : l a y o u t _ a l i g n P a r e n t R i g h t =" t r u e " 36 a n d r o i d : v i s i b i l i t y =" i n v i s i b l e "/ > 37 < / R e l a t i v e L a y o u t > 38 < S e e k B a r 39 a n d r o i d : i d =" @ + id / p l a c e h o l d e r S e e k b a r " 40 a n d r o i d : l a y o u t _ w i d t h =" w r a p _ c o n t e n t "

(33)

6 IMPLEMENTIERUNG 28 41 a n d r o i d : l a y o u t _ h e i g h t =" 40 px " 42 a n d r o i d : l a y o u t _ a l i g n P a r e n t B o t t o m =" t r u e "/ > 43 < de . u n i k o b l e n z . i s w e b . c s x p o i . D a t e S e e k B a r 44 a n d r o i d : i d =" @ + id / d a t e S e e k b a r " 45 a n d r o i d : l a y o u t _ w i d t h =" f i l l _ p a r e n t " 46 a n d r o i d : l a y o u t _ h e i g h t =" 45 px " 47 a n d r o i d : p a d d i n g T o p =" 5 px " 48 a n d r o i d : p a d d i n g B o t t o m =" 10 px " 49 a n d r o i d : m a x =" 20 " 50 a n d r o i d : p r o g r e s s =" 0 " 51 a n d r o i d : l a y o u t _ a b o v e =" @ + id / p l a c e h o l d e r S e e k b a r "/ > 52 < / R e l a t i v e L a y o u t > 53 ...

Die MapView kann um maximal ein Child-Element erweitert werden, so

dass als Child-Element ein RelativeLayout9 verwendet wird, welches die

wei-teren Bestandteile kapselt. Dies sind ein weiteres RelativeLayout-Element, welches am oberen Rand angeordnet ist (android:layout_alignParentTop= "true"). Dieses beinhaltet den Button, der das Datum anzeigt und einen

Button, der Informationen f¨ur den Benutzer bereit h¨alt. Anschließend folgt

ein SeekBar-Element, welches am unteren Rand angeordnet ist (android:

layout_alignParentBottom="true") und¨uber diesem befindet sich die

Da-teSeekBar. Die SeekBar, die am unteren Ende platziert ist, ist nur ein Platz-halter und wird in der Anwendung auf nicht sichtbar gestellt. Denn am unte-ren Ende der Karte befinden sich die Buttons zum Zoomen der Karte. Damit

diese nicht von der DateSeekBar ¨uberlagert werden, wurde dieser Platzhalter

hinzugef¨ugt.

9

http://developer.android.com/reference/android/widget/RelativeLayout. html

(34)

6 IMPLEMENTIERUNG 29

6.3

Anzeige der Events

Nachdem nun die Infrastruktur in Kapitel 6.1 um Events erweitert wurde

und in Kapitel 6.2 die M¨oglichkeit geschaffen wurde, auf der Kartenansicht

ein Datum einzustellen, sollen Events nun auch entsprechend auf der Karte dargestellt werden.

Eines der Anforderungen lautete, dass die Events sich auf der Karte von

POIs unterscheiden sollen. Dies wird so umgesetzt, dass f¨ur Events ein

an-deres OverlayItem10 auf der Karte dargestellt wird. Die Grafiken der POIs

und Events, die auf der Karte angezeigt werden, sind in einem

Itemized-Overlay11 zusammengefasst. Dieses organisiert das Anordnen, Sortieren und

Zeichnen der hinzugef¨ugten OverlayItems. Das entsprechende OverlayItem

erzeugt jedoch jeder einzelne PoiWrapper f¨ur sich.

Dies wurde nun ausgenutzt, um das ItemizedOverlay (fast) unangetastet zu lassen und nur die getOverlayItem-Methode der PoiWrapper-Klasse an-zupassen (siehe Listing 4).

Listing 4: getOverlayItem() der PoiWrapper-Klasse

1 /* *

2 * G e t s a map o v e r l a y i t e m r e p r e s e n t i n g the POI or the e v e n t .

3 *

4 * @ r e t u r n a map o v e r l a y i t e m r e p r e s e n t i n g the POI

5 */ 6 p u b l i c O v e r l a y I t e m g e t O v e r l a y I t e m () { 7 if (t h i s. i s E v e n t ()) { 8 r e t u r n new E v e n t O v e r l a y I t e m (new G e o P o i n t ( 9 (int) ( m L a t i t u d e C o n s t a n t s . M D _ F A C T O R ) , 10 (int) ( m L o n g i t u d e C o n s t a n t s . M D _ F A C T O R )) , mName , n u l l); 11 } e l s e { 12 r e t u r n new P o i O v e r l a y I t e m (new G e o P o i n t ( 13 (int) ( m L a t i t u d e C o n s t a n t s . M D _ F A C T O R ) , 14 (int) ( m L o n g i t u d e C o n s t a n t s . M D _ F A C T O R )) , mName , n u l l); 15 } 16 }

Die Methode getOverlayItem() liefert ein EventOverlayItem zur¨uck, falls

die aktuelle PoiWrapper-Instanz ein Start- oder ein Endzeitpunkt hat, also einen Event darstellt. Falls dies nicht der Fall ist, wird ein PoiOverlayItem –

wie bisher – zur¨uckgegeben. POIs werden auf der Karte als gelbe, konstante

Sterne angezeigt. Dagegen wird f¨ur Events eins von elf m¨oglichen

Stern-Symbolen dargestellt. Und zwar wird je nach Distanz des Event-Startdatums

zum gerade eingestellten Datum die Tranzparenz des Symbols ver¨andert.

Daf¨ur gibt es zehn verschiedene Abstufungen – von komplett opak bis zu

10 http://code.google.com/intl/de-DE/android/add-ons/google-apis/ reference/com/google/android/maps/OverlayItem.html 11 http://code.google.com/intl/de-DE/android/add-ons/google-apis/ reference/com/google/android/maps/ItemizedOverlay.html

(35)

6 IMPLEMENTIERUNG 30

Abbildung 12: Abstufungen der Event-Symbole nach Zeit

komplett transparent (siehe Abbildung 12). Findet ein Event jedoch gerade statt, liegt also das Startdatum vor dem aktuellen Datum und das Enddatum

danach, wird ein besonderer Marker f¨ur diesen Event dargestellt: ein Stern

mit einem Verlauf von Blau zu Rot.

Die Klasse EventOverlayItem berechnet die Differenz zwischen den bei-den java.util.Calendar-Instanzen: das mit dem Zeitauswahl-Widget aktuelle Datum und das Startdatum des Events. Anhand der Differenz wird dann das passende Symbol ausgesucht und als Marker gesetzt. Wenn nun das Start-Datum vor dem aktuellen Start-Datum liegt, aber das Enddatum noch nach dem Datum liegt, wird der Event mit einem opaken Stern, der einen Verlauf von Blau zu Rot beinhaltet, dargestellt. Wichtig hierbei anzumerken ist, dass im Listing 5 auch das Flag mActive gesetzt wird. Dieses Flag gibt an, ob ein

OverlayItem auf der Karte angeklickt werden kann. Dies soll n¨amlich nicht

der Fall sein, wenn ein Event entweder vor oder mehr als eine bestimmte An-zahl von Tagen nach dem aktuellen Datum startet. Ist dies der Fall, wird der Alpha-Wert auf 0 gesetzt und das Flag mActive auf false. Somit wird es nicht

angezeigt und beim Klicken auf der Karte nicht ber¨ucksichtigt. Somit kann

nun ein Datum mittels des Zeitauswahl-Widgets ausgew¨ahlt werden und die

(36)

6 IMPLEMENTIERUNG 31 Listing 5: EventOverlayItem-Klasse 1 p u b l i c c l a s s E v e n t O v e r l a y I t e m e x t e n d s O v e r l a y I t e m { 2 p u b l i c E v e n t O v e r l a y I t e m ( G e o P o i n t point , S t r i n g title , S t r i n g s n i p p e t ) { 3 s u p e r( point , title , s n i p p e t ); 4 C a l e n d a r cal = ( C a l e n d a r ) C s x P o i A c t i v i t y . m C a l . c l o n e (); 5 C a l e n d a r p o i S t a r t C a l = H e l p e r s . g e t C a l e n d a r O f I s o S t r i n g ( m S t a r t D a t e );

6 int d e l t a S t a r t D a y s = (int) H e l p e r s . d a y s B e t w e e n ( cal , p o i S t a r t C a l );

7 D r a w a b l e m a r k e r = n u l l;

8 // e v e n t s t a r t d a t e is a f t e r the c u r r e n t set d a t e and l e s s t h e n

9 // D E L T A _ D A Y S off 10 if ( d e l t a S t a r t D a y s != -1 && d e l t a D a y s < C o n s t a n t s . D E L T A _ D A Y S ) { 11 int s t a r I n d e x = (int) M a t h . f l o o r ( d e l t a D a y s * 10 / 3 0 ) ; 12 s w i t c h ( s t a r I n d e x ) { 13 c a s e 0: 14 m a r k e r = ( D r a w a b l e ) I n t e r a c t i v e M a p V i e w . g e t M a p C o n t e x t () 15 . g e t R e s o u r c e s (). g e t D r a w a b l e ( R . d r a w a b l e . b t n _ s t a r _ 0 ); 16 b r e a k; 17 ... 18 c a s e 9: 19 m a r k e r = ( D r a w a b l e ) I n t e r a c t i v e M a p V i e w . g e t M a p C o n t e x t () 20 . g e t R e s o u r c e s (). g e t D r a w a b l e ( R . d r a w a b l e . b t n _ s t a r _ 9 ); 21 b r e a k; 22 } 23 m A c t i v e = t r u e; 24 }

25 // s t a r t d a t e is b e f o r e the c u r r e n t set date , but the end d a t e is

26 // a f t e r the c u r r e n t date , so the e v e n t d o e s c u r r e n t l y o c c u r

27 e l s e if ( H e l p e r s . d a y s B e t w e e n ( cal , H e l p e r s 28 . g e t C a l e n d a r O f I s o S t r i n g ( m E n d D a t e )) != -1) { 29 m a r k e r = ( D r a w a b l e ) I n t e r a c t i v e M a p V i e w . g e t M a p C o n t e x t () 30 . g e t R e s o u r c e s (). g e t D r a w a b l e ( R . d r a w a b l e . b t n _ s t a r _ 0 ); 31 m A c t i v e = t r u e; 32 }

33 // s t a r t and end d a t e of the e v e n t are b e f o r e the c u r r e n t set date ,

34 // so don ’ t s h o w t h i s e v e n t 35 e l s e { 36 m a r k e r = ( D r a w a b l e ) I n t e r a c t i v e M a p V i e w . g e t M a p C o n t e x t () 37 . g e t R e s o u r c e s (). g e t D r a w a b l e ( R . d r a w a b l e . b t n _ c i r c l e ); 38 m a r k e r . s e t A l p h a ( 0 ) ; 39 m A c t i v e = f a l s e; 40 } 41 m a r k e r . s e t B o u n d s (0 , 0 , m a r k e r . g e t I n t r i n s i c H e i g h t () , m a r k e r 42 . g e t I n t r i n s i c W i d t h ( ) ) ; 43 t h i s. s e t M a r k e r ( m a r k e r ); 44 } 45 }

(37)

6 IMPLEMENTIERUNG 32

6.4

Grafische Benutzungsoberfl¨

ache

Um mit den Events zu interagieren muss auch die Benutzungsoberfl¨ache um

einige Teile erweitert werden. So muss es die M¨oglichkeit geben Events zu

erstellen, zu editieren und auch wieder zu l¨oschen. Außerdem soll es m¨oglich

sein, zu einem POI den Zeitaspekt hinzuzuf¨ugen und aber auch bei einem

Event diesen Zeitaspekt wieder zu entfernen.

Implementiert wurde dies gr¨oßtenteils durch Erweitern der vorhandenen

Activities und Views. Neu entwickelte Activities sind die DatePickerActivity und die DateTimePickerActivity, wobei hierbei nun exemplarisch die

Date-PickerActivity vorgestellt wird. Wie der Name schon suggeriert, erm¨oglicht

diese Activity das Ausw¨ahlen eines Datums. Dabei soll dies durch einen

mo-dalen Dialog geschehen, der ¨uber der aufrufenden Activity erscheint. Die

Implementierung des Widgets ist so realisiert, dass die aufrufende Activity das aktuelle Datum versendet und dies dann im DatePicker gesetzt wird. Bei einem Klick auf

”Save“ wird das aktuell eingestellte Datum an die aufrufende

Activity zur¨uckgesandt und dort aktualisiert. ¨Ahnlich l¨auft es bei der

Date-TimePickerActivity, nur dass hier noch die M¨oglichkeit zum Einstellen einer

Uhrzeit besteht.

Um den weiteren Anforderungen aus Kapitel 4.3 gerecht zu werden,

wur-den noch zus¨atzliche Ver¨anderungen an der Benutzungsoberfl¨ache vollzogen.

So sind Links im POI-Editor und im Ontology-Browser nun unterstrichen dargestellt. Die statische Methode getUnderlinedString der Helpers-Klasse

aus Listing 6 liefert ein SpannableString-Objekt12, welches im Android-Kontext

einen formatierten String darstellt, den man einfach als Text setzen kann (sie-he Listing 7).

Listing 6: Erstellen eines unterstrichenen String

1 p u b l i c s t a t i c S p a n n a b l e S t r i n g g e t U n d e r l i n e d S t r i n g ( S t r i n g t o U n d e r l i n e ) {

2 S p a n n a b l e S t r i n g str = S p a n n a b l e S t r i n g . v a l u e O f ( t o U n d e r l i n e );

3 str . s e t S p a n (new U n d e r l i n e S p a n () , 0 , t o U n d e r l i n e . l e n g t h () , 0);

4 r e t u r n str ;

5 }

Listing 7: Setzen des unterstrichenen Strings

1 c a t e g o r y I t e m V i e w . s e t T e x t ( H e l p e r s . g e t U n d e r l i n e d S t r i n g ( c a t e g o r y . g e t N a m e ( ) ) ) ;

Eine weitere Anforderung war, dass sich die csxPOI-Anwendung zum Bei-spiel beim Drehen des Bildschirms nicht neu synchronisiert und dann dabei

h¨angen bleibt. Dies geschah deswegen, weil das Android-Betriebssystem bei

bestimmten Systemereignissen die aktuelle Anwendung schließt und anschlie-ßend neu startet. Dadurch wurde die Anwendung beim Drehen des Bild-schirms neu gestartet und hat sich aufgehangen. Damit dies nicht mehr der

12

(38)

6 IMPLEMENTIERUNG 33

Fall ist kann man im Android Manifest festlegen, welche Systemereignisse das Betriebssystem und welche die Anwendung behandeln soll. Beim Drehen des Bildschirms soll die Anwendung nicht neu gestartet werden, so dass dieses Ereignis von der Anwendung behandelt werden kann. Dazu wurde nun die CsxPoiActivity im Android Manifest wie in Listing 8 erweitert.

Listing 8: Festlegen der selbst zu behandelnden Ereignisse

1 < a c t i v i t y a n d r o i d : n a m e =" . C s x P o i A c t i v i t y " a n d r o i d :l a b e l=" @ s t r i n g / a p p _ n a m e " a n d r o i d : c o n f i g C h a n g e s =" o r i e n t a t i o n | k e y b o a r d | k e y b o a r d H i d d e n ">

Nun behandelt die csxPOI-Anwendung das Wechseln der Orientierung

des Ger¨ats selber, wobei dabei aber einfach nichts unternommen wird. Somit

(39)

7 PROTOTYP 34

Abbildung 13: Hauptansicht (links), Popup zum W¨ahlen des Datums (rechts)

7

Prototyp

Nachdem nun das Konzept der Erweiterung und dessen Implementierung vorgestellt wurden, soll nun der bei der Arbeit erweiterte Prototyp vorgestellt

werden. Dabei geht es darum, einen ¨Uberblick ¨uber die neuen Funktionen und

deren Umsetzung zu bekommen.

7.1

Zeitauswahl-Widget

Nach dem Starten der csxPOI-Anwendung sieht der Anwender die Karte als Hauptansicht (siehe Abbildung 13 links). Auf dem Button in der linken obe-ren Ecke ist das aktuelle Datum dargestellt. Events vor dem Datum oder mehr als 30 Tage nach diesem Datum werden auf der Karte nicht angezeigt. Die Darstellung des aktuellen Datums ist deswegen auf einem Button

dar-gestellt, damit es f¨ur den Benutzer klar wird, dass er auch auf das Datum

klicken kann. Durch einen Klick darauf ¨offnet sich ein Fenster um das Datum

einzustellen (siehe Abbildung 13 rechts). Dies stellt eine weitere M¨oglichkeit

dar, das Datum einzustellen und aber auch einfach zum heutigen Datum

zur¨uckzukehren. Wenn der Anwender das Datum um ein Jahr in die Zukunft

verschieben m¨ochte, m¨usste er auf dem Zeitauswahl-Widget sehr oft

(40)

7 PROTOTYP 35

Abbildung 14: Erstellen eines Events (links), Ge¨andertes Datum (rechts)

Bedienung und Umsetzung des Zeitauswahl-Widgets wurde schon in Kapitel 5.2 hinreichend beschrieben. Damit kann der Benutzer mit einem Finger das

Datum ver¨andern und gleichzeitig die sich aktualisierenden Events auf der

Karte betrachten.

7.2

Events anlegen und editieren

Um einen Event, respektive POI mit Zeitangabe, anzulegen tippt der

Benut-zer im Hauptmen¨u der Anwendung auf die Schaltfl¨ache

”Create POI“. Diese

Bezeichnung ist darauf zur¨uckzuf¨uhren, dass im mobilen Kontext nach wie

vor der Ort die dominante Rolle einnimmt. Außerdem gibt es f¨ur den

Anwen-der keine Einf¨uhrung von Events, sondern die Einf¨uhrung von Zeitaspekten

f¨ur Points of Interest. Somit ist die Bezeichnung der Schaltfl¨ache weiterhin

angebracht und sollte beim Anwender nicht f¨ur Verwirrung sorgen.

Wenn der Benutzer nun auf

”Create POI“ getippt hat, ¨offnet sich das

bisherige Fenster zum Anlegen eines POIs. Man kann hier nun einen Namen und Kategorien angeben. Nach einen Klick auf

”with date / time“ bietet sich

dem Benutzer ein ¨ahnliches Bild wie in Abbildung 14 links. Das Startdatum

ist vorausgef¨ullt mit dem aktuellen Datum und Uhrzeit und das Enddatum

24 Stunden sp¨ater. In dem Beispiel aus der Abbildung m¨ochten wir eine

Referenzen

ÄHNLICHE DOKUMENTE

Damit der Windmesser nicht wegfliegen kann, wenn du misst, klebe noch etwas Knete in den Innenraum.. Wenn du gehst, kannst du sehen, wie weit die beiden (im Bild sind sie

 Schreibe eine Geschichte über einen Sturm. Suche dir aus den Wörtern hier oben 5 aus und unterstreiche

Oft wird das Eiskorn mehrere Male hochgewirbelt, und jedes Mal lagert sich ein neuer Wassertropfen an.. Mehrere Eisschichten wickeln sich also um den

Keine Schneeflocke gleicht der anderen – eines haben sie jedoch alle gemeinsam: sie sehen alle aus wie 6

Da sich einzelne Tröpfchen zu größeren Tröpfchen verbinden, werden sie schwerer und können nicht mehr in der Luft schweben.. 4 Die Tropfen fallen schließlich als Regen

aus dem Wassertropfen steigen viele winzige Wasserteilchen in die _________, die so klein sind, dass wir sie nicht mehr sehen können. Je höher die Wasserteilchen aufsteigen,

aus dem Wassertropfen steigen viele winzige Wasserteilchen in die Luft, die so klein sind, dass wir sie nicht mehr sehen können.. Je höher die Wasserteilchen aufsteigen, umso

Bank Kanne Klammer knausern Kuh Bild Karte klammern Knete Kuss Birke Kastanie Klasse knuffen lenken blank Kasten kleben Koffer Lenkrad blinken kauen Kleid Krokodil