├── .gitignore ├── README.md ├── gtfs └── ulm │ ├── agency.txt │ ├── calendar.txt │ ├── calendar_dates.txt │ ├── routes.txt │ ├── shapes.txt │ ├── stop_times.txt │ ├── stops.txt │ └── trips.txt ├── lib ├── event-simulator │ ├── event-sim-tester.js │ └── event-simulator.js ├── gtfs-parser │ ├── barrier-points.js │ ├── csv-loader.js │ ├── csv-test.js │ ├── gtfs-loader.js │ ├── gtfs-test.js │ ├── gtfs-timetable-parser.js │ └── parser.js ├── map-data-generator │ ├── map-data-generator.js │ ├── map-data-tester.js │ └── trips-test.js └── path-normalizer │ └── path-normalizer.js ├── package.json ├── public ├── css │ ├── bootstrap-1.1.1.min.css │ ├── leaflet.css │ ├── leaflet.ie.css │ └── livemap.css ├── images │ ├── bus_20x20.png │ ├── bus_24x24.png │ ├── layers.png │ ├── marker-icon.png │ ├── marker-shadow.png │ ├── marker.png │ ├── popup-close.png │ ├── station_16x16.png │ ├── station_22x22.png │ ├── station_32x32.png │ ├── tram_20x20.png │ ├── tram_24x24.png │ ├── ulmapi_logo_small.png │ ├── zoom-in.png │ └── zoom-out.png └── js │ ├── images │ ├── layers.png │ ├── marker-icon.png │ ├── marker-shadow.png │ ├── marker.png │ ├── popup-close.png │ ├── zoom-in.png │ └── zoom-out.png │ ├── jquery.min.js │ ├── leaflet.js │ └── livemap.js ├── routes └── site.js ├── server.js └── views ├── container ├── about.html └── map.html └── layout.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | gtfs/ulm -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LiveMap 2 | ### Real-time visualization of public transportation in the City of Ulm, Germany. 3 | 4 | 5 | ## What is this? 6 | 7 | This application visualizes public transportation vehicles moving through the City of Ulm, Germany. Since the transport authority does not provide a useable data feed, we decided to scrape the timetable data and converted them into the GTFS format. We then implemented a simple GTFS parser which emulates the emission of real time event information (though it's based on the static data we liberated from their timetable prison. We hope to eventually switch the backend event emitter to realtime data in the future. If anybody out there knows someone working at the Stadtwerke Ulm, please prod them a little *nudge nudge*). The events emitted by the GTFS parser are consumed by the web application, which renders a map and moves markers according to the estimated location of each vehicle. 8 | 9 | 10 | ## Why? 11 | 12 | This application is a contribution to the Node Knockout 2011 by UlmApi.de members. We implemented this proof-of-concept prototype within two days. It is intended to demonstrate what is possible by mashing cool technology and open data together, shaking it well and letting it boil for a while. It might also prove relaxing to watch. Except if you're using Firefox. 13 | 14 | 15 | ## Technologies used 16 | 17 | node.js: General platform 18 | express.js: Middleware framework 19 | Socket.IO: Messaging library 20 | Leaflet: JavaScript mapping library 21 | bootstrap: CSS template 22 | 23 | 24 | ## What is UlmApi.de? 25 | 26 | We are a group of open data enthusiasts, mostly from the University of Ulm. 27 | 28 | 29 | # License 30 | 31 | Copyright (c) 2011 32 | 33 | Benjamin Erb 34 | Simon Fuchs 35 | Stefan Kaufmann 36 | Michael Mueller 37 | 38 | Permission is hereby granted, free of charge, to any person obtaining 39 | a copy of this software and associated documentation files (the 40 | "Software"), to deal in the Software without restriction, including 41 | without limitation the rights to use, copy, modify, merge, publish, 42 | distribute, sublicense, and/or sell copies of the Software, and to 43 | permit persons to whom the Software is furnished to do so, subject to 44 | the following conditions: 45 | 46 | The above copyright notice and this permission notice shall be 47 | included in all copies or substantial portions of the Software. 48 | 49 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 50 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 51 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 52 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 53 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 54 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 55 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 56 | -------------------------------------------------------------------------------- /gtfs/ulm/agency.txt: -------------------------------------------------------------------------------- 1 | agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone,agency_fare_url 2 | SWU,SWU Nahverkehr Ulm/Neu-Ulm GmbH,http://www.swu.de/privatkunden/swu-nahverkehr.html,Europe/Berlin,de,+49 731 166-2124,http://www.swu.de/privatkunden/swu-nahverkehr/fahrkarten/tarife.html 3 | -------------------------------------------------------------------------------- /gtfs/ulm/calendar.txt: -------------------------------------------------------------------------------- 1 | service_id,start_date,end_date,monday,tuesday,wednesday,thursday,friday,saturday,sunday 2 | 0,20141214,20151212,0,0,0,0,0,0,0 3 | Ss,20141214,20151212,0,0,0,0,0,0,0 4 | Na,20141214,20151212,0,0,0,0,0,0,0 5 | Nb,20141214,20151212,0,0,0,0,0,0,0 6 | 3,20141214,20151212,0,0,0,0,0,0,0 7 | Su,20141214,20151212,0,0,0,0,0,0,0 8 | Sf,20141214,20151212,0,0,0,0,0,0,0 9 | Fa,20141214,20151212,0,0,0,0,0,0,0 10 | Fb,20141214,20151212,0,0,0,0,0,0,0 11 | 2,20141214,20151212,0,0,0,0,0,0,0 12 | Ys,20141214,20151212,0,0,0,0,0,0,0 13 | Yr,20141214,20151212,0,0,0,0,0,0,0 14 | Yu,20141214,20151212,0,0,0,0,0,0,0 15 | Yt,20141214,20151212,0,0,0,0,0,0,0 16 | -------------------------------------------------------------------------------- /gtfs/ulm/calendar_dates.txt: -------------------------------------------------------------------------------- 1 | service_id,date,exception_type 2 | Nb,20141214,1 3 | 3,20141214,1 4 | 0,20141215,1 5 | Ss,20141215,1 6 | Na,20141215,1 7 | Su,20141215,1 8 | 0,20141216,1 9 | Ss,20141216,1 10 | Na,20141216,1 11 | Su,20141216,1 12 | 0,20141217,1 13 | Ss,20141217,1 14 | Na,20141217,1 15 | Su,20141217,1 16 | 0,20141218,1 17 | Ss,20141218,1 18 | Na,20141218,1 19 | Su,20141218,1 20 | 0,20141219,1 21 | Ss,20141219,1 22 | Na,20141219,1 23 | Su,20141219,1 24 | Fa,20141219,1 25 | Yr,20141219,1 26 | 2,20141220,1 27 | Nb,20141221,1 28 | 3,20141221,1 29 | 0,20141222,1 30 | Na,20141222,1 31 | Su,20141222,1 32 | Sf,20141222,1 33 | 0,20141223,1 34 | Na,20141223,1 35 | Su,20141223,1 36 | Sf,20141223,1 37 | Yt,20141224,1 38 | 3,20141225,1 39 | Ys,20141225,1 40 | 3,20141226,1 41 | Ys,20141226,1 42 | 2,20141227,1 43 | Nb,20141228,1 44 | 3,20141228,1 45 | 0,20141229,1 46 | Na,20141229,1 47 | Sf,20141229,1 48 | 0,20141230,1 49 | Na,20141230,1 50 | Sf,20141230,1 51 | 2,20141231,1 52 | Yu,20141231,1 53 | Nb,20150101,1 54 | 3,20150101,1 55 | 0,20150102,1 56 | Na,20150102,1 57 | Sf,20150102,1 58 | Fa,20150102,1 59 | Yr,20150102,1 60 | 2,20150103,1 61 | Nb,20150104,1 62 | 3,20150104,1 63 | 0,20150105,1 64 | Na,20150105,1 65 | Sf,20150105,1 66 | Fa,20150105,1 67 | Fb,20150105,1 68 | Yr,20150105,1 69 | Nb,20150106,1 70 | 3,20150106,1 71 | 0,20150107,1 72 | Ss,20150107,1 73 | Na,20150107,1 74 | Su,20150107,1 75 | 0,20150108,1 76 | Ss,20150108,1 77 | Na,20150108,1 78 | Su,20150108,1 79 | 0,20150109,1 80 | Ss,20150109,1 81 | Na,20150109,1 82 | Su,20150109,1 83 | Fa,20150109,1 84 | Yr,20150109,1 85 | 2,20150110,1 86 | Nb,20150111,1 87 | 3,20150111,1 88 | 0,20150112,1 89 | Ss,20150112,1 90 | Na,20150112,1 91 | Su,20150112,1 92 | 0,20150113,1 93 | Ss,20150113,1 94 | Na,20150113,1 95 | Su,20150113,1 96 | 0,20150114,1 97 | Ss,20150114,1 98 | Na,20150114,1 99 | Su,20150114,1 100 | 0,20150115,1 101 | Ss,20150115,1 102 | Na,20150115,1 103 | Su,20150115,1 104 | 0,20150116,1 105 | Ss,20150116,1 106 | Na,20150116,1 107 | Su,20150116,1 108 | Fa,20150116,1 109 | Yr,20150116,1 110 | 2,20150117,1 111 | Nb,20150118,1 112 | 3,20150118,1 113 | 0,20150119,1 114 | Ss,20150119,1 115 | Na,20150119,1 116 | Su,20150119,1 117 | 0,20150120,1 118 | Ss,20150120,1 119 | Na,20150120,1 120 | Su,20150120,1 121 | 0,20150121,1 122 | Ss,20150121,1 123 | Na,20150121,1 124 | Su,20150121,1 125 | 0,20150122,1 126 | Ss,20150122,1 127 | Na,20150122,1 128 | Su,20150122,1 129 | 0,20150123,1 130 | Ss,20150123,1 131 | Na,20150123,1 132 | Su,20150123,1 133 | Fa,20150123,1 134 | Yr,20150123,1 135 | 2,20150124,1 136 | Nb,20150125,1 137 | 3,20150125,1 138 | 0,20150126,1 139 | Ss,20150126,1 140 | Na,20150126,1 141 | Su,20150126,1 142 | 0,20150127,1 143 | Ss,20150127,1 144 | Na,20150127,1 145 | Su,20150127,1 146 | 0,20150128,1 147 | Ss,20150128,1 148 | Na,20150128,1 149 | Su,20150128,1 150 | 0,20150129,1 151 | Ss,20150129,1 152 | Na,20150129,1 153 | Su,20150129,1 154 | 0,20150130,1 155 | Ss,20150130,1 156 | Na,20150130,1 157 | Su,20150130,1 158 | Fa,20150130,1 159 | Yr,20150130,1 160 | 2,20150131,1 161 | Nb,20150201,1 162 | 3,20150201,1 163 | 0,20150202,1 164 | Ss,20150202,1 165 | Na,20150202,1 166 | Su,20150202,1 167 | 0,20150203,1 168 | Ss,20150203,1 169 | Na,20150203,1 170 | Su,20150203,1 171 | 0,20150204,1 172 | Ss,20150204,1 173 | Na,20150204,1 174 | Su,20150204,1 175 | 0,20150205,1 176 | Ss,20150205,1 177 | Na,20150205,1 178 | Su,20150205,1 179 | 0,20150206,1 180 | Ss,20150206,1 181 | Na,20150206,1 182 | Su,20150206,1 183 | Fa,20150206,1 184 | Yr,20150206,1 185 | 2,20150207,1 186 | Nb,20150208,1 187 | 3,20150208,1 188 | 0,20150209,1 189 | Ss,20150209,1 190 | Na,20150209,1 191 | Su,20150209,1 192 | 0,20150210,1 193 | Ss,20150210,1 194 | Na,20150210,1 195 | Su,20150210,1 196 | 0,20150211,1 197 | Ss,20150211,1 198 | Na,20150211,1 199 | Su,20150211,1 200 | 0,20150212,1 201 | Ss,20150212,1 202 | Na,20150212,1 203 | Su,20150212,1 204 | 0,20150213,1 205 | Ss,20150213,1 206 | Na,20150213,1 207 | Su,20150213,1 208 | Fa,20150213,1 209 | Yr,20150213,1 210 | 2,20150214,1 211 | Nb,20150215,1 212 | 3,20150215,1 213 | 0,20150216,1 214 | Na,20150216,1 215 | Sf,20150216,1 216 | 0,20150217,1 217 | Na,20150217,1 218 | Sf,20150217,1 219 | 0,20150218,1 220 | Na,20150218,1 221 | Sf,20150218,1 222 | 0,20150219,1 223 | Na,20150219,1 224 | Sf,20150219,1 225 | 0,20150220,1 226 | Na,20150220,1 227 | Sf,20150220,1 228 | Fa,20150220,1 229 | Yr,20150220,1 230 | 2,20150221,1 231 | Nb,20150222,1 232 | 3,20150222,1 233 | 0,20150223,1 234 | Ss,20150223,1 235 | Na,20150223,1 236 | 0,20150224,1 237 | Ss,20150224,1 238 | Na,20150224,1 239 | 0,20150225,1 240 | Ss,20150225,1 241 | Na,20150225,1 242 | 0,20150226,1 243 | Ss,20150226,1 244 | Na,20150226,1 245 | 0,20150227,1 246 | Ss,20150227,1 247 | Na,20150227,1 248 | Fa,20150227,1 249 | Yr,20150227,1 250 | 2,20150228,1 251 | Nb,20150301,1 252 | 3,20150301,1 253 | 0,20150302,1 254 | Ss,20150302,1 255 | Na,20150302,1 256 | 0,20150303,1 257 | Ss,20150303,1 258 | Na,20150303,1 259 | 0,20150304,1 260 | Ss,20150304,1 261 | Na,20150304,1 262 | 0,20150305,1 263 | Ss,20150305,1 264 | Na,20150305,1 265 | 0,20150306,1 266 | Ss,20150306,1 267 | Na,20150306,1 268 | Fa,20150306,1 269 | Yr,20150306,1 270 | 2,20150307,1 271 | Nb,20150308,1 272 | 3,20150308,1 273 | 0,20150309,1 274 | Ss,20150309,1 275 | Na,20150309,1 276 | 0,20150310,1 277 | Ss,20150310,1 278 | Na,20150310,1 279 | 0,20150311,1 280 | Ss,20150311,1 281 | Na,20150311,1 282 | 0,20150312,1 283 | Ss,20150312,1 284 | Na,20150312,1 285 | 0,20150313,1 286 | Ss,20150313,1 287 | Na,20150313,1 288 | Fa,20150313,1 289 | Yr,20150313,1 290 | 2,20150314,1 291 | Nb,20150315,1 292 | 3,20150315,1 293 | 0,20150316,1 294 | Ss,20150316,1 295 | Na,20150316,1 296 | 0,20150317,1 297 | Ss,20150317,1 298 | Na,20150317,1 299 | 0,20150318,1 300 | Ss,20150318,1 301 | Na,20150318,1 302 | 0,20150319,1 303 | Ss,20150319,1 304 | Na,20150319,1 305 | 0,20150320,1 306 | Ss,20150320,1 307 | Na,20150320,1 308 | Fa,20150320,1 309 | Yr,20150320,1 310 | 2,20150321,1 311 | Nb,20150322,1 312 | 3,20150322,1 313 | 0,20150323,1 314 | Ss,20150323,1 315 | Na,20150323,1 316 | 0,20150324,1 317 | Ss,20150324,1 318 | Na,20150324,1 319 | 0,20150325,1 320 | Ss,20150325,1 321 | Na,20150325,1 322 | 0,20150326,1 323 | Ss,20150326,1 324 | Na,20150326,1 325 | 0,20150327,1 326 | Ss,20150327,1 327 | Na,20150327,1 328 | Fa,20150327,1 329 | Yr,20150327,1 330 | 2,20150328,1 331 | Nb,20150329,1 332 | 3,20150329,1 333 | 0,20150330,1 334 | Na,20150330,1 335 | Sf,20150330,1 336 | 0,20150331,1 337 | Na,20150331,1 338 | Sf,20150331,1 339 | 0,20150401,1 340 | Na,20150401,1 341 | Sf,20150401,1 342 | 0,20150402,1 343 | Na,20150402,1 344 | Sf,20150402,1 345 | Fa,20150402,1 346 | Fb,20150402,1 347 | Yr,20150402,1 348 | 3,20150403,1 349 | Ys,20150403,1 350 | 2,20150404,1 351 | 3,20150405,1 352 | Ys,20150405,1 353 | Nb,20150406,1 354 | 3,20150406,1 355 | 0,20150407,1 356 | Na,20150407,1 357 | Sf,20150407,1 358 | 0,20150408,1 359 | Na,20150408,1 360 | Sf,20150408,1 361 | 0,20150409,1 362 | Na,20150409,1 363 | Sf,20150409,1 364 | 0,20150410,1 365 | Na,20150410,1 366 | Sf,20150410,1 367 | Fa,20150410,1 368 | Yr,20150410,1 369 | 2,20150411,1 370 | Nb,20150412,1 371 | 3,20150412,1 372 | 0,20150413,1 373 | Ss,20150413,1 374 | Na,20150413,1 375 | Su,20150413,1 376 | 0,20150414,1 377 | Ss,20150414,1 378 | Na,20150414,1 379 | Su,20150414,1 380 | 0,20150415,1 381 | Ss,20150415,1 382 | Na,20150415,1 383 | Su,20150415,1 384 | 0,20150416,1 385 | Ss,20150416,1 386 | Na,20150416,1 387 | Su,20150416,1 388 | 0,20150417,1 389 | Ss,20150417,1 390 | Na,20150417,1 391 | Su,20150417,1 392 | Fa,20150417,1 393 | Yr,20150417,1 394 | 2,20150418,1 395 | Nb,20150419,1 396 | 3,20150419,1 397 | 0,20150420,1 398 | Ss,20150420,1 399 | Na,20150420,1 400 | Su,20150420,1 401 | 0,20150421,1 402 | Ss,20150421,1 403 | Na,20150421,1 404 | Su,20150421,1 405 | 0,20150422,1 406 | Ss,20150422,1 407 | Na,20150422,1 408 | Su,20150422,1 409 | 0,20150423,1 410 | Ss,20150423,1 411 | Na,20150423,1 412 | Su,20150423,1 413 | 0,20150424,1 414 | Ss,20150424,1 415 | Na,20150424,1 416 | Su,20150424,1 417 | Fa,20150424,1 418 | Yr,20150424,1 419 | 2,20150425,1 420 | Nb,20150426,1 421 | 3,20150426,1 422 | 0,20150427,1 423 | Ss,20150427,1 424 | Na,20150427,1 425 | Su,20150427,1 426 | 0,20150428,1 427 | Ss,20150428,1 428 | Na,20150428,1 429 | Su,20150428,1 430 | 0,20150429,1 431 | Ss,20150429,1 432 | Na,20150429,1 433 | Su,20150429,1 434 | 0,20150430,1 435 | Ss,20150430,1 436 | Na,20150430,1 437 | Su,20150430,1 438 | Fa,20150430,1 439 | Fb,20150430,1 440 | Yr,20150430,1 441 | 3,20150501,1 442 | Ys,20150501,1 443 | 2,20150502,1 444 | Nb,20150503,1 445 | 3,20150503,1 446 | 0,20150504,1 447 | Ss,20150504,1 448 | Na,20150504,1 449 | Su,20150504,1 450 | 0,20150505,1 451 | Ss,20150505,1 452 | Na,20150505,1 453 | Su,20150505,1 454 | 0,20150506,1 455 | Ss,20150506,1 456 | Na,20150506,1 457 | Su,20150506,1 458 | 0,20150507,1 459 | Ss,20150507,1 460 | Na,20150507,1 461 | Su,20150507,1 462 | 0,20150508,1 463 | Ss,20150508,1 464 | Na,20150508,1 465 | Su,20150508,1 466 | Fa,20150508,1 467 | Yr,20150508,1 468 | 2,20150509,1 469 | Nb,20150510,1 470 | 3,20150510,1 471 | 0,20150511,1 472 | Ss,20150511,1 473 | Na,20150511,1 474 | Su,20150511,1 475 | 0,20150512,1 476 | Ss,20150512,1 477 | Na,20150512,1 478 | Su,20150512,1 479 | 0,20150513,1 480 | Ss,20150513,1 481 | Na,20150513,1 482 | Su,20150513,1 483 | Fa,20150513,1 484 | Fb,20150513,1 485 | Yr,20150513,1 486 | Nb,20150514,1 487 | 3,20150514,1 488 | 0,20150515,1 489 | Na,20150515,1 490 | Su,20150515,1 491 | Sf,20150515,1 492 | Fa,20150515,1 493 | Yr,20150515,1 494 | 2,20150516,1 495 | Nb,20150517,1 496 | 3,20150517,1 497 | 0,20150518,1 498 | Ss,20150518,1 499 | Na,20150518,1 500 | Su,20150518,1 501 | 0,20150519,1 502 | Ss,20150519,1 503 | Na,20150519,1 504 | Su,20150519,1 505 | 0,20150520,1 506 | Ss,20150520,1 507 | Na,20150520,1 508 | Su,20150520,1 509 | 0,20150521,1 510 | Ss,20150521,1 511 | Na,20150521,1 512 | Su,20150521,1 513 | 0,20150522,1 514 | Ss,20150522,1 515 | Na,20150522,1 516 | Su,20150522,1 517 | Fa,20150522,1 518 | Yr,20150522,1 519 | 2,20150523,1 520 | 3,20150524,1 521 | Ys,20150524,1 522 | Nb,20150525,1 523 | 3,20150525,1 524 | 0,20150526,1 525 | Na,20150526,1 526 | Su,20150526,1 527 | Sf,20150526,1 528 | 0,20150527,1 529 | Na,20150527,1 530 | Su,20150527,1 531 | Sf,20150527,1 532 | 0,20150528,1 533 | Na,20150528,1 534 | Su,20150528,1 535 | Sf,20150528,1 536 | 0,20150529,1 537 | Na,20150529,1 538 | Su,20150529,1 539 | Sf,20150529,1 540 | Fa,20150529,1 541 | Yr,20150529,1 542 | 2,20150530,1 543 | Nb,20150531,1 544 | 3,20150531,1 545 | 0,20150601,1 546 | Na,20150601,1 547 | Su,20150601,1 548 | Sf,20150601,1 549 | 0,20150602,1 550 | Na,20150602,1 551 | Su,20150602,1 552 | Sf,20150602,1 553 | 0,20150603,1 554 | Na,20150603,1 555 | Su,20150603,1 556 | Sf,20150603,1 557 | Fa,20150603,1 558 | Fb,20150603,1 559 | Yr,20150603,1 560 | Nb,20150604,1 561 | 3,20150604,1 562 | 0,20150605,1 563 | Na,20150605,1 564 | Su,20150605,1 565 | Sf,20150605,1 566 | Fa,20150605,1 567 | Yr,20150605,1 568 | 2,20150606,1 569 | Nb,20150607,1 570 | 3,20150607,1 571 | 0,20150608,1 572 | Ss,20150608,1 573 | Na,20150608,1 574 | Su,20150608,1 575 | 0,20150609,1 576 | Ss,20150609,1 577 | Na,20150609,1 578 | Su,20150609,1 579 | 0,20150610,1 580 | Ss,20150610,1 581 | Na,20150610,1 582 | Su,20150610,1 583 | 0,20150611,1 584 | Ss,20150611,1 585 | Na,20150611,1 586 | Su,20150611,1 587 | 0,20150612,1 588 | Ss,20150612,1 589 | Na,20150612,1 590 | Su,20150612,1 591 | Fa,20150612,1 592 | Yr,20150612,1 593 | 2,20150613,1 594 | Nb,20150614,1 595 | 3,20150614,1 596 | 0,20150615,1 597 | Ss,20150615,1 598 | Na,20150615,1 599 | Su,20150615,1 600 | 0,20150616,1 601 | Ss,20150616,1 602 | Na,20150616,1 603 | Su,20150616,1 604 | 0,20150617,1 605 | Ss,20150617,1 606 | Na,20150617,1 607 | Su,20150617,1 608 | 0,20150618,1 609 | Ss,20150618,1 610 | Na,20150618,1 611 | Su,20150618,1 612 | 0,20150619,1 613 | Ss,20150619,1 614 | Na,20150619,1 615 | Su,20150619,1 616 | Fa,20150619,1 617 | Yr,20150619,1 618 | 2,20150620,1 619 | Nb,20150621,1 620 | 3,20150621,1 621 | 0,20150622,1 622 | Ss,20150622,1 623 | Na,20150622,1 624 | Su,20150622,1 625 | 0,20150623,1 626 | Ss,20150623,1 627 | Na,20150623,1 628 | Su,20150623,1 629 | 0,20150624,1 630 | Ss,20150624,1 631 | Na,20150624,1 632 | Su,20150624,1 633 | 0,20150625,1 634 | Ss,20150625,1 635 | Na,20150625,1 636 | Su,20150625,1 637 | 0,20150626,1 638 | Ss,20150626,1 639 | Na,20150626,1 640 | Su,20150626,1 641 | Fa,20150626,1 642 | Yr,20150626,1 643 | 2,20150627,1 644 | Nb,20150628,1 645 | 3,20150628,1 646 | 0,20150629,1 647 | Ss,20150629,1 648 | Na,20150629,1 649 | Su,20150629,1 650 | 0,20150630,1 651 | Ss,20150630,1 652 | Na,20150630,1 653 | Su,20150630,1 654 | 0,20150701,1 655 | Ss,20150701,1 656 | Na,20150701,1 657 | Su,20150701,1 658 | 0,20150702,1 659 | Ss,20150702,1 660 | Na,20150702,1 661 | Su,20150702,1 662 | 0,20150703,1 663 | Ss,20150703,1 664 | Na,20150703,1 665 | Su,20150703,1 666 | Fa,20150703,1 667 | Yr,20150703,1 668 | 2,20150704,1 669 | Nb,20150705,1 670 | 3,20150705,1 671 | 0,20150706,1 672 | Ss,20150706,1 673 | Na,20150706,1 674 | Su,20150706,1 675 | 0,20150707,1 676 | Ss,20150707,1 677 | Na,20150707,1 678 | Su,20150707,1 679 | 0,20150708,1 680 | Ss,20150708,1 681 | Na,20150708,1 682 | Su,20150708,1 683 | 0,20150709,1 684 | Ss,20150709,1 685 | Na,20150709,1 686 | Su,20150709,1 687 | 0,20150710,1 688 | Ss,20150710,1 689 | Na,20150710,1 690 | Su,20150710,1 691 | Fa,20150710,1 692 | Yr,20150710,1 693 | 2,20150711,1 694 | Nb,20150712,1 695 | 3,20150712,1 696 | 0,20150713,1 697 | Ss,20150713,1 698 | Na,20150713,1 699 | Su,20150713,1 700 | 0,20150714,1 701 | Ss,20150714,1 702 | Na,20150714,1 703 | Su,20150714,1 704 | 0,20150715,1 705 | Ss,20150715,1 706 | Na,20150715,1 707 | Su,20150715,1 708 | 0,20150716,1 709 | Ss,20150716,1 710 | Na,20150716,1 711 | Su,20150716,1 712 | 0,20150717,1 713 | Ss,20150717,1 714 | Na,20150717,1 715 | Su,20150717,1 716 | Fa,20150717,1 717 | Yr,20150717,1 718 | 2,20150718,1 719 | Nb,20150719,1 720 | 3,20150719,1 721 | 0,20150721,1 722 | Ss,20150721,1 723 | Na,20150721,1 724 | 0,20150722,1 725 | Ss,20150722,1 726 | Na,20150722,1 727 | 0,20150723,1 728 | Ss,20150723,1 729 | Na,20150723,1 730 | 0,20150724,1 731 | Ss,20150724,1 732 | Na,20150724,1 733 | Fa,20150724,1 734 | Yr,20150724,1 735 | 2,20150725,1 736 | Nb,20150726,1 737 | 3,20150726,1 738 | 0,20150727,1 739 | Ss,20150727,1 740 | Na,20150727,1 741 | 0,20150728,1 742 | Ss,20150728,1 743 | Na,20150728,1 744 | 0,20150729,1 745 | Ss,20150729,1 746 | Na,20150729,1 747 | 0,20150730,1 748 | Na,20150730,1 749 | Sf,20150730,1 750 | 0,20150731,1 751 | Na,20150731,1 752 | Sf,20150731,1 753 | Fa,20150731,1 754 | Yr,20150731,1 755 | 2,20150801,1 756 | Nb,20150802,1 757 | 3,20150802,1 758 | 0,20150803,1 759 | Na,20150803,1 760 | Sf,20150803,1 761 | 0,20150804,1 762 | Na,20150804,1 763 | Sf,20150804,1 764 | 0,20150805,1 765 | Na,20150805,1 766 | Sf,20150805,1 767 | 0,20150806,1 768 | Na,20150806,1 769 | Sf,20150806,1 770 | 0,20150807,1 771 | Na,20150807,1 772 | Sf,20150807,1 773 | Fa,20150807,1 774 | Yr,20150807,1 775 | 2,20150808,1 776 | Nb,20150809,1 777 | 3,20150809,1 778 | 0,20150810,1 779 | Na,20150810,1 780 | Sf,20150810,1 781 | 0,20150811,1 782 | Na,20150811,1 783 | Sf,20150811,1 784 | 0,20150812,1 785 | Na,20150812,1 786 | Sf,20150812,1 787 | 0,20150813,1 788 | Na,20150813,1 789 | Sf,20150813,1 790 | 0,20150814,1 791 | Na,20150814,1 792 | Sf,20150814,1 793 | Fa,20150814,1 794 | Yr,20150814,1 795 | 2,20150815,1 796 | Nb,20150816,1 797 | 3,20150816,1 798 | 0,20150817,1 799 | Na,20150817,1 800 | Sf,20150817,1 801 | 0,20150818,1 802 | Na,20150818,1 803 | Sf,20150818,1 804 | 0,20150819,1 805 | Na,20150819,1 806 | Sf,20150819,1 807 | 0,20150820,1 808 | Na,20150820,1 809 | Sf,20150820,1 810 | 0,20150821,1 811 | Na,20150821,1 812 | Sf,20150821,1 813 | Fa,20150821,1 814 | Yr,20150821,1 815 | 2,20150822,1 816 | Nb,20150823,1 817 | 3,20150823,1 818 | 0,20150824,1 819 | Na,20150824,1 820 | Sf,20150824,1 821 | 0,20150825,1 822 | Na,20150825,1 823 | Sf,20150825,1 824 | 0,20150826,1 825 | Na,20150826,1 826 | Sf,20150826,1 827 | 0,20150827,1 828 | Na,20150827,1 829 | Sf,20150827,1 830 | 0,20150828,1 831 | Na,20150828,1 832 | Sf,20150828,1 833 | Fa,20150828,1 834 | Yr,20150828,1 835 | 2,20150829,1 836 | Nb,20150830,1 837 | 3,20150830,1 838 | 0,20150831,1 839 | Na,20150831,1 840 | Sf,20150831,1 841 | 0,20150901,1 842 | Na,20150901,1 843 | Sf,20150901,1 844 | 0,20150902,1 845 | Na,20150902,1 846 | Sf,20150902,1 847 | 0,20150903,1 848 | Na,20150903,1 849 | Sf,20150903,1 850 | 0,20150904,1 851 | Na,20150904,1 852 | Sf,20150904,1 853 | Fa,20150904,1 854 | Yr,20150904,1 855 | 2,20150905,1 856 | Nb,20150906,1 857 | 3,20150906,1 858 | 0,20150907,1 859 | Na,20150907,1 860 | Sf,20150907,1 861 | 0,20150908,1 862 | Na,20150908,1 863 | Sf,20150908,1 864 | 0,20150909,1 865 | Na,20150909,1 866 | Sf,20150909,1 867 | 0,20150910,1 868 | Na,20150910,1 869 | Sf,20150910,1 870 | 0,20150911,1 871 | Na,20150911,1 872 | Sf,20150911,1 873 | Fa,20150911,1 874 | Yr,20150911,1 875 | 2,20150912,1 876 | Nb,20150913,1 877 | 3,20150913,1 878 | 0,20150914,1 879 | Ss,20150914,1 880 | Na,20150914,1 881 | 0,20150915,1 882 | Ss,20150915,1 883 | Na,20150915,1 884 | 0,20150916,1 885 | Ss,20150916,1 886 | Na,20150916,1 887 | 0,20150917,1 888 | Ss,20150917,1 889 | Na,20150917,1 890 | 0,20150918,1 891 | Ss,20150918,1 892 | Na,20150918,1 893 | Fa,20150918,1 894 | Yr,20150918,1 895 | 2,20150919,1 896 | Nb,20150920,1 897 | 3,20150920,1 898 | 0,20150921,1 899 | Ss,20150921,1 900 | Na,20150921,1 901 | 0,20150922,1 902 | Ss,20150922,1 903 | Na,20150922,1 904 | 0,20150923,1 905 | Ss,20150923,1 906 | Na,20150923,1 907 | 0,20150924,1 908 | Ss,20150924,1 909 | Na,20150924,1 910 | 0,20150925,1 911 | Ss,20150925,1 912 | Na,20150925,1 913 | Fa,20150925,1 914 | Yr,20150925,1 915 | 2,20150926,1 916 | Nb,20150927,1 917 | 3,20150927,1 918 | 0,20150928,1 919 | Ss,20150928,1 920 | Na,20150928,1 921 | 0,20150929,1 922 | Ss,20150929,1 923 | Na,20150929,1 924 | 0,20150930,1 925 | Ss,20150930,1 926 | Na,20150930,1 927 | 0,20151001,1 928 | Ss,20151001,1 929 | Na,20151001,1 930 | 0,20151002,1 931 | Ss,20151002,1 932 | Na,20151002,1 933 | Fa,20151002,1 934 | Yr,20151002,1 935 | 3,20151003,1 936 | Ys,20151003,1 937 | Nb,20151004,1 938 | 3,20151004,1 939 | 0,20151005,1 940 | Ss,20151005,1 941 | Na,20151005,1 942 | 0,20151006,1 943 | Ss,20151006,1 944 | Na,20151006,1 945 | 0,20151007,1 946 | Ss,20151007,1 947 | Na,20151007,1 948 | 0,20151008,1 949 | Ss,20151008,1 950 | Na,20151008,1 951 | 0,20151009,1 952 | Ss,20151009,1 953 | Na,20151009,1 954 | Fa,20151009,1 955 | Yr,20151009,1 956 | 2,20151010,1 957 | Nb,20151011,1 958 | 3,20151011,1 959 | 0,20151012,1 960 | Ss,20151012,1 961 | Na,20151012,1 962 | Su,20151012,1 963 | 0,20151013,1 964 | Ss,20151013,1 965 | Na,20151013,1 966 | Su,20151013,1 967 | 0,20151014,1 968 | Ss,20151014,1 969 | Na,20151014,1 970 | Su,20151014,1 971 | 0,20151015,1 972 | Ss,20151015,1 973 | Na,20151015,1 974 | Su,20151015,1 975 | 0,20151016,1 976 | Ss,20151016,1 977 | Na,20151016,1 978 | Su,20151016,1 979 | Fa,20151016,1 980 | Yr,20151016,1 981 | 2,20151017,1 982 | Nb,20151018,1 983 | 3,20151018,1 984 | 0,20151019,1 985 | Ss,20151019,1 986 | Na,20151019,1 987 | Su,20151019,1 988 | 0,20151020,1 989 | Ss,20151020,1 990 | Na,20151020,1 991 | Su,20151020,1 992 | 0,20151021,1 993 | Ss,20151021,1 994 | Na,20151021,1 995 | Su,20151021,1 996 | 0,20151022,1 997 | Ss,20151022,1 998 | Na,20151022,1 999 | Su,20151022,1 1000 | 0,20151023,1 1001 | Ss,20151023,1 1002 | Na,20151023,1 1003 | Su,20151023,1 1004 | Fa,20151023,1 1005 | Yr,20151023,1 1006 | 2,20151024,1 1007 | Nb,20151025,1 1008 | 3,20151025,1 1009 | 0,20151026,1 1010 | Ss,20151026,1 1011 | Na,20151026,1 1012 | Su,20151026,1 1013 | 0,20151027,1 1014 | Ss,20151027,1 1015 | Na,20151027,1 1016 | Su,20151027,1 1017 | 0,20151028,1 1018 | Ss,20151028,1 1019 | Na,20151028,1 1020 | Su,20151028,1 1021 | 0,20151029,1 1022 | Ss,20151029,1 1023 | Na,20151029,1 1024 | Su,20151029,1 1025 | 0,20151030,1 1026 | Ss,20151030,1 1027 | Na,20151030,1 1028 | Su,20151030,1 1029 | Fa,20151030,1 1030 | Yr,20151030,1 1031 | 2,20151031,1 1032 | Nb,20151101,1 1033 | 3,20151101,1 1034 | 0,20151102,1 1035 | Na,20151102,1 1036 | Su,20151102,1 1037 | Sf,20151102,1 1038 | 0,20151103,1 1039 | Na,20151103,1 1040 | Su,20151103,1 1041 | Sf,20151103,1 1042 | 0,20151104,1 1043 | Na,20151104,1 1044 | Su,20151104,1 1045 | Sf,20151104,1 1046 | 0,20151105,1 1047 | Na,20151105,1 1048 | Su,20151105,1 1049 | Sf,20151105,1 1050 | 0,20151106,1 1051 | Na,20151106,1 1052 | Su,20151106,1 1053 | Sf,20151106,1 1054 | Fa,20151106,1 1055 | Yr,20151106,1 1056 | 2,20151107,1 1057 | Nb,20151108,1 1058 | 3,20151108,1 1059 | 0,20151109,1 1060 | Ss,20151109,1 1061 | Na,20151109,1 1062 | Su,20151109,1 1063 | 0,20151110,1 1064 | Ss,20151110,1 1065 | Na,20151110,1 1066 | Su,20151110,1 1067 | 0,20151111,1 1068 | Ss,20151111,1 1069 | Na,20151111,1 1070 | Su,20151111,1 1071 | 0,20151112,1 1072 | Ss,20151112,1 1073 | Na,20151112,1 1074 | Su,20151112,1 1075 | 0,20151113,1 1076 | Ss,20151113,1 1077 | Na,20151113,1 1078 | Su,20151113,1 1079 | Fa,20151113,1 1080 | Yr,20151113,1 1081 | 2,20151114,1 1082 | Nb,20151115,1 1083 | 3,20151115,1 1084 | 0,20151116,1 1085 | Ss,20151116,1 1086 | Na,20151116,1 1087 | Su,20151116,1 1088 | 0,20151117,1 1089 | Ss,20151117,1 1090 | Na,20151117,1 1091 | Su,20151117,1 1092 | 0,20151118,1 1093 | Ss,20151118,1 1094 | Na,20151118,1 1095 | Su,20151118,1 1096 | 0,20151119,1 1097 | Ss,20151119,1 1098 | Na,20151119,1 1099 | Su,20151119,1 1100 | 0,20151120,1 1101 | Ss,20151120,1 1102 | Na,20151120,1 1103 | Su,20151120,1 1104 | Fa,20151120,1 1105 | Yr,20151120,1 1106 | 2,20151121,1 1107 | Nb,20151122,1 1108 | 3,20151122,1 1109 | 0,20151123,1 1110 | Ss,20151123,1 1111 | Na,20151123,1 1112 | Su,20151123,1 1113 | 0,20151124,1 1114 | Ss,20151124,1 1115 | Na,20151124,1 1116 | Su,20151124,1 1117 | 0,20151125,1 1118 | Ss,20151125,1 1119 | Na,20151125,1 1120 | Su,20151125,1 1121 | 0,20151126,1 1122 | Ss,20151126,1 1123 | Na,20151126,1 1124 | Su,20151126,1 1125 | 0,20151127,1 1126 | Ss,20151127,1 1127 | Na,20151127,1 1128 | Su,20151127,1 1129 | Fa,20151127,1 1130 | Yr,20151127,1 1131 | 2,20151128,1 1132 | Nb,20151129,1 1133 | 3,20151129,1 1134 | 0,20151130,1 1135 | Ss,20151130,1 1136 | Na,20151130,1 1137 | Su,20151130,1 1138 | 0,20151201,1 1139 | Ss,20151201,1 1140 | Na,20151201,1 1141 | Su,20151201,1 1142 | 0,20151202,1 1143 | Ss,20151202,1 1144 | Na,20151202,1 1145 | Su,20151202,1 1146 | 0,20151203,1 1147 | Ss,20151203,1 1148 | Na,20151203,1 1149 | Su,20151203,1 1150 | 0,20151204,1 1151 | Ss,20151204,1 1152 | Na,20151204,1 1153 | Su,20151204,1 1154 | Fa,20151204,1 1155 | Yr,20151204,1 1156 | 2,20151205,1 1157 | Nb,20151206,1 1158 | 3,20151206,1 1159 | 0,20151207,1 1160 | Ss,20151207,1 1161 | Na,20151207,1 1162 | Su,20151207,1 1163 | 0,20151208,1 1164 | Ss,20151208,1 1165 | Na,20151208,1 1166 | Su,20151208,1 1167 | 0,20151209,1 1168 | Ss,20151209,1 1169 | Na,20151209,1 1170 | Su,20151209,1 1171 | 0,20151210,1 1172 | Ss,20151210,1 1173 | Na,20151210,1 1174 | Su,20151210,1 1175 | 0,20151211,1 1176 | Ss,20151211,1 1177 | Na,20151211,1 1178 | Su,20151211,1 1179 | Fa,20151211,1 1180 | Yr,20151211,1 1181 | 2,20151212,1 1182 | Nb,20151213,1 1183 | 3,20151213,1 1184 | 0,20151214,1 1185 | Ss,20151214,1 1186 | Na,20151214,1 1187 | Su,20151214,1 1188 | 0,20151215,1 1189 | Ss,20151215,1 1190 | Na,20151215,1 1191 | Su,20151215,1 1192 | 0,20151216,1 1193 | Ss,20151216,1 1194 | Na,20151216,1 1195 | Su,20151216,1 1196 | 0,20151217,1 1197 | Ss,20151217,1 1198 | Na,20151217,1 1199 | Su,20151217,1 1200 | 0,20151218,1 1201 | Ss,20151218,1 1202 | Na,20151218,1 1203 | Su,20151218,1 1204 | Fa,20151218,1 1205 | Yr,20151218,1 1206 | 2,20151219,1 1207 | Nb,20151220,1 1208 | 3,20151220,1 1209 | 0,20151221,1 1210 | Ss,20151221,1 1211 | Na,20151221,1 1212 | Su,20151221,1 1213 | 0,20151222,1 1214 | Ss,20151222,1 1215 | Na,20151222,1 1216 | Su,20151222,1 1217 | 0,20151223,1 1218 | Na,20151223,1 1219 | Su,20151223,1 1220 | Sf,20151223,1 1221 | 2,20151224,1 1222 | Yt,20151224,1 1223 | 3,20151225,1 1224 | Ys,20151225,1 1225 | 3,20151226,1 1226 | Ys,20151226,1 1227 | Nb,20151227,1 1228 | 3,20151227,1 1229 | 0,20151228,1 1230 | Na,20151228,1 1231 | Sf,20151228,1 1232 | 0,20151229,1 1233 | Na,20151229,1 1234 | Sf,20151229,1 1235 | 0,20151230,1 1236 | Na,20151230,1 1237 | Sf,20151230,1 1238 | 2,20151231,1 1239 | Yu,20151231,1 1240 | 3,20160101,1 1241 | Ys,20160101,1 1242 | 2,20160102,1 1243 | Nb,20160103,1 1244 | 3,20160103,1 1245 | 0,20160104,1 1246 | Na,20160104,1 1247 | Sf,20160104,1 1248 | 0,20160105,1 1249 | Na,20160105,1 1250 | Sf,20160105,1 1251 | Fa,20160105,1 1252 | Fb,20160105,1 1253 | Yr,20160105,1 1254 | Nb,20160106,1 1255 | 3,20160106,1 1256 | 0,20160107,1 1257 | Ss,20160107,1 1258 | Na,20160107,1 1259 | Su,20160107,1 1260 | 0,20160108,1 1261 | Ss,20160108,1 1262 | Na,20160108,1 1263 | Su,20160108,1 1264 | Fa,20160108,1 1265 | Yr,20160108,1 1266 | 2,20160109,1 1267 | Nb,20160110,1 1268 | 3,20160110,1 1269 | 0,20160111,1 1270 | Ss,20160111,1 1271 | Na,20160111,1 1272 | Su,20160111,1 1273 | 0,20160112,1 1274 | Ss,20160112,1 1275 | Na,20160112,1 1276 | Su,20160112,1 1277 | 0,20160113,1 1278 | Ss,20160113,1 1279 | Na,20160113,1 1280 | Su,20160113,1 1281 | 0,20160114,1 1282 | Ss,20160114,1 1283 | Na,20160114,1 1284 | Su,20160114,1 1285 | 0,20160115,1 1286 | Ss,20160115,1 1287 | Na,20160115,1 1288 | Su,20160115,1 1289 | Fa,20160115,1 1290 | Yr,20160115,1 1291 | 2,20160116,1 1292 | Nb,20160117,1 1293 | 3,20160117,1 1294 | 0,20160118,1 1295 | Ss,20160118,1 1296 | Na,20160118,1 1297 | Su,20160118,1 1298 | 0,20160119,1 1299 | Ss,20160119,1 1300 | Na,20160119,1 1301 | Su,20160119,1 1302 | 0,20160120,1 1303 | Ss,20160120,1 1304 | Na,20160120,1 1305 | Su,20160120,1 1306 | 0,20160121,1 1307 | Ss,20160121,1 1308 | Na,20160121,1 1309 | Su,20160121,1 1310 | 0,20160122,1 1311 | Ss,20160122,1 1312 | Na,20160122,1 1313 | Su,20160122,1 1314 | Fa,20160122,1 1315 | Yr,20160122,1 1316 | 2,20160123,1 1317 | Nb,20160124,1 1318 | 3,20160124,1 1319 | 0,20160125,1 1320 | Ss,20160125,1 1321 | Na,20160125,1 1322 | Su,20160125,1 1323 | 0,20160126,1 1324 | Ss,20160126,1 1325 | Na,20160126,1 1326 | Su,20160126,1 1327 | 0,20160127,1 1328 | Ss,20160127,1 1329 | Na,20160127,1 1330 | Su,20160127,1 1331 | 0,20160128,1 1332 | Ss,20160128,1 1333 | Na,20160128,1 1334 | Su,20160128,1 1335 | 0,20160129,1 1336 | Ss,20160129,1 1337 | Na,20160129,1 1338 | Su,20160129,1 1339 | Fa,20160129,1 1340 | Yr,20160129,1 1341 | 2,20160130,1 1342 | Nb,20160131,1 1343 | 3,20160131,1 1344 | 0,20160201,1 1345 | Ss,20160201,1 1346 | Na,20160201,1 1347 | Su,20160201,1 1348 | 0,20160202,1 1349 | Ss,20160202,1 1350 | Na,20160202,1 1351 | Su,20160202,1 1352 | 0,20160203,1 1353 | Ss,20160203,1 1354 | Na,20160203,1 1355 | Su,20160203,1 1356 | 0,20160204,1 1357 | Ss,20160204,1 1358 | Na,20160204,1 1359 | Su,20160204,1 1360 | 0,20160205,1 1361 | Ss,20160205,1 1362 | Na,20160205,1 1363 | Su,20160205,1 1364 | Fa,20160205,1 1365 | Yr,20160205,1 1366 | 2,20160206,1 1367 | Nb,20160207,1 1368 | 3,20160207,1 1369 | 0,20160208,1 1370 | Na,20160208,1 1371 | Su,20160208,1 1372 | Sf,20160208,1 1373 | 0,20160209,1 1374 | Na,20160209,1 1375 | Su,20160209,1 1376 | Sf,20160209,1 1377 | 0,20160210,1 1378 | Na,20160210,1 1379 | Su,20160210,1 1380 | Sf,20160210,1 1381 | 0,20160211,1 1382 | Na,20160211,1 1383 | Su,20160211,1 1384 | Sf,20160211,1 1385 | 0,20160212,1 1386 | Na,20160212,1 1387 | Su,20160212,1 1388 | Sf,20160212,1 1389 | Fa,20160212,1 1390 | Yr,20160212,1 1391 | 2,20160213,1 1392 | Nb,20160214,1 1393 | 3,20160214,1 1394 | 0,20160215,1 1395 | Ss,20160215,1 1396 | Na,20160215,1 1397 | 0,20160216,1 1398 | Ss,20160216,1 1399 | Na,20160216,1 1400 | 0,20160217,1 1401 | Ss,20160217,1 1402 | Na,20160217,1 1403 | 0,20160218,1 1404 | Ss,20160218,1 1405 | Na,20160218,1 1406 | 0,20160219,1 1407 | Ss,20160219,1 1408 | Na,20160219,1 1409 | Fa,20160219,1 1410 | Yr,20160219,1 1411 | 2,20160220,1 1412 | Nb,20160221,1 1413 | 3,20160221,1 1414 | 0,20160222,1 1415 | Ss,20160222,1 1416 | Na,20160222,1 1417 | 0,20160223,1 1418 | Ss,20160223,1 1419 | Na,20160223,1 1420 | 0,20160224,1 1421 | Ss,20160224,1 1422 | Na,20160224,1 1423 | 0,20160225,1 1424 | Ss,20160225,1 1425 | Na,20160225,1 1426 | 0,20160226,1 1427 | Ss,20160226,1 1428 | Na,20160226,1 1429 | Fa,20160226,1 1430 | Yr,20160226,1 1431 | 2,20160227,1 1432 | Nb,20160228,1 1433 | 3,20160228,1 1434 | 0,20160229,1 1435 | Ss,20160229,1 1436 | Na,20160229,1 1437 | -------------------------------------------------------------------------------- /gtfs/ulm/routes.txt: -------------------------------------------------------------------------------- 1 | route_id,agency_id,route_short_name,route_long_name,route_type,route_color,route_text_color 2 | 87001,SWU,1,Söflingen–Böfingen,0,ED1B24,FFFFFF 3 | 87003,SWU,3,Wiblingen (Alte Siedlung)–Wissenschaftsstadt ,3,005DA3,FFFFFF 4 | 87004,SWU,4,Grimmelfingen–Kuhberg–Böfingen Süd ,3,F79534,FFFFFF 5 | 87005,SWU,5,Ludwigsfeld/Wiley–Wissenschaftsstadt,3,1AA8BE,FFFFFF 6 | 87006,SWU,6,Donaustadion–Eselsberg Hasenkopf–Universität Süd ,3,00ADEF,FFFFFF 7 | 87007,SWU,7,Willy-Brandt-Platz–Jungingen,3,B1006A,FFFFFF 8 | 87009,SWU,9,Wiblingen (Reutlinger Str.)–Rosengasse,3,FFD504,FFFFFF 9 | 87901,SWU,N1,Ulm ZOB-Söflingen-Ermingen-Eggingen-Einsingen,3,ED1B24,FFFFFF 10 | 87903,SWU,N3,Ulm ZOB-Blaubeurer Straße-Universität-Lehr-Jungingen,3,82C341,FFFFFF 11 | 87902,SWU,N2,Ulm ZOB-Eselsberg-Blaustein-Arnegg-Herrlingen ,3,76408C,FFFFFF 12 | 87905,SWU,N5,Ulm ZOB-Neu-Ulm-Offenhausen-Pfuhl-Burlafingen,3,005DA3,FFFFFF 13 | 87904,SWU,N4,Ulm ZOB-Eichberg-Böfingen ,3,05B6EC,FFFFFF 14 | 87907,SWU,N7,Ulm ZOB-Wiblingen ,3,E2499B,FFFFFF 15 | 87908,SWU,N8,Ulm ZOB-Kuhberg-Donautal-Gögglingen-Donaustetten,3,F79534,FFFFFF 16 | 87016,SWU,E,Einsatzbus,3,, 17 | 87015,SWU,15,Willy-Brandt-Platz–Universität Süd,3,77B143,FFFFFF 18 | 87014,SWU,14,Kuhberg–Wiblingen (Pranger),3,B22C2B,FFFFFF 19 | 87013,SWU,13,Kuhberg (Am Hochsträß)–Eselsberg Hasenkopf–Universität Süd,3,76408C,FFFFFF 20 | 87011,SWU,11,Roter Berg–Gleißelstetten ,3,DF9CBB,FFFFFF 21 | 87010,SWU,10,Donautal–Blautal-Center,3,A5A158,FFFFFF 22 | -------------------------------------------------------------------------------- /gtfs/ulm/stops.txt: -------------------------------------------------------------------------------- 1 | stop_id,stop_code,stop_name,location_type,parent_station,stop_lon,stop_lat 2 | 900150102,Liststraße,Liststraße,0,9001501,9.94908842283,48.3696734697 3 | 900160001,Pranger,Pranger,0,9001600,9.98832689491,48.3609300167 4 | 900136201,Telefunken,Telefunken,0,9001362,9.97336252029,48.395665814 5 | 900160003,Pranger,Pranger,0,9001600,9.98858971182,48.3601960942 6 | 900101502,Herdbrücke,Herdbrücke,0,9001015,9.99576366159,48.3964447058 7 | 900110201,Loherstraße,Loherstraße,0,9001102,9.96921227904,48.4322023313 8 | 900110202,Loherstraße,Loherstraße,0,9001102,9.96869985673,48.4327460567 9 | 900160002,Pranger,Pranger,0,9001600,9.98817972222,48.360925 10 | 900172902,Meininger Allee,Meininger Allee,0,9001729,10.0084520807,48.3948874315 11 | 900172901,Meininger Allee,Meininger Allee,0,9001729,10.0081836379,48.39479421 12 | 900107312,Thüringenweg,Thüringenweg,0,9001073,10.0194129477,48.4332048563 13 | 900107311,Thüringenweg,Thüringenweg,0,9001073,10.0196054579,48.4332365 14 | 900134301,Sportplatz TSG,Sportplatz TSG,0,9001343,9.94493861111,48.3978038889 15 | 9001736,Wiley Club,Wiley Club,1,,10.0077774432,48.3809226844 16 | 9001735,Marlene-Dietrich-Straße,Marlene-Dietrich-Straße,1,,10.0086752778,48.3850094444 17 | 9001734,Bradleystraße,Bradleystraße,1,,10.0117130491,48.3857227271 18 | 900163501,Reutlinger Straße,Reutlinger Straße,0,9001635,9.97011388889,48.35455 19 | 9001732,Escheugraben,Escheugraben,1,,10.0060536111,48.3876563889 20 | 9001731,Steubenstraße,Steubenstraße,1,,10.0078056154,48.3902008532 21 | 9001097,Neutorstraße,Neutorstraße,1,,9.98612558934,48.4028272199 22 | 9001634,Tannenplatz Zentrum,Tannenplatz Zentrum,1,,9.9729123332,48.3514827219 23 | 9001635,Reutlinger Straße,Reutlinger Straße,1,,9.97003861111,48.3544880556 24 | 9001632,Kemptener Straße,Kemptener Straße,1,,9.97295657222,48.3464496067 25 | 9001633,Saulgauer Straße,Saulgauer Straße,1,,9.96829681316,48.3483189455 26 | 9001739,Donauklinik,Donauklinik,1,,9.99348796068,48.3932697959 27 | 9001004,Pauluskirche,Pauluskirche,1,,9.99503440349,48.404748323 28 | 900173202,Escheugraben,Escheugraben,0,9001732,10.0060536111,48.3876563889 29 | 900173201,Escheugraben,Escheugraben,0,9001732,10.0052567271,48.3881024151 30 | 900124702,Manfred-Börner-Straße,Manfred-Börner-Straße,0,9001247,9.94275357912,48.4197437633 31 | 900136202,Telefunken,Telefunken,0,9001362,9.9701575,48.3951027778 32 | 900124701,Manfred-Börner-Straße,Manfred-Börner-Straße,0,9001247,9.94272,48.4197733333 33 | 9001321,Schongauer Weg,Schongauer Weg,1,,9.9485,48.3934194444 34 | 9001322,Leonberger Weg,Leonberger Weg,1,,9.95021856965,48.3918256875 35 | 9001323,Gleißelstetten,Gleißelstetten,1,,9.94709583333,48.3877536111 36 | 9001324,Fünf-Bäume-Weg Mitte,Fünf-Bäume-Weg Mitte,1,,9.94501972222,48.3965033333 37 | 9001325,Maienweg Nord,Maienweg Nord,1,,9.94570666667,48.3948177778 38 | 9001329,Oberer Roter Berg,Oberer Roter Berg,1,,9.93533703913,48.401416273 39 | 900135904,Haßlerstraße,Haßlerstraße,0,9001359,9.97806722222,48.3884594444 40 | 900136701,Auf der Gölde,Auf der Gölde,0,9001367,9.96819861111,48.4006925 41 | 900138001,Saarlandstraße,Saarlandstraße,0,9001380,9.97073265251,48.3880157125 42 | 900138002,Saarlandstraße,Saarlandstraße,0,9001380,9.97031722222,48.3879344444 43 | 900121001,Burgunderweg,Burgunderweg,0,9001210,9.96134223504,48.4087949217 44 | 900107402,Haslacher Weg,Haslacher Weg,0,9001074,10.0137347215,48.429860953 45 | 900107401,Haslacher Weg,Haslacher Weg,0,9001074,10.0151992845,48.4311134021 46 | 900270202,"Blaustein, Galgenbergstraße",Galgenbergstraße,0,9002702,9.91635638889,48.4146722222 47 | 900270201,"Blaustein, Galgenbergstraße",Galgenbergstraße,0,9002702,9.91567904732,48.4153074384 48 | 900135903,Haßlerstraße,Haßlerstraße,0,9001359,9.97862138889,48.3893241667 49 | 900139502,Barbaralinde,Barbaralinde,0,9001395,9.95006361049,48.3790745656 50 | 900100009,ZOB,ZOB,0,9001000,9.98361222222,48.3982872222 51 | 900139501,Barbaralinde,Barbaralinde,0,9001395,9.95047057902,48.3792982221 52 | 9001600,Pranger,Pranger,1,,9.98858971182,48.3601960942 53 | 900100003,ZOB,ZOB,0,9001000,9.98385056212,48.3979154276 54 | 900100002,ZOB,ZOB,0,9001000,9.98383124117,48.3980229938 55 | 900100001,ZOB,ZOB,0,9001000,9.98383278315,48.3981227666 56 | 9001099,SWU Betriebshof,SWU Betriebshof,1,,9.96826583333,48.3963811111 57 | 9001552,Firma Rheinzink,Firma Rheinzink,1,,9.92544627258,48.3560278679 58 | 9001550,Firma Nanz,Firma Nanz,1,,9.94381888889,48.3671463889 59 | 9001555,Firma Wieland,Firma Wieland,1,,9.94423055556,48.3565972222 60 | 9001554,Firma UPS,Firma UPS,1,,9.92631333333,48.3539605556 61 | 9001395,Barbaralinde,Barbaralinde,1,,9.95006361049,48.3790745656 62 | 900170302,Jakobsruhe,Jakobsruhe,0,9001703,9.98946910199,48.3818580858 63 | 900170301,Jakobsruhe,Jakobsruhe,0,9001703,9.99023138889,48.3814225 64 | 9001391,Oberer Kuhberg,Oberer Kuhberg,1,,9.95300833333,48.3818425 65 | 9001390,Kuhberg Schulzentrum,Kuhberg Schulzentrum,1,,9.95639698932,48.3835689334 66 | 9001392,Am Hochsträß,Am Hochsträß,1,,9.94884876024,48.3804711735 67 | 9001254,Lise-Meitner-Straße,Lise-Meitner-Straße,1,,9.93525472222,48.4187977778 68 | 9001255,Heilmeyersteige,Heilmeyersteige,1,,9.95074722809,48.4135118652 69 | 9001256,Virchowstraße,Virchowstraße,1,,9.94617369243,48.4140844664 70 | 9001257,Söflinger Weinberge,Söflinger Weinberge,1,,9.94200555123,48.4122282331 71 | 9001251,Kelternweg,Kelternweg,1,,9.96023638889,48.413595 72 | 900173501,Marlene-Dietrich-Straße,Marlene-Dietrich-Straße,0,9001735,10.0087355556,48.38496 73 | 900173502,Marlene-Dietrich-Straße,Marlene-Dietrich-Straße,0,9001735,10.0086752778,48.3850094444 74 | 900165302,"Gögglingen, Riedlenstraße",Riedlenstraße,0,9001653,9.936715,48.33487 75 | 900122501,Bleicher Hag,Bleicher Hag,0,9001225,9.97187972222,48.4060236111 76 | 900176802,Hafnerweg,Hafnerweg,0,9001768,10.0181247222,48.3661166667 77 | 900176801,Hafnerweg,Hafnerweg,0,9001768,10.0178692932,48.366432596 78 | 900139201,Am Hochsträß,Am Hochsträß,0,9001392,9.94884876024,48.3804711735 79 | 900171402,Kasernstraße,Kasernstraße,0,9001714,10.0070268319,48.396610748 80 | 900171401,Kasernstraße,Kasernstraße,0,9001714,10.006535535,48.3967344591 81 | 9001280,Beim Türmle,Beim Türmle,1,,9.95646944444,48.40655 82 | 9001044,Neuer Friedhof,Neuer Friedhof,1,,9.9865325,48.4157891667 83 | 900126101,Traminerweg,Traminerweg,0,9001261,9.95699484589,48.4113781831 84 | 900125102,Kelternweg,Kelternweg,0,9001251,9.96023638889,48.413595 85 | 900125101,Kelternweg,Kelternweg,0,9001251,9.95996444462,48.4133673495 86 | 900130101,Ottiliengasse,Ottiliengasse,0,9001301,9.95561167607,48.3968636325 87 | 900130102,Ottiliengasse,Ottiliengasse,0,9001301,9.95551138889,48.3966844444 88 | 900125602,Virchowstraße,Virchowstraße,0,9001256,9.94617369243,48.4140844664 89 | 9001078,Ludwig-Beck-Straße,Ludwig-Beck-Straße,1,,10.0068939333,48.4220850952 90 | 9001079,Eichenplatz,Eichenplatz,1,,10.0032022222,48.4191294444 91 | 9001173,Auf dem Hart,Auf dem Hart,1,,9.98758034357,48.4392170356 92 | 900133302,Torstraße,Torstraße,0,9001333,9.95191863516,48.3951680667 93 | 900142202,"Eggingen, Rathaus",Rathaus,0,9001422,9.8788375,48.3639183333 94 | 900142201,"Eggingen, Rathaus",Rathaus,0,9001422,9.87881299395,48.3637083126 95 | 900133301,Torstraße,Torstraße,0,9001333,9.9518685785,48.3952329948 96 | 9001070,Ostpreußenweg,Ostpreußenweg,1,,10.0304153141,48.4343540454 97 | 9001733,Riedstraße,Riedstraße,1,,10.0099077778,48.3879094444 98 | 9001072,Mecklenburgweg,Mecklenburgweg,1,,10.02384347,48.4344775929 99 | 9001073,Thüringenweg,Thüringenweg,1,,10.0194129477,48.4332048563 100 | 9001074,Haslacher Weg,Haslacher Weg,1,,10.0137956697,48.4301167126 101 | 900163101,St.-Gallener-Straße,St.-Gallener-Straße,0,9001631,9.97868152779,48.3500890024 102 | 900163102,St.-Gallener-Straße,St.-Gallener-Straße,0,9001631,9.97874253128,48.3497106462 103 | 900141304,"Einsingen, Hirsch",Hirsch,0,9001413,9.90016222222,48.3528394444 104 | 900141303,"Einsingen, Hirsch",Hirsch,0,9001413,9.90035944444,48.3527802778 105 | 900135212,Theodor-Heuss-Platz,Theodor-Heuss-Platz,0,9001352,9.96831622245,48.3947427114 106 | 900270801,"Blaustein, Am Blaugarten",Am Blaugarten,0,9002708,9.92909712004,48.4111868091 107 | 900270802,"Blaustein, Am Blaugarten",Am Blaugarten,0,9002708,9.92918196273,48.4110516218 108 | 900172301,Gartenstraße,Gartenstraße,0,9001723,10.0002252839,48.3924686725 109 | 900107212,Mecklenburgweg,Mecklenburgweg,0,9001072,10.02384347,48.4344775929 110 | 900107211,Mecklenburgweg,Mecklenburgweg,0,9001072,10.0238636336,48.4344504099 111 | 900135211,Theodor-Heuss-Platz,Theodor-Heuss-Platz,0,9001352,9.96844681403,48.3946701012 112 | 900171902,Waldeck,Waldeck,0,9001719,10.0096522222,48.3944741667 113 | 900125601,Virchowstraße,Virchowstraße,0,9001256,9.94593528899,48.4140397568 114 | 900109701,Neutorstraße,Neutorstraße,0,9001097,9.98612558934,48.4028272199 115 | 900171901,Waldeck,Waldeck,0,9001719,10.0102514928,48.3942593732 116 | 9001672,"Donaustetten, Illerkirchberger Str.",Illerkirchberger Str.,1,,9.93190295138,48.3281559544 117 | 9001261,Traminerweg,Traminerweg,1,,9.95702237212,48.411531048 118 | 900176501,Hasenweg,Hasenweg,0,9001765,10.0107775,48.3669058333 119 | 9001671,"Donaustetten, Wasserturm",Wasserturm,1,,9.93302929149,48.331584895 120 | 900102501,Frauenstraße,Frauenstraße,0,9001025,9.99361055556,48.4062038889 121 | 900102502,Frauenstraße,Frauenstraße,0,9001025,9.99276500394,48.4067645159 122 | 9001631,St.-Gallener-Straße,St.-Gallener-Straße,1,,9.97874253128,48.3497106462 123 | 900139102,Oberer Kuhberg,Oberer Kuhberg,0,9001391,9.95189305556,48.3816930556 124 | 900139103,Oberer Kuhberg,Oberer Kuhberg,0,9001391,9.9530578653,48.3817956038 125 | 900139101,Oberer Kuhberg,Oberer Kuhberg,0,9001391,9.9527920884,48.3819731207 126 | 900171302,Augsburger Tor,Augsburger Tor,0,9001713,10.0041002778,48.3982772222 127 | 900155401,Firma UPS,Firma UPS,0,9001554,9.92596138889,48.3541091667 128 | 9001772,Danziger Straße,Danziger Straße,1,,10.0112925864,48.3707523285 129 | 9001771,Oberfeld,Oberfeld,1,,10.0110202778,48.3640155556 130 | 900155402,Firma UPS,Firma UPS,0,9001554,9.92631333333,48.3539605556 131 | 900117002,Edith-Stein-Ring,Edith-Stein-Ring,0,9001170,9.99286557963,48.4397694243 132 | 900138102,Robert-Dick-Weg,Robert-Dick-Weg,0,9001381,9.96729777778,48.3863486111 133 | 900120101,Fort Unterer Eselsberg,Fort Unterer Eselsberg,0,9001201,9.96554599056,48.411477226 134 | 900120102,Fort Unterer Eselsberg,Fort Unterer Eselsberg,0,9001201,9.96552972222,48.4114205556 135 | 900150002,Steinbeisstraße,Steinbeisstraße,0,9001500,9.95332638889,48.36852 136 | 900134302,Sportplatz TSG,Sportplatz TSG,0,9001343,9.94463140127,48.3978372965 137 | 900177101,Oberfeld,Oberfeld,0,9001771,10.0110202778,48.3640155556 138 | 900150001,Steinbeisstraße,Steinbeisstraße,0,9001500,9.95339,48.3685977778 139 | 9001724,Memminger Straße,Memminger Straße,1,,10.0037581794,48.3853376057 140 | 900193701,"Pfuhl, Platzgasse",Platzgasse,0,9001937,10.0354477778,48.4085977778 141 | 900193702,"Pfuhl, Platzgasse",Platzgasse,0,9001937,10.0350533333,48.4081933333 142 | 900105401,Donauhalle,Donauhalle,0,9001054,10.0112470497,48.4121363091 143 | 900105402,Donauhalle,Donauhalle,0,9001054,10.0112344444,48.4121075 144 | 900135902,Haßlerstraße,Haßlerstraße,0,9001359,9.97882166667,48.3904411111 145 | 9001602,Alte Siedlung,Alte Siedlung,1,,9.9827620345,48.3537679035 146 | 9001601,Oberer Wirt,Oberer Wirt,1,,9.98638805556,48.3565363889 147 | 900135901,Haßlerstraße,Haßlerstraße,0,9001359,9.97761777778,48.3896536111 148 | 9001608,Ostermahdweg,Ostermahdweg,1,,9.99054416667,48.3645825 149 | 900193902,"Pfuhl, Trissionplatz",Trissionplatz,0,9001939,10.0330472559,48.4068330489 150 | 900193901,"Pfuhl, Trissionplatz",Trissionplatz,0,9001939,10.032909757,48.4067829948 151 | 900129902,Sedanstraße,Sedanstraße,0,9001299,9.96027867496,48.3921446118 152 | 900129901,Sedanstraße,Sedanstraße,0,9001299,9.96036082891,48.392180959 153 | 9001210,Burgunderweg,Burgunderweg,1,,9.96134518159,48.4087566004 154 | 9001218,Lupferbrücke,Lupferbrücke,1,,9.95667798863,48.403585522 155 | 900153401,Voithstraße,Voithstraße,0,9001534,9.95602666667,48.3675952778 156 | 9001359,Haßlerstraße,Haßlerstraße,1,,9.97806722222,48.3884594444 157 | 900124003,Universität Süd,Universität Süd,0,9001240,9.95599422615,48.4218187432 158 | 900124002,Universität Süd,Universität Süd,0,9001240,9.95631308411,48.4218900549 159 | 900106001,Safranberg,Safranberg,0,9001060,10.0031894444,48.4124702778 160 | 900100301,Rosengasse,Rosengasse,0,9001003,9.99682388889,48.4003733333 161 | 900100302,Rosengasse,Rosengasse,0,9001003,9.99677833333,48.4007486111 162 | 900106002,Safranberg,Safranberg,0,9001060,10.0017741667,48.4129013889 163 | 9001351,Blücherstraße,Blücherstraße,1,,9.9736839315,48.3938570147 164 | 9001350,Ehinger Tor,Ehinger Tor,1,,9.98100965138,48.3946650882 165 | 9001353,Magirusstraße,Magirusstraße,1,,9.96467475962,48.3944497235 166 | 9001352,Theodor-Heuss-Platz,Theodor-Heuss-Platz,1,,9.96831622245,48.3947427114 167 | 9001355,Beyerstraße (nur Pausenhaltestelle),Beyerstraße (nur Pausenhaltestelle),1,,9.97832916667,48.3929661111 168 | 9001354,Blautal-Center,Blautal-Center,1,,9.96053277778,48.4003238889 169 | 900132102,Schongauer Weg,Schongauer Weg,0,9001321,9.9485,48.3934194444 170 | 9001501,Liststraße,Liststraße,1,,9.94908842283,48.3696734697 171 | 900162002,Erenlauh,Erenlauh,0,9001620,9.97106682646,48.3585890566 172 | 900162001,Erenlauh,Erenlauh,0,9001620,9.97109916667,48.3584027778 173 | 900135403,Blautal-Center,Blautal-Center,0,9001354,9.96053277778,48.4003238889 174 | 900135402,Blautal-Center,Blautal-Center,0,9001354,9.9615575,48.4004472222 175 | 900135401,Blautal-Center,Blautal-Center,0,9001354,9.96161379207,48.4006477675 176 | 9001131,"Mähringen, Ulmer Steige",Ulmer Steige,1,,9.94406694444,48.4353838889 177 | 900116001,Hörverlsinger Weg,Hörverlsinger Weg,0,9001160,9.98636166667,48.4260036111 178 | 900116002,Hörverlsinger Weg,Hörverlsinger Weg,0,9001160,9.98604527778,48.4254666667 179 | 900105101,Staufenring,Staufenring,0,9001051,10.0043627291,48.4035150353 180 | 900105102,Staufenring,Staufenring,0,9001051,10.0042083333,48.4034916667 181 | 900101112,Justizgebäude,Justizgebäude,0,9001011,9.99283222222,48.4019797222 182 | 900170102,Adenauerbrücke,Adenauerbrücke,0,9001701,9.98814888889,48.3884697222 183 | 9001504,Maybachstraße,Maybachstraße,1,,9.94627527778,48.3612808333 184 | 900129601,Neunkirchenweg,Neunkirchenweg,0,9001296,9.95985153416,48.3864279484 185 | 9001506,Benzstraße,Benzstraße,1,,9.94174260472,48.3656715372 186 | 900134502,Fünf-Bäume-Weg,Fünf-Bäume-Weg,0,9001345,9.9488075,48.3964088889 187 | 9001500,Steinbeisstraße,Steinbeisstraße,1,,9.95332638889,48.36852 188 | 900155202,Firma Rheinzink,Firma Rheinzink,0,9001552,9.92544627258,48.3560278679 189 | 900155201,Firma Rheinzink,Firma Rheinzink,0,9001552,9.92562916667,48.3561802778 190 | 9001503,Heuweg,Heuweg,1,,9.95211722222,48.3648516667 191 | 9001258,Sonnenfeld,Sonnenfeld,1,,9.93726861111,48.4141425 192 | 900124901,Science Park II,Science Park II,0,9001249,9.9376425,48.4246883333 193 | 900124902,Science Park II,Science Park II,0,9001249,9.93680416667,48.4243511111 194 | 900174501,Arena,Arena,0,9001745,10.00577,48.38237 195 | 900121002,Burgunderweg,Burgunderweg,0,9001210,9.96134518159,48.4087566004 196 | 900174502,Arena,Arena,0,9001745,10.0056492694,48.3816857417 197 | 900100902,Hafengasse,Hafengasse,0,9001009,9.996296608,48.3986892944 198 | 900133901,Am Roten Berg,Am Roten Berg,0,9001339,9.93959916667,48.4010911111 199 | 900133902,Am Roten Berg,Am Roten Berg,0,9001339,9.94046444444,48.4008133333 200 | 900100901,Hafengasse,Hafengasse,0,9001009,9.99601333333,48.3979872222 201 | 900122201,Beringerbrücke,Beringerbrücke,0,9001222,9.96642038821,48.4046630722 202 | 900103902,Kienlesberg,Kienlesberg,0,9001039,9.98336777778,48.4058161111 203 | 900103901,Kienlesberg,Kienlesberg,0,9001039,9.98334416667,48.4058791667 204 | 900122202,Beringerbrücke,Beringerbrücke,0,9001222,9.96633590244,48.4046054226 205 | 900108201,Eichberg Nord,Eichberg Nord,0,9001082,10.0076147654,48.4265955256 206 | 900108202,Eichberg Nord,Eichberg Nord,0,9001082,10.0070377046,48.4261468646 207 | 900136702,Auf der Gölde,Auf der Gölde,0,9001367,9.9668075,48.4004272222 208 | 900135301,Magirusstraße,Magirusstraße,0,9001353,9.96387702515,48.3944323771 209 | 900135302,Magirusstraße,Magirusstraße,0,9001353,9.96467475962,48.3944497235 210 | 900126601,Ehrensteiner Feld,Ehrensteiner Feld,0,9001266,9.94850130143,48.41136293 211 | 9001000,ZOB,ZOB,1,,9.98361222222,48.3982872222 212 | 9001003,Rosengasse,Rosengasse,1,,9.99677833333,48.4007486111 213 | 900126602,Ehrensteiner Feld,Ehrensteiner Feld,0,9001266,9.94783222222,48.4111994444 214 | 900271002,"Blaustein, Hofstraße",Hofstraße,0,9002710,9.92247083333,48.4151611111 215 | 900105203,Donaustadion,Donaustadion,0,9001052,10.0068729134,48.40505648 216 | 900271001,"Blaustein, Hofstraße",Hofstraße,0,9002710,9.92324805556,48.4152358333 217 | 9001009,Hafengasse,Hafengasse,1,,9.996296608,48.3986892944 218 | 9001008,Hauptbahnhof,Hauptbahnhof,1,,9.98416128745,48.3993656011 219 | 900129602,Neunkirchenweg,Neunkirchenweg,0,9001296,9.95987985727,48.3863216682 220 | 900143301,"Ermingen, Waldstraße",Waldstraße,0,9001433,9.89777416667,48.3819652778 221 | 900143302,"Ermingen, Waldstraße",Waldstraße,0,9001433,9.89740222222,48.3818813889 222 | 9001431,"Ermingen, Allewind",Allewind,1,,9.89145972222,48.3764644444 223 | 9001432,"Ermingen, Panoramastraße",Panoramastraße,1,,9.89662314096,48.377553572 224 | 9001433,"Ermingen, Waldstraße",Waldstraße,1,,9.89740222222,48.3818813889 225 | 900104402,Neuer Friedhof,Neuer Friedhof,0,9001044,9.9865325,48.4157891667 226 | 900131003,Sonnenstraße,Sonnenstraße,0,9001310,9.95664527778,48.3945102778 227 | 900131002,Sonnenstraße,Sonnenstraße,0,9001310,9.95846507487,48.3946647344 228 | 900131001,Sonnenstraße,Sonnenstraße,0,9001310,9.95776475111,48.3945859776 229 | 900104401,Neuer Friedhof,Neuer Friedhof,0,9001044,9.98678722222,48.4157188889 230 | 900154901,Ratiopharm,Ratiopharm,0,9001549,9.93833845323,48.3600745506 231 | 900108701,Egertweg,Egertweg,0,9001087,10.0122730556,48.4258608333 232 | 900108702,Egertweg,Egertweg,0,9001087,10.0121418662,48.4261117253 233 | 900172502,Edisoncenter,Edisoncenter,0,9001725,10.007251754,48.3793174434 234 | 900172501,Edisoncenter,Edisoncenter,0,9001725,10.0073578942,48.3794000374 235 | 900173101,Steubenstraße,Steubenstraße,0,9001731,10.0075765737,48.3900577639 236 | 900173102,Steubenstraße,Steubenstraße,0,9001731,10.0078056154,48.3902008532 237 | 900131101,Königstraße,Königstraße,0,9001311,9.96123083333,48.3944605556 238 | 900132201,Leonberger Weg,Leonberger Weg,0,9001322,9.949445,48.3918241667 239 | 900132202,Leonberger Weg,Leonberger Weg,0,9001322,9.94949850273,48.3918571565 240 | 900132203,Leonberger Weg,Leonberger Weg,0,9001322,9.95021856965,48.3918256875 241 | 900106101,Albecker Steige,Albecker Steige,0,9001061,10.0038788889,48.4140025 242 | 900129702,Sulzbachweg,Sulzbachweg,0,9001297,9.95966484134,48.3889319114 243 | 900126502,Veltlinerweg,Veltlinerweg,0,9001265,9.95134768892,48.4097678384 244 | 900126501,Veltlinerweg,Veltlinerweg,0,9001265,9.9501774206,48.4098646374 245 | 900135202,Theodor-Heuss-Platz,Theodor-Heuss-Platz,0,9001352,9.96831622245,48.3947427114 246 | 900170401,Illerbrücke,Illerbrücke,0,9001704,9.98957470698,48.3725564961 247 | 900170402,Illerbrücke,Illerbrücke,0,9001704,9.98958527778,48.3727016667 248 | 900145101,"Harthausen, Kirche",Kirche,0,9001451,9.91422083333,48.3907552778 249 | 9001725,Edisoncenter,Edisoncenter,1,,10.007251754,48.3793174434 250 | 900145102,"Harthausen, Kirche",Kirche,0,9001451,9.91417379583,48.3906768206 251 | 9001723,Gartenstraße,Gartenstraße,1,,10.0002252839,48.3924686725 252 | 900117101,Margarete-Steiff-Weg,Margarete-Steiff-Weg,0,9001171,9.99666970033,48.4417536873 253 | 900276102,"Arnegg, Gasthof Blautal",Gasthof Blautal,0,9002761,9.8797309517,48.4154131788 254 | 900276101,"Arnegg, Gasthof Blautal",Gasthof Blautal,0,9002761,9.88043490267,48.4154836695 255 | 900100004,ZOB,ZOB,0,9001000,9.98385389999,48.3978074504 256 | 900190601,"Offenhausen, Roseggerstraße",Roseggerstraße,0,9001906,10.0246449612,48.4017389023 257 | 9001311,Königstraße,Königstraße,1,,9.96109037988,48.3945197924 258 | 900190602,"Offenhausen, Roseggerstraße",Roseggerstraße,0,9001906,10.023907095,48.4016493257 259 | 900110301,Junginger Straße,Junginger Straße,0,9001103,9.97212777778,48.4366013889 260 | 900272802,"Herrlingen, Bahnhof",Bahnhof,0,9002728,9.89788886521,48.4183524772 261 | 900130003,Söflingen,Söflingen,0,9001300,9.95464601969,48.3952942872 262 | 900170003,ZUP,ZUP,0,9001700,10.0036128644,48.3922253103 263 | 900107802,Ludwig-Beck-Straße,Ludwig-Beck-Straße,0,9001078,10.0068939333,48.4220850952 264 | 9001864,Borsigstraße,Borsigstraße,1,,10.0164722426,48.395777464 265 | 900163202,Kemptener Straße,Kemptener Straße,0,9001632,9.97295657222,48.3464496067 266 | 9001162,Albstraße,Albstraße,1,,9.98619888889,48.4352952778 267 | 900163201,Kemptener Straße,Kemptener Straße,0,9001632,9.97292747015,48.3464936933 268 | 900190301,"Offenhausen, Ortsstraße",Ortsstraße,0,9001903,10.0224772837,48.40207331 269 | 900190302,"Offenhausen, Ortsstraße",Ortsstraße,0,9001903,10.0225933076,48.4019202086 270 | 900125801,Sonnenfeld,Sonnenfeld,0,9001258,9.9375197259,48.4141181897 271 | 900167102,"Donaustetten, Wasserturm",Wasserturm,0,9001671,9.93302929149,48.331584895 272 | 9001940,"Pfuhl, Winterstraße",Winterstraße,1,,10.0437536111,48.4118383333 273 | 9001942,"Pfuhl, Schulzentrum",Schulzentrum,1,,10.0538429019,48.4142277265 274 | 9001540,Hans-Lorenser-Straße,Hans-Lorenser-Straße,1,,9.93803916667,48.3486775 275 | 900126002,Ruländerweg,Ruländerweg,0,9001260,9.95594820745,48.4083553411 276 | 900126001,Ruländerweg,Ruländerweg,0,9001260,9.95599834183,48.4083603573 277 | 9001548,Firma Meiller,Firma Meiller,1,,9.9361125,48.3615183333 278 | 9001549,Ratiopharm,Ratiopharm,1,,9.93852939873,48.3600745905 279 | 9001382,Egginer Weg,Egginer Weg,1,,9.96394722222,48.3854344444 280 | 9001383,Gewerbeschulen Königstraße,Gewerbeschulen Königstraße,1,,9.96019934375,48.3846033116 281 | 9001380,Saarlandstraße,Saarlandstraße,1,,9.97031722222,48.3879344444 282 | 9001381,Robert-Dick-Weg,Robert-Dick-Weg,1,,9.96729777778,48.3863486111 283 | 900101012,Theater,Theater,0,9001010,9.98784333333,48.4011683333 284 | 900101011,Theater,Theater,0,9001010,9.98798937783,48.4011655841 285 | 900136002,Römerplatz,Römerplatz,0,9001360,9.97428388889,48.3902127778 286 | 9001260,Ruländerweg,Ruländerweg,1,,9.95594820745,48.4083553411 287 | 900136001,Römerplatz,Römerplatz,0,9001360,9.9753175,48.3903736111 288 | 900138101,Robert-Dick-Weg,Robert-Dick-Weg,0,9001381,9.96690111111,48.3860513889 289 | 9001266,Ehrensteiner Feld,Ehrensteiner Feld,1,,9.94783222222,48.4111994444 290 | 900140102,Häberlinweg,Häberlinweg,0,9001401,9.94098546786,48.3731129639 291 | 900140101,Häberlinweg,Häberlinweg,0,9001401,9.94107305556,48.3730961111 292 | 900107011,Ostpreußenweg,Ostpreußenweg,0,9001070,10.0304153141,48.4343540454 293 | 900108102,Eichberg,Eichberg,0,9001081,10.0053641667,48.4228113889 294 | 900108101,Eichberg,Eichberg,0,9001081,10.0058977778,48.4234769444 295 | 900101111,Justizgebäude,Justizgebäude,0,9001011,9.99294333333,48.4019483333 296 | 900116602,Gehrnstraße,Gehrnstraße,0,9001166,9.99238722222,48.4458025 297 | 900116601,Gehrnstraße,Gehrnstraße,0,9001166,9.99235354594,48.4458617791 298 | 9002702,"Blaustein, Galgenbergstraße",Galgenbergstraße,1,,9.91635638889,48.4146722222 299 | 9002701,"Blaustein, Bahnhof/Rathaus",Bahnhof/Rathaus,1,,9.91872377359,48.4153670965 300 | 9001046,Wilhelmsburgkaserne,Wilhelmsburgkaserne,1,,9.98381,48.4180494444 301 | 900270101,"Blaustein, Bahnhof/Rathaus",Bahnhof/Rathaus,0,9002701,9.91828405822,48.415731024 302 | 900270102,"Blaustein, Bahnhof/Rathaus",Bahnhof/Rathaus,0,9002701,9.91872377359,48.4153670965 303 | 9002704,"Blaustein, Kalte Herberge",Kalte Herberge,1,,9.90803315608,48.4185365488 304 | 9002708,"Blaustein, Am Blaugarten",Am Blaugarten,1,,9.92918196273,48.4110516218 305 | 9001049,Congress Centrum,Congress Centrum,1,,10.0037127778,48.4008075 306 | 9001048,Örlinger Straße,Örlinger Straße,1,,10.0016213889,48.4087463889 307 | 900138302,Gewerbeschulen Königstraße,Gewerbeschulen Königstraße,0,9001383,9.96019934375,48.3846033116 308 | 900170008,ZUP,ZUP,0,9001700,10.0028572149,48.392008323 309 | 900153201,Siemensstraße,Siemensstraße,0,9001532,9.95497927792,48.3621738382 310 | 9001968,"Burlafingen, Schule",Schule,1,,10.0697605959,48.4120414445 311 | 900153202,Siemensstraße,Siemensstraße,0,9001532,9.95496038139,48.3621457678 312 | 9001166,Gehrnstraße,Gehrnstraße,1,,9.99238722222,48.4458025 313 | 9001167,Donau-Iller-Werkstätten,Donau-Iller-Werkstätten,1,,9.98591111111,48.4469527778 314 | 9001164,Schwarzenbergstraße,Schwarzenbergstraße,1,,9.98581861111,48.44872 315 | 9001165,Fichtenstraße,Fichtenstraße,1,,9.99082036879,48.4494479065 316 | 900167101,"Donaustetten, Wasserturm",Wasserturm,0,9001671,9.93317731694,48.3317039809 317 | 900132501,Maienweg Nord,Maienweg Nord,0,9001325,9.94570666667,48.3948177778 318 | 9001160,Hörverlsinger Weg,Hörverlsinger Weg,1,,9.98604527778,48.4254666667 319 | 9001161,Franzenhauserweg,Franzenhauserweg,1,,9.98558283039,48.4293234864 320 | 9001507,Boschstraße,Boschstraße,1,,9.95438944444,48.3711908333 321 | 900173401,Bradleystraße,Bradleystraße,0,9001734,10.0114165466,48.3855965901 322 | 900173402,Bradleystraße,Bradleystraße,0,9001734,10.0117130491,48.3857227271 323 | 9001502,Daimlerstraße,Daimlerstraße,1,,9.9527225,48.3664561111 324 | 900135111,Blücherstraße,Blücherstraße,0,9001351,9.97298422726,48.393850575 325 | 900105801,Ostplatz,Ostplatz,0,9001058,10.0011699447,48.4059940604 326 | 900105802,Ostplatz,Ostplatz,0,9001058,10.0018527778,48.4057136111 327 | 900135112,Blücherstraße,Blücherstraße,0,9001351,9.9736839315,48.3938570147 328 | 900186403,Borsigstraße,Borsigstraße,0,9001864,10.0165302724,48.3957230287 329 | 900186404,Borsigstraße,Borsigstraße,0,9001864,10.0164722426,48.395777464 330 | 900107202,Mecklenburgweg,Mecklenburgweg,0,9001072,10.0243584461,48.4345034025 331 | 9001744,Washingtonallee,Washingtonallee,1,,10.0111294444,48.3798902778 332 | 900100102,Steinerne Brücke,Steinerne Brücke,0,9001001,9.98858400295,48.3971605101 333 | 900194002,"Pfuhl, Winterstraße",Winterstraße,0,9001940,10.0437536111,48.4118383333 334 | 900142101,"Eggingen, Ringinger Straße",Ringinger Straße,0,9001421,9.87963305556,48.3610772222 335 | 900142102,"Eggingen, Ringinger Straße",Ringinger Straße,0,9001421,9.87965361111,48.3612286111 336 | 9001768,Hafnerweg,Hafnerweg,1,,10.0181247222,48.3661166667 337 | 9001769,Reichenberger Straße,Reichenberger Straße,1,,10.01521,48.3689986111 338 | 9001765,Hasenweg,Hasenweg,1,,10.0107775,48.3669058333 339 | 9001766,Katholische kirche,Katholische kirche,1,,10.0136552778,48.3672363889 340 | 9001767,Allgäuer Straße,Allgäuer Straße,1,,10.0130763259,48.3638942064 341 | 9001727,Wiley Süd,Wiley Süd,1,,10.0105616667,48.3769363889 342 | 900176901,Reichenberger Straße,Reichenberger Straße,0,9001769,10.0148336206,48.369632828 343 | 900160203,Alte Siedlung,Alte Siedlung,0,9001602,9.9827620345,48.3537679035 344 | 900160202,Alte Siedlung,Alte Siedlung,0,9001602,9.98329275095,48.3540138016 345 | 900160201,Alte Siedlung,Alte Siedlung,0,9001602,9.98284333333,48.3538772222 346 | 900194202,"Pfuhl, Schulzentrum",Schulzentrum,0,9001942,10.0538429019,48.4142277265 347 | 900116302,Rathaus Jungingen,Rathaus Jungingen,0,9001163,9.98679111111,48.4428138889 348 | 900104902,Congress Centrum,Congress Centrum,0,9001049,10.0037127778,48.4008075 349 | 900104901,Congress Centrum,Congress Centrum,0,9001049,10.0034413889,48.4009261111 350 | 900116301,Rathaus Jungingen,Rathaus Jungingen,0,9001163,9.98657416667,48.4428952778 351 | 900125701,Söflinger Weinberge,Söflinger Weinberge,0,9001257,9.94197830112,48.4123193013 352 | 900165102,"Gögglingen, Zollbrücke",Zollbrücke,0,9001651,9.94103278926,48.3426596659 353 | 900165101,"Gögglingen, Zollbrücke",Zollbrücke,0,9001651,9.94167911152,48.3431526066 354 | 900154001,Hans-Lorenser-Straße,Hans-Lorenser-Straße,0,9001540,9.93803916667,48.3486775 355 | 900176601,Katholische kirche,Katholische kirche,0,9001766,10.0136552778,48.3672363889 356 | 9001903,"Offenhausen, Ortsstraße",Ortsstraße,1,,10.0225933076,48.4019202086 357 | 9001904,"Offenhausen, Grundweg",Grundweg,1,,10.0233689972,48.4035933224 358 | 900105002,Willy-Brandt-Platz,Willy-Brandt-Platz,0,9001050,10.000326512,48.4025973183 359 | 9001906,"Offenhausen, Roseggerstraße",Roseggerstraße,1,,10.023907095,48.4016493257 360 | 900139002,Kuhberg Schulzentrum,Kuhberg Schulzentrum,0,9001390,9.95639698932,48.3835689334 361 | 900139001,Kuhberg Schulzentrum,Kuhberg Schulzentrum,0,9001390,9.95454666667,48.3834022222 362 | 900105003,Willy-Brandt-Platz,Willy-Brandt-Platz,0,9001050,10.0009262683,48.40242606 363 | 900132901,Oberer Roter Berg,Oberer Roter Berg,0,9001329,9.93533703913,48.401416273 364 | 9001346,Franz-Wiedemeier-Straße,Franz-Wiedemeier-Straße,1,,9.93682218976,48.3989288398 365 | 900159101,Am Sandhaken,Am Sandhaken,0,9001591,9.96127027778,48.3645494444 366 | 9001345,Fünf-Bäume-Weg,Fünf-Bäume-Weg,1,,9.9488075,48.3964088889 367 | 9001342,Clarissenstraße,Clarissenstraße,1,,9.95335416667,48.3988663889 368 | 9001343,Sportplatz TSG,Sportplatz TSG,1,,9.94463140127,48.3978372965 369 | 9001340,Riedwiesenweg,Riedwiesenweg,1,,9.94547761087,48.4018002736 370 | 9001341,St.-Jakob-Straße,St.-Jakob-Straße,1,,9.95007625206,48.4004850973 371 | 900120005,Eselsberg Hasenkopf,Eselsberg Hasenkopf,0,9001200,9.96284301666,48.4145314156 372 | 900120004,Eselsberg Hasenkopf,Eselsberg Hasenkopf,0,9001200,9.96260638889,48.4143275 373 | 900196102,"Burlafingen, Bahnhof",Bahnhof,0,9001961,10.0691028372,48.4107661706 374 | 900120001,Eselsberg Hasenkopf,Eselsberg Hasenkopf,0,9001200,9.9631871052,48.414611486 375 | 9001220,Bahnhof Söflingen,Bahnhof Söflingen,1,,9.95906777778,48.4030652778 376 | 900120002,Eselsberg Hasenkopf,Eselsberg Hasenkopf,0,9001200,9.96355122249,48.414106157 377 | 900163302,Saulgauer Straße,Saulgauer Straße,0,9001633,9.96829681316,48.3483189455 378 | 900163301,Saulgauer Straße,Saulgauer Straße,0,9001633,9.96843515115,48.348256985 379 | 900163502,Reutlinger Straße,Reutlinger Straße,0,9001635,9.97003861111,48.3544880556 380 | 900116501,Fichtenstraße,Fichtenstraße,0,9001165,9.99107971546,48.4493588555 381 | 900193301,"Pfuhl, Leipheimer Straße",Leipheimer Straße,0,9001933,10.0468780253,48.4072909187 382 | 900134001,Riedwiesenweg,Riedwiesenweg,0,9001340,9.94514027778,48.4018511111 383 | 900134002,Riedwiesenweg,Riedwiesenweg,0,9001340,9.94547761087,48.4018002736 384 | 900138301,Gewerbeschulen Königstraße,Gewerbeschulen Königstraße,0,9001383,9.96168472222,48.3848927778 385 | 900193601,"Pfuhl, Altes Rathaus",Altes Rathaus,0,9001936,10.0397775,48.4102293721 386 | 900160501,Kapelle,Kapelle,0,9001605,9.98341803787,48.3604833168 387 | 900160502,Kapelle,Kapelle,0,9001605,9.98425383069,48.3605566074 388 | 900193602,"Pfuhl, Altes Rathaus",Altes Rathaus,0,9001936,10.0398470447,48.4102186556 389 | 900193802,"Pfuhl, Stauffenbergstraße",Stauffenbergstraße,0,9001938,10.0306792512,48.4056831876 390 | 900193801,"Pfuhl, Stauffenbergstraße",Stauffenbergstraße,0,9001938,10.0303686111,48.4056091667 391 | 900134901,Jägerstraße,Jägerstraße,0,9001349,9.95564888889,48.4001677778 392 | 900150101,Liststraße,Liststraße,0,9001501,9.94912912415,48.3696934041 393 | 900100802,Hauptbahnhof,Hauptbahnhof,0,9001008,9.98416128745,48.3993656011 394 | 900100801,Hauptbahnhof,Hauptbahnhof,0,9001008,9.98422768554,48.3993311097 395 | 9001081,Eichberg,Eichberg,1,,10.0053641667,48.4228113889 396 | 9001080,Eugen-Bolz-Straße,Eugen-Bolz-Straße,1,,10.0173578287,48.4200736483 397 | 9001083,Alfred-Delp-Weg,Alfred-Delp-Weg,1,,10.0132138889,48.423425 398 | 9001082,Eichberg Nord,Eichberg Nord,1,,10.0070377046,48.4261468646 399 | 900105112,Staufenring,Staufenring,0,9001051,10.0042073,48.403492429 400 | 9001087,Egertweg,Egertweg,1,,10.012325834,48.4256026171 401 | 900105111,Staufenring,Staufenring,0,9001051,10.0043627291,48.4035150353 402 | 9001539,Ernst-Abbe-Straße,Ernst-Abbe-Straße,1,,9.92857846657,48.3528266438 403 | 900134902,Jägerstraße,Jägerstraße,0,9001349,9.9555025,48.4001313889 404 | 900177202,Danziger Straße,Danziger Straße,0,9001772,10.0112925864,48.3707523285 405 | 900177201,Danziger Straße,Danziger Straße,0,9001772,10.0112894444,48.370815 406 | 9001532,Siemensstraße,Siemensstraße,1,,9.95496038139,48.3621457678 407 | 900100201,Rathaus Ulm,Rathaus Ulm,0,9001002,9.99286568236,48.3974951256 408 | 9001534,Voithstraße,Voithstraße,1,,9.95602666667,48.3675952778 409 | 900100202,Rathaus Ulm,Rathaus Ulm,0,9001002,9.99413044726,48.3976179276 410 | 900160801,Ostermahdweg,Ostermahdweg,0,9001608,9.99091222222,48.3654222222 411 | 900160802,Ostermahdweg,Ostermahdweg,0,9001608,9.99054416667,48.3645825 412 | 900174302,Neue Hochschule,Neue Hochschule,0,9001743,10.0091933333,48.3795605556 413 | 900174301,Neue Hochschule,Neue Hochschule,0,9001743,10.00869,48.3795288889 414 | 900133202,Maienweg,Maienweg,0,9001332,9.94866416667,48.3896572222 415 | 900141403,"Einsingen, Kirche",Kirche,0,9001414,9.89513055556,48.3539038889 416 | 900141404,"Einsingen, Kirche",Kirche,0,9001414,9.89498611111,48.3543452778 417 | 900133201,Maienweg,Maienweg,0,9001332,9.94861055556,48.3897572222 418 | 900109998,SWU Betriebshof,SWU Betriebshof,0,9001099,9.9677802616,48.3963827982 419 | 900109999,SWU Betriebshof,SWU Betriebshof,0,9001099,9.96826583333,48.3963811111 420 | 900150604,Benzstraße,Benzstraße,0,9001506,9.94174260472,48.3656715372 421 | 9001265,Veltlinerweg,Veltlinerweg,1,,9.95134768892,48.4097678384 422 | 900134501,Fünf-Bäume-Weg,Fünf-Bäume-Weg,0,9001345,9.94859952698,48.3965491568 423 | 900150601,Benzstraße,Benzstraße,0,9001506,9.94248593467,48.3664752158 424 | 900150602,Benzstraße,Benzstraße,0,9001506,9.9425324138,48.3664318766 425 | 900150603,Benzstraße,Benzstraße,0,9001506,9.9417950013,48.3656817894 426 | 900116101,Franzenhauserweg,Franzenhauserweg,0,9001161,9.98545388889,48.42873 427 | 9001404,Erbacher Straße,Erbacher Straße,1,,9.93984951928,48.3670106241 428 | 900116102,Franzenhauserweg,Franzenhauserweg,0,9001161,9.98558283039,48.4293234864 429 | 9001401,Häberlinweg,Häberlinweg,1,,9.94098546786,48.3731129639 430 | 9001400,Rathausstraße,Rathausstraße,1,,9.93589861111,48.3718797222 431 | 9001403,Eisenbahnstraße,Eisenbahnstraße,1,,9.93708611111,48.3701763889 432 | 9001015,Herdbrücke,Herdbrücke,1,,9.99576366159,48.3964447058 433 | 9001012,Keplerstraße,Keplerstraße,1,,9.992616374,48.4055853947 434 | 900187105,Lessingstraße,Lessingstraße,0,9001871,10.0256,48.3969 435 | 9001010,Theater,Theater,1,,9.98784333333,48.4011683333 436 | 9001011,Justizgebäude,Justizgebäude,1,,9.99283222222,48.4019797222 437 | 900129701,Sulzbachweg,Sulzbachweg,0,9001297,9.95970926534,48.3890117125 438 | 9001001,Steinerne Brücke,Steinerne Brücke,1,,9.98858400295,48.3971605101 439 | 900187104,Lessingstraße,Lessingstraße,0,9001871,10.0246694444,48.3967305556 440 | 900170004,ZUP,ZUP,0,9001700,10.0029812307,48.3918779665 441 | 900126102,Traminerweg,Traminerweg,0,9001261,9.95702237212,48.411531048 442 | 900121802,Lupferbrücke,Lupferbrücke,0,9001218,9.95667798863,48.403585522 443 | 900121801,Lupferbrücke,Lupferbrücke,0,9001218,9.95687222222,48.4035777778 444 | 9001002,Rathaus Ulm,Rathaus Ulm,1,,9.99413044726,48.3976179276 445 | 900131011,Sonnenstraße,Sonnenstraße,0,9001310,9.95776475111,48.3945859776 446 | 900131012,Sonnenstraße,Sonnenstraße,0,9001310,9.95846507487,48.3946647344 447 | 900124801,Hochschule Eselsberg,Hochschule Eselsberg,0,9001248,9.93782611111,48.4187752778 448 | 900105202,Donaustadion,Donaustadion,0,9001052,10.0074894444,48.4049786111 449 | 900130011,Söflingen,Söflingen,0,9001300,9.95500564155,48.3948493386 450 | 900124802,Hochschule Eselsberg,Hochschule Eselsberg,0,9001248,9.93825861111,48.4187294444 451 | 900125402,Lise-Meitner-Straße,Lise-Meitner-Straße,0,9001254,9.93525472222,48.4187977778 452 | 900125401,Lise-Meitner-Straße,Lise-Meitner-Straße,0,9001254,9.93493578946,48.4187576869 453 | 900172702,Wiley Süd,Wiley Süd,0,9001727,10.0105616667,48.3769363889 454 | 9001163,Rathaus Jungingen,Rathaus Jungingen,1,,9.98679111111,48.4428138889 455 | 900105201,Donaustadion,Donaustadion,0,9001052,10.0076333333,48.4049875 456 | 9001249,Science Park II,Science Park II,1,,9.93680416667,48.4243511111 457 | 9001605,Kapelle,Kapelle,1,,9.98425383069,48.3605566074 458 | 900107411,Haslacher Weg,Haslacher Weg,0,9001074,10.0139492571,48.4302437164 459 | 900134602,Franz-Wiedemeier-Straße,Franz-Wiedemeier-Straße,0,9001346,9.93682218976,48.3989288398 460 | 900135203,Theodor-Heuss-Platz,Theodor-Heuss-Platz,0,9001352,9.96860765348,48.3949049835 461 | 900134601,Franz-Wiedemeier-Straße,Franz-Wiedemeier-Straße,0,9001346,9.93661111111,48.3989925 462 | 900116202,Albstraße,Albstraße,0,9001162,9.98619888889,48.4352952778 463 | 900116201,Albstraße,Albstraße,0,9001162,9.98589666667,48.4344702778 464 | 900105302,Wohnpark Friedrichsau,Wohnpark Friedrichsau,0,9001053,10.0089784204,48.4084236123 465 | 900105301,Wohnpark Friedrichsau,Wohnpark Friedrichsau,0,9001053,10.0089967551,48.4085071475 466 | 9001710,Rathaus Neu-Ulm,Rathaus Neu-Ulm,1,,10.000725,48.3950422222 467 | 9001713,Augsburger Tor,Augsburger Tor,1,,10.0041002778,48.3982772222 468 | 900138202,Egginer Weg,Egginer Weg,0,9001382,9.96394722222,48.3854344444 469 | 9001714,Kasernstraße,Kasernstraße,1,,10.0070268319,48.396610748 470 | 900107201,Mecklenburgweg,Mecklenburgweg,0,9001072,10.0247669471,48.4345082117 471 | 900138201,Egginer Weg,Egginer Weg,0,9001382,9.96435944444,48.3853802778 472 | 9001719,Waldeck,Waldeck,1,,10.0096522222,48.3944741667 473 | 9001651,"Gögglingen, Zollbrücke",Zollbrücke,1,,9.94103278926,48.3426596659 474 | 9001652,"Gögglingen, Hoher Berg",Hoher Berg,1,,9.93918539538,48.3385041572 475 | 9001653,"Gögglingen, Riedlenstraße",Riedlenstraße,1,,9.936715,48.33487 476 | 900159401,Firma Seeberger,Firma Seeberger,0,9001594,9.95065385988,48.3585383886 477 | 900140402,Erbacher Straße,Erbacher Straße,0,9001404,9.93984951928,48.3670106241 478 | 900140401,Erbacher Straße,Erbacher Straße,0,9001404,9.93983388889,48.3671238889 479 | 900159402,Firma Seeberger,Firma Seeberger,0,9001594,9.95179305556,48.3592152778 480 | 900196202,"Burlafingen, Dorfplatz",Dorfplatz,0,9001962,10.0681,48.4152633333 481 | 900170007,ZUP,ZUP,0,9001700,10.0033645183,48.3922840909 482 | 9001301,Ottiliengasse,Ottiliengasse,1,,9.95551138889,48.3966844444 483 | 900176902,Reichenberger Straße,Reichenberger Straße,0,9001769,10.01521,48.3689986111 484 | 900131111,Königstraße,Königstraße,0,9001311,9.96123083333,48.3944605556 485 | 9001300,Söflingen,Söflingen,1,,9.95500564155,48.3948493386 486 | 900131112,Königstraße,Königstraße,0,9001311,9.96109037988,48.3945197924 487 | 900132301,Gleißelstetten,Gleißelstetten,0,9001323,9.94797472222,48.3880691667 488 | 900124501,Kliniken Wissenschaftsstadt,Kliniken Wissenschaftsstadt,0,9001245,9.94950638889,48.4234533333 489 | 900124502,Kliniken Wissenschaftsstadt,Kliniken Wissenschaftsstadt,0,9001245,9.95003472222,48.4235488889 490 | 900132302,Gleißelstetten,Gleißelstetten,0,9001323,9.94709583333,48.3877536111 491 | 900135201,Theodor-Heuss-Platz,Theodor-Heuss-Platz,0,9001352,9.96844681403,48.3946701012 492 | 900113101,"Mähringen, Ulmer Steige",Ulmer Steige,0,9001131,9.94406694444,48.4353838889 493 | 9001871,Lessingstraße,Lessingstraße,1,,10.0256,48.3969 494 | 900167204,"Donaustetten, Illerkirchberger Str.",Illerkirchberger Str.,0,9001672,9.93190295138,48.3281559544 495 | 900170501,Amtsgericht,Amtsgericht,0,9001705,9.99372994554,48.3913664017 496 | 900167203,"Donaustetten, Illerkirchberger Str.",Illerkirchberger Str.,0,9001672,9.93195332529,48.3281099032 497 | 9001170,Edith-Stein-Ring,Edith-Stein-Ring,1,,9.99286557963,48.4397694243 498 | 900103101,Frauensteige,Frauensteige,0,9001031,9.99039027003,48.409656455 499 | 900123202,Lehrer Tal,Lehrer Tal,0,9001232,9.97379099135,48.4064681029 500 | 900123201,Lehrer Tal,Lehrer Tal,0,9001232,9.97678081344,48.4066053146 501 | 900105012,Willy-Brandt-Platz,Willy-Brandt-Platz,0,9001050,10.000326512,48.4025973183 502 | 900105011,Willy-Brandt-Platz,Willy-Brandt-Platz,0,9001050,10.0017094441,48.4027036897 503 | 900116702,Donau-Iller-Werkstätten,Donau-Iller-Werkstätten,0,9001167,9.98591111111,48.4469527778 504 | 900116701,Donau-Iller-Werkstätten,Donau-Iller-Werkstätten,0,9001167,9.98461527778,48.4473261111 505 | 9001006,Gänsturm,Gänsturm,1,,10.0009855556,48.3987147222 506 | 9001574,IVECO,IVECO,1,,9.92920539234,48.35964537 507 | 900101002,Theater,Theater,0,9001010,9.98784333333,48.4011683333 508 | 900101003,Theater,Theater,0,9001010,9.98717151987,48.4016255087 509 | 900101004,Theater,Theater,0,9001010,9.98706333333,48.4014022222 510 | 900143102,"Ermingen, Allewind",Allewind,0,9001431,9.89145972222,48.3764644444 511 | 900143101,"Ermingen, Allewind",Allewind,0,9001431,9.8937479127,48.3766009705 512 | 900108712,Egertweg,Egertweg,0,9001087,10.012325834,48.4256026171 513 | 900108711,Egertweg,Egertweg,0,9001087,10.0124314596,48.4258340463 514 | 900107902,Eichenplatz,Eichenplatz,0,9001079,10.0032022222,48.4191294444 515 | 900107901,Eichenplatz,Eichenplatz,0,9001079,10.0041419444,48.4201566667 516 | 900190402,"Offenhausen, Grundweg",Grundweg,0,9001904,10.0233689972,48.4035933224 517 | 900190401,"Offenhausen, Grundweg",Grundweg,0,9001904,10.0228328547,48.4035835209 518 | 900174401,Washingtonallee,Washingtonallee,0,9001744,10.0111294444,48.3798902778 519 | 900154902,Ratiopharm,Ratiopharm,0,9001549,9.93852939873,48.3600745905 520 | 9001052,Donaustadion,Donaustadion,1,,10.006926029,48.4051008226 521 | 9001053,Wohnpark Friedrichsau,Wohnpark Friedrichsau,1,,10.0089784204,48.4084236123 522 | 9001050,Willy-Brandt-Platz,Willy-Brandt-Platz,1,,10.000326512,48.4025973183 523 | 9001051,Staufenring,Staufenring,1,,10.0042073,48.403492429 524 | 900105901,Steinhövelstraße,Steinhövelstraße,0,9001059,10.0051766667,48.4110986111 525 | 9001054,Donauhalle,Donauhalle,1,,10.0112344444,48.4121075 526 | 900105902,Steinhövelstraße,Steinhövelstraße,0,9001059,10.0027597222,48.4096161111 527 | 9001058,Ostplatz,Ostplatz,1,,10.0018527778,48.4057136111 528 | 9001059,Steinhövelstraße,Steinhövelstraße,1,,10.0027597222,48.4096161111 529 | 900116401,Schwarzenbergstraße,Schwarzenbergstraße,0,9001164,9.98693638889,48.4488636111 530 | 900101501,Herdbrücke,Herdbrücke,0,9001015,9.99587202863,48.3965206673 531 | 900135011,Ehinger Tor,Ehinger Tor,0,9001350,9.98108048888,48.3946892647 532 | 900196802,"Burlafingen, Schule",Schule,0,9001968,10.0697605959,48.4120414445 533 | 900135012,Ehinger Tor,Ehinger Tor,0,9001350,9.98100965138,48.3946650882 534 | 900140002,Rathausstraße,Rathausstraße,0,9001400,9.93589861111,48.3718797222 535 | 900140001,Rathausstraße,Rathausstraße,0,9001400,9.93642974077,48.3719114166 536 | 900170502,Amtsgericht,Amtsgericht,0,9001705,9.99491941102,48.3920265606 537 | 9001171,Margarete-Steiff-Weg,Margarete-Steiff-Weg,1,,9.9963755883,48.4413734648 538 | 900122002,Bahnhof Söflingen,Bahnhof Söflingen,0,9001220,9.95906777778,48.4030652778 539 | 900122001,Bahnhof Söflingen,Bahnhof Söflingen,0,9001220,9.95861027778,48.4031027778 540 | 900108002,Eugen-Bolz-Straße,Eugen-Bolz-Straße,0,9001080,10.018511982,48.4211716914 541 | 900108001,Eugen-Bolz-Straße,Eugen-Bolz-Straße,0,9001080,10.0178351523,48.4205068601 542 | 900135102,Blücherstraße,Blücherstraße,0,9001351,9.9736839315,48.3938570147 543 | 900135101,Blücherstraße,Blücherstraße,0,9001351,9.97298422726,48.393850575 544 | 900160101,Oberer Wirt,Oberer Wirt,0,9001601,9.98546972222,48.3558266667 545 | 900160102,Oberer Wirt,Oberer Wirt,0,9001601,9.98638805556,48.3565363889 546 | 900110101,Mähringer Straße,Mähringer Straße,0,9001101,9.96734722222,48.432175 547 | 900116502,Fichtenstraße,Fichtenstraße,0,9001165,9.99082036879,48.4494479065 548 | 900125702,Söflinger Weinberge,Söflinger Weinberge,0,9001257,9.94200555123,48.4122282331 549 | 900104603,Wilhelmsburgkaserne,Wilhelmsburgkaserne,0,9001046,9.98381,48.4180494444 550 | 9001025,Frauenstraße,Frauenstraße,1,,9.99276500394,48.4067645159 551 | 9001020,Karlstraße,Karlstraße,1,,9.98775101227,48.4043652852 552 | 9001240,Universität Süd,Universität Süd,1,,9.95599422615,48.4218187432 553 | 900163401,Tannenplatz Zentrum,Tannenplatz Zentrum,0,9001634,9.97305177338,48.3510214474 554 | 900163402,Tannenplatz Zentrum,Tannenplatz Zentrum,0,9001634,9.9729123332,48.3514827219 555 | 900124602,Universität West,Universität West,0,9001246,9.94733972222,48.4214508333 556 | 900170101,Adenauerbrücke,Adenauerbrücke,0,9001701,9.98855388889,48.3887511111 557 | 900170103,Adenauerbrücke,Adenauerbrücke,0,9001701,9.98958583333,48.3885097222 558 | 9001594,Firma Seeberger,Firma Seeberger,1,,9.95179305556,48.3592152778 559 | 900124601,Universität West,Universität West,0,9001246,9.94696429044,48.4213560144 560 | 9001591,Am Sandhaken,Am Sandhaken,1,,9.96127027778,48.3645494444 561 | 9001590,Kastbrücke,Kastbrücke,1,,9.96269251148,48.3617774966 562 | 9001451,"Harthausen, Kirche",Kirche,1,,9.91417379583,48.3906768206 563 | 900173302,Riedstraße,Riedstraße,0,9001733,10.0099077778,48.3879094444 564 | 900173301,Riedstraße,Riedstraße,0,9001733,10.0102282291,48.3879694159 565 | 900132101,Schongauer Weg,Schongauer Weg,0,9001321,9.94841222222,48.3934766667 566 | 900102001,Karlstraße,Karlstraße,0,9001020,9.98758580726,48.404228829 567 | 900108312,Alfred-Delp-Weg,Alfred-Delp-Weg,0,9001083,10.0132138889,48.423425 568 | 900108311,Alfred-Delp-Weg,Alfred-Delp-Weg,0,9001083,10.0131539729,48.4234821276 569 | 900102002,Karlstraße,Karlstraße,0,9001020,9.98775101227,48.4043652852 570 | 900136601,Beim B'scheid,Beim B'scheid,0,9001366,9.97391066386,48.4018145845 571 | 900136602,Beim B'scheid,Beim B'scheid,0,9001366,9.97413395406,48.4017151758 572 | 900107301,Thüringenweg,Thüringenweg,0,9001073,10.0207188352,48.433487946 573 | 900107302,Thüringenweg,Thüringenweg,0,9001073,10.0200066241,48.4333194643 574 | 9001621,Fischerhauser Weg,Fischerhauser Weg,1,,9.9764650735,48.3605534532 575 | 9001620,Erenlauh,Erenlauh,1,,9.97106682646,48.3585890566 576 | 9001939,"Pfuhl, Trissionplatz",Trissionplatz,1,,10.0330472559,48.4068330489 577 | 9001938,"Pfuhl, Stauffenbergstraße",Stauffenbergstraße,1,,10.0306792512,48.4056831876 578 | 900100101,Steinerne Brücke,Steinerne Brücke,0,9001001,9.98820111111,48.3971741667 579 | 9001934,"Pfuhl, Kirchstraße",Kirchstraße,1,,10.0422013889,48.4078952778 580 | 9001937,"Pfuhl, Platzgasse",Platzgasse,1,,10.0350533333,48.4081933333 581 | 9001936,"Pfuhl, Altes Rathaus",Altes Rathaus,1,,10.0398470447,48.4102186556 582 | 9001933,"Pfuhl, Leipheimer Straße",Leipheimer Straße,1,,10.0468780253,48.4072909187 583 | 900173602,Wiley Club,Wiley Club,0,9001736,10.0077774432,48.3809226844 584 | 900173601,Wiley Club,Wiley Club,0,9001736,10.0077385505,48.3812933755 585 | 9001333,Torstraße,Torstraße,1,,9.95191863516,48.3951680667 586 | 9001332,Maienweg,Maienweg,1,,9.94866416667,48.3896572222 587 | 9001331,Auf der Laue,Auf der Laue,1,,9.94884179721,48.3950423002 588 | 900133101,Auf der Laue,Auf der Laue,0,9001331,9.94815815269,48.394919932 589 | 900133102,Auf der Laue,Auf der Laue,0,9001331,9.94884179721,48.3950423002 590 | 9001232,Lehrer Tal,Lehrer Tal,1,,9.97379099135,48.4064681029 591 | 9001339,Am Roten Berg,Am Roten Berg,1,,9.94046444444,48.4008133333 592 | 9001246,Universität West,Universität West,1,,9.94733972222,48.4214508333 593 | 900165204,"Gögglingen, Hoher Berg",Hoher Berg,0,9001652,9.93918539538,48.3385041572 594 | 900107412,Haslacher Weg,Haslacher Weg,0,9001074,10.0137956697,48.4301167126 595 | 900165203,"Gögglingen, Hoher Berg",Hoher Berg,0,9001652,9.93915034132,48.3387033712 596 | 900176701,Allgäuer Straße,Allgäuer Straße,0,9001767,10.0136081164,48.3639008467 597 | 900176702,Allgäuer Straße,Allgäuer Straße,0,9001767,10.0130763259,48.3638942064 598 | 900101001,Theater,Theater,0,9001010,9.98798937783,48.4011655841 599 | 900100601,Gänsturm,Gänsturm,0,9001006,10.0010308333,48.3988852778 600 | 900100602,Gänsturm,Gänsturm,0,9001006,10.0009855556,48.3987147222 601 | 900103002,Kliniken Michelsberg,Kliniken Michelsberg,0,9001030,9.99227080756,48.4112798567 602 | 900159001,Kastbrücke,Kastbrücke,0,9001590,9.96287966771,48.3619661222 603 | 900159002,Kastbrücke,Kastbrücke,0,9001590,9.96269251148,48.3617774966 604 | 9001528,Gasthof Donautal,Gasthof Donautal,1,,9.95528008464,48.375096512 605 | 900103001,Kliniken Michelsberg,Kliniken Michelsberg,0,9001030,9.99214667144,48.4113492858 606 | 900117301,Auf dem Hart,Auf dem Hart,0,9001173,9.98678250189,48.4389486461 607 | 900117302,Auf dem Hart,Auf dem Hart,0,9001173,9.98758034357,48.4392170356 608 | 9001248,Hochschule Eselsberg,Hochschule Eselsberg,1,,9.93825861111,48.4187294444 609 | 9001247,Manfred-Börner-Straße,Manfred-Börner-Straße,1,,9.94318055556,48.4199694444 610 | 900173901,Donauklinik,Donauklinik,0,9001739,9.99348796068,48.3932697959 611 | 9001245,Kliniken Wissenschaftsstadt,Kliniken Wissenschaftsstadt,1,,9.95003472222,48.4235488889 612 | 9001244,Staudingerstraße,Staudingerstraße,1,,9.95263466339,48.424373648 613 | 9001241,Botanischer Garten,Botanischer Garten,1,,9.95681694444,48.4247744444 614 | 900158601,DEUTZ AG,DEUTZ AG,0,9001586,9.93361926937,48.3616025705 615 | 900150301,Heuweg,Heuweg,0,9001503,9.95201027778,48.3645816667 616 | 900141204,"Einsingen, Ensostraße",Ensostraße,0,9001412,9.90539861111,48.3525736111 617 | 900141203,"Einsingen, Ensostraße",Ensostraße,0,9001412,9.90596222222,48.3525047222 618 | 900158602,DEUTZ AG,DEUTZ AG,0,9001586,9.93283333333,48.3616647222 619 | 900134101,St.-Jakob-Straße,St.-Jakob-Straße,0,9001341,9.94929861111,48.4008497222 620 | 900134102,St.-Jakob-Straße,St.-Jakob-Straße,0,9001341,9.95007625206,48.4004850973 621 | 900150302,Heuweg,Heuweg,0,9001503,9.95211722222,48.3648516667 622 | 900157402,IVECO,IVECO,0,9001574,9.92920539234,48.35964537 623 | 900157401,IVECO,IVECO,0,9001574,9.92957083333,48.3598280556 624 | 900152801,Gasthof Donautal,Gasthof Donautal,0,9001528,9.95576217269,48.3750625901 625 | 900152802,Gasthof Donautal,Gasthof Donautal,0,9001528,9.95528008464,48.375096512 626 | 900171002,Rathaus Neu-Ulm,Rathaus Neu-Ulm,0,9001710,10.000725,48.3950422222 627 | 900171001,Rathaus Neu-Ulm,Rathaus Neu-Ulm,0,9001710,10.00067917,48.3951289216 628 | 900125502,Heilmeyersteige,Heilmeyersteige,0,9001255,9.95074722809,48.4135118652 629 | 9002763,"Arnegg, Bildstöckle",Bildstöckle,1,,9.8743,48.4133777778 630 | 900150201,Daimlerstraße,Daimlerstraße,0,9001502,9.95298194444,48.3671175 631 | 900150202,Daimlerstraße,Daimlerstraße,0,9001502,9.9527225,48.3664561111 632 | 9001729,Meininger Allee,Meininger Allee,1,,10.0084520807,48.3948874315 633 | 9001412,"Einsingen, Ensostraße",Ensostraße,1,,9.90539861111,48.3525736111 634 | 9001413,"Einsingen, Hirsch",Hirsch,1,,9.90016222222,48.3528394444 635 | 9001414,"Einsingen, Kirche",Kirche,1,,9.89498611111,48.3543452778 636 | 9002761,"Arnegg, Gasthof Blautal",Gasthof Blautal,1,,9.8797309517,48.4154131788 637 | 9001061,Albecker Steige,Albecker Steige,1,,10.0038788889,48.4140025 638 | 9001060,Safranberg,Safranberg,1,,10.0017741667,48.4129013889 639 | 900120202,Multscherschule,Multscherschule,0,9001202,9.96772277778,48.4085138889 640 | 900120201,Multscherschule,Multscherschule,0,9001202,9.96774222222,48.4086658333 641 | 900100502,Haus der Begegnung,Haus der Begegnung,0,9001005,9.99824719008,48.3976644802 642 | 900155501,Firma Wieland,Firma Wieland,0,9001555,9.94512388889,48.3561608333 643 | 900155502,Firma Wieland,Firma Wieland,0,9001555,9.94423055556,48.3565972222 644 | 900100501,Haus der Begegnung,Haus der Begegnung,0,9001005,9.99810779209,48.39774424 645 | 9001225,Bleicher Hag,Bleicher Hag,1,,9.97187972222,48.4060236111 646 | 900104801,Örlinger Straße,Örlinger Straße,0,9001048,10.0016213889,48.4087463889 647 | 900100811,Hauptbahnhof,Hauptbahnhof,0,9001008,9.98422768554,48.3993311097 648 | 900100812,Hauptbahnhof,Hauptbahnhof,0,9001008,9.98416128745,48.3993656011 649 | 900130001,Söflingen,Söflingen,0,9001300,9.95500564155,48.3948493386 650 | 900130002,Söflingen,Söflingen,0,9001300,9.95512533575,48.3949750652 651 | 900107001,Ostpreußenweg,Ostpreußenweg,0,9001070,10.030616941,48.4341552953 652 | 900125802,Sonnenfeld,Sonnenfeld,0,9001258,9.93726861111,48.4141425 653 | 9001297,Sulzbachweg,Sulzbachweg,1,,9.95966484134,48.3889319114 654 | 900134202,Clarissenstraße,Clarissenstraße,0,9001342,9.95335416667,48.3988663889 655 | 900105311,Wohnpark Friedrichsau,Wohnpark Friedrichsau,0,9001053,10.0089967551,48.4085071475 656 | 900105312,Wohnpark Friedrichsau,Wohnpark Friedrichsau,0,9001053,10.0089784204,48.4084236123 657 | 900134201,Clarissenstraße,Clarissenstraße,0,9001342,9.9532925,48.3989511111 658 | 900150701,Boschstraße,Boschstraße,0,9001507,9.95389611111,48.3701791667 659 | 900193401,"Pfuhl, Kirchstraße",Kirchstraße,0,9001934,10.0422013889,48.4078952778 660 | 900150702,Boschstraße,Boschstraße,0,9001507,9.95438944444,48.3711908333 661 | 9002728,"Herrlingen, Bahnhof",Bahnhof,1,,9.89788886521,48.4183524772 662 | 9001222,Beringerbrücke,Beringerbrücke,1,,9.96633590244,48.4046054226 663 | 900139104,Oberer Kuhberg,Oberer Kuhberg,0,9001391,9.95300833333,48.3818425 664 | 9001708,Petrusplatz,Petrusplatz,1,,9.99827484398,48.3945860356 665 | 9001706,Schützenstraße,Schützenstraße,1,,9.9974875,48.3936061111 666 | 9001707,Donaucenter,Donaucenter,1,,9.99717743073,48.394403149 667 | 9001704,Illerbrücke,Illerbrücke,1,,9.98958527778,48.3727016667 668 | 9001705,Amtsgericht,Amtsgericht,1,,9.99491941102,48.3920265606 669 | 9001702,Donaubad,Donaubad,1,,9.98689277778,48.3850519444 670 | 9001703,Jakobsruhe,Jakobsruhe,1,,9.98946910199,48.3818580858 671 | 9001700,ZUP,ZUP,1,,10.0028572149,48.392008323 672 | 9001701,Adenauerbrücke,Adenauerbrücke,1,,9.98958583333,48.3885097222 673 | 9001030,Kliniken Michelsberg,Kliniken Michelsberg,1,,9.99227080756,48.4112798567 674 | 900100401,Pauluskirche,Pauluskirche,0,9001004,9.99503440349,48.404748323 675 | 900170801,Petrusplatz,Petrusplatz,0,9001708,9.99810166998,48.3947175995 676 | 900170802,Petrusplatz,Petrusplatz,0,9001708,9.99827484398,48.3945860356 677 | 900170701,Donaucenter,Donaucenter,0,9001707,9.99717743073,48.394403149 678 | 900131102,Königstraße,Königstraße,0,9001311,9.96109037988,48.3945197924 679 | 900124101,Botanischer Garten,Botanischer Garten,0,9001241,9.95678916667,48.4249044444 680 | 900124102,Botanischer Garten,Botanischer Garten,0,9001241,9.95681694444,48.4247744444 681 | 9001745,Arena,Arena,1,,10.0056492694,48.3816857417 682 | 900155001,Firma Nanz,Firma Nanz,0,9001550,9.94379305556,48.3672063889 683 | 900276301,"Arnegg, Bildstöckle",Bildstöckle,0,9002763,9.8743,48.4133777778 684 | 900155002,Firma Nanz,Firma Nanz,0,9001550,9.94381888889,48.3671463889 685 | 900117001,Edith-Stein-Ring,Edith-Stein-Ring,0,9001170,9.99375535756,48.4400048383 686 | 9001349,Jägerstraße,Jägerstraße,1,,9.9555025,48.4001313889 687 | 900135501,Beyerstraße (nur Pausenhaltestelle),Beyerstraße (nur Pausenhaltestelle),0,9001355,9.97832916667,48.3929661111 688 | 9001964,"Burlafingen, Glöcklerstraße",Glöcklerstraße,1,,10.0651931471,48.4164232563 689 | 9001962,"Burlafingen, Dorfplatz",Dorfplatz,1,,10.0681,48.4152633333 690 | 900125501,Heilmeyersteige,Heilmeyersteige,0,9001255,9.95005417157,48.4138677774 691 | 9001961,"Burlafingen, Bahnhof",Bahnhof,1,,10.0691028372,48.4107661706 692 | 900105412,Donauhalle,Donauhalle,0,9001054,10.0112344444,48.4121075 693 | 900105411,Donauhalle,Donauhalle,0,9001054,10.0112470497,48.4121363091 694 | 9001101,Mähringer Straße,Mähringer Straße,1,,9.96734722222,48.432175 695 | 900272001,"Blaustein, Lindenstraße",Lindenstraße,0,9002720,9.93493083888,48.4085320184 696 | 900162102,Fischerhauser Weg,Fischerhauser Weg,0,9001621,9.9764650735,48.3605534532 697 | 900162101,Fischerhauser Weg,Fischerhauser Weg,0,9001621,9.97653053476,48.3604155109 698 | 9001202,Multscherschule,Multscherschule,1,,9.96772277778,48.4085138889 699 | 9001201,Fort Unterer Eselsberg,Fort Unterer Eselsberg,1,,9.96552972222,48.4114205556 700 | 9001200,Eselsberg Hasenkopf,Eselsberg Hasenkopf,1,,9.96284301666,48.4145314156 701 | 900156101,Graf-Arco-Straße,Graf-Arco-Straße,0,9001561,9.94257055556,48.3583911111 702 | 900105001,Willy-Brandt-Platz,Willy-Brandt-Platz,0,9001050,10.0017094441,48.4027036897 703 | 900156103,Graf-Arco-Straße,Graf-Arco-Straße,0,9001561,9.94152636748,48.3582871432 704 | 900156102,Graf-Arco-Straße,Graf-Arco-Straße,0,9001561,9.94244166667,48.3576583333 705 | 9001561,Graf-Arco-Straße,Graf-Arco-Straße,1,,9.94152636748,48.3582871432 706 | 9001310,Sonnenstraße,Sonnenstraße,1,,9.95846507487,48.3946647344 707 | 900132401,Fünf-Bäume-Weg Mitte,Fünf-Bäume-Weg Mitte,0,9001324,9.94501972222,48.3965033333 708 | 900124401,Staudingerstraße,Staudingerstraße,0,9001244,9.95284805556,48.4245283333 709 | 900124402,Staudingerstraße,Staudingerstraße,0,9001244,9.95263466339,48.424373648 710 | 9001032,Schillerhöhe,Schillerhöhe,1,,9.9881313682,48.4077159753 711 | 9001366,Beim B'scheid,Beim B'scheid,1,,9.97413395406,48.4017151758 712 | 9001367,Auf der Gölde,Auf der Gölde,1,,9.9668075,48.4004272222 713 | 9001360,Römerplatz,Römerplatz,1,,9.97428388889,48.3902127778 714 | 9001362,Telefunken,Telefunken,1,,9.9701575,48.3951027778 715 | 900128001,Beim Türmle,Beim Türmle,0,9001280,9.95656111111,48.40651 716 | 900128002,Beim Türmle,Beim Türmle,0,9001280,9.95646944444,48.40655 717 | 900170202,Donaubad,Donaubad,0,9001702,9.98689277778,48.3850519444 718 | 900170201,Donaubad,Donaubad,0,9001702,9.98698694444,48.3852841667 719 | 900172701,Wiley Süd,Wiley Süd,0,9001727,10.0106088448,48.3769448406 720 | 900124001,Universität Süd,Universität Süd,0,9001240,9.95633969174,48.4211654151 721 | 900103201,Schillerhöhe,Schillerhöhe,0,9001032,9.98894972222,48.4081488889 722 | 900103202,Schillerhöhe,Schillerhöhe,0,9001032,9.9881313682,48.4077159753 723 | 9002710,"Blaustein, Hofstraße",Hofstraße,1,,9.92247083333,48.4151611111 724 | 900135004,Ehinger Tor,Ehinger Tor,0,9001350,9.9804813997,48.3945805556 725 | 900135003,Ehinger Tor,Ehinger Tor,0,9001350,9.98118019801,48.3947163025 726 | 900135002,Ehinger Tor,Ehinger Tor,0,9001350,9.98100965138,48.3946650882 727 | 900135001,Ehinger Tor,Ehinger Tor,0,9001350,9.98108048888,48.3946892647 728 | 900110302,Junginger Straße,Junginger Straße,0,9001103,9.97168777103,48.4361622923 729 | 9002720,"Blaustein, Lindenstraße",Lindenstraße,1,,9.93493083888,48.4085320184 730 | 900116402,Schwarzenbergstraße,Schwarzenbergstraße,0,9001164,9.98581861111,48.44872 731 | 900101101,Justizgebäude,Justizgebäude,0,9001011,9.99294333333,48.4019483333 732 | 900101103,Justizgebäude,Justizgebäude,0,9001011,9.99209778651,48.4019629061 733 | 900101102,Justizgebäude,Justizgebäude,0,9001011,9.99283222222,48.4019797222 734 | 9001005,Haus der Begegnung,Haus der Begegnung,1,,9.99824719008,48.3976644802 735 | 9001102,Loherstraße,Loherstraße,1,,9.96869985673,48.4327460567 736 | 9001103,Junginger Straße,Junginger Straße,1,,9.97168777103,48.4361622923 737 | 900143201,"Ermingen, Panoramastraße",Panoramastraße,0,9001432,9.89622861111,48.3781341667 738 | 900143202,"Ermingen, Panoramastraße",Panoramastraße,0,9001432,9.89662314096,48.377553572 739 | 9001299,Sedanstraße,Sedanstraße,1,,9.96027867496,48.3921446118 740 | 900196402,"Burlafingen, Glöcklerstraße",Glöcklerstraße,0,9001964,10.0651931471,48.4164232563 741 | 900270401,"Blaustein, Kalte Herberge",Kalte Herberge,0,9002704,9.90887976067,48.4182914634 742 | 900108011,Eugen-Bolz-Straße,Eugen-Bolz-Straße,0,9001080,10.0174694444,48.4201075 743 | 900108012,Eugen-Bolz-Straße,Eugen-Bolz-Straße,0,9001080,10.0173578287,48.4200736483 744 | 900270402,"Blaustein, Kalte Herberge",Kalte Herberge,0,9002704,9.90803315608,48.4185365488 745 | 900154802,Firma Meiller,Firma Meiller,0,9001548,9.9361125,48.3615183333 746 | 9001296,Neunkirchenweg,Neunkirchenweg,1,,9.95987985727,48.3863216682 747 | 900154801,Firma Meiller,Firma Meiller,0,9001548,9.93624638889,48.3613138889 748 | 900172402,Memminger Straße,Memminger Straße,0,9001724,10.0037581794,48.3853376057 749 | 900170001,ZUP,ZUP,0,9001700,10.0036261596,48.3920286204 750 | 900172401,Memminger Straße,Memminger Straße,0,9001724,10.0041316667,48.3850272222 751 | 900150402,Maybachstraße,Maybachstraße,0,9001504,9.94627527778,48.3612808333 752 | 900150401,Maybachstraße,Maybachstraße,0,9001504,9.94677861111,48.3615141667 753 | 900135312,Magirusstraße,Magirusstraße,0,9001353,9.96467475962,48.3944497235 754 | 900135311,Magirusstraße,Magirusstraße,0,9001353,9.96387702515,48.3944323771 755 | 9001743,Neue Hochschule,Neue Hochschule,1,,10.0091933333,48.3795605556 756 | 9001741,Fachoberschule,Fachoberschule,1,,10.0026066667,48.3881125 757 | 900105211,Donaustadion,Donaustadion,0,9001052,10.0076333333,48.4049875 758 | 9001031,Frauensteige,Frauensteige,1,,9.99039027003,48.409656455 759 | 900105213,Donaustadion,Donaustadion,0,9001052,10.006926029,48.4051008226 760 | 900105212,Donaustadion,Donaustadion,0,9001052,10.0074894444,48.4049786111 761 | 900101202,Keplerstraße,Keplerstraße,0,9001012,9.992616374,48.4055853947 762 | 900117102,Margarete-Steiff-Weg,Margarete-Steiff-Weg,0,9001171,9.9963755883,48.4413734648 763 | 900170601,Schützenstraße,Schützenstraße,0,9001706,9.9974875,48.3936061111 764 | 900174101,Fachoberschule,Fachoberschule,0,9001741,10.0027861111,48.3881705556 765 | 9001039,Kienlesberg,Kienlesberg,1,,9.98336777778,48.4058161111 766 | 900174102,Fachoberschule,Fachoberschule,0,9001741,10.0026066667,48.3881125 767 | 9001586,DEUTZ AG,DEUTZ AG,1,,9.93283333333,48.3616647222 768 | 900153902,Ernst-Abbe-Straße,Ernst-Abbe-Straße,0,9001539,9.92857846657,48.3528266438 769 | 900153901,Ernst-Abbe-Straße,Ernst-Abbe-Straße,0,9001539,9.92882141597,48.3526277581 770 | 9001422,"Eggingen, Rathaus",Rathaus,1,,9.8788375,48.3639183333 771 | 9001421,"Eggingen, Ringinger Straße",Ringinger Straße,1,,9.87965361111,48.3612286111 772 | 900107801,Ludwig-Beck-Straße,Ludwig-Beck-Straße,0,9001078,10.0071415353,48.4221849127 773 | 900140301,Eisenbahnstraße,Eisenbahnstraße,0,9001403,9.93699163863,48.3704062098 774 | 900140302,Eisenbahnstraße,Eisenbahnstraße,0,9001403,9.93708611111,48.3701763889 775 | -------------------------------------------------------------------------------- /lib/event-simulator/event-sim-tester.js: -------------------------------------------------------------------------------- 1 | var events= require("./event-simulator.js"); 2 | events.init(7, function(step) { 3 | console.log(step) 4 | }); -------------------------------------------------------------------------------- /lib/event-simulator/event-simulator.js: -------------------------------------------------------------------------------- 1 | module.exports = (function(){ 2 | 3 | var progress = 0; 4 | var direction = 1; 5 | 6 | function nextStep(speed, callback) { 7 | progress = progress + (direction*speed*0.1); // x0.1 every 10s 8 | 9 | if (progress >= 100) { 10 | progress = 100; 11 | direction = -1; 12 | } 13 | if (progress <= 0) { 14 | progress = 0; 15 | direction = 1; 16 | } 17 | callback({ 18 | progress : progress, 19 | timestamp : (new Date()).getTime(), 20 | trip_id : 1 21 | }); 22 | } 23 | 24 | return { 25 | init : function(speedValue, cb) { 26 | // speed: 10.000m == 100% 27 | // 100m == 1% 28 | // 100m/10s = 10m/s 29 | // speed in m/s 30 | 31 | nextStep(speedValue, cb); 32 | setInterval(function(){ 33 | nextStep(speedValue, cb); 34 | }, 10000); 35 | } 36 | }; 37 | 38 | 39 | 40 | })(); 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /lib/gtfs-parser/barrier-points.js: -------------------------------------------------------------------------------- 1 | module.exports = function(parties, barrierCallback, abortCallback) { 2 | var running = true; 3 | var count = 0; 4 | 5 | var successCallback = barrierCallback || function() { 6 | }; 7 | 8 | var cancelCallback = abortCallback || function() { 9 | }; 10 | 11 | return { 12 | "submit" : function() { 13 | if (++count === parties && running) { 14 | successCallback(); 15 | } 16 | }, 17 | "abort" : function(customAbortCallback) { 18 | if (running && customAbortCallback) { 19 | customAbortCallback(); 20 | } 21 | else if (running && cancelCallback) { 22 | cancelCallback(); 23 | } 24 | running = false; 25 | } 26 | }; 27 | }; 28 | -------------------------------------------------------------------------------- /lib/gtfs-parser/csv-loader.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"); 2 | 3 | module.exports = (function(){ 4 | 5 | var load = function(filename, cb) { 6 | 7 | fs.readFile(filename, "utf8", function(err, data) { 8 | //console.log(filename); 9 | //console.log(data); 10 | 11 | data = data.replace(/\"+/g, ""); 12 | data = data.replace(/\r|\t/g, ""); 13 | 14 | var lines = data.split("\n"); 15 | var cols = lines[0].split(","); 16 | lines.shift(); 17 | 18 | var data = []; 19 | for (var line in lines) { 20 | var fields = lines[line].split(","); 21 | var entry = {}; 22 | var pushIt = false; 23 | for (var i = 0; i < fields.length; i++) { 24 | var val = fields[i]; 25 | if (!cols[i]) continue; 26 | var key= cols[i].replace(/\s+/g,""); 27 | if (key.length > 0 && val.length > 0) { 28 | entry[key] = val; 29 | pushIt = true; 30 | } 31 | } 32 | if (pushIt) data.push(entry); 33 | } 34 | 35 | cb(data); 36 | }); 37 | }; 38 | 39 | return { 40 | load : load 41 | }; 42 | })(); 43 | -------------------------------------------------------------------------------- /lib/gtfs-parser/csv-test.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var csv = require("./csv-loader.js"); 3 | 4 | csv.load(path.join(__dirname, "..", "..", "gtfs","ulm","stops.txt"), function(data) { 5 | console.log(data); 6 | console.log(JSON.stringify(data)); 7 | }); 8 | -------------------------------------------------------------------------------- /lib/gtfs-parser/gtfs-loader.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | var csv = require(path.join(__dirname, "csv-loader")); 3 | var Barrier = require(path.join(__dirname, "barrier-points")); 4 | 5 | module.exports = function(dir, cb){ 6 | 7 | var dataset = {}; 8 | 9 | var barrier = new Barrier(7, function() { 10 | cb({ 11 | getAgency : function () { 12 | return dataset.agency; 13 | }, 14 | getCalendars : function () { 15 | return dataset.calendar; 16 | }, 17 | getRoutes : function () { 18 | return dataset.routes; 19 | }, 20 | getShapes : function () { 21 | return dataset.shapes; 22 | }, 23 | getStops : function () { 24 | return dataset.stops; 25 | }, 26 | getStopTimes : function () { 27 | return dataset.stop_times; 28 | }, 29 | getTrips : function () { 30 | return dataset.trips; 31 | }, 32 | getRouteById : function(id) { 33 | for (var route in dataset.routes) { 34 | if (dataset.routes[route].route_id == id) return dataset.routes[route]; 35 | } 36 | }, 37 | getTripById : function(id) { 38 | for (var trip in dataset.trips) { 39 | if (dataset.trips[trip].trip_id == id) return dataset.trips[trip]; 40 | } 41 | }, 42 | getShapesById : function(id) { 43 | var ret = []; 44 | for (var i in dataset.shapes) { 45 | if (dataset.shapes[i].shape_id == id) ret.push(dataset.shapes[i]); 46 | } 47 | return ret; 48 | }, 49 | getCalendarById : function(id) { 50 | for (var cal in dataset.calendar) { 51 | if (dataset.calendar[cal].service_id == id){ 52 | return dataset.calendar[cal]; 53 | } 54 | } 55 | }, 56 | getStopById : function(id) { 57 | for (var stop in stops) { 58 | if (stops[stop].stop_id == id) { 59 | return stops[stop]; 60 | } 61 | } 62 | }, 63 | getStopTimeById : function(trip_id,stop_id) { 64 | for (var stop_time in stop_times){ 65 | if (stop_times[stop_time].trip_id == trip_id && stop_times[stop_time].stop_id == stop_id){ 66 | return stop_times[stop_time]; 67 | } 68 | } 69 | } 70 | }); 71 | }); 72 | 73 | var dataset = {}; 74 | 75 | ['agency', 'calendar', 'routes', 'shapes', 'stops', 'stop_times', 'trips'].forEach(function(id){ 76 | csv.load(path.join(dir, id+".txt"), function(data) { 77 | dataset[id] = data; 78 | barrier.submit(); 79 | }); 80 | }); 81 | 82 | }; 83 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /lib/gtfs-parser/gtfs-test.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | //var Gtfs = require(path.join(__dirname, "gtfs-parser", "gtfs-loader")); 3 | var Gtfs = require(path.join(__dirname, "..", "gtfs-parser", "gtfs-loader")); 4 | 5 | dir = "../../gtfs/ulm/"; 6 | var gtfs = Gtfs(dir, function(data) { 7 | console.log(data); 8 | }); -------------------------------------------------------------------------------- /lib/gtfs-parser/gtfs-timetable-parser.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | 3 | var Gtfs = require(path.join(__dirname, "..", "gtfs-parser", "gtfs-loader")); 4 | 5 | 6 | 7 | 8 | 9 | module.exports = (function(){ 10 | var stopTimes; 11 | var date; 12 | var trips; // holds all the trips with the calculated start/end points and the duration 13 | var gtfs; 14 | 15 | 16 | // returns a array with *current* trips with progressNow and progressThen at a given time (only ms since midnight are used) 17 | // delta: delta T in ms between Now and Then 18 | var calculateTripProgess = function(time, delta) { 19 | time = (time.getHours()*60*60 + time.getMinutes()*60 + time.getSeconds())*1000; 20 | var progressThen, startTime,endTime, timeShifted, tripFits; 21 | var tripsProgress = {}; 22 | // if time <6, check if there are lines after 23:59 23 | if (time < 6*60*60*1000) { 24 | timeShifted = parseInt(time + 24*60*60*1000,10); 25 | } else { 26 | timeShifted = false; 27 | } 28 | 29 | for (var i in trips) { 30 | startTime = parseInt(trips[i][trips[i].start].arrivalTime,10); 31 | endTime = parseInt(trips[i][trips[i].end].arrivalTime,10); 32 | //console.log("tripid: "+trips[i][0].trip_id+" start: "+startTime+" end: "+endTime+" time " + time ) 33 | 34 | // if time<6h, timeShifted + 24h and check if trip fits 35 | if (timeShifted) { 36 | if (startTime < timeShifted && timeShifted < endTime) { 37 | tripFits = true; 38 | //console.log("tripid: "+trips[i][0].trip_id+" start: "+startTime+" end: "+endTime+ " timestampshifted "+timeShifted+" duration "+trips[i].duration+" => fits: "+tripFits) 39 | } else { 40 | tripFits = false; 41 | } 42 | } 43 | if ((startTime < time && time < endTime) || tripFits) { 44 | // trip is running at given timen, calculate progesses 45 | if (!tripsProgress[trips[i][0].trip_id]) tripsProgress[trips[i][0].trip_id] = {}; 46 | if (tripFits) { // use the shifted time if the trip is after 24h 47 | tripsProgress[trips[i][0].trip_id].progressNow = (timeShifted-startTime)/trips[i].duration; 48 | progressThen = (timeShifted+delta-startTime)/trips[i].duration; 49 | } else { 50 | tripsProgress[trips[i][0].trip_id].progressNow = (time-startTime)/trips[i].duration; 51 | progressThen = (time+delta-startTime)/trips[i].duration; 52 | } 53 | if (progressThen > 1) progressThen = 1; 54 | tripsProgress[trips[i][0].trip_id].progressThen = progressThen; 55 | // invert all progresses if direction bit is set 56 | if (gtfs.getTripById(trips[i][0].trip_id).direction_id==1) { 57 | tripsProgress[trips[i][0].trip_id].progressNow = 1-tripsProgress[trips[i][0].trip_id].progressNow; 58 | tripsProgress[trips[i][0].trip_id].progressThen = 1-tripsProgress[trips[i][0].trip_id].progressThen; 59 | } 60 | } 61 | } 62 | console.log(tripsProgress); 63 | return tripsProgress; 64 | }; 65 | 66 | // 1. convert all arrival_time (hh:mm:ss) to arrivalTime (ms since 00:00), use dd-mm-yyyy from parameter "datestamp" 67 | // 2. find the start and end point index, saved in .end and .start 68 | var convertArrivalTimes = function (datestamp) { 69 | var day = datestamp.getDate(); 70 | var month = datestamp.getMonth()+1; 71 | var year = datestamp.getYear()+1900; 72 | var dateString = month+" "+day+", "+year+" "; 73 | dateString = "0 0, 0 "; 74 | var arrivalTime; 75 | var tripsWithDates = {}; // return array 76 | 77 | 78 | // convert the dates and gather the stoptimes for one tripid 79 | for (var i in stopTimes) { 80 | // get the Time 81 | var arrival_time = stopTimes[i].arrival_time; 82 | if (!arrival_time) continue; 83 | var arrivelTimeSplited = arrival_time.split(":"); 84 | 85 | arrivalTime = (arrivelTimeSplited[0] * 60 * 60 + arrivelTimeSplited[1] * 60 + arrivelTimeSplited[2]*1)*1000; 86 | //console.log (arrivelTimeSplited[0] + ":"+arrivelTimeSplited[1]+":"+arrivelTimeSplited[2]+"=>"+arrivalTime); 87 | stopTimes[i].arrivalTime = arrivalTime; 88 | 89 | // gather the stoptimes for one tripid 90 | if (!tripsWithDates[stopTimes[i].trip_id]) { 91 | tripsWithDates[stopTimes[i].trip_id] = []; 92 | } 93 | tripsWithDates[stopTimes[i].trip_id].push(stopTimes[i]); 94 | } 95 | 96 | for (var i in tripsWithDates) { 97 | var maxVal = -1; 98 | var minVal = 10000000; 99 | var min, max; 100 | for (var ii in tripsWithDates[i]) { 101 | //search the min stop_sequence 102 | if (tripsWithDates[i][ii].stop_sequence < minVal*1) { 103 | min = ii; 104 | minVal = tripsWithDates[i][ii].stop_sequence; 105 | } 106 | //search the max stop_sequence 107 | if (tripsWithDates[i][ii].stop_sequence > maxVal*1) { 108 | max = ii; 109 | maxVal = tripsWithDates[i][ii].stop_sequence; 110 | 111 | } 112 | } 113 | tripsWithDates[i].start = min; 114 | tripsWithDates[i].end = max; 115 | // how long is the trip: 116 | tripsWithDates[i].duration = tripsWithDates[i][max].arrivalTime-tripsWithDates[i][min].arrivalTime; 117 | } 118 | return tripsWithDates; 119 | } 120 | 121 | 122 | function nextStep( callback) { 123 | callback({ 124 | trips : calculateTripProgess((new Date()), 10000), 125 | timestamp : (new Date()).getTime(), 126 | }); 127 | } 128 | 129 | return { 130 | init : function(gtfsObject, intervall, cb) { 131 | gtfs = gtfsObject; // we need this later 132 | stopTimes = gtfs.getStopTimes(); 133 | date = new Date(); 134 | trips = convertArrivalTimes(date); 135 | //console.log(trips); 136 | 137 | nextStep(cb); 138 | setInterval(function(){ 139 | nextStep(cb); 140 | }, intervall); 141 | } 142 | }; 143 | 144 | 145 | 146 | 147 | 148 | 149 | return { 150 | init : init, 151 | getCurrentTripsProgress : getCurrentTripsProgress 152 | }; 153 | })(); 154 | -------------------------------------------------------------------------------- /lib/gtfs-parser/parser.js: -------------------------------------------------------------------------------- 1 | var gtfs = require("./gtfs-loader"); 2 | 3 | gtfs.load(); 4 | console.log(gtfs.getRouteById(87001)); 5 | -------------------------------------------------------------------------------- /lib/map-data-generator/map-data-generator.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | 3 | var Gtfs = require(path.join(__dirname, "..", "gtfs-parser", "gtfs-loader")); 4 | 5 | module.exports = (function(){ 6 | 7 | /* get all stops that are contained within the trips 8 | @return: { 'stop_id' :true, ... } */ 9 | var getAllValidStops = function(stopTimes, trips) { 10 | var result = {}; 11 | var isInTrips = function(trip_id) { 12 | for (var i in trips) { 13 | if (trips[i].trip_id == trip_id) 14 | return true; 15 | } 16 | return false; 17 | } 18 | 19 | for (var i in stopTimes) { 20 | if (isInTrips(stopTimes[i].trip_id)) 21 | result[stopTimes[i].stop_id] = true; 22 | } 23 | 24 | return result; 25 | }; 26 | 27 | /* creates a fast lookup table for getting shapes from trip ids. 28 | * 29 | * shapes: {"87001":{"type":"LineString","coordinates":[[9.954786,48.394874], ... ] } 30 | * trips: [{"route_id":"87001","service_id":"weekdays","trip_id":"87001w001","trip_headsign":"Böfingen","direction_id":"0","shape_id":"87001"}, 31 | */ 32 | var lookupTbl = {}; 33 | var createFastLookupTable = function(shapes, trips) { 34 | for (var i in trips) { 35 | for (var j in shapes) { 36 | if (trips[i].shape_id == j) 37 | lookupTbl[trips[i].trip_id] = {shape_id: j, shape: shapes[j]}; 38 | } 39 | } 40 | } 41 | 42 | var getShapeIdFromTripId = function(trip_id){ 43 | if (lookupTbl[trip_id]) 44 | return lookupTbl[trip_id].shape_id; 45 | else 46 | return undefined; 47 | }; 48 | 49 | /* @return: { type: 'LineString', coordinates: [ [ 9.954786, 48.394874 ], ... ] */ 50 | var getShapeFromTripId = function(trip_id){ 51 | return lookupTbl[trip_id].shape; 52 | }; 53 | 54 | /* all initial stuff should be done here, this function gets invoked on app startup */ 55 | var gen = function(gtfs, dir, cb) { 56 | var mapData = {}; 57 | mapData['stops'] = {}; 58 | mapData['stops'].type = "FeatureCollection"; 59 | mapData['stops'].features = []; 60 | mapData['shapes'] = {}; 61 | mapData['trips'] = {}; 62 | 63 | /* GeoJSON format: 64 | { "type": "FeatureCollection", 65 | "features": [ 66 | { "type": "Feature", 67 | "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, 68 | "properties": {"prop0": "value0"} // name etc 69 | */ 70 | 71 | // transform all stops to GeoJSON 72 | var stops = gtfs.getStops(); 73 | for (var i in stops) { 74 | var point = {}; 75 | point.type = "Feature"; 76 | point.geometry = {}; 77 | point.geometry.type = "Point"; 78 | point.geometry.coordinates = [stops[i].stop_lon,stops[i].stop_lat]; 79 | point.properties = {}; 80 | point.properties.stop_name = stops[i].stop_name; 81 | point.properties.stop_longname = stops[i].stop_code; 82 | point.properties.stop_id = stops[i].stop_id; 83 | mapData['stops'].features.push(point); 84 | } 85 | 86 | /* now eliminiate all stops which are not contained within a trip */ 87 | var trips = gtfs.getTrips(); 88 | var allValidStops = getAllValidStops(gtfs.getStopTimes(), trips); 89 | var clear = []; 90 | 91 | for (var o in mapData['stops'].features) { 92 | if (allValidStops[ mapData['stops'].features[o].properties.stop_id ] === true) 93 | clear.push(mapData['stops'].features[o]) 94 | } 95 | mapData['stops'].features = clear; 96 | 97 | 98 | // collect all shapes and transform to GeoJSON 99 | // todo: use the right GeoJSON format 100 | var shapes = gtfs.getShapes(); 101 | var coords = {}; 102 | for (var i in shapes) { // extract lon&lat 103 | shape_id = shapes[i].shape_id; 104 | 105 | // new shape id 106 | if (!coords[shape_id]){ 107 | coords[shape_id] = {}; 108 | coords[shape_id].type = "LineString"; 109 | coords[shape_id].coordinates = []; 110 | } 111 | // insert the coords, one pair of coords 112 | var coord = [parseFloat(shapes[i].shape_pt_lon),parseFloat(shapes[i].shape_pt_lat)]; 113 | coords[shape_id].coordinates.push(coord); // push the pair 114 | } 115 | mapData['shapes'] = coords; 116 | 117 | createFastLookupTable(mapData['shapes'], trips); 118 | 119 | 120 | 121 | // gather tripdata for the client 122 | var route; 123 | for (var i in trips) { 124 | if (!mapData['trips'][trips[i].trip_id]) mapData['trips'][trips[i].trip_id] = {}; 125 | //headsign: 126 | mapData['trips'][trips[i].trip_id].trip_headsign = trips[i].trip_headsign; 127 | 128 | // route stuff 129 | route = gtfs.getRouteById(trips[i].route_id); 130 | mapData['trips'][trips[i].trip_id].route_type = route.route_type; 131 | mapData['trips'][trips[i].trip_id].route_short_name = route.route_short_name; 132 | mapData['trips'][trips[i].trip_id].route_long_name = route.route_long_name; 133 | } 134 | 135 | cb({ 136 | gen : gen, 137 | getStops : function() { 138 | return mapData['stops']; 139 | }, 140 | getShapes : function() { 141 | return mapData['shapes']; 142 | }, 143 | getTrips : function() { 144 | return mapData['trips']; 145 | }, 146 | getShapeIdFromTripId : getShapeIdFromTripId, 147 | getShapeFromTripId : getShapeFromTripId 148 | }); 149 | }; 150 | 151 | return { 152 | gen:gen 153 | }; 154 | })(); 155 | -------------------------------------------------------------------------------- /lib/map-data-generator/map-data-tester.js: -------------------------------------------------------------------------------- 1 | var mapData = require("./map-data-generator.js"); 2 | 3 | mapData.gen("../../gtfs/sf/", function(mapData) { 4 | // console.log(mapData); 5 | // console.log(JSON.stringify(mapData.getStops())); 6 | var trip_id = "01SFO1"; 7 | console.log(mapData.getShapeIdFromTripId(trip_id)); 8 | console.log(mapData.getShapeFromTripId(trip_id)); 9 | }); -------------------------------------------------------------------------------- /lib/map-data-generator/trips-test.js: -------------------------------------------------------------------------------- 1 | var mapData = require("./map-data-generator.js"); 2 | 3 | 4 | /* 5 | trips: 6 | [ { route_id: '87003', 7 | service_id: 'university', 8 | trip_id: '87003ue009', 9 | trip_headsign: 'Ehinger Tor', 10 | shape_id: '87003' } ] 11 | 12 | trips: 13 | [ { route_id: '87003', 14 | service_id: 'university', 15 | trip_id: '87003ue009', 16 | trip_headsign: 'Ehinger Tor', 17 | shape_id: '87003' } ] 18 | 19 | 20 | stop[features]: 21 | { 22 | "geometry": { 23 | "coordinates": [ 24 | "9.493104", 25 | "48.151358" 26 | ], 27 | "type": "Point" 28 | }, 29 | "properties": { 30 | "stop_id": "9006469", 31 | "stop_name": "St. Wendelinus-Stra\u00dfe" 32 | }, 33 | "type": "Feature" 34 | } 35 | 36 | stopTimes: [ { trip_id: '87003ue009', 37 | arrival_time: '18:15:00', 38 | departure_time: '18:15:00', 39 | stop_id: '9001350', 40 | stop_sequence: '170' } ] 41 | 42 | */ 43 | mapData.gen("../../gtfs/ulm/", function(mapData) { 44 | console.log(mapData.getTrips()); 45 | console.log(JSON.stringify(mapData.getStops())); 46 | }); 47 | -------------------------------------------------------------------------------- /lib/path-normalizer/path-normalizer.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = function(shapes){ 3 | 4 | var normalizedPaths = {}; 5 | 6 | 7 | /** 8 | * Geo formulas taken from http://www.movable-type.co.uk/scripts/latlong.html 9 | */ 10 | 11 | if (typeof(Number.prototype.toRad) === "undefined") { 12 | Number.prototype.toRad = function() { 13 | return this * Math.PI / 180; 14 | }; 15 | } 16 | 17 | if (typeof(Number.prototype.toDeg) === "undefined") { 18 | Number.prototype.toDeg = function() { 19 | return this * 180 / Math.PI; 20 | }; 21 | } 22 | 23 | 24 | var R = 6371; // km 25 | 26 | var distanceLatLng = function(lat1,lon1, lat2, lon2){ 27 | var dLat = (lat2-lat1).toRad(); 28 | var dLon = (lon2-lon1).toRad(); 29 | var lat1 = lat1.toRad(); 30 | var lat2 = lat2.toRad(); 31 | 32 | var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 33 | var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 34 | var d = R * c; 35 | return d * 1000; 36 | }; 37 | 38 | var bearing = function(lat1, lon1, lat2, lon2){ 39 | var dLon = (lon2-lon1).toRad(); 40 | lat1 = lat1.toRad(); 41 | lat2 = lat2.toRad(); 42 | 43 | var y = Math.sin(dLon) * Math.cos(lat2); 44 | var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); 45 | var brng = (Math.atan2(y, x).toDeg()+360) % 360; 46 | return brng; 47 | }; 48 | 49 | var pointMove = function(lat1, lon1, brng, d){ 50 | d = d/1000; 51 | 52 | var dist = d/R 53 | brng = brng.toRad(); 54 | 55 | lat1 = lat1.toRad(); 56 | lon1 = lon1.toRad(); 57 | var lat2 = Math.asin( Math.sin(lat1)*Math.cos(dist) + Math.cos(lat1)*Math.sin(dist)*Math.cos(brng) ); 58 | var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2)); 59 | lon2 = (lon2+3*Math.PI)%(2*Math.PI) - Math.PI; 60 | 61 | return [lon2.toDeg(), lat2.toDeg()]; 62 | }; 63 | 64 | 65 | //Takes a list of points ([lon,lat]), and processes it. 66 | //Returns a function to calculate the estimated position on the path 67 | //at given percentage (0..1) 68 | var createPath = function(pointlist){ 69 | 70 | var oldLat = pointlist[0][1]; 71 | var oldLon = pointlist[0][0]; 72 | 73 | var sum = 0; 74 | var distances = []; 75 | for(var i = 0;i 1){ 86 | return [0,0]; 87 | } 88 | else if(percentage === 0){ 89 | return pointlist[0]; 90 | } 91 | else if(percentage === 1){ 92 | 93 | return pointlist[pointlist.length-1]; 94 | } 95 | else{ 96 | 97 | var targetSum = percentage * sum; 98 | 99 | //find last point before 100 | var idx = 0; 101 | var dSum = 0; 102 | 103 | while(((dSum + distances[idx]) < targetSum) && (idx < distances.length)){ 104 | dSum = dSum + distances[idx]; 105 | idx++; 106 | } 107 | idx--; 108 | 109 | var delta = targetSum-dSum; 110 | 111 | var b = bearing(pointlist[idx][1], pointlist[idx][0], pointlist[idx+1][1], pointlist[idx+1][0]); 112 | var x = pointMove(pointlist[idx][1], pointlist[idx][0] , b, delta) 113 | return x; 114 | } 115 | } 116 | }; 117 | 118 | }; 119 | 120 | //Takes a path list and returns a list of normalized points on the path. 121 | var normalize = function(pointlist, numberPoints){ 122 | 123 | var path = createPath(pointlist); 124 | 125 | var normalizedPoints = []; 126 | for(var i = 0;i", 3 | "name": "ulmapi-de", 4 | "version": "0.0.2", 5 | "homepage": "http://ulmapi.de", 6 | "repository": { 7 | "type": "git", 8 | "url": "git://github.com/ulmapi/livemap.git" 9 | }, 10 | "engines": { 11 | "node": ">= v0.10" 12 | }, 13 | "dependencies": { 14 | "ejs": "~1.0.0", 15 | "errorhandler": "~1.0.1", 16 | "express": "~4.4.1", 17 | "morgan": "~1.1.1", 18 | "socket.io": "~1.0.4", 19 | "socket.io-client": "~1.0.4" 20 | }, 21 | "devDependencies": {} 22 | } 23 | -------------------------------------------------------------------------------- /public/css/bootstrap-1.1.1.min.css: -------------------------------------------------------------------------------- 1 | html,body{margin:0;padding:0;} 2 | h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,cite,code,del,dfn,em,img,q,s,samp,small,strike,strong,sub,sup,tt,var,dd,dl,dt,li,ol,ul,fieldset,form,label,legend,button,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;font-weight:normal;font-style:normal;font-size:100%;line-height:1;font-family:inherit;} 3 | table{border-collapse:collapse;border-spacing:0;} 4 | ol,ul{list-style:none;} 5 | q:before,q:after,blockquote:before,blockquote:after{content:"";} 6 | html{overflow-y:scroll;font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} 7 | a:focus{outline:thin dotted;} 8 | article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} 9 | audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} 10 | audio:not([controls]){display:none;} 11 | sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;} 12 | sup{top:-0.5em;} 13 | sub{bottom:-0.25em;} 14 | img{border:0;-ms-interpolation-mode:bicubic;} 15 | button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;} 16 | button,input{line-height:normal;*overflow:visible;} 17 | button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;} 18 | button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} 19 | input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} 20 | input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;} 21 | textarea{overflow:auto;vertical-align:top;} 22 | table{border-collapse:collapse;border-spacing:0;} 23 | .clearfix{zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} 24 | .clearfix:after{clear:both;} 25 | .center-block{display:block;margin:0 auto;} 26 | .container{width:940px;margin:0 auto;zoom:1;margin-bottom:18px;}.container:before,.container:after{display:table;content:"";} 27 | .container:after{clear:both;} 28 | .btn.danger,.alert-message.danger,.btn.danger:hover,.alert-message.danger:hover,.btn.error,.alert-message.error,.btn.error:hover,.alert-message.error:hover,.btn.success,.alert-message.success,.btn.success:hover,.alert-message.success:hover,.btn.info,.alert-message.info,.btn.info:hover,.alert-message.info:hover{color:#ffffff;} 29 | .btn.danger,.alert-message.danger,.btn.error,.alert-message.error{background-color:#c43c35;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#c43c35 #c43c35 #882a25;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 30 | .btn.success,.alert-message.success{background-color:#57a957;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#57a957 #57a957 #3d773d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 31 | .btn.info,.alert-message.info{background-color:#339bb9;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#339bb9 #339bb9 #22697d;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 32 | .row{zoom:1;margin-bottom:18px;margin-left:-20px;}.row:before,.row:after{display:table;content:"";} 33 | .row:after{clear:both;} 34 | .row .span1,.row .span2,.row .span3,.row .span4,.row .span5,.row .span6,.row .span7,.row .span8,.row .span9,.row .span10,.row .span11,.row .span12,.row .span13,.row .span14,.row .span15,.row .span16{display:inline;float:left;margin-left:20px;} 35 | .row .span1{width:40px;} 36 | .row .span2{width:100px;} 37 | .row .span3{width:160px;} 38 | .row .span4{width:220px;} 39 | .row .span5{width:280px;} 40 | .row .span6{width:340px;} 41 | .row .span7{width:400px;} 42 | .row .span8{width:460px;} 43 | .row .span9{width:520px;} 44 | .row .span10{width:580px;} 45 | .row .span11{width:640px;} 46 | .row .span12{width:700px;} 47 | .row .span13{width:760px;} 48 | .row .span14{width:820px;} 49 | .row .span15{width:880px;} 50 | .row .span16{width:940px;} 51 | .row .offset1{margin-left:80px;} 52 | .row .offset2{margin-left:140px;} 53 | .row .offset3{margin-left:200px;} 54 | .row .offset4{margin-left:260px;} 55 | .row .offset5{margin-left:320px;} 56 | .row .offset6{margin-left:380px;} 57 | .row .offset7{margin-left:440px;} 58 | .row .offset8{margin-left:500px;} 59 | .row .offset9{margin-left:560px;} 60 | .row .offset10{margin-left:620px;} 61 | .row .offset11{margin-left:680px;} 62 | .row .offset12{margin-left:740px;} 63 | html,body{background-color:#fff;} 64 | body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:18px;color:#808080;text-rendering:optimizeLegibility;} 65 | .container{width:940px;margin:0 auto;} 66 | .container-fluid{padding:0 20px;zoom:1;margin-bottom:18px;}.container-fluid:before,.container-fluid:after{display:table;content:"";} 67 | .container-fluid:after{clear:both;} 68 | .container-fluid .sidebar{float:left;width:220px;} 69 | .container-fluid .content{min-width:700px;max-width:1180px;margin-left:240px;} 70 | a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#0050a3;text-decoration:underline;} 71 | .btn{display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(0.25, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:-moz-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);padding:4px 14px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:18px;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;} 72 | .primary{background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);color:#fff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border:1px solid #004b9a;border-bottom-color:#003f81;}.primary:hover{color:#fff;} 73 | .btn{-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;transition:0.1s linear all;}.btn.primary{color:#fff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}.btn.primary:hover{color:#fff;} 74 | .btn.large{font-size:16px;line-height:28px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 75 | .btn.small{padding-right:9px;padding-left:9px;font-size:11px;} 76 | .btn.disabled{background-image:none;filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 77 | .btn:disabled{background-image:none;filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.btn:disabled.primary{color:#fff;} 78 | .btn:active{-webkit-box-shadow:inset 0 3px 7px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 3px 7px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 3px 7px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} 79 | button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;} 80 | p{font-size:13px;font-weight:normal;line-height:18px;margin-bottom:9px;}p small{font-size:11px;color:#bfbfbf;} 81 | h1,h2,h3,h4,h5,h6{font-weight:bold;color:#404040;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{color:#bfbfbf;} 82 | h1{margin-bottom:18px;font-size:30px;line-height:36px;}h1 small{font-size:18px;} 83 | h2{font-size:24px;line-height:36px;}h2 small{font-size:14px;} 84 | h3,h4,h5,h6{line-height:36px;} 85 | h3{font-size:18px;}h3 small{font-size:14px;} 86 | h4{font-size:16px;}h4 small{font-size:12px;} 87 | h5{font-size:14px;} 88 | h6{font-size:13px;color:#bfbfbf;text-transform:uppercase;} 89 | ul,ol{margin:0 0 18px 25px;} 90 | ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} 91 | ul{list-style:disc;} 92 | ol{list-style:decimal;} 93 | li{line-height:18px;color:#808080;} 94 | ul.unstyled{list-style:none;margin-left:0;} 95 | dl{margin-bottom:18px;}dl dt,dl dd{line-height:18px;} 96 | dl dt{font-weight:bold;} 97 | dl dd{margin-left:9px;} 98 | hr{margin:0 0 19px;border:0;border-bottom:1px solid #eee;} 99 | strong{font-style:inherit;font-weight:bold;line-height:inherit;} 100 | em{font-style:italic;font-weight:inherit;line-height:inherit;} 101 | .muted{color:#bfbfbf;} 102 | blockquote{margin-bottom:18px;border-left:5px solid #eee;padding-left:15px;}blockquote p{font-size:14px;font-weight:300;line-height:18px;margin-bottom:0;} 103 | blockquote small{display:block;font-size:12px;font-weight:300;line-height:18px;color:#bfbfbf;}blockquote small:before{content:'\2014 \00A0';} 104 | address{display:block;line-height:18px;margin-bottom:18px;} 105 | code,pre{padding:0 3px 2px;font-family:Monaco, Andale Mono, Courier New, monospace;font-size:12px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 106 | code{background-color:#fee9cc;color:rgba(0, 0, 0, 0.75);padding:1px 3px;} 107 | pre{background-color:#f5f5f5;display:block;padding:17px;margin:0 0 18px;line-height:18px;font-size:12px;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;white-space:pre;white-space:pre-wrap;word-wrap:break-word;} 108 | form{margin-bottom:18px;} 109 | fieldset{margin-bottom:18px;padding-top:18px;}fieldset legend{display:block;margin-left:150px;font-size:20px;line-height:1;*margin:0 0 5px 145px;*line-height:1.5;color:#404040;} 110 | .clearfix{margin-bottom:18px;} 111 | label,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:normal;} 112 | label{padding-top:6px;font-size:13px;line-height:18px;float:left;width:130px;text-align:right;color:#404040;} 113 | div.input{margin-left:150px;} 114 | input[type=checkbox],input[type=radio]{cursor:pointer;} 115 | input[type=text],input[type=password],textarea,select,.uneditable-input{display:inline-block;width:210px;padding:4px;font-size:13px;line-height:18px;height:18px;color:#808080;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 116 | select,input[type=file]{height:27px;line-height:27px;} 117 | textarea{height:auto;} 118 | .uneditable-input{background-color:#eee;display:block;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.075);} 119 | :-moz-placeholder{color:#bfbfbf;} 120 | ::-webkit-input-placeholder{color:#bfbfbf;} 121 | input[type=text],input[type=password],select,textarea{-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1);} 122 | input[type=text]:focus,input[type=password]:focus,textarea:focus{outline:none;border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.1),0 0 8px rgba(82, 168, 236, 0.6);} 123 | form div.error{background:#fae5e3;padding:10px 0;margin:-10px 0 10px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}form div.error>label,form div.error span.help-inline,form div.error span.help-block{color:#9d261d;} 124 | form div.error input[type=text],form div.error input[type=password],form div.error textarea{border-color:#c87872;-webkit-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);-moz-box-shadow:0 0 3px rgba(171, 41, 32, 0.25);box-shadow:0 0 3px rgba(171, 41, 32, 0.25);}form div.error input[type=text]:focus,form div.error input[type=password]:focus,form div.error textarea:focus{border-color:#b9554d;-webkit-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);-moz-box-shadow:0 0 6px rgba(171, 41, 32, 0.5);box-shadow:0 0 6px rgba(171, 41, 32, 0.5);} 125 | form div.error .input-prepend span.add-on,form div.error .input-append span.add-on{background:#f4c8c5;border-color:#c87872;color:#b9554d;} 126 | .input-mini,input.mini,textarea.mini,select.mini{width:60px;} 127 | .input-small,input.small,textarea.small,select.small{width:90px;} 128 | .input-medium,input.medium,textarea.medium,select.medium{width:150px;} 129 | .input-large,input.large,textarea.large,select.large{width:210px;} 130 | .input-xlarge,input.xlarge,textarea.xlarge,select.xlarge{width:270px;} 131 | .input-xxlarge,input.xxlarge,textarea.xxlarge,select.xxlarge{width:530px;} 132 | textarea.xxlarge{overflow-y:scroll;} 133 | input[readonly]:focus,textarea[readonly]:focus,input.disabled{background:#f5f5f5;border-color:#ddd;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 134 | .actions{background:#f5f5f5;margin-top:18px;margin-bottom:18px;padding:17px 20px 18px 150px;border-top:1px solid #ddd;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.actions .secondary-action{float:right;}.actions .secondary-action a{line-height:30px;}.actions .secondary-action a:hover{text-decoration:underline;} 135 | .help-inline,.help-block{font-size:12px;line-height:18px;color:#bfbfbf;} 136 | .help-inline{padding-left:5px;*position:relative;*top:-5px;} 137 | .help-block{display:block;max-width:600px;} 138 | .inline-inputs{color:#808080;}.inline-inputs span,.inline-inputs input[type=text]{display:inline-block;} 139 | .inline-inputs input.mini{width:60px;} 140 | .inline-inputs input.small{width:90px;} 141 | .inline-inputs span{padding:0 2px 0 1px;} 142 | .input-prepend input[type=text],.input-append input[type=text],.input-prepend input[type=password],.input-append input[type=password]{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} 143 | .input-prepend .add-on,.input-append .add-on{background:#f5f5f5;float:left;display:block;width:auto;min-width:16px;padding:4px 4px 4px 5px;color:#bfbfbf;font-weight:normal;line-height:18px;height:18px;text-align:center;text-shadow:0 1px 0 #fff;border:1px solid #ccc;border-right-width:0;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} 144 | .input-prepend .active,.input-append .active{background:#a9dba9;border-color:#46a546;} 145 | .input-prepend .add-on{*margin-top:1px;} 146 | .input-append input[type=text],.input-append input[type=password]{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} 147 | .input-append .add-on{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;border-right-width:1px;border-left-width:0;} 148 | .inputs-list{margin:0 0 5px;width:100%;}.inputs-list li{display:block;padding:0;width:100%;}.inputs-list li label{display:block;float:none;width:auto;padding:0;line-height:18px;text-align:left;white-space:normal;}.inputs-list li label strong{color:#808080;} 149 | .inputs-list li label small{font-size:12px;font-weight:normal;} 150 | .inputs-list li ul.inputs-list{margin-left:25px;margin-bottom:10px;padding-top:0;} 151 | .inputs-list li:first-child{padding-top:5px;} 152 | .inputs-list input[type=radio],.inputs-list input[type=checkbox]{margin-bottom:0;} 153 | .form-stacked{padding-left:20px;}.form-stacked fieldset{padding-top:9px;} 154 | .form-stacked legend{margin-left:0;} 155 | .form-stacked label{display:block;float:none;width:auto;font-weight:bold;text-align:left;line-height:20px;padding-top:0;} 156 | .form-stacked .clearfix{margin-bottom:9px;}.form-stacked .clearfix div.input{margin-left:0;} 157 | .form-stacked .inputs-list{margin-bottom:0;}.form-stacked .inputs-list li{padding-top:0;}.form-stacked .inputs-list li label{font-weight:normal;padding-top:0;} 158 | .form-stacked div.error{padding-top:10px;padding-bottom:10px;padding-left:10px;margin-top:0;margin-left:-10px;} 159 | .form-stacked .actions{margin-left:-20px;padding-left:20px;} 160 | table{width:100%;margin-bottom:18px;padding:0;border-collapse:separate;font-size:13px;}table th,table td{padding:10px 10px 9px;line-height:13.5px;text-align:left;vertical-align:middle;border-bottom:1px solid #ddd;} 161 | table th{padding-top:9px;font-weight:bold;border-bottom-width:2px;} 162 | .zebra-striped tbody tr:nth-child(odd) td{background-color:#f9f9f9;} 163 | .zebra-striped tbody tr:hover td{background-color:#f5f5f5;} 164 | .zebra-striped .header{cursor:pointer;}.zebra-striped .header:after{content:"";float:right;margin-top:7px;border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:hidden;} 165 | .zebra-striped .headerSortUp,.zebra-striped .headerSortDown{background-color:rgba(141, 192, 219, 0.25);text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} 166 | .zebra-striped .header:hover:after{visibility:visible;} 167 | .zebra-striped .headerSortDown:after,.zebra-striped .headerSortDown:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} 168 | .zebra-striped .headerSortUp:after{border-bottom:none;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:0.6;-moz-opacity:0.6;opacity:0.6;} 169 | table .blue{color:#049cdb;border-bottom-color:#049cdb;} 170 | table .headerSortUp.blue,table .headerSortDown.blue{background-color:#ade6fe;} 171 | table .green{color:#46a546;border-bottom-color:#46a546;} 172 | table .headerSortUp.green,table .headerSortDown.green{background-color:#cdeacd;} 173 | table .red{color:#9d261d;border-bottom-color:#9d261d;} 174 | table .headerSortUp.red,table .headerSortDown.red{background-color:#f4c8c5;} 175 | table .yellow{color:#ffc40d;border-bottom-color:#ffc40d;} 176 | table .headerSortUp.yellow,table .headerSortDown.yellow{background-color:#fff6d9;} 177 | table .orange{color:#f89406;border-bottom-color:#f89406;} 178 | table .headerSortUp.orange,table .headerSortDown.orange{background-color:#fee9cc;} 179 | table .purple{color:#7a43b6;border-bottom-color:#7a43b6;} 180 | table .headerSortUp.purple,table .headerSortDown.purple{background-color:#e2d5f0;} 181 | .topbar{height:40px;position:fixed;top:0;left:0;right:0;z-index:10000;overflow:visible;}.topbar .fill{background:#222;background-color:#222222;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} 182 | .topbar a{color:#bfbfbf;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} 183 | .topbar a:hover,.topbar ul li.active a{background-color:#333;background-color:rgba(255, 255, 255, 0.05);color:#ffffff;text-decoration:none;} 184 | .topbar h3{position:relative;}.topbar h3 a{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;color:#ffffff;font-size:20px;font-weight:200;line-height:1;} 185 | .topbar form{float:left;margin:5px 0 0 0;position:relative;filter:alpha(opacity=100);-khtml-opacity:1;-moz-opacity:1;opacity:1;}.topbar form input{background-color:#444;background-color:rgba(255, 255, 255, 0.3);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:normal;font-weight:13px;line-height:1;width:220px;padding:4px 9px;color:#fff;color:rgba(255, 255, 255, 0.75);border:1px solid #111;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.25);-webkit-transition:none;-moz-transition:none;transition:none;}.topbar form input:-moz-placeholder{color:#e6e6e6;} 186 | .topbar form input::-webkit-input-placeholder{color:#e6e6e6;} 187 | .topbar form input:hover{background-color:#bfbfbf;background-color:rgba(255, 255, 255, 0.5);color:#fff;} 188 | .topbar form input:focus,.topbar form input.focused{outline:none;background-color:#fff;color:#404040;text-shadow:0 1px 0 #fff;border:0;padding:5px 10px;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);} 189 | .topbar ul{display:block;float:left;margin:0 10px 0 0;position:relative;}.topbar ul.secondary-nav{float:right;margin-left:10px;margin-right:0;} 190 | .topbar ul li{display:block;float:left;font-size:13px;}.topbar ul li a{display:block;float:none;padding:10px 10px 11px;line-height:19px;text-decoration:none;}.topbar ul li a:hover{color:#fff;text-decoration:none;} 191 | .topbar ul li.active a{background-color:#222;background-color:rgba(0, 0, 0, 0.5);} 192 | .topbar ul.primary-nav li ul{left:0;} 193 | .topbar ul.secondary-nav li ul{right:0;} 194 | .topbar ul li.menu{position:relative;}.topbar ul li.menu a.menu:after{width:0px;height:0px;display:inline-block;content:"↓";text-indent:-99999px;vertical-align:top;margin-top:8px;margin-left:4px;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #fff;filter:alpha(opacity=50);-khtml-opacity:0.5;-moz-opacity:0.5;opacity:0.5;} 195 | .topbar ul li.menu.open a.menu,.topbar ul li.menu.open a:hover{background-color:#444;background-color:rgba(255, 255, 255, 0.1);*background-color:#444;color:#fff;} 196 | .topbar ul li.menu.open ul{display:block;}.topbar ul li.menu.open ul li a{background-color:transparent;font-weight:normal;}.topbar ul li.menu.open ul li a:hover{background-color:rgba(255, 255, 255, 0.1);*background-color:#444;color:#fff;} 197 | .topbar ul li.menu.open ul li.active a{background-color:rgba(255, 255, 255, 0.1);font-weight:bold;} 198 | .topbar ul li ul{background-color:#333;float:left;display:none;position:absolute;top:40px;min-width:160px;max-width:220px;_width:160px;margin-left:0;margin-right:0;padding:0;text-align:left;border:0;zoom:1;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.6);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.6);box-shadow:0 1px 2px rgba(0, 0, 0, 0.6);}.topbar ul li ul li{float:none;clear:both;display:block;background:none;font-size:12px;}.topbar ul li ul li a{display:block;padding:6px 15px;clear:both;font-weight:normal;line-height:19px;color:#bbb;}.topbar ul li ul li a:hover{background-color:#333;background-color:rgba(255, 255, 255, 0.25);color:#fff;} 199 | .topbar ul li ul li.divider{height:1px;overflow:hidden;background:#222;background:rgba(0, 0, 0, 0.2);border-bottom:1px solid rgba(255, 255, 255, 0.1);margin:5px 0;} 200 | .topbar ul li ul li span{clear:both;display:block;background:rgba(0, 0, 0, 0.2);padding:6px 15px;cursor:default;color:#808080;border-top:1px solid rgba(0, 0, 0, 0.2);} 201 | .hero-unit{background-color:#f5f5f5;margin-top:60px;margin-bottom:30px;padding:60px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} 202 | .hero-unit p{font-size:18px;font-weight:200;line-height:27px;} 203 | footer{margin-top:17px;padding-top:17px;border-top:1px solid #eee;} 204 | .page-header{margin-bottom:17px;border-bottom:1px solid #ddd;-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);box-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}.page-header h1{margin-bottom:8px;} 205 | .btn{cursor:pointer;display:inline-block;background-color:#e6e6e6;background-repeat:no-repeat;background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(0.25, #ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:-moz-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:-ms-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:-o-linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);background-image:linear-gradient(#ffffff, #ffffff 0.25, #e6e6e6);padding:5px 14px 6px;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);color:#333;font-size:13px;line-height:normal;border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-webkit-transition:0.1s linear all;-moz-transition:0.1s linear all;transition:0.1s linear all;}.btn:hover{background-position:0 -15px;color:#333;text-decoration:none;} 206 | .btn.primary{color:#fff;background-color:#0064cd;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));background-image:-moz-linear-gradient(top, #049cdb, #0064cd);background-image:-ms-linear-gradient(top, #049cdb, #0064cd);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));background-image:-webkit-linear-gradient(top, #049cdb, #0064cd);background-image:-o-linear-gradient(top, #049cdb, #0064cd);background-image:linear-gradient(top, #049cdb, #0064cd);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#0064cd #0064cd #003f81;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);} 207 | .btn.disabled{cursor:default;background-image:none;filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;} 208 | .btn:disabled{cursor:default;background-image:none;filter:alpha(opacity=65);-khtml-opacity:0.65;-moz-opacity:0.65;opacity:0.65;} 209 | .btn:active{-webkit-box-shadow:inset 0 3px 7px rgba(0, 0, 0, 0.1),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 3px 7px rgba(0, 0, 0, 0.1),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 3px 7px rgba(0, 0, 0, 0.1),0 1px 2px rgba(0, 0, 0, 0.05);} 210 | .btn.large{font-size:16px;line-height:normal;padding:9px 14px 9px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 211 | .btn.small{padding:7px 9px 7px;font-size:11px;} 212 | button.btn::-moz-focus-inner,input[type=submit].btn::-moz-focus-inner{padding:0;border:0;} 213 | .alert-message{background-color:#eedc94;background-repeat:repeat-x;background-image:-khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));background-image:-moz-linear-gradient(top, #fceec1, #eedc94);background-image:-ms-linear-gradient(top, #fceec1, #eedc94);background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));background-image:-webkit-linear-gradient(top, #fceec1, #eedc94);background-image:-o-linear-gradient(top, #fceec1, #eedc94);background-image:linear-gradient(top, #fceec1, #eedc94);text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);border-color:#eedc94 #eedc94 #e4c652;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);margin-bottom:18px;padding:7px 14px;color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);border-width:1px;border-style:solid;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.25);}.alert-message h5{line-height:18px;} 214 | .alert-message p{margin-bottom:0;} 215 | .alert-message div{margin-top:5px;margin-bottom:2px;line-height:28px;} 216 | .alert-message .btn{-webkit-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);-moz-box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);box-shadow:0 1px 0 rgba(255, 255, 255, 0.25);} 217 | .alert-message .close{float:right;margin-top:-2px;color:#000000;font-size:20px;font-weight:bold;text-shadow:0 1px 0 #ffffff;filter:alpha(opacity=20);-khtml-opacity:0.2;-moz-opacity:0.2;opacity:0.2;}.alert-message .close:hover{color:#000000;text-decoration:none;filter:alpha(opacity=40);-khtml-opacity:0.4;-moz-opacity:0.4;opacity:0.4;} 218 | .alert-message.block-message{background-image:none;background-color:#fdf5d9;padding:14px;border-color:#fceec1;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}.alert-message.block-message p{margin-right:30px;} 219 | .alert-message.block-message .alert-actions{margin-top:5px;} 220 | .alert-message.block-message.error,.alert-message.block-message.success,.alert-message.block-message.info{color:#404040;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} 221 | .alert-message.block-message.error{background-color:#fddfde;border-color:#fbc7c6;} 222 | .alert-message.block-message.success{background-color:#d1eed1;border-color:#bfe7bf;} 223 | .alert-message.block-message.info{background-color:#ddf4fb;border-color:#c6edf9;} 224 | .tabs,.pills{margin:0 0 20px;padding:0;zoom:1;margin-bottom:18px;}.tabs:before,.pills:before,.tabs:after,.pills:after{display:table;content:"";} 225 | .tabs:after,.pills:after{clear:both;} 226 | .tabs li,.pills li{display:inline;}.tabs li a,.pills li a{float:left;width:auto;} 227 | .tabs{width:100%;border-bottom:1px solid #bfbfbf;}.tabs li a{margin-bottom:-1px;margin-right:2px;padding:0 15px;line-height:35px;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}.tabs li a:hover{background-color:#e6e6e6;border-bottom:1px solid #bfbfbf;} 228 | .tabs li.active a{background-color:#fff;padding:0 14px;border:1px solid #ccc;border-bottom:0;color:#808080;} 229 | .pills li a{margin:5px 3px 5px 0;padding:0 15px;text-shadow:0 1px 1px #fff;line-height:30px;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}.pills li a:hover{background:#0050a3;color:#fff;text-decoration:none;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);} 230 | .pills li.active a{background:#0069d6;color:#fff;text-shadow:0 1px 1px rgba(0, 0, 0, 0.25);} 231 | .pagination{height:36px;margin:18px 0;}.pagination ul{float:left;margin:0;border:1px solid #ddd;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}.pagination ul li{display:inline;}.pagination ul li a{float:left;padding:0 14px;line-height:34px;border-right:1px solid;border-right-color:#ddd;border-right-color:rgba(0, 0, 0, 0.15);*border-right-color:#ddd;text-decoration:none;} 232 | .pagination ul li a:hover,.pagination ul li.active a{background-color:#c7eefe;} 233 | .pagination ul li.disabled a,.pagination ul li.disabled a:hover{background-color:transparent;color:#bfbfbf;} 234 | .pagination ul li.next a{border:0;} 235 | .well{background-color:#f5f5f5;margin-bottom:20px;padding:19px;min-height:20px;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);} 236 | .modal-backdrop{background-color:rgba(0, 0, 0, 0.5);position:fixed;top:0;left:0;right:0;bottom:0;z-index:1000;} 237 | .modal{position:fixed;top:50%;left:50%;z-index:2000;width:560px;margin:-280px 0 0 -250px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal .modal-header{border-bottom:1px solid #eee;padding:5px 20px;}.modal .modal-header .close{position:absolute;right:10px;top:10px;color:#999;line-height:10px;font-size:18px;} 238 | .modal .modal-body{padding:20px;} 239 | .modal .modal-footer{background-color:#f5f5f5;padding:14px 20px 15px;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;zoom:1;margin-bottom:18px;margin-bottom:0;}.modal .modal-footer:before,.modal .modal-footer:after{display:table;content:"";} 240 | .modal .modal-footer:after{clear:both;} 241 | .modal .modal-footer .btn{float:right;margin-left:10px;} 242 | .twipsy{display:block;position:absolute;visibility:visible;padding:5px;font-size:11px;z-index:1000;filter:alpha(opacity=80);-khtml-opacity:0.8;-moz-opacity:0.8;opacity:0.8;}.twipsy.above .twipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} 243 | .twipsy.left .twipsy-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} 244 | .twipsy.below .twipsy-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} 245 | .twipsy.right .twipsy-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} 246 | .twipsy .twipsy-inner{padding:3px 8px;background-color:#000;color:white;text-align:center;max-width:200px;text-decoration:none;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} 247 | .twipsy .twipsy-arrow{position:absolute;width:0;height:0;} 248 | .popover{position:absolute;top:0;left:0;z-index:1000;padding:5px;display:none;}.popover.above .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} 249 | .popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} 250 | .popover.below .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} 251 | .popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} 252 | .popover .arrow{position:absolute;width:0;height:0;} 253 | .popover .inner{background-color:#333;background-color:rgba(0, 0, 0, 0.8);*background-color:#333;padding:3px;overflow:hidden;width:280px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} 254 | .popover .title{background-color:#f5f5f5;padding:9px 15px;line-height:1;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;border-bottom:1px solid #eee;} 255 | .popover .content{background-color:#ffffff;padding:14px;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover .content p,.popover .content ul,.popover .content ol{margin-bottom:0;} 256 | -------------------------------------------------------------------------------- /public/css/leaflet.css: -------------------------------------------------------------------------------- 1 | /* required styles */ 2 | 3 | .leaflet-map-pane, 4 | .leaflet-tile, 5 | .leaflet-marker-icon, 6 | .leaflet-marker-shadow, 7 | .leaflet-tile-pane, 8 | .leaflet-overlay-pane, 9 | .leaflet-shadow-pane, 10 | .leaflet-marker-pane, 11 | .leaflet-popup-pane, 12 | .leaflet-overlay-pane svg, 13 | .leaflet-zoom-box, 14 | .leaflet-image-layer, 15 | .leaflet-layer { /* TODO optimize classes */ 16 | position: absolute; 17 | } 18 | .leaflet-container { 19 | overflow: hidden; 20 | outline: 0; 21 | } 22 | .leaflet-tile, 23 | .leaflet-marker-icon, 24 | .leaflet-marker-shadow { 25 | -moz-user-select: none; 26 | -webkit-user-select: none; 27 | user-select: none; 28 | } 29 | .leaflet-marker-icon, 30 | .leaflet-marker-shadow { 31 | display: block; 32 | } 33 | .leaflet-clickable { 34 | cursor: pointer; 35 | } 36 | .leaflet-dragging, .leaflet-dragging .leaflet-clickable { 37 | cursor: move; 38 | } 39 | .leaflet-container img { 40 | /* map is broken in FF if you have max-width: 100% on tiles */ 41 | max-width: none !important; 42 | } 43 | .leaflet-container img.leaflet-image-layer { 44 | /* stupid Android 2 doesn't understand "max-width: none" properly */ 45 | max-width: 15000px !important; 46 | } 47 | 48 | .leaflet-tile-pane { z-index: 2; } 49 | .leaflet-objects-pane { z-index: 3; } 50 | .leaflet-overlay-pane { z-index: 4; } 51 | .leaflet-shadow-pane { z-index: 5; } 52 | .leaflet-marker-pane { z-index: 6; } 53 | .leaflet-popup-pane { z-index: 7; } 54 | 55 | .leaflet-tile { 56 | filter: inherit; 57 | visibility: hidden; 58 | } 59 | .leaflet-tile-loaded { 60 | visibility: inherit; 61 | } 62 | 63 | .leaflet-zoom-box { 64 | width: 0; 65 | height: 0; 66 | } 67 | 68 | /* Leaflet controls */ 69 | 70 | .leaflet-control { 71 | position: relative; 72 | z-index: 7; 73 | pointer-events: auto; 74 | } 75 | .leaflet-top, 76 | .leaflet-bottom { 77 | position: absolute; 78 | z-index: 1000; 79 | pointer-events: none; 80 | } 81 | .leaflet-top { 82 | top: 0; 83 | } 84 | .leaflet-right { 85 | right: 0; 86 | } 87 | .leaflet-bottom { 88 | bottom: 0; 89 | } 90 | .leaflet-left { 91 | left: 0; 92 | } 93 | .leaflet-control { 94 | float: left; 95 | clear: both; 96 | } 97 | .leaflet-right .leaflet-control { 98 | float: right; 99 | } 100 | .leaflet-top .leaflet-control { 101 | margin-top: 10px; 102 | } 103 | .leaflet-bottom .leaflet-control { 104 | margin-bottom: 10px; 105 | } 106 | .leaflet-left .leaflet-control { 107 | margin-left: 10px; 108 | } 109 | .leaflet-right .leaflet-control { 110 | margin-right: 10px; 111 | } 112 | 113 | .leaflet-control-zoom { 114 | -moz-border-radius: 7px; 115 | -webkit-border-radius: 7px; 116 | border-radius: 7px; 117 | } 118 | .leaflet-control-zoom { 119 | padding: 5px; 120 | background: rgba(0, 0, 0, 0.25); 121 | } 122 | .leaflet-control-zoom a { 123 | background-color: rgba(255, 255, 255, 0.75); 124 | } 125 | .leaflet-control-zoom a, .leaflet-control-layers a { 126 | background-position: 50% 50%; 127 | background-repeat: no-repeat; 128 | display: block; 129 | } 130 | .leaflet-control-zoom a { 131 | -moz-border-radius: 4px; 132 | -webkit-border-radius: 4px; 133 | border-radius: 4px; 134 | width: 19px; 135 | height: 19px; 136 | } 137 | .leaflet-control-zoom a:hover { 138 | background-color: #fff; 139 | } 140 | .leaflet-touch .leaflet-control-zoom a { 141 | width: 27px; 142 | height: 27px; 143 | } 144 | .leaflet-control-zoom-in { 145 | background-image: url(images/zoom-in.png); 146 | margin-bottom: 5px; 147 | } 148 | .leaflet-control-zoom-out { 149 | background-image: url(images/zoom-out.png); 150 | } 151 | 152 | .leaflet-control-layers { 153 | box-shadow: 0 1px 7px #999; 154 | background: #f8f8f9; 155 | -moz-border-radius: 8px; 156 | -webkit-border-radius: 8px; 157 | border-radius: 8px; 158 | } 159 | .leaflet-control-layers a { 160 | background-image: url(images/layers.png); 161 | width: 36px; 162 | height: 36px; 163 | } 164 | .leaflet-touch .leaflet-control-layers a { 165 | width: 44px; 166 | height: 44px; 167 | } 168 | .leaflet-control-layers .leaflet-control-layers-list, 169 | .leaflet-control-layers-expanded .leaflet-control-layers-toggle { 170 | display: none; 171 | } 172 | .leaflet-control-layers-expanded .leaflet-control-layers-list { 173 | display: block; 174 | position: relative; 175 | } 176 | .leaflet-control-layers-expanded { 177 | padding: 6px 10px 6px 6px; 178 | font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; 179 | color: #333; 180 | background: #fff; 181 | } 182 | .leaflet-control-layers input { 183 | margin-top: 2px; 184 | position: relative; 185 | top: 1px; 186 | } 187 | .leaflet-control-layers label { 188 | display: block; 189 | } 190 | .leaflet-control-layers-separator { 191 | height: 0; 192 | border-top: 1px solid #ddd; 193 | margin: 5px -10px 5px -6px; 194 | } 195 | 196 | .leaflet-container .leaflet-control-attribution { 197 | background-color: rgba(255, 255, 255, 0.7); 198 | box-shadow: 0 0 5px #bbb; 199 | margin: 0; 200 | } 201 | 202 | .leaflet-control-attribution, 203 | .leaflet-control-scale-line { 204 | padding: 0 5px; 205 | color: #333; 206 | } 207 | 208 | .leaflet-container .leaflet-control-attribution, 209 | .leaflet-container .leaflet-control-scale { 210 | font: 11px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; 211 | } 212 | 213 | .leaflet-left .leaflet-control-scale { 214 | margin-left: 5px; 215 | } 216 | .leaflet-bottom .leaflet-control-scale { 217 | margin-bottom: 5px; 218 | } 219 | 220 | .leaflet-control-scale-line { 221 | border: 2px solid #777; 222 | border-top: none; 223 | color: black; 224 | line-height: 1; 225 | font-size: 10px; 226 | padding-bottom: 2px; 227 | text-shadow: 1px 1px 1px #fff; 228 | background-color: rgba(255, 255, 255, 0.5); 229 | } 230 | .leaflet-control-scale-line:not(:first-child) { 231 | border-top: 2px solid #777; 232 | padding-top: 1px; 233 | border-bottom: none; 234 | margin-top: -2px; 235 | } 236 | .leaflet-control-scale-line:not(:first-child):not(:last-child) { 237 | border-bottom: 2px solid #777; 238 | } 239 | 240 | .leaflet-touch .leaflet-control-attribution, .leaflet-touch .leaflet-control-layers { 241 | box-shadow: none; 242 | } 243 | .leaflet-touch .leaflet-control-layers { 244 | border: 5px solid #bbb; 245 | } 246 | 247 | 248 | /* Zoom and fade animations */ 249 | 250 | .leaflet-fade-anim .leaflet-tile, .leaflet-fade-anim .leaflet-popup { 251 | opacity: 0; 252 | 253 | -webkit-transition: opacity 0.2s linear; 254 | -moz-transition: opacity 0.2s linear; 255 | -o-transition: opacity 0.2s linear; 256 | transition: opacity 0.2s linear; 257 | } 258 | .leaflet-fade-anim .leaflet-tile-loaded, .leaflet-fade-anim .leaflet-map-pane .leaflet-popup { 259 | opacity: 1; 260 | } 261 | 262 | .leaflet-zoom-anim .leaflet-zoom-animated { 263 | -webkit-transition: -webkit-transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75); 264 | -moz-transition: -moz-transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75); 265 | -o-transition: -o-transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75); 266 | transition: transform 0.25s cubic-bezier(0.25,0.1,0.25,0.75); 267 | } 268 | 269 | .leaflet-zoom-anim .leaflet-tile, 270 | .leaflet-pan-anim .leaflet-tile, 271 | .leaflet-touching .leaflet-zoom-animated { 272 | -webkit-transition: none; 273 | -moz-transition: none; 274 | -o-transition: none; 275 | transition: none; 276 | } 277 | 278 | .leaflet-zoom-anim .leaflet-zoom-hide { 279 | visibility: hidden; 280 | } 281 | 282 | 283 | /* Popup layout */ 284 | 285 | .leaflet-popup { 286 | position: absolute; 287 | text-align: center; 288 | } 289 | .leaflet-popup-content-wrapper { 290 | padding: 1px; 291 | text-align: left; 292 | } 293 | .leaflet-popup-content { 294 | margin: 14px 20px; 295 | } 296 | .leaflet-popup-tip-container { 297 | margin: 0 auto; 298 | width: 40px; 299 | height: 20px; 300 | position: relative; 301 | overflow: hidden; 302 | } 303 | .leaflet-popup-tip { 304 | width: 15px; 305 | height: 15px; 306 | padding: 1px; 307 | 308 | margin: -8px auto 0; 309 | 310 | -moz-transform: rotate(45deg); 311 | -webkit-transform: rotate(45deg); 312 | -ms-transform: rotate(45deg); 313 | -o-transform: rotate(45deg); 314 | transform: rotate(45deg); 315 | } 316 | .leaflet-container a.leaflet-popup-close-button { 317 | position: absolute; 318 | top: 0; 319 | right: 0; 320 | padding: 4px 5px 0 0; 321 | text-align: center; 322 | width: 18px; 323 | height: 14px; 324 | font: 16px/14px Tahoma, Verdana, sans-serif; 325 | color: #c3c3c3; 326 | text-decoration: none; 327 | font-weight: bold; 328 | } 329 | .leaflet-container a.leaflet-popup-close-button:hover { 330 | color: #999; 331 | } 332 | .leaflet-popup-content p { 333 | margin: 18px 0; 334 | } 335 | .leaflet-popup-scrolled { 336 | overflow: auto; 337 | border-bottom: 1px solid #ddd; 338 | border-top: 1px solid #ddd; 339 | } 340 | 341 | 342 | /* Visual appearance */ 343 | 344 | .leaflet-container { 345 | background: #ddd; 346 | } 347 | .leaflet-container a { 348 | color: #0078A8; 349 | } 350 | .leaflet-container a.leaflet-active { 351 | outline: 2px solid orange; 352 | } 353 | .leaflet-zoom-box { 354 | border: 2px dotted #05f; 355 | background: white; 356 | opacity: 0.5; 357 | } 358 | .leaflet-div-icon { 359 | background: #fff; 360 | border: 1px solid #666; 361 | } 362 | .leaflet-editing-icon { 363 | border-radius: 2px; 364 | } 365 | .leaflet-popup-content-wrapper, .leaflet-popup-tip { 366 | background: white; 367 | 368 | box-shadow: 0 3px 10px #888; 369 | -moz-box-shadow: 0 3px 10px #888; 370 | -webkit-box-shadow: 0 3px 14px #999; 371 | } 372 | .leaflet-popup-content-wrapper { 373 | -moz-border-radius: 20px; 374 | -webkit-border-radius: 20px; 375 | border-radius: 20px; 376 | } 377 | .leaflet-popup-content { 378 | font: 12px/1.4 "Helvetica Neue", Arial, Helvetica, sans-serif; 379 | } 380 | -------------------------------------------------------------------------------- /public/css/leaflet.ie.css: -------------------------------------------------------------------------------- 1 | .leaflet-vml-shape { 2 | width: 1px; 3 | height: 1px; 4 | } 5 | .lvml { 6 | behavior: url(#default#VML); 7 | display: inline-block; 8 | position: absolute; 9 | } 10 | 11 | .leaflet-control { 12 | display: inline; 13 | } 14 | 15 | .leaflet-popup-tip { 16 | width: 21px; 17 | _width: 27px; 18 | margin: 0 auto; 19 | _margin-top: -3px; 20 | 21 | filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); 22 | -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; 23 | } 24 | .leaflet-popup-tip-container { 25 | margin-top: -1px; 26 | } 27 | .leaflet-popup-content-wrapper, .leaflet-popup-tip { 28 | border: 1px solid #bbb; 29 | } 30 | 31 | .leaflet-control-zoom { 32 | filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#3F000000',EndColorStr='#3F000000'); 33 | } 34 | .leaflet-control-zoom a { 35 | background-color: #eee; 36 | } 37 | .leaflet-control-zoom a:hover { 38 | background-color: #fff; 39 | } 40 | .leaflet-control-layers-toggle { 41 | } 42 | .leaflet-control-attribution, .leaflet-control-layers { 43 | background: white; 44 | } -------------------------------------------------------------------------------- /public/css/livemap.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 0; 3 | margin: 0; 4 | } 5 | 6 | html,body,#content,#map { 7 | height: 100%; 8 | } 9 | 10 | #clock { 11 | font-size:18px; 12 | float:right; 13 | margin:10px 0px 0px 10px; 14 | } 15 | 16 | #warning { 17 | position: relative; 18 | top: 150px; 19 | left: auto; 20 | margin: 0 auto; 21 | z-index: 999; 22 | display:none; 23 | } -------------------------------------------------------------------------------- /public/images/bus_20x20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/bus_20x20.png -------------------------------------------------------------------------------- /public/images/bus_24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/bus_24x24.png -------------------------------------------------------------------------------- /public/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/layers.png -------------------------------------------------------------------------------- /public/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/marker-icon.png -------------------------------------------------------------------------------- /public/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/marker-shadow.png -------------------------------------------------------------------------------- /public/images/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/marker.png -------------------------------------------------------------------------------- /public/images/popup-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/popup-close.png -------------------------------------------------------------------------------- /public/images/station_16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/station_16x16.png -------------------------------------------------------------------------------- /public/images/station_22x22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/station_22x22.png -------------------------------------------------------------------------------- /public/images/station_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/station_32x32.png -------------------------------------------------------------------------------- /public/images/tram_20x20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/tram_20x20.png -------------------------------------------------------------------------------- /public/images/tram_24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/tram_24x24.png -------------------------------------------------------------------------------- /public/images/ulmapi_logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/ulmapi_logo_small.png -------------------------------------------------------------------------------- /public/images/zoom-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/zoom-in.png -------------------------------------------------------------------------------- /public/images/zoom-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/images/zoom-out.png -------------------------------------------------------------------------------- /public/js/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/js/images/layers.png -------------------------------------------------------------------------------- /public/js/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/js/images/marker-icon.png -------------------------------------------------------------------------------- /public/js/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/js/images/marker-shadow.png -------------------------------------------------------------------------------- /public/js/images/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/js/images/marker.png -------------------------------------------------------------------------------- /public/js/images/popup-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/js/images/popup-close.png -------------------------------------------------------------------------------- /public/js/images/zoom-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/js/images/zoom-in.png -------------------------------------------------------------------------------- /public/js/images/zoom-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UlmApi/livemap/cc19921568aed6e7a0cca574fda3026542235ce5/public/js/images/zoom-out.png -------------------------------------------------------------------------------- /public/js/livemap.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function(){ 2 | 3 | var cloudmadeUrl = 'http://tiles.codefor.de/static/bbs/germany/{z}/{x}/{y}.png'; 4 | var cloudmadeAttribution = 'UlmApi.de, Map data © 2014 OpenStreetMap contributors, Imagery © 2014 OpenStreetMap contributors'; 5 | var cloudmade = new L.TileLayer( 6 | cloudmadeUrl, { 7 | maxZoom : 18, 8 | attribution : cloudmadeAttribution 9 | }); 10 | 11 | var map = new L.Map('map', { 12 | center : new L.LatLng(48.399976,9.995399), 13 | zoom : 13, 14 | layers : [ cloudmade ], 15 | zoomControl : false 16 | }); 17 | 18 | var StationIcon = L.Icon.extend({options:{ 19 | iconUrl: 'images/station_22x22.png', 20 | shadowUrl: null, 21 | shadowSize: new L.Point(0,0), 22 | iconSize: new L.Point(22, 22), 23 | iconAnchor: new L.Point(11, 11), 24 | popupAnchor: new L.Point(0,-9) 25 | }}); 26 | 27 | var BusIcon = L.Icon.extend({options:{ 28 | iconUrl: 'images/bus_20x20.png', 29 | shadowUrl: null, 30 | shadowSize: new L.Point(0,0), 31 | iconSize: new L.Point(20, 20), 32 | iconAnchor: new L.Point(10, 10), 33 | popupAnchor: new L.Point(0,-10) 34 | }}); 35 | 36 | var TramIcon = L.Icon.extend({options:{ 37 | iconUrl: 'images/tram_20x20.png', 38 | shadowUrl: null, 39 | shadowSize: new L.Point(0,0), 40 | iconSize: new L.Point(20, 20), 41 | iconAnchor: new L.Point(10,10), 42 | popupAnchor: new L.Point(0,-10) 43 | }}); 44 | 45 | var hIcon = new StationIcon(); 46 | var bIcon = new BusIcon(); 47 | var tIcon = new TramIcon(); 48 | 49 | 50 | var nulls = function(i) { 51 | return (i < 10) ? i = '0' + i : i; 52 | }; 53 | 54 | var getOffset = function(d) { 55 | /* summertime for germany, 2011 */ 56 | if ((d.getUTCMonth() == 3 && d.getUTCDate() >= 27) || 57 | (d.getUTCMonth() == 10 && d.getUTCDate() <= 30) || 58 | (d.getUTCMonth() > 3 && d.getUTCMonth() < 10)) 59 | return 2; 60 | else 61 | return 1; 62 | } 63 | 64 | window.setInterval(function() { 65 | var d = new Date(); 66 | var offset = getOffset(d); 67 | 68 | var hrs = nulls((d.getUTCHours() + offset) % 24); 69 | var mins = nulls(d.getUTCMinutes()); 70 | var secs = nulls(d.getUTCSeconds()); 71 | 72 | $("#clock").html(hrs + ':' + mins + ':' + secs); 73 | }, 1000); 74 | 75 | 76 | /* is it a service free period= */ 77 | var d = new Date(); 78 | var offset = getOffset(d); 79 | if ( 80 | (((d.getUTCHours() + offset) % 24) >= 23 && d.getUTCMinutes() > 30) || 81 | (((d.getUTCHours() + offset) % 24)) < 6){ 82 | $("#warning").show(); 83 | } 84 | 85 | var stopsLayer; 86 | var shapeLayers = {}; 87 | var trips = {}; 88 | 89 | $.ajax({ 90 | url: '/data/trips', 91 | success: function(data) { 92 | trips = data; 93 | } 94 | 95 | }); 96 | 97 | $.ajax({ 98 | url: '/data/stops', 99 | success: function(data) { 100 | 101 | L.geoJson(data, { 102 | pointToLayer: function(f, latlng) { return new L.Marker(latlng, {icon : hIcon }).bindPopup(''+f.properties.stop_name+'
'+f.properties.stop_longname); } 103 | }).addTo(map); 104 | } 105 | }); 106 | 107 | $.ajax({ 108 | url: '/data/shapes', 109 | success: function(data) { 110 | 111 | 112 | for(var i in data){ 113 | if (data.hasOwnProperty(i)) { 114 | 115 | L.geoJson(data[i], { 116 | 117 | 118 | }).addTo(map); 119 | } 120 | } 121 | } 122 | 123 | }); 124 | 125 | 126 | 127 | var socket = io.connect('/'); 128 | 129 | var knownTrips = {}; 130 | 131 | 132 | var delayedMoveMarker = function(delay, trip, lat, lon){ 133 | var marker = knownTrips[trip]; 134 | setTimeout(function(){ 135 | if(lat === 0 && lon === 0){ 136 | map.removeLayer(marker); 137 | delete knownTrips[trip]; 138 | } 139 | else{ 140 | marker.setLatLng(new L.LatLng(lat, lon)); 141 | } 142 | },delay); 143 | }; 144 | 145 | 146 | /* event simulator, throws an event every 10 secs. */ 147 | socket.on('event', function (data) { 148 | for(var trip in data){ 149 | if(data.hasOwnProperty(trip)){ 150 | var newMarker = false; 151 | if(!knownTrips[trip]){ 152 | var popup; 153 | var markerIcon = bIcon; 154 | if(trips && trips[trip]){ 155 | popup = ""+trips[trip].route_short_name+" – "+trips[trip].trip_headsign+"
"+trips[trip].route_long_name+"
"+trip+""; 156 | //bus or tram? 157 | markerIcon = (trips[trip].route_type == "0" ? tIcon : bIcon); 158 | } 159 | else{ 160 | console.dir(trips); 161 | } 162 | knownTrips[trip] = new L.Marker(new L.LatLng(data[trip][0][1], data[trip][0][0]), {icon : markerIcon}); 163 | knownTrips[trip].bindPopup(popup || trip); 164 | newMarker = true; 165 | } 166 | for(var i = 0;i 2 | 3 | 4 | 5 | <%= pageTitle %> – UlmApi.de 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | <% if (type == "map") { %> 17 | 18 | 19 | 20 | 21 | 22 | <% } %> 23 | 24 | 25 | 26 | 27 | 28 |
29 |
30 |
31 |

