Nærmeste færdig

Bare en kort opfølgning: det er med i næste opdatering at man får vist de nærmeste transportformer først når man søger på ruter. Her er hvordan rækkefølgen er i Kastrup, Aarhus C, Frederikshavn og Ystad:

Nærheden mellemregninger

Jeg blev færdig med koden til at kunne finde hvilke trafikselskaber og transportformer der er i nærheden i sidste uge. Jeg mangler stadig at binde det ind i brugergrænsefladen, det gør jeg i dag, men nu er funktionaliteten der i hvert fald sådan at hvis man giver et punkt og en radius kan man få en liste tilbage af hvilke trafikselskaber og transportformer er der i det område. De er sorteret efter omtrent afstand hvor omtrent betyder i værste tilfælde op til +/- 10 km.

For at checke om resultaterne ser rimelige ud har jeg prøvet lidt forskellige steder rundt i Danmark og er blevet overrasket et par gange. Her er et par eksempler.

Aakirkeby:
$ atb query_grid --type agencies --radius 50 55.070895 14.920060
+----+---------+------------------+
| id | dist_km | name             |
+----+---------+------------------+
| 0  | 0       | Bornholms Trafik |
| 28 | 0       | Rute700          |
| 9  | 15      | Mols-Linien      |
+----+---------+------------------+
$ atb query_grid --type route_types --radius 50 55.070895 14.920060
+----+---------+-------+
| id | dist_km | name  |
+----+---------+-------+
| 3  | 0       | BUS   |
| 4  | 15      | FERRY |
+----+---------+-------+
Mols-Linien på Bornholm? Det viser sig at den er god nok -- Rønne-Ystad er teknisk set Mols-Linien.

Skagen:
$ atb query_grid --type agencies --radius 50 57.724226 10.598802
+----+---------+------+
| id | dist_km | name |
+----+---------+------+
| 3  | 0       | NT   |
+----+---------+------+
$ atb query_grid --type route_types --radius 50 57.724226 10.598802
+----+---------+-------+
| id | dist_km | name  |
+----+---------+-------+
| 2  | 0       | TRAIN |
| 3  | 0       | BUS   |
| 4  | 35.3553 | FERRY |
+----+---------+-------+
Kun et trafikselskab men tre transportformer? Den er osse god nok, NT har både busser, tog, og færger.

Aarhus C:
$ atb query_grid --type agencies --radius 50 56.154194 10.214894
+----+---------+-------------+
| id | dist_km | name        |
+----+---------+-------------+
| 1  | 0       | DSB         |
| 3  | 0       | NT          |
| 7  | 0       | Midttrafik  |
| 10 | 0       | Arriva tog  |
| 6  | 29.1548 | Rejseplanen |
| 25 | 32.0156 | Samsø Bus   |
| 19 | 50      | Sydtrafik   |
+----+---------+-------------+
$ atb query_grid --type route_types --radius 50 56.154194 10.214894
+----+---------+-------+
| id | dist_km | name  |
+----+---------+-------+
| 2  | 0       | TRAIN |
| 3  | 0       | BUS   |
| 5  | 0       | TRAM  |
| 4  | 29.1548 | FERRY |
+----+---------+-------+
Ikke de store overraskelser der andet måske end at Samsø er tættere på Århus i lige linje end jeg ville have troet -- kun 30 km.

Frederiksberg:
$ atb query_grid --type agencies --radius 50 55.673477 12.521350
+----+---------+-------------------------------+
| id | dist_km | name                          |
+----+---------+-------------------------------+
| 1  | 0       | DSB                           |
| 4  | 0       | Movia                         |
| 13 | 0       | DSB S-tog                     |
| 14 | 0       | Metroselskabet                |
| 28 | 5       | Rute700                       |
| 17 | 5       | Gråhundbus                    |
| 12 | 10      | Movia                         |
| 23 | 28.2843 | Öresundståg                   |
| 22 | 40.3113 | Sporvejsmuseet Skjoldenæsholm |
| 6  | 41.2311 | Rejseplanen                   |
+----+---------+-------------------------------+
$ atb query_grid --type route_types --radius 50 55.673477 12.521350
+----+---------+---------+
| id | dist_km | name    |
+----+---------+---------+
| 1  | 0       | METRO   |
| 2  | 0       | TRAIN   |
| 3  | 0       | BUS     |
| 6  | 0       | S_TRAIN |
| 4  | 5       | FERRY   |
+----+---------+---------+ 

Nærheden

Denne uge har jeg arbejdet på at gøre A til B nemmere at bruge for blinde. Det lyder måske langhåret men jeg fik en masse feedback sidste uge jeg går ud fra og det der skal laves om er ikke så omfattende som jeg havde frygtet. Det der er langhåret ved det er at selv hvis du ved hvordan du gerne vil have din app til at fungere er TalkBack på android uhyggeligt tungt at danse med.

Som en afveksling når jeg bliver frustreret er jeg begyndt at arbejde på noget jeg længe gerne har villet lave. Der er flere steder jeg viser lister af ting hvor det der er relevant afhænger af hvor du befinder dig i landet. F.eks transportformer: hvis du er i København er det typisk relevant at se metro, det er det ikke hvis du er i Århus. Tilsvarende er det typisk relevant at se letbanen hvis du er i Århus men ikke i København. Tilsvarende med trafikselskaber: hvis du er i Aalborg er det typisk mere relevant at se NT end Fynbus. Og så videre. Så jeg vil gerne kunne ordne listerne baseret på hvor du er.

