diff --git a/labs/data/tramnetwork.json b/labs/data/tramnetwork.json new file mode 100644 index 0000000..b18b386 --- /dev/null +++ b/labs/data/tramnetwork.json @@ -0,0 +1 @@ +{"stops": {"\u00d6stra Sjukhuset": {"lat": "57.7224618", "lon": "12.0478166"}, "Tingvallsv\u00e4gen": {"lat": "57.7246437", "lon": "12.0420754"}, "Kaggeledstorget": {"lat": "57.7229358", "lon": "12.0332892"}, "\u00c4tteh\u00f6gsgatan": {"lat": "57.7200477", "lon": "12.0285376"}, "Munkeb\u00e4ckstorget": {"lat": "57.7185656", "lon": "12.0263524"}, "H\u00e4rlanda": {"lat": "57.7181065", "lon": "12.0194426"}, "Stockholmsgatan": {"lat": "57.7170564", "lon": "12.0136038"}, "Redbergsplatsen": {"lat": "57.716275", "lon": "12.004907"}, "Olskrokstorget": {"lat": "57.7146209", "lon": "11.9987871"}, "Svingeln": {"lat": "57.713358", "lon": "11.9917409"}, "Ullevi Norra": {"lat": "57.7081152", "lon": "11.9861639"}, "Centralstationen": {"lat": "57.7077849", "lon": "11.9734427"}, "Brunnsparken": {"lat": "57.7065955", "lon": "11.9689358"}, "Stenpiren": {"lat": "57.7056512", "lon": "11.9574172"}, "J\u00e4rntorget": {"lat": "57.6999652", "lon": "11.952972"}, "Prinsgatan": {"lat": "57.6964754", "lon": "11.9513521"}, "Olivedalsgatan": {"lat": "57.6918865", "lon": "11.9536831"}, "Linn\u00e9platsen": {"lat": "57.689966", "lon": "11.9520518"}, "Botaniska Tr\u00e4dg\u00e5rden": {"lat": "57.6812619", "lon": "11.9455821"}, "Marklandsgatan": {"lat": "57.673267", "lon": "11.9353621"}, "Axel Dahlstr\u00f6ms Torg": {"lat": "57.672288", "lon": "11.9275696"}, "Lantmilsgatan": {"lat": "57.6668601", "lon": "11.924836"}, "Nymilsgatan": {"lat": "57.6624705", "lon": "11.9250789"}, "Musikv\u00e4gen": {"lat": "57.6590769", "lon": "11.9206117"}, "Positivgatan": {"lat": "57.6566374", "lon": "11.9175191"}, "Fr\u00f6lunda Torg Sp\u00e5rvagn": {"lat": "57.6527643", "lon": "11.9116376"}, "Briljantgatan": {"lat": "57.6486393", "lon": "11.9035069"}, "Smaragdgatan": {"lat": "57.6454509", "lon": "11.8993694"}, "Opaltorget": {"lat": "57.6423342", "lon": "11.9010554"}, "M\u00f6lndals Innerstad": {"lat": "57.655591400000006", "lon": "12.01855524009189"}, "M\u00f6lndals sjukhus": {"lat": "57.6614548", "lon": "12.0136632"}, "Lackareb\u00e4ck": {"lat": "57.6663479", "lon": "12.0114421"}, "Kroksl\u00e4tts Fabriker": {"lat": "57.6717887", "lon": "12.0100249"}, "Kroksl\u00e4tts torg": {"lat": "57.6753924", "lon": "12.0078652"}, "Lana": {"lat": "57.678333", "lon": "12.0041666"}, "Varbergsgatan": {"lat": "57.6795297", "lon": "12.003115"}, "Elisedal": {"lat": "57.6834394", "lon": "12.0004416"}, "Almedal": {"lat": "57.6867844", "lon": "11.9974967"}, "Liseberg S\u00f6dra": {"lat": "57.6945173", "lon": "11.993695420809985"}, "Korsv\u00e4gen": {"lat": "57.6968295", "lon": "11.9868341"}, "Scandinavium": {"lat": "57.7006276", "lon": "11.9858582"}, "Ullevi S\u00f6dra": {"lat": "57.7039541", "lon": "11.9850022"}, "Domkyrkan": {"lat": "57.7042356", "lon": "11.9636653"}, "Gr\u00f6nsakstorget": {"lat": "57.7025866", "lon": "11.9639739"}, "Vasaplatsen": {"lat": "57.6989398", "lon": "11.9705111"}, "Vasa Viktoriagatan": {"lat": "57.6985634", "lon": "11.9653312"}, "Handelsh\u00f6gskolan": {"lat": "57.6965303", "lon": "11.9625825"}, "Brunnsgatan": {"lat": "57.6936796", "lon": "11.9591759"}, "Seminariegatan": {"lat": "57.6920557", "lon": "11.9571828"}, "Bokekullsgatan": {"lat": "57.6771253", "lon": "11.9327977"}, "H\u00f6gsbogatan": {"lat": "57.6803596", "lon": "11.9301317"}, "Klintens V\u00e4g": {"lat": "57.6824461", "lon": "11.9279843"}, "Godhemsgatan": {"lat": "57.6854379", "lon": "11.9264658"}, "Mariaplan": {"lat": "57.686497", "lon": "11.9202959"}, "Ostindiegatan": {"lat": "57.6876154", "lon": "11.9156284"}, "Vagnhallen Majorna": {"lat": "57.6891689", "lon": "11.9123386"}, "Jaegerdorffsplatsen": {"lat": "57.6914334", "lon": "11.9150447"}, "Chapmans Torg": {"lat": "57.6944764", "lon": "11.9198652"}, "Kaptensgatan": {"lat": "57.6971583", "lon": "11.9276101"}, "Stigbergstorget": {"lat": "57.6990303", "lon": "11.9338896"}, "Masthuggstorget": {"lat": "57.6995343", "lon": "11.9447351"}, "Hagakyrkan": {"lat": "57.6996013", "lon": "11.9615964"}, "Valand": {"lat": "57.7004651", "lon": "11.9748851"}, "Kungsportsplatsen": {"lat": "57.7039668", "lon": "11.9697972"}, "Solrosgatan": {"lat": "57.7162733", "lon": "12.0250195"}, "Sanatoriegatan": {"lat": "57.7132161", "lon": "12.0240768"}, "Virginsgatan": {"lat": "57.7107812", "lon": "12.0235382"}, "Berzeliigatan": {"lat": "57.6983047", "lon": "11.9823431"}, "Gamlestads Torg": {"lat": "57.7279636", "lon": "12.0046485"}, "Hj\u00e4llbo": {"lat": "57.7692649", "lon": "12.0223749"}, "Hammarkullen": {"lat": "57.7800406", "lon": "12.0366009"}, "Stor\u00e5s": {"lat": "57.785139", "lon": "12.0462261"}, "Angered Centrum": {"lat": "57.7960687", "lon": "12.0495277"}, "Welandergatan": {"lat": "57.7060778", "lon": "12.0239345"}, "T\u00f6pelsgatan": {"lat": "57.7023397", "lon": "12.0221389"}, "B\u00f6gatan": {"lat": "57.700946", "lon": "12.0160087"}, "Ekmanska": {"lat": "57.6996668", "lon": "12.0096351"}, "B\u00e4ckeliden": {"lat": "57.6999206", "lon": "12.0033203"}, "Sankt Sigfrids Plan": {"lat": "57.6987301", "lon": "11.9994709"}, "Liseberg Station": {"lat": "57.6975588", "lon": "11.9942205"}, "Lilla Bommen": {"lat": "57.7092219", "lon": "11.9667699"}, "Frihamnen": {"lat": "57.7203255", "lon": "11.9600773"}, "Hjalmar Brantingsplatsen": {"lat": "57.7206077", "lon": "11.9522789"}, "V\u00e5gm\u00e4stareplatsen": {"lat": "57.720537", "lon": "11.9451746"}, "Wieselgrensplatsen": {"lat": "57.7205998", "lon": "11.9355948"}, "Rambergsvallen": {"lat": "57.719347", "lon": "11.9268104"}, "Gropeg\u00e5rdsgatan": {"lat": "57.7183037", "lon": "11.9191595"}, "Eketr\u00e4gatan": {"lat": "57.7164903", "lon": "11.9099118"}, "S\u00e4l\u00f6fjordsgatan": {"lat": "57.7136356", "lon": "11.9029025"}, "V\u00e5rv\u00e4derstorget": {"lat": "57.7129196", "lon": "11.8931411"}, "Mildv\u00e4dersgatan": {"lat": "57.7156823", "lon": "11.890926"}, "\u00d6nskev\u00e4dersgatan": {"lat": "57.7201505", "lon": "11.8930502"}, "Friskv\u00e4derstorget": {"lat": "57.7235673", "lon": "11.8931956"}, "V\u00e4derilsgatan": {"lat": "57.7265488", "lon": "11.8933485"}, "Temperaturgatan": {"lat": "57.732569", "lon": "11.8952913"}, "Varmfrontsgatan": {"lat": "57.7368776", "lon": "11.8966497"}, "Aprilgatan": {"lat": "57.7608913", "lon": "12.0409994"}, "Allhelgonakyrkan": {"lat": "57.7574065", "lon": "12.0374426"}, "Kortedala Torg": {"lat": "57.752779", "lon": "12.0330403"}, "Runstavsgatan": {"lat": "57.7479034", "lon": "12.0303082"}, "Nym\u00e5negatan": {"lat": "57.7427511", "lon": "12.0298737"}, "Bev\u00e4ringsgatan": {"lat": "57.7399617", "lon": "12.0286261"}, "Kviberg": {"lat": "57.7367053", "lon": "12.0265257"}, "Bellevue": {"lat": "57.7325237", "lon": "12.0246107"}, "SKF": {"lat": "57.7291018", "lon": "12.0132691"}, "Ejdergatan": {"lat": "57.7210222", "lon": "12.005952"}, "Chalmers": {"lat": "57.6900225", "lon": "11.9730927"}, "Wavrinskys Plats": {"lat": "57.6888028", "lon": "11.9684664"}, "Medicinaregatan": {"lat": "57.6855827", "lon": "11.9619508"}, "Sahlgrenska Huvudentr\u00e9": {"lat": "57.6836795", "lon": "11.9614653"}, "Nordstan": {"lat": "57.7086397", "lon": "11.969087498371342"}, "Komettorget": {"lat": "57.7511423", "lon": "12.0713114"}, "Rymdtorget Sp\u00e5rvagn": {"lat": "57.7558013", "lon": "12.0669195"}, "Teleskopgatan": {"lat": "57.7593", "lon": "12.0597894"}, "Galileis Gata": {"lat": "57.7605336", "lon": "12.051446"}, "Januarigatan": {"lat": "57.7602447", "lon": "12.0412135"}, "Kapellplatsen": {"lat": "57.6927713", "lon": "11.9735773"}, "Sannaplan": {"lat": "57.6842394", "lon": "11.9166553"}, "Sandarna": {"lat": "57.6827594", "lon": "11.9095056"}, "Kungssten": {"lat": "57.6805281", "lon": "11.9018248"}, "Doktor Sydows Gata": {"lat": "57.6793184", "lon": "11.9776909"}, "Doktor Fries Torg": {"lat": "57.6844804", "lon": "11.9726716"}, "Saltholmen": {"lat": "57.6606312", "lon": "11.8455002"}, "Roddf\u00f6reningen": {"lat": "57.6640011", "lon": "11.8516451"}, "L\u00e5ngedrag": {"lat": "57.6682375", "lon": "11.8535394"}, "Hinsholmen": {"lat": "57.6676904", "lon": "11.8610197"}, "K\u00e4ringberget": {"lat": "57.6692358", "lon": "11.8710883"}, "Tranered": {"lat": "57.6723198", "lon": "11.8793541"}, "Hagen": {"lat": "57.6748357", "lon": "11.8841485"}, "Nya Varvsall\u00e9n": {"lat": "57.6780065", "lon": "11.8950555"}, "Ekedal": {"lat": "57.6871315", "lon": "11.9290998"}, "Majvallen": {"lat": "57.6909343", "lon": "11.9354935"}, "Fj\u00e4llgatan": {"lat": "57.69443", "lon": "11.9362336"}}, "lines": {"1": ["\u00d6stra Sjukhuset", "Tingvallsv\u00e4gen", "Kaggeledstorget", "\u00c4tteh\u00f6gsgatan", "Munkeb\u00e4ckstorget", "H\u00e4rlanda", "Stockholmsgatan", "Redbergsplatsen", "Olskrokstorget", "Svingeln", "Ullevi Norra", "Centralstationen", "Brunnsparken", "Stenpiren", "J\u00e4rntorget", "Prinsgatan", "Olivedalsgatan", "Linn\u00e9platsen", "Botaniska Tr\u00e4dg\u00e5rden", "Marklandsgatan", "Axel Dahlstr\u00f6ms Torg", "Lantmilsgatan", "Nymilsgatan", "Musikv\u00e4gen", "Positivgatan", "Fr\u00f6lunda Torg Sp\u00e5rvagn", "Briljantgatan", "Smaragdgatan", "Opaltorget"], "2": ["M\u00f6lndals Innerstad", "M\u00f6lndals sjukhus", "Lackareb\u00e4ck", "Kroksl\u00e4tts Fabriker", "Kroksl\u00e4tts torg", "Lana", "Varbergsgatan", "Elisedal", "Almedal", "Liseberg S\u00f6dra", "Korsv\u00e4gen", "Scandinavium", "Ullevi S\u00f6dra", "Centralstationen", "Brunnsparken", "Domkyrkan", "Gr\u00f6nsakstorget", "Vasaplatsen", "Vasa Viktoriagatan", "Handelsh\u00f6gskolan", "Brunnsgatan", "Seminariegatan", "Olivedalsgatan", "Linn\u00e9platsen", "Botaniska Tr\u00e4dg\u00e5rden", "Marklandsgatan", "Axel Dahlstr\u00f6ms Torg"], "3": ["Marklandsgatan", "Bokekullsgatan", "H\u00f6gsbogatan", "Klintens V\u00e4g", "Godhemsgatan", "Mariaplan", "Ostindiegatan", "Vagnhallen Majorna", "Jaegerdorffsplatsen", "Chapmans Torg", "Kaptensgatan", "Stigbergstorget", "Masthuggstorget", "J\u00e4rntorget", "Hagakyrkan", "Vasa Viktoriagatan", "Vasaplatsen", "Valand", "Kungsportsplatsen", "Brunnsparken", "Centralstationen", "Ullevi Norra", "Svingeln", "Olskrokstorget", "Redbergsplatsen", "Stockholmsgatan", "H\u00e4rlanda", "Solrosgatan", "Sanatoriegatan", "Virginsgatan"], "4": ["M\u00f6lndals Innerstad", "M\u00f6lndals sjukhus", "Lackareb\u00e4ck", "Kroksl\u00e4tts Fabriker", "Kroksl\u00e4tts torg", "Lana", "Varbergsgatan", "Elisedal", "Almedal", "Liseberg S\u00f6dra", "Korsv\u00e4gen", "Berzeliigatan", "Valand", "Kungsportsplatsen", "Brunnsparken", "Centralstationen", "Gamlestads Torg", "Hj\u00e4llbo", "Hammarkullen", "Stor\u00e5s", "Angered Centrum"], "5": ["\u00d6stra Sjukhuset", "Tingvallsv\u00e4gen", "Kaggeledstorget", "\u00c4tteh\u00f6gsgatan", "Munkeb\u00e4ckstorget", "Solrosgatan", "Sanatoriegatan", "Virginsgatan", "Welandergatan", "T\u00f6pelsgatan", "B\u00f6gatan", "Ekmanska", "B\u00e4ckeliden", "Sankt Sigfrids Plan", "Liseberg Station", "Korsv\u00e4gen", "Berzeliigatan", "Valand", "Kungsportsplatsen", "Brunnsparken", "Lilla Bommen", "Frihamnen", "Hjalmar Brantingsplatsen", "V\u00e5gm\u00e4stareplatsen", "Wieselgrensplatsen", "Rambergsvallen", "Gropeg\u00e5rdsgatan", "Eketr\u00e4gatan", "S\u00e4l\u00f6fjordsgatan", "V\u00e5rv\u00e4derstorget", "Mildv\u00e4dersgatan", "\u00d6nskev\u00e4dersgatan", "Friskv\u00e4derstorget", "V\u00e4derilsgatan", "Temperaturgatan", "Varmfrontsgatan"], "6": ["Aprilgatan", "Allhelgonakyrkan", "Kortedala Torg", "Runstavsgatan", "Nym\u00e5negatan", "Bev\u00e4ringsgatan", "Kviberg", "Bellevue", "SKF", "Gamlestads Torg", "Ejdergatan", "Redbergsplatsen", "Olskrokstorget", "Svingeln", "Ullevi Norra", "Ullevi S\u00f6dra", "Scandinavium", "Korsv\u00e4gen", "Chalmers", "Wavrinskys Plats", "Medicinaregatan", "Sahlgrenska Huvudentr\u00e9", "Linn\u00e9platsen", "Olivedalsgatan", "Prinsgatan", "J\u00e4rntorget", "Hagakyrkan", "Gr\u00f6nsakstorget", "Domkyrkan", "Brunnsparken", "Nordstan", "Frihamnen", "Hjalmar Brantingsplatsen", "V\u00e5gm\u00e4stareplatsen", "Wieselgrensplatsen", "Rambergsvallen", "Gropeg\u00e5rdsgatan", "Eketr\u00e4gatan", "S\u00e4l\u00f6fjordsgatan", "V\u00e5rv\u00e4derstorget", "Mildv\u00e4dersgatan", "\u00d6nskev\u00e4dersgatan", "Friskv\u00e4derstorget", "V\u00e4derilsgatan", "Temperaturgatan", "Varmfrontsgatan"], "7": ["Komettorget", "Rymdtorget Sp\u00e5rvagn", "Teleskopgatan", "Galileis Gata", "Januarigatan", "Allhelgonakyrkan", "Kortedala Torg", "Runstavsgatan", "Nym\u00e5negatan", "Bev\u00e4ringsgatan", "Kviberg", "Bellevue", "SKF", "Gamlestads Torg", "Centralstationen", "Brunnsparken", "Kungsportsplatsen", "Valand", "Vasaplatsen", "Kapellplatsen", "Chalmers", "Wavrinskys Plats", "Medicinaregatan", "Sahlgrenska Huvudentr\u00e9", "Botaniska Tr\u00e4dg\u00e5rden", "Marklandsgatan", "Axel Dahlstr\u00f6ms Torg", "Lantmilsgatan", "Nymilsgatan", "Musikv\u00e4gen", "Positivgatan", "Fr\u00f6lunda Torg Sp\u00e5rvagn", "Briljantgatan", "Smaragdgatan", "Opaltorget"], "8": ["Angered Centrum", "Stor\u00e5s", "Hammarkullen", "Hj\u00e4llbo", "Gamlestads Torg", "Ejdergatan", "Redbergsplatsen", "Olskrokstorget", "Svingeln", "Ullevi Norra", "Ullevi S\u00f6dra", "Scandinavium", "Korsv\u00e4gen", "Chalmers", "Wavrinskys Plats", "Medicinaregatan", "Sahlgrenska Huvudentr\u00e9", "Botaniska Tr\u00e4dg\u00e5rden", "Marklandsgatan", "Axel Dahlstr\u00f6ms Torg", "Lantmilsgatan", "Nymilsgatan", "Musikv\u00e4gen", "Positivgatan", "Fr\u00f6lunda Torg Sp\u00e5rvagn"], "9": ["Angered Centrum", "Stor\u00e5s", "Hammarkullen", "Hj\u00e4llbo", "Gamlestads Torg", "Centralstationen", "Brunnsparken", "Stenpiren", "J\u00e4rntorget", "Masthuggstorget", "Stigbergstorget", "Kaptensgatan", "Chapmans Torg", "Jaegerdorffsplatsen", "Vagnhallen Majorna", "Ostindiegatan", "Sannaplan", "Sandarna", "Kungssten"], "10": ["Doktor Sydows Gata", "Doktor Fries Torg", "Wavrinskys Plats", "Chalmers", "Kapellplatsen", "Vasaplatsen", "Valand", "Kungsportsplatsen", "Brunnsparken", "Centralstationen", "Lilla Bommen", "Frihamnen", "Hjalmar Brantingsplatsen", "V\u00e5gm\u00e4stareplatsen", "Wieselgrensplatsen", "Rambergsvallen", "Gropeg\u00e5rdsgatan", "Eketr\u00e4gatan", "S\u00e4l\u00f6fjordsgatan", "V\u00e5rv\u00e4derstorget", "Mildv\u00e4dersgatan", "\u00d6nskev\u00e4dersgatan", "Friskv\u00e4derstorget", "V\u00e4derilsgatan"], "11": ["Saltholmen", "Roddf\u00f6reningen", "L\u00e5ngedrag", "Hinsholmen", "K\u00e4ringberget", "Tranered", "Hagen", "Nya Varvsall\u00e9n", "Kungssten", "Sandarna", "Sannaplan", "Mariaplan", "Godhemsgatan", "Ekedal", "Majvallen", "Fj\u00e4llgatan", "Stigbergstorget", "Masthuggstorget", "J\u00e4rntorget", "Hagakyrkan", "Gr\u00f6nsakstorget", "Domkyrkan", "Brunnsparken", "Centralstationen", "Gamlestads Torg", "SKF", "Bellevue", "Kviberg", "Bev\u00e4ringsgatan", "Nym\u00e5negatan", "Runstavsgatan", "Kortedala Torg", "Allhelgonakyrkan", "Januarigatan", "Galileis Gata", "Teleskopgatan", "Rymdtorget Sp\u00e5rvagn", "Komettorget"], "13": ["Saltholmen", "Roddf\u00f6reningen", "L\u00e5ngedrag", "Hinsholmen", "K\u00e4ringberget", "Tranered", "Hagen", "Nya Varvsall\u00e9n", "Kungssten", "Sandarna", "Sannaplan", "Mariaplan", "Marklandsgatan", "Botaniska Tr\u00e4dg\u00e5rden", "Sahlgrenska Huvudentr\u00e9", "Medicinaregatan", "Wavrinskys Plats", "Chalmers", "Korsv\u00e4gen", "Scandinavium", "Ullevi S\u00f6dra", "Centralstationen"]}, "times": {"\u00d6stra Sjukhuset": {"Tingvallsv\u00e4gen": 1}, "Tingvallsv\u00e4gen": {"Kaggeledstorget": 2}, "Kaggeledstorget": {"\u00c4tteh\u00f6gsgatan": 0}, "\u00c4tteh\u00f6gsgatan": {"Munkeb\u00e4ckstorget": 1}, "Munkeb\u00e4ckstorget": {"H\u00e4rlanda": 2, "Solrosgatan": 1}, "H\u00e4rlanda": {"Stockholmsgatan": 1, "Solrosgatan": 2}, "Stockholmsgatan": {"Redbergsplatsen": 2}, "Redbergsplatsen": {"Olskrokstorget": 1}, "Olskrokstorget": {"Svingeln": 2}, "Svingeln": {"Ullevi Norra": 2}, "Ullevi Norra": {"Centralstationen": 1, "Ullevi S\u00f6dra": 2}, "Centralstationen": {"Brunnsparken": 1, "Gamlestads Torg": 6, "Lilla Bommen": 1}, "Brunnsparken": {"Stenpiren": 1, "Domkyrkan": 1, "Lilla Bommen": 0, "Nordstan": 1}, "Stenpiren": {"J\u00e4rntorget": 2}, "J\u00e4rntorget": {"Prinsgatan": 1, "Hagakyrkan": 3}, "Prinsgatan": {"Olivedalsgatan": 2}, "Olivedalsgatan": {"Linn\u00e9platsen": 1}, "Linn\u00e9platsen": {"Botaniska Tr\u00e4dg\u00e5rden": 2}, "Botaniska Tr\u00e4dg\u00e5rden": {"Marklandsgatan": 3}, "Marklandsgatan": {"Axel Dahlstr\u00f6ms Torg": 1, "Bokekullsgatan": 1}, "Axel Dahlstr\u00f6ms Torg": {"Lantmilsgatan": 1}, "Lantmilsgatan": {"Nymilsgatan": 1}, "Nymilsgatan": {"Musikv\u00e4gen": 1}, "Musikv\u00e4gen": {"Positivgatan": 2}, "Positivgatan": {"Fr\u00f6lunda Torg Sp\u00e5rvagn": 1}, "Fr\u00f6lunda Torg Sp\u00e5rvagn": {"Briljantgatan": 2}, "Briljantgatan": {"Smaragdgatan": 1}, "Smaragdgatan": {"Opaltorget": 0}, "Opaltorget": {}, "M\u00f6lndals Innerstad": {"M\u00f6lndals sjukhus": 1}, "M\u00f6lndals sjukhus": {"Lackareb\u00e4ck": 2}, "Lackareb\u00e4ck": {"Kroksl\u00e4tts Fabriker": 1}, "Kroksl\u00e4tts Fabriker": {"Kroksl\u00e4tts torg": 1}, "Kroksl\u00e4tts torg": {"Lana": 1}, "Lana": {"Varbergsgatan": 1}, "Varbergsgatan": {"Elisedal": 1}, "Elisedal": {"Almedal": 1}, "Almedal": {"Liseberg S\u00f6dra": 2}, "Liseberg S\u00f6dra": {"Korsv\u00e4gen": 2}, "Korsv\u00e4gen": {"Scandinavium": 1, "Berzeliigatan": 1, "Chalmers": 3}, "Scandinavium": {"Ullevi S\u00f6dra": 2}, "Ullevi S\u00f6dra": {"Centralstationen": 3}, "Domkyrkan": {"Gr\u00f6nsakstorget": 1}, "Gr\u00f6nsakstorget": {"Vasaplatsen": 2}, "Vasaplatsen": {"Vasa Viktoriagatan": 1, "Valand": 1, "Kapellplatsen": 2}, "Vasa Viktoriagatan": {"Handelsh\u00f6gskolan": 1}, "Handelsh\u00f6gskolan": {"Brunnsgatan": 2}, "Brunnsgatan": {"Seminariegatan": 1}, "Seminariegatan": {"Olivedalsgatan": 1}, "Bokekullsgatan": {"H\u00f6gsbogatan": 1}, "H\u00f6gsbogatan": {"Klintens V\u00e4g": 2}, "Klintens V\u00e4g": {"Godhemsgatan": 1}, "Godhemsgatan": {"Mariaplan": 2, "Ekedal": 1}, "Mariaplan": {"Ostindiegatan": 1, "Marklandsgatan": 4}, "Ostindiegatan": {"Vagnhallen Majorna": 2, "Sannaplan": 1}, "Vagnhallen Majorna": {"Jaegerdorffsplatsen": 1}, "Jaegerdorffsplatsen": {"Chapmans Torg": 1}, "Chapmans Torg": {"Kaptensgatan": 2}, "Kaptensgatan": {"Stigbergstorget": 2}, "Stigbergstorget": {"Masthuggstorget": 2}, "Masthuggstorget": {"J\u00e4rntorget": 2}, "Hagakyrkan": {"Vasa Viktoriagatan": 1, "Gr\u00f6nsakstorget": 2}, "Valand": {"Kungsportsplatsen": 2}, "Kungsportsplatsen": {"Brunnsparken": 1}, "Solrosgatan": {"Sanatoriegatan": 1}, "Sanatoriegatan": {"Virginsgatan": 0}, "Virginsgatan": {"Welandergatan": 2}, "Berzeliigatan": {"Valand": 2}, "Gamlestads Torg": {"Hj\u00e4llbo": 1, "Ejdergatan": 2}, "Hj\u00e4llbo": {"Hammarkullen": 3}, "Hammarkullen": {"Stor\u00e5s": 1}, "Stor\u00e5s": {"Angered Centrum": 3}, "Angered Centrum": {}, "Welandergatan": {"T\u00f6pelsgatan": 1}, "T\u00f6pelsgatan": {"B\u00f6gatan": 1}, "B\u00f6gatan": {"Ekmanska": 1}, "Ekmanska": {"B\u00e4ckeliden": 1}, "B\u00e4ckeliden": {"Sankt Sigfrids Plan": 1}, "Sankt Sigfrids Plan": {"Liseberg Station": 1}, "Liseberg Station": {"Korsv\u00e4gen": 2}, "Lilla Bommen": {"Frihamnen": 4}, "Frihamnen": {"Hjalmar Brantingsplatsen": 1}, "Hjalmar Brantingsplatsen": {"V\u00e5gm\u00e4stareplatsen": 1}, "V\u00e5gm\u00e4stareplatsen": {"Wieselgrensplatsen": 1}, "Wieselgrensplatsen": {"Rambergsvallen": 1}, "Rambergsvallen": {"Gropeg\u00e5rdsgatan": 2}, "Gropeg\u00e5rdsgatan": {"Eketr\u00e4gatan": 1}, "Eketr\u00e4gatan": {"S\u00e4l\u00f6fjordsgatan": 2}, "S\u00e4l\u00f6fjordsgatan": {"V\u00e5rv\u00e4derstorget": 1}, "V\u00e5rv\u00e4derstorget": {"Mildv\u00e4dersgatan": 1}, "Mildv\u00e4dersgatan": {"\u00d6nskev\u00e4dersgatan": 1}, "\u00d6nskev\u00e4dersgatan": {"Friskv\u00e4derstorget": 1}, "Friskv\u00e4derstorget": {"V\u00e4derilsgatan": 1}, "V\u00e4derilsgatan": {"Temperaturgatan": 2}, "Temperaturgatan": {"Varmfrontsgatan": 0}, "Varmfrontsgatan": {}, "Aprilgatan": {"Allhelgonakyrkan": 1}, "Allhelgonakyrkan": {"Kortedala Torg": 1}, "Kortedala Torg": {"Runstavsgatan": 2}, "Runstavsgatan": {"Nym\u00e5negatan": 1}, "Nym\u00e5negatan": {"Bev\u00e4ringsgatan": 1}, "Bev\u00e4ringsgatan": {"Kviberg": 1}, "Kviberg": {"Bellevue": 1}, "Bellevue": {"SKF": 2}, "SKF": {"Gamlestads Torg": 1}, "Ejdergatan": {"Redbergsplatsen": 2}, "Chalmers": {"Wavrinskys Plats": 1}, "Wavrinskys Plats": {"Medicinaregatan": 2}, "Medicinaregatan": {"Sahlgrenska Huvudentr\u00e9": 2}, "Sahlgrenska Huvudentr\u00e9": {"Linn\u00e9platsen": 1, "Botaniska Tr\u00e4dg\u00e5rden": 3}, "Nordstan": {"Frihamnen": 1}, "Komettorget": {"Rymdtorget Sp\u00e5rvagn": 2}, "Rymdtorget Sp\u00e5rvagn": {"Teleskopgatan": 1}, "Teleskopgatan": {"Galileis Gata": 1}, "Galileis Gata": {"Januarigatan": 1}, "Januarigatan": {"Allhelgonakyrkan": 1}, "Kapellplatsen": {"Chalmers": 1}, "Sannaplan": {"Sandarna": 1, "Mariaplan": 1}, "Sandarna": {"Kungssten": 2}, "Kungssten": {}, "Doktor Sydows Gata": {"Doktor Fries Torg": 1}, "Doktor Fries Torg": {"Wavrinskys Plats": 2}, "Saltholmen": {"Roddf\u00f6reningen": 1}, "Roddf\u00f6reningen": {"L\u00e5ngedrag": 1}, "L\u00e5ngedrag": {"Hinsholmen": 1}, "Hinsholmen": {"K\u00e4ringberget": 2}, "K\u00e4ringberget": {"Tranered": 1}, "Tranered": {"Hagen": 1}, "Hagen": {"Nya Varvsall\u00e9n": 2}, "Nya Varvsall\u00e9n": {"Kungssten": 1}, "Ekedal": {"Majvallen": 1}, "Majvallen": {"Fj\u00e4llgatan": 1}, "Fj\u00e4llgatan": {"Stigbergstorget": 2}}} \ No newline at end of file diff --git a/labs/lab1/test_tramdata.py b/labs/lab1/test_tramdata.py index 09b9461..c2e8f3b 100644 --- a/labs/lab1/test_tramdata.py +++ b/labs/lab1/test_tramdata.py @@ -1,23 +1,53 @@ import unittest from tramdata import * - -TRAM_FILE = './tramnetwork.json' +import haversine as hs +TRAMFILE = 'labs/data/tramnetwork.json' class TestTramData(unittest.TestCase): def setUp(self): - with open(TRAM_FILE) as trams: + with open(TRAMFILE) as trams: tramdict = json.loads(trams.read()) self.stopdict = tramdict['stops'] self.linedict = tramdict['lines'] - - def test_stops_exist(self): + self.timedict = tramdict['times'] + self.tramdict = tramdict + def teststopsexist(self): stopset = {stop for line in self.linedict for stop in self.linedict[line]} for stop in stopset: self.assertIn(stop, self.stopdict, msg = stop + ' not in stopdict') - # add your own tests here - + def test_all_stops_included(self): + test1 = ['1','2','3','4','5','6','7','8','9','10','11','13'] + for i in range(len(test1)): + self.assertIn( test1[i], self.linedict.keys(), msg = "didnt work") + + def test_stops_in_line(self): + test2 = ["Ullevi Norra", "Chalmers", "Angered Centrum", "Saltholmen", "Hagen", "Rambergsvallen"] + for i in range(len(test2)): + self.assertIn(test2[i], [item for sublist in list(self.linedict.values()) for item in sublist], msg = "didnt work") + + def test_distance_feasible(self): + + for stop1 in self.stopdict: + for stop2 in self.stopdict: + self.assertLess(distance_between_stops(self.stopdict, stop1, stop2), 20, msg = "didnt work") + + + def test_times_beetween_stops(self): + + for line in self.linedict: + for stop1 in self.linedict[line]: + for stop2 in self.linedict[line]: + self.assertEqual(time_between_stops(self.linedict, self.timedict, line, stop1, stop2),time_between_stops(self.linedict, self.timedict, line, stop2, stop1) , msg = "didnt work") + + def test_query(self): + test3 = ["between norrköping and linköping", "via chalmers", "between chalmers and ullevi norra", "time with 8 from chalmers to ullevi", "distance from Hagen to Rambergsvallen", "quit", "hejehjehejehje"] + x = 0 + for i in test3: + if answer_query(self.tramdict, i) == str or int or list or float: + x+=1 + print(f'query {x} passed test ouf of {len(test3)}') if __name__ == '__main__': unittest.main() diff --git a/labs/lab1/tramdata.py b/labs/lab1/tramdata.py new file mode 100644 index 0000000..e91ae59 --- /dev/null +++ b/labs/lab1/tramdata.py @@ -0,0 +1,149 @@ +import sys +import json +from haversine import haversine +from pprint import pprint + + + + +STOP_FILE = './data/tramstops.json' + +LINE_FILE = './data/tramlines.txt' + +TRAM_FILE = './tramnetwork.json' + +def build_tram_stops(jsonobject): + with open(STOP_FILE, 'r') as fromFile: + jsonobject = json.load(fromFile) + + + stopdict = {x: {"lat":jsonobject[x]['position'][0], "lon":jsonobject[x]['position'][1]} for x in jsonobject} + + return stopdict + +def build_tram_lines(lines): + with open (LINE_FILE, "r", encoding= "UTF-8") as file: + lines = file.read().replace(":","").strip().split("\n\n") + lines = [line.split("\n") for line in lines] + + linedict = {} + timedict = {} + + for line in lines: + values=[] + key = line[0] + for i in range(1, len(line) - 1): + name, time = [item.strip() for item in line[i].split(" ") if item] + next_name, next_time = [item.strip() for item in line[i+1].split(" ") if item] + time_diff = int(next_time) - int(time) + values.append(name) + if name not in timedict: + timedict[name] = {} + if next_name not in timedict: + timedict[next_name] = {} + if name not in timedict[next_name]: + timedict[name][next_name] = time_diff + values.append(next_name) + linedict[key] = values + return (linedict, timedict) + +def build_tram_network(stopfile, linefile): + + + outdict = {"stops": build_tram_stops(stopfile), "lines": build_tram_lines(linefile)[0], "times": build_tram_lines(linefile)[1]} + + with open("./tramnetwork.json", "w") as file: + json.dump(outdict, file) + + +def lines_via_stop(linedict, stop): + + return [key for key in linedict if stop in linedict[key]] + +def lines_between_stops(linedict, stop1, stop2): + + return [key for key in linedict if stop1 in linedict[key] and stop2 in linedict[key]] + +def time_between_stops(linedict, timedict, line, stop1, stop2): + + if linedict[str(line)].index(stop1) < linedict[str(line)].index(stop2): + index_1 = linedict[str(line)].index(stop1) + index_2 = linedict[str(line)].index(stop2) + 1 + else: + index_1 = linedict[str(line)].index(stop2) + index_2 = linedict[str(line)].index(stop1) + 1 + + stoplist = linedict[str(line)][index_1:index_2] + + time = 0 + for i in range(len(stoplist) - 1): + if stoplist[i+1] in timedict[stoplist[i]]: + time += timedict[stoplist[i]][stoplist[i+1]] + + elif stoplist[i] in timedict[stoplist[i+1]]: + time += timedict[stoplist[i+1]][stoplist[i]] + + return time + +def distance_between_stops(stopdict, stop1, stop2): + + loc_1 = (float(stopdict[stop1]["lat"]),float(stopdict[stop1]["lon"])) + loc_2 = (float(stopdict[stop2]["lat"]),float(stopdict[stop2]["lon"])) + + return haversine(loc_1, loc_2) + +def answer_query(tramdict, query): + + query = query.lower().title().split() + + if query[0] == "Via": + stop = " ".join(query[query.index("Via") + 1:]) + return lines_via_stop(tramdict["lines"], stop) + + if query[0] == "Between": + stop1 = " ".join(query[query.index("Between") + 1: query.index("And")]) + stop2 = " ".join(query[query.index("And") + 1:]) + + return lines_between_stops(tramdict["lines"], stop1, stop2) + + if query[0] == "Time": + line = query[2] + stop1 = stop1 = " ".join(query[query.index("From") + 1: query.index("To")]) + stop2 = " ".join(query[query.index("To") + 1:]) + return time_between_stops(tramdict["lines"], tramdict["times"], int(line), stop1, stop2) + + if query[0] == "Distance": + + stop1 = " ".join(query[query.index("From") + 1: query.index("To")]) + stop2 = " ".join(query[query.index("To") + 1:]) + return distance_between_stops(tramdict["stops"], stop1, stop2) + + return query + +def dialogue(tramfile=TRAM_FILE): + + with open(tramfile, "r") as file: + tramdict = json.load(file) + + while True: + try: + print("Choose option:\n via \n between and from to \n distance from to \n quit") + query = input("") + + + answer = answer_query(tramdict, query) + if answer[0] == "Quit": + break + + if answer: + print(answer) + else: + print("unknown arguments") + except: + print("sorry, try that again") + +if __name__ == '__main__': + if sys.argv[1:] == ['init']: + build_tram_network(STOP_FILE,LINE_FILE) + else: + dialogue() diff --git a/labs/lab1/tramstops.json b/labs/lab1/tramstops.json new file mode 100644 index 0000000..2c0292a --- /dev/null +++ b/labs/lab1/tramstops.json @@ -0,0 +1,933 @@ +{ + "\u00d6stra Sjukhuset": { + "town": "G\u00f6teborg", + "position": [ + "57.7224618", + "12.0478166" + ] + }, + "Tingvallsv\u00e4gen": { + "town": "G\u00f6teborg", + "position": [ + "57.7246437", + "12.0420754" + ] + }, + "Kaggeledstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.7229358", + "12.0332892" + ] + }, + "\u00c4tteh\u00f6gsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7200477", + "12.0285376" + ] + }, + "Munkeb\u00e4ckstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.7185656", + "12.0263524" + ] + }, + "H\u00e4rlanda": { + "town": "G\u00f6teborg", + "position": [ + "57.7181065", + "12.0194426" + ] + }, + "Stockholmsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7170564", + "12.0136038" + ] + }, + "Redbergsplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.716275", + "12.004907" + ] + }, + "Olskrokstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.7146209", + "11.9987871" + ] + }, + "Svingeln": { + "town": "G\u00f6teborg", + "position": [ + "57.713358", + "11.9917409" + ] + }, + "Ullevi Norra": { + "town": "G\u00f6teborg", + "position": [ + "57.7081152", + "11.9861639" + ] + }, + "Centralstationen": { + "town": "G\u00f6teborg", + "position": [ + "57.7077849", + "11.9734427" + ] + }, + "Brunnsparken": { + "town": "G\u00f6teborg", + "position": [ + "57.7065955", + "11.9689358" + ] + }, + "Stenpiren": { + "town": "G\u00f6teborg", + "position": [ + "57.7056512", + "11.9574172" + ] + }, + "J\u00e4rntorget": { + "town": "G\u00f6teborg", + "position": [ + "57.6999652", + "11.952972" + ] + }, + "Prinsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6964754", + "11.9513521" + ] + }, + "Olivedalsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6918865", + "11.9536831" + ] + }, + "Linn\u00e9platsen": { + "town": "G\u00f6teborg", + "position": [ + "57.689966", + "11.9520518" + ] + }, + "Botaniska Tr\u00e4dg\u00e5rden": { + "town": "G\u00f6teborg", + "position": [ + "57.6812619", + "11.9455821" + ] + }, + "Marklandsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.673267", + "11.9353621" + ] + }, + "Axel Dahlstr\u00f6ms Torg": { + "town": "G\u00f6teborg", + "position": [ + "57.672288", + "11.9275696" + ] + }, + "Lantmilsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6668601", + "11.924836" + ] + }, + "Nymilsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6624705", + "11.9250789" + ] + }, + "Musikv\u00e4gen": { + "town": "G\u00f6teborg", + "position": [ + "57.6590769", + "11.9206117" + ] + }, + "Positivgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6566374", + "11.9175191" + ] + }, + "Fr\u00f6lunda Torg Sp\u00e5rvagn": { + "town": "G\u00f6teborg", + "position": [ + "57.6527643", + "11.9116376" + ] + }, + "Briljantgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6486393", + "11.9035069" + ] + }, + "Smaragdgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6454509", + "11.8993694" + ] + }, + "Opaltorget": { + "town": "G\u00f6teborg", + "position": [ + "57.6423342", + "11.9010554" + ] + }, + "M\u00f6lndals Innerstad": { + "town": "M\u00f6lndal", + "position": [ + "57.655591400000006", + "12.01855524009189" + ] + }, + "M\u00f6lndals sjukhus": { + "town": "M\u00f6lndal", + "position": [ + "57.6614548", + "12.0136632" + ] + }, + "Lackareb\u00e4ck": { + "town": "M\u00f6lndal", + "position": [ + "57.6663479", + "12.0114421" + ] + }, + "Kroksl\u00e4tts Fabriker": { + "town": "M\u00f6lndal", + "position": [ + "57.6717887", + "12.0100249" + ] + }, + "Kroksl\u00e4tts torg": { + "town": "M\u00f6lndal", + "position": [ + "57.6753924", + "12.0078652" + ] + }, + "Lana": { + "town": "G\u00f6teborg", + "position": [ + "57.678333", + "12.0041666" + ] + }, + "Varbergsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6795297", + "12.003115" + ] + }, + "Elisedal": { + "town": "G\u00f6teborg", + "position": [ + "57.6834394", + "12.0004416" + ] + }, + "Almedal": { + "town": "G\u00f6teborg", + "position": [ + "57.6867844", + "11.9974967" + ] + }, + "Liseberg S\u00f6dra": { + "town": "G\u00f6teborg", + "position": [ + "57.6945173", + "11.993695420809985" + ] + }, + "Korsv\u00e4gen": { + "town": "G\u00f6teborg", + "position": [ + "57.6968295", + "11.9868341" + ] + }, + "Scandinavium": { + "town": "G\u00f6teborg", + "position": [ + "57.7006276", + "11.9858582" + ] + }, + "Ullevi S\u00f6dra": { + "town": "G\u00f6teborg", + "position": [ + "57.7039541", + "11.9850022" + ] + }, + "Domkyrkan": { + "town": "G\u00f6teborg", + "position": [ + "57.7042356", + "11.9636653" + ] + }, + "Gr\u00f6nsakstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.7025866", + "11.9639739" + ] + }, + "Vasaplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.6989398", + "11.9705111" + ] + }, + "Vasa Viktoriagatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6985634", + "11.9653312" + ] + }, + "Handelsh\u00f6gskolan": { + "town": "G\u00f6teborg", + "position": [ + "57.6965303", + "11.9625825" + ] + }, + "Brunnsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6936796", + "11.9591759" + ] + }, + "Seminariegatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6920557", + "11.9571828" + ] + }, + "Bokekullsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6771253", + "11.9327977" + ] + }, + "H\u00f6gsbogatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6803596", + "11.9301317" + ] + }, + "Klintens V\u00e4g": { + "town": "G\u00f6teborg", + "position": [ + "57.6824461", + "11.9279843" + ] + }, + "Godhemsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6854379", + "11.9264658" + ] + }, + "Mariaplan": { + "town": "G\u00f6teborg", + "position": [ + "57.686497", + "11.9202959" + ] + }, + "Ostindiegatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6876154", + "11.9156284" + ] + }, + "Vagnhallen Majorna": { + "town": "G\u00f6teborg", + "position": [ + "57.6891689", + "11.9123386" + ] + }, + "Jaegerdorffsplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.6914334", + "11.9150447" + ] + }, + "Chapmans Torg": { + "town": "G\u00f6teborg", + "position": [ + "57.6944764", + "11.9198652" + ] + }, + "Kaptensgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6971583", + "11.9276101" + ] + }, + "Stigbergstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.6990303", + "11.9338896" + ] + }, + "Masthuggstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.6995343", + "11.9447351" + ] + }, + "Hagakyrkan": { + "town": "G\u00f6teborg", + "position": [ + "57.6996013", + "11.9615964" + ] + }, + "Valand": { + "town": "G\u00f6teborg", + "position": [ + "57.7004651", + "11.9748851" + ] + }, + "Kungsportsplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.7039668", + "11.9697972" + ] + }, + "Solrosgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7162733", + "12.0250195" + ] + }, + "Sanatoriegatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7132161", + "12.0240768" + ] + }, + "Virginsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7107812", + "12.0235382" + ] + }, + "Berzeliigatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6983047", + "11.9823431" + ] + }, + "Gamlestads Torg": { + "town": "G\u00f6teborg", + "position": [ + "57.7279636", + "12.0046485" + ] + }, + "Hj\u00e4llbo": { + "town": "G\u00f6teborg", + "position": [ + "57.7692649", + "12.0223749" + ] + }, + "Hammarkullen": { + "town": "G\u00f6teborg", + "position": [ + "57.7800406", + "12.0366009" + ] + }, + "Stor\u00e5s": { + "town": "G\u00f6teborg", + "position": [ + "57.785139", + "12.0462261" + ] + }, + "Angered Centrum": { + "town": "G\u00f6teborg", + "position": [ + "57.7960687", + "12.0495277" + ] + }, + "Welandergatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7060778", + "12.0239345" + ] + }, + "T\u00f6pelsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7023397", + "12.0221389" + ] + }, + "B\u00f6gatan": { + "town": "G\u00f6teborg", + "position": [ + "57.700946", + "12.0160087" + ] + }, + "Ekmanska": { + "town": "G\u00f6teborg", + "position": [ + "57.6996668", + "12.0096351" + ] + }, + "B\u00e4ckeliden": { + "town": "G\u00f6teborg", + "position": [ + "57.6999206", + "12.0033203" + ] + }, + "Sankt Sigfrids Plan": { + "town": "G\u00f6teborg", + "position": [ + "57.6987301", + "11.9994709" + ] + }, + "Liseberg Station": { + "town": "G\u00f6teborg", + "position": [ + "57.6975588", + "11.9942205" + ] + }, + "Lilla Bommen": { + "town": "G\u00f6teborg", + "position": [ + "57.7092219", + "11.9667699" + ] + }, + "Frihamnen": { + "town": "G\u00f6teborg", + "position": [ + "57.7203255", + "11.9600773" + ] + }, + "Hjalmar Brantingsplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.7206077", + "11.9522789" + ] + }, + "V\u00e5gm\u00e4stareplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.720537", + "11.9451746" + ] + }, + "Wieselgrensplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.7205998", + "11.9355948" + ] + }, + "Rambergsvallen": { + "town": "G\u00f6teborg", + "position": [ + "57.719347", + "11.9268104" + ] + }, + "Gropeg\u00e5rdsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7183037", + "11.9191595" + ] + }, + "Eketr\u00e4gatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7164903", + "11.9099118" + ] + }, + "S\u00e4l\u00f6fjordsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7136356", + "11.9029025" + ] + }, + "V\u00e5rv\u00e4derstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.7129196", + "11.8931411" + ] + }, + "Mildv\u00e4dersgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7156823", + "11.890926" + ] + }, + "\u00d6nskev\u00e4dersgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7201505", + "11.8930502" + ] + }, + "Friskv\u00e4derstorget": { + "town": "G\u00f6teborg", + "position": [ + "57.7235673", + "11.8931956" + ] + }, + "V\u00e4derilsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7265488", + "11.8933485" + ] + }, + "Temperaturgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.732569", + "11.8952913" + ] + }, + "Varmfrontsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7368776", + "11.8966497" + ] + }, + "Aprilgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7608913", + "12.0409994" + ] + }, + "Allhelgonakyrkan": { + "town": "G\u00f6teborg", + "position": [ + "57.7574065", + "12.0374426" + ] + }, + "Kortedala Torg": { + "town": "G\u00f6teborg", + "position": [ + "57.752779", + "12.0330403" + ] + }, + "Runstavsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7479034", + "12.0303082" + ] + }, + "Nym\u00e5negatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7427511", + "12.0298737" + ] + }, + "Bev\u00e4ringsgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7399617", + "12.0286261" + ] + }, + "Kviberg": { + "town": "G\u00f6teborg", + "position": [ + "57.7367053", + "12.0265257" + ] + }, + "Bellevue": { + "town": "G\u00f6teborg", + "position": [ + "57.7325237", + "12.0246107" + ] + }, + "SKF": { + "town": "G\u00f6teborg", + "position": [ + "57.7291018", + "12.0132691" + ] + }, + "Ejdergatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7210222", + "12.005952" + ] + }, + "Chalmers": { + "town": "G\u00f6teborg", + "position": [ + "57.6900225", + "11.9730927" + ] + }, + "Wavrinskys Plats": { + "town": "G\u00f6teborg", + "position": [ + "57.6888028", + "11.9684664" + ] + }, + "Medicinaregatan": { + "town": "G\u00f6teborg", + "position": [ + "57.6855827", + "11.9619508" + ] + }, + "Sahlgrenska Huvudentr\u00e9": { + "town": "G\u00f6teborg", + "position": [ + "57.6836795", + "11.9614653" + ] + }, + "Nordstan": { + "town": "G\u00f6teborg", + "position": [ + "57.7086397", + "11.969087498371342" + ] + }, + "Komettorget": { + "town": "G\u00f6teborg", + "position": [ + "57.7511423", + "12.0713114" + ] + }, + "Rymdtorget Sp\u00e5rvagn": { + "town": "G\u00f6teborg", + "position": [ + "57.7558013", + "12.0669195" + ] + }, + "Teleskopgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7593", + "12.0597894" + ] + }, + "Galileis Gata": { + "town": "G\u00f6teborg", + "position": [ + "57.7605336", + "12.051446" + ] + }, + "Januarigatan": { + "town": "G\u00f6teborg", + "position": [ + "57.7602447", + "12.0412135" + ] + }, + "Kapellplatsen": { + "town": "G\u00f6teborg", + "position": [ + "57.6927713", + "11.9735773" + ] + }, + "Sannaplan": { + "town": "G\u00f6teborg", + "position": [ + "57.6842394", + "11.9166553" + ] + }, + "Sandarna": { + "town": "G\u00f6teborg", + "position": [ + "57.6827594", + "11.9095056" + ] + }, + "Kungssten": { + "town": "G\u00f6teborg", + "position": [ + "57.6805281", + "11.9018248" + ] + }, + "Doktor Sydows Gata": { + "town": "G\u00f6teborg", + "position": [ + "57.6793184", + "11.9776909" + ] + }, + "Doktor Fries Torg": { + "town": "G\u00f6teborg", + "position": [ + "57.6844804", + "11.9726716" + ] + }, + "Saltholmen": { + "town": "G\u00f6teborg", + "position": [ + "57.6606312", + "11.8455002" + ] + }, + "Roddf\u00f6reningen": { + "town": "G\u00f6teborg", + "position": [ + "57.6640011", + "11.8516451" + ] + }, + "L\u00e5ngedrag": { + "town": "G\u00f6teborg", + "position": [ + "57.6682375", + "11.8535394" + ] + }, + "Hinsholmen": { + "town": "G\u00f6teborg", + "position": [ + "57.6676904", + "11.8610197" + ] + }, + "K\u00e4ringberget": { + "town": "G\u00f6teborg", + "position": [ + "57.6692358", + "11.8710883" + ] + }, + "Tranered": { + "town": "G\u00f6teborg", + "position": [ + "57.6723198", + "11.8793541" + ] + }, + "Hagen": { + "town": "G\u00f6teborg", + "position": [ + "57.6748357", + "11.8841485" + ] + }, + "Nya Varvsall\u00e9n": { + "town": "G\u00f6teborg", + "position": [ + "57.6780065", + "11.8950555" + ] + }, + "Ekedal": { + "town": "G\u00f6teborg", + "position": [ + "57.6871315", + "11.9290998" + ] + }, + "Majvallen": { + "town": "G\u00f6teborg", + "position": [ + "57.6909343", + "11.9354935" + ] + }, + "Fj\u00e4llgatan": { + "town": "G\u00f6teborg", + "position": [ + "57.69443", + "11.9362336" + ] + } +} \ No newline at end of file