UlmApi.de LiveMap

32 |
    33 |
  • class="active" <% } %>>Map
  • 34 |
  • class="active" <% } %>>About
  • 35 |
36 | 37 |
38 |
39 |
40 | 41 |
42 |
43 |

LiveMap

44 |

Real-time visualization of public transportation in the City of Ulm, Germany.

45 |
46 | 47 | 48 |
49 |
50 |

What is this?

51 |

This application visualizes public transportation vehicles moving through the City of Ulm, Germany. Since the transport authority does not provide 52 | a useable data feed, we decided to scrape the timetable data and converted them into the 53 | GTFS format. We then implemented a simple GTFS parser which emulates the emission of real time event information (though it's based on the static data 54 | we liberated from their timetable prison. We hope to eventually switch the backend event emitter to realtime data in the future. If anybody out there 55 | knows someone working at the Stadtwerke Ulm, please prod them a little *nudge nudge*). 56 | The events emitted by the GTFS parser are consumed by the web application, which renders a map and moves markers according to the estimated location of each vehicle.

57 |

Why?

58 |

This application is a contribution to the Node Knockout 2011 by UlmApi.de members. 59 | We implemented this proof-of-concept prototype within two days. It is intended to demonstrate what is possible by mashing cool technology and open data 60 | together, shaking it well and letting it boil for a while. It might also prove relaxing to watch. Except if you're using Firefox.

61 |
62 |
63 |

Technologies used

64 |
65 |
node.js
66 |
General platform
67 |
express.js
68 |
Middleware framework
69 |
Socket.IO
70 |
Messaging library
71 |
Leaflet
72 |
JavaScript mapping library
73 |
bootstrap
74 |
CSS template
75 |
76 |
77 |
78 |
79 |
80 |

Team

81 |
82 |
Michael Müller
83 |
84 |
Simon Fuchs
85 |
86 |
Benjamin Erb
87 |
88 |
Stefan Kaufmann
89 |
90 |
91 |
92 |
93 |

What is UlmApi.de?

94 |

We are a group of open data enthusiasts, mostly from ulm university.

95 |
96 |
97 |
98 | 99 | 100 | 113 | 114 | 115 | 116 | 117 | -------------------------------------------------------------------------------- /views/container/map.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= pageTitle %> – UlmApi.de 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | <% if (type == "map") { %> 17 | 18 | 19 | 20 | 21 | 22 | <% } %> 23 | 24 | 25 | 26 | 27 | 28 |
29 |
30 |
31 |

UlmApi.de LiveMap

32 |
    33 |
  • class="active" <% } %>>Map
  • 34 |
  • class="active" <% } %>>About
  • 35 |
36 | 37 |
38 |
39 |
40 | 41 |
42 | 43 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /views/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= pageTitle %> – UlmApi.de 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | <% if (type == "map") { %> 17 | 18 | 19 | 20 | 21 | 22 | <% } %> 23 | 24 | 25 | 26 | 27 | 28 |
29 |
30 |
31 |

UlmApi.de LiveMap

32 |
    33 |
  • class="active" <% } %>>Map
  • 34 |
  • class="active" <% } %>>About
  • 35 |
36 | 37 |
38 |
39 |
40 | 41 | <%- body %> 42 | 43 | 56 | 57 | 58 | 59 | --------------------------------------------------------------------------------