For at kunne det har jeg brug for at vide hvad der er relevant forskellige steder i landet og kunne slå op, givet et bestemt sted brugeren befinder sig: hvad er relevant lige her. Min løsning er i store træk at lave nogle små, meget grove, kort som giver hvad der findes forskellige steder. Her er kortene for hvilke transportformer der findes, der er et for hver type:

De er, i rækkefølge, metro, tog, bus, færge, letbane, og s-tog. Tilsvarende gemmer jeg kort der giver hvilke trafikselskaber der er i hvilke dele af landet, her er et udsnit:

De er Samsø Bus, Arriva, Sydtrafik, DSB, og Movia.

Hvis jeg kan finde ud af at få det til at spille i forhold til at bede om den nuværende position (det er altid langhåret på grund af tilladelser og den slags) vil transportformer blive vist i rækkefølge i forhold til hvor man befinder sig. Trafikselskaberne bliver ikke brugt endnu men det kommer på længere sigt.

Klynger af stop

I forbindelse med at jeg har arbejdet på at finde naboerne til et stop har jeg osse indført noget der hedder "klynger" af stop. En klynge er nogle stop i nærheden af hinanden der hedder det samme. Det er næsten altid par af stop, et på hver side af vejen, men ikke altid. Den største klynge er Slagelse St. (Ndr.Stationsvej) hvor der er 17 stop lige ved siden af hinanden der alle hedder det samme:

Problemet før var at når man søgte efter et stop fik man ofte flere og fordi de hedder det samme er det ikke til at hitte ud af hvilket der er det rigtige. Efter den næste opdatering bliver stop i den samme klynge ikke vist individuelt men kun en gang. Her er et eksempel på før og efter:

Det burde gøre det lidt nemmere at finde det man leder efter.

Naboer

Jeg er gået i gang med at lave nogle nye funktioner i app'en. En stor del af arbejdet handler ikke om at tilføje noget som sådan men at få de funktioner der allerede er der til at virke mere hensigtsmæssigt. Men der er osse nogle nye ting man kommer til at kunne.

En ting jeg allerede har arbejdet med men som fortjener at blive gjort endnu bedre er at tage med i betragtning når man kan gå mellem stop. Lige nu er app'en ret striks omkring hvilket stop mener og kigger ikke altid på stop i nærheden. Det er jeg i gang med at gøre den lidt mere afslappet omkring.

For at kunne gøre det har app'en brug for at vide hvilke stop der er i nærheden af hinanden. Jeg kalder det at stoppene er naboer. Til det jeg skal lave er det nyttigt at vide for et givet stop, hvilke andre stop er der indenfor sådan rimelig gå afstand. Lige nu bruger jeg 1,25 km som radius – det er det man kan gå på et kvarter hvis man går 5 km/t. Der er i omegnen af 30.000 stop i Danmark og mange af dem, specielt inde i byerne, har mange naboer indenfor 1,25 km. Rekorden er Sankt Markus Allé & Vodroffsvej på Frederiksberg der har 149 andre stop indenfor 1,25 km. I alt er der 4,7 millioner "naboskaber", altså par af stop der er naboer. Jeg vil gerne gemme listen af naboer for hvert stop som en del af app'en for den er ret tung at beregne men 4,7 millioner er alt for meget – det ville fylde mere end hele resten af køreplanerne. Det jeg har arbejdet på denne uge er at løse det problem: hvordan gemmer jeg naboskaberne mellem stop uden at det fylder for meget.

Den løsning jeg er endt med at lave udnytter at når stop er i nærheden af hinanden har de gerne de samme andre stop som naboer. Det kan godt være Sankt Markus Allé & Vodroffsvej har 149 naboer og Danas Plads har 144 men fordi de ligger lige klods op og ned af hinanden er langt de fleste af de naboer de samme for de to. Måske 130 af dem er naboer til begge stop. Hvis jeg gemte en særskilt liste af naboer for hver af de to stop ville der være 293 i alt (149 + 144) men hvis jeg laver en liste med de 130 naboer de har til fælles og deler den mellem de to fylder det kun 163 tal (130 + 19 + 14). 19 er det antal stop Sankt Markus Allé & Vodroffsvej har ud over de 130 de begge har og 14 er det samme for Danas Plads. Det er en pladsbesparelse på næsten 50%.

Det har krævet lidt snilde at få til at virke og specielt at få systemet til selv at kunne genkende hvornår det er en god ide at dele naboer mellem flere stop. Men nu fungerer det og sparer så meget plads at det er realistisk at gemme nabo-listerne sammen med køreplanerne. Stoppet lige udenfor mit kontor bruger f.eks 3 delte nabo-lister som andre stop i nærheden osse henviser til.

Hvert screenshot viser en af de delte lister. De mørke stop er dem der indgår i listen, de lyse er andre stop der henviser til den liste. Her er et andet eksempel, det er et tilfældigt stop i Roskilde der osse bruger 3 delte nabo-lister

Meget af tiden når jeg arbejder på algoritmer går det op i meget abstrakte begreber: tal, afstande, afbildninger, scorings-funktioner, osv, ting der når jeg arbejder med dem ligger fjernt fra det praktiske problem jeg er i gang med at løse. Men når det så virker er det virkelig interessant at tage de løsninger algoritmen finder på og kigge på dem på et kort. Jeg kan ikke forklare præcis hvorfor der er tre delte nabo-lister lige der i Roskilde men det ser da meget fornuftigt ud.