├── .gitignore ├── 01-installing-and-running-ui └── README.md ├── 02-otp-and-graph-building ├── .dockerignore ├── .env ├── Dockerfile ├── README.md ├── build-config.json ├── docker-compose.yml ├── otp-config.json └── router-config.json ├── 03-running-otp-and-digitransit ├── .dockerignore ├── .env ├── Dockerfile ├── README.md ├── build-config.json ├── docker-compose.yml ├── otp-config.json └── router-config.json ├── 04-adding-geojson-layers ├── README.md └── rt-layers │ ├── bicycle-parking.geojson │ ├── bicycleinfrastructure.geojson │ ├── car-parking.geojson │ ├── charging.geojson │ └── toilet.geojson ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | logs/ 2 | TODOs.md 3 | -------------------------------------------------------------------------------- /01-installing-and-running-ui/README.md: -------------------------------------------------------------------------------- 1 | ## Customize stadtnavi Frontend, using existing back-end services 2 | 3 | This introduction will use a node:20 docker image to avoid a potentially tedious setup. 4 | 5 | ### 1. Requirements, installation 6 | - docker 7 | - git 8 | 9 | ### Installing Docker (more info [here](https://docs.docker.com/engine/install/debian/)) 10 | - don't forget to uninstall conflicting packages 11 | - use the [Docker repository](https://docs.docker.com/engine/install/debian/#install-using-the-repository) 12 | - create a group and add user https://docs.docker.com/engine/install/linux-postinstall/ 13 | - try `docker run hello-world` and `docker --version` 14 | 15 | 16 | ### Installing git and cURL: 17 | `apt-get install git curl -y` 18 | 19 | check installation (exact versions may differ): 20 | ``` 21 | $ git --version 22 | git version 2.39.2 23 | ``` 24 | 25 | ### 2. Checking out digitransit 26 | 27 | In your local projects directory, checkout the digitransit-ui: 28 | 29 | ``` 30 | $ git clone https://github.com/stadtnavi/digitransit-ui.git 31 | Cloning into 'digitransit-ui'... 32 | remote: Enumerating objects: 190376, done. 33 | remote: Counting objects: 100% (4619/4619), done. 34 | remote: Compressing objects: 100% (1604/1604), done. 35 | remote: Total 190376 (delta 3173), reused 4243 (delta 3004), pack-reused 185757 36 | Receiving objects: 100% (190376/190376), 202.79 MiB | 7.42 MiB/s, done. 37 | Resolving deltas: 100% (136603/136603), done. 38 | ``` 39 | 40 | ### 3. Installing dependencies and running digitransit 41 | 42 | To install digitransit and it's dependencies, run 43 | 44 | ``` 45 | $ docker run -ti --rm -p 8080:8080 -v $PWD/digitransit-ui:/digitransit-ui node:20 /bin/bash 46 | 47 | # cd digitransit-ui 48 | # git checkout next 49 | # yarn install 50 | ➤ YN0065: Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry 51 | ➤ YN0065: Run yarn config set --home enableTelemetry 0 to disable 52 | 53 | ➤ YN0000: ┌ Resolution step 54 | ➤ YN0002: │ @digitransit-component/digitransit-component@workspace:digitransit-component/packages/digitransit-component doesn't provide @digitransit-component/digitransit-component-dialog-modal (p4d433), requested by @digitransit-component/digitransit-component-autosuggest 55 | ➤ YN0002: │ @digitransit-component/digitransit-component@workspace:digitransit-component/packages/digitransit-component doesn't provide @digitransit-component/digitransit-component-dialog-modal (p03091), requested by @digitransit-component/digitransit-component-favourite-editing-modal 56 | ➤ YN0002: │ @digitransit-component/digitransit-component@workspace:digitransit-component/packages/digitransit-component doesn't provide @hsl-fi/container-spinner (p20867), requested by @digitransit-component/digit 57 | ... 58 | ➤ YN0000: │ Some peer dependencies are incorrectly met; run yarn explain peer-requirements for details, where is the six-letter p-prefixed code 59 | ➤ YN0000: └ Completed 60 | ➤ YN0000: ┌ Fetch step 61 | ➤ YN0013: │ yazl@npm:2.5.1 can't be found in the cache and will be fetched from the remote registry 62 | ... 63 | 64 | 65 | $ yarn setup 66 | 67 | ... 68 | lerna success run Ran npm script 'clean' in 2 packages in 1.8s: 69 | lerna success - @digitransit-store/digitransit-store-common-functions 70 | lerna success - @digitransit-store/digitransit-store-future-route 71 | info filter [ '@digitransit-store/*', 72 | info filter '!@digitransit-component/digitransit-component', 73 | info filter '!@digitransit-component/digitransit-component-with-breakpoint', 74 | info filter '!undefined' ] 75 | 76 | /tmp/digitransit-ui/digitransit-store/packages/digitransit-store-common-functions/src/index.js → digitransit-store/packages/digitransit-store-common-functions/lib... 77 | created digitransit-store/packages/digitransit-store-common-functions/lib in 876ms 78 | 79 | /tmp/digitransit-ui/digitransit-store/packages/digitransit-store-future-route/src/index.js → digitransit-store/packages/digitransit-store-future-route/lib... 80 | created digitransit-store/packages/digitransit-store-future-route/lib in 1.8s 81 | 82 | ``` 83 | The warnings are "ok" (well, rather currently expected than ok). 84 | 85 | To test the installation run: 86 | `CONFIG=herrenberg yarn run dev` 87 | 88 | In the console you will see this message `Digitransit-ui available on port 8080`. Open http://localhost:8080/ and wait for the initial loading to finish. 89 | 90 | ### 4. Starting a new config 91 | - to add a new theme run: `yarn run add-theme ` 92 | - for example `yarn run add-theme rt` 93 | - 3 file should be created and 1 modified: 94 | 1. app/configurations/config..js 95 | 2. sass/themes//_theme.scss 96 | 3. sass/themes//main.scss 97 | 4. app/configurations/config.default.js has been modified: `themeMap` should have a new property `: ''` 98 | 99 | 100 | ### 5. Do some customization 101 | * Colors 102 | * edit sass/themes//_theme.scss file 103 | * changing the already declared scss variables will change the colors of the new config immediately 104 | * e.g. change the primary color to orange: `$primary-color: #ff7300;` 105 | * City Name 106 | * modify the `APP_TITLE` variable located in app/configurations/config..js 107 | * `config.rt.js` 108 | * Replace the content of `config.rt.js` with the following code: 109 | ``` 110 | /* eslint-disable */ 111 | import configMerger from '../util/configMerger'; 112 | 113 | const CONFIG = 'rt'; 114 | const APP_TITLE = 'stadtnavi Reutlingen'; 115 | const APP_DESCRIPTION = 'Gemeinsam Mobilität neu denken - die intermodale Verbindungssuche mit offenen, lokalen Daten'; 116 | const API_URL = process.env.API_URL || 'https://api.stadtnavi.de'; 117 | const MAP_URL = process.env.MAP_URL || 'https://tiles.stadtnavi.eu/streets/{z}/{x}/{y}{r}.png'; 118 | const SEMI_TRANSPARENT_MAP_URL = process.env.SEMITRANSPARENT_MAP_URL || "https://tiles.stadtnavi.eu/satellite-overlay/{z}/{x}/{y}{r}.png"; 119 | const GEOCODING_BASE_URL = process.env.GEOCODING_BASE_URL || "https://photon.stadtnavi.eu/pelias/v1"; 120 | const YEAR = 1900 + new Date().getYear(); 121 | const STATIC_MESSAGE_URL = 122 | process.env.STATIC_MESSAGE_URL || 123 | '/assets/messages/message.empty.json'; 124 | 125 | const parentConfig = require('./config.stadtnavi.js').default; 126 | 127 | const minLat = 47.6020; 128 | const maxLat = 49.0050; 129 | const minLon = 8.4087; 130 | const maxLon = 9.9014; 131 | 132 | export default configMerger(parentConfig, { 133 | CONFIG, 134 | 135 | colors: { 136 | primary: '#333333', 137 | }, 138 | 139 | socialMedia: { 140 | title: APP_TITLE, 141 | description: APP_DESCRIPTION, 142 | 143 | image: { 144 | url: '/img/stadtnavi-social-media-card.png', 145 | width: 600, 146 | height: 300, 147 | } 148 | }, 149 | 150 | title: APP_TITLE, 151 | 152 | searchParams: { 153 | 'boundary.rect.min_lat': 48.34164, 154 | 'boundary.rect.max_lat': 48.97661, 155 | 'boundary.rect.min_lon': 9.95635, 156 | 'boundary.rect.max_lon': 8.530883, 157 | 'focus.point.lat': 48.5957, 158 | 'focus.point.lon': 8.8675 159 | }, 160 | 161 | areaPolygon: [ 162 | [minLon, minLat], 163 | [minLon, maxLat], 164 | [maxLon, maxLat], 165 | [maxLon, minLat], 166 | ], 167 | 168 | cityBike: { 169 | minZoomStopsNearYou: 10, 170 | showStationId: false, 171 | useSpacesAvailable: false, 172 | showCityBikes: true, 173 | networks: { 174 | bolt_reutlingen_tuebingen: { 175 | icon: "brand_bolt", 176 | operator: "bolt", 177 | name: { 178 | de: "Bolt OÜ" 179 | }, 180 | type: "scooter", 181 | form_factors: ['scooter', 'bicycle'], 182 | hideCode: true, 183 | enabled: true, 184 | url: { 185 | de: "https://www.bolt.eu/" 186 | } 187 | } 188 | } 189 | }, 190 | 191 | staticMessagesUrl: STATIC_MESSAGE_URL, 192 | 193 | // no live bus locations 194 | vehicles: false, 195 | }); 196 | 197 | ``` 198 | 199 | ### 6. Show results 200 | 201 | To start the application in production mode: 202 | - run `yarn run build` 203 | THEN 204 | - run `yarn run start` 205 | 206 | To start the application in development mode: 207 | - run `yarn run dev` 208 | 209 | Environment variables: 210 | - CONFIG=<...> 211 | - API_URL=<...> 212 | - MAP_URL=<...> 213 | - OTP_URL=<...> 214 | - GEOCODING_BASE_URL=<...> 215 | - ASSET_URL=<...> 216 | 217 | Running stadtnavi instance in dev/prod mode: 218 | - `CONFIG=rt yarn run dev` (development mode) 219 | OR 220 | - `yarn build` then `CONFIG=rt yarn run start` (production mode) 221 | 222 | ### 7. Building a Docker image 223 | 224 | When your happy with your changes, you may quit the docker container (via `exit`), and build docker image we will reuse in subsequent tutorial steps. 225 | 226 | 1. In the `digitransit-ui directory, build a docker image, run: `docker build -t stadtnavi/digitransit-ui .` (NOTE the "." at the end) 227 | 2. run the image: `docker run -p 8080:8080 -e CONFIG=rt stadtnavi/digitransit-ui` 228 | - any environment variable can be specified after the `-e` option 229 | - more information [here](https://github.com/HSLdevcom/digitransit-ui/blob/master/docs/Docker.md) 230 | 231 | ### More information 232 | visit: https://github.com/HSLdevcom/digitransit-ui 233 | -------------------------------------------------------------------------------- /02-otp-and-graph-building/.dockerignore: -------------------------------------------------------------------------------- 1 | docker-compose.yml 2 | Dockerfile 3 | *.md 4 | -------------------------------------------------------------------------------- /02-otp-and-graph-building/.env: -------------------------------------------------------------------------------- 1 | # URL to the GTFS feed used for routing 2 | GTFS_URL=https://www.openvvs.de/dataset/e66f03e4-79f2-41d0-90f1-166ca609e491/resource/bfbb59c7-767c-4bca-bbb2-d8d32a3e0378/download/google_transit.zip 3 | # URL to the OSM region used for routing. 4 | OSM_URL=https://download.geofabrik.de/europe/germany/baden-wuerttemberg/stuttgart-regbez-latest.osm.pbf 5 | # Memory allocated to OpenTripPlanner when building the Graph 6 | GRAPH_BUILD_MEMORY=5G 7 | # Port to access OpenTripPlanner on the host machine 8 | OTP_PORT=8090 9 | 10 | # Image used to build (and run) OpenTripPlanner 11 | OTP_IMAGE=mfdz/opentripplanner 12 | # Image tag used to build (and run) OpenTripPlanner 13 | OTP_TAG=latest 14 | -------------------------------------------------------------------------------- /02-otp-and-graph-building/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG OTP_TAG=latest 2 | ARG OTP_IMAGE=mfdz/opentripplanner 3 | 4 | FROM $OTP_IMAGE:$OTP_TAG AS otp 5 | 6 | # defined empty, so we can access the arg as env later again 7 | ARG gtfs_url=https://www.openvvs.de/dataset/e66f03e4-79f2-41d0-90f1-166ca609e491/resource/bfbb59c7-767c-4bca-bbb2-d8d32a3e0378/download/google_transit.zip 8 | ENV GTFS_URL=$gtfs_url 9 | ARG osm_pbf_url=https://download.geofabrik.de/europe/germany/baden-wuerttemberg/stuttgart-regbez-latest.osm.pbf 10 | ENV OSM_PBF_URL=$osm_pbf_url 11 | ARG memory=31G 12 | ENV MEMORY=$memory 13 | 14 | RUN apt-get update && apt-get install zip -y 15 | 16 | RUN mkdir -p /opt/opentripplanner/build/ 17 | 18 | # add build data 19 | # NOTE: we're using dockers caching here. Add items in order of least to most frequent changes 20 | ADD router-config.json /opt/opentripplanner/build/ 21 | ADD build-config.json /opt/opentripplanner/build/ 22 | ADD otp-config.json /opt/opentripplanner/build/ 23 | ADD $OSM_PBF_URL /opt/opentripplanner/build/ 24 | ADD $GTFS_URL /opt/opentripplanner/build/gtfs.zip 25 | 26 | # print version 27 | RUN java -jar otp-shaded.jar --version | tee build/version.txt 28 | 29 | # build 30 | RUN java -Xmx$MEMORY -jar otp-shaded.jar --build --save /opt/opentripplanner/build/ 31 | 32 | # 33 | ENTRYPOINT java -Xmx$MEMORY -jar otp-shaded.jar --load --serve /opt/opentripplanner/build/ 34 | -------------------------------------------------------------------------------- /02-otp-and-graph-building/README.md: -------------------------------------------------------------------------------- 1 | # stadtnavi Tutorial - OpenTripPlanner aufsetzen 2 | 3 | 4 | ## Building and running OpenTripPlanner with default config 5 | 6 | ```sh 7 | $ docker-compose up -d 8 | ... 9 | 10:35:13.093 INFO (Graph.java:980) Summary (number of each type of annotation): 10 | 10:35:13.136 INFO (Graph.java:988) BogusShapeDistanceTraveled - 866 11 | 10:35:13.137 INFO (Graph.java:988) BogusShapeGeometryCaught - 99 12 | 10:35:13.138 INFO (Graph.java:988) GraphConnectivity - 7037 13 | 10:35:13.138 INFO (Graph.java:988) Graphwide - 1 14 | 10:35:13.139 INFO (Graph.java:988) HopSpeedFast - 23461 15 | 10:35:13.139 INFO (Graph.java:988) HopSpeedSlow - 39 16 | 10:35:13.139 INFO (Graph.java:988) HopZeroTime - 33549 17 | 10:35:13.139 INFO (Graph.java:988) LevelAmbiguous - 753 18 | 10:35:13.140 INFO (Graph.java:988) ParkAndRideUnlinked - 12 19 | 10:35:13.140 INFO (Graph.java:988) StopLinkedTooFar - 191 20 | 10:35:13.140 INFO (Graph.java:988) StopNotLinkedForTransfers - 643 21 | 10:35:13.140 INFO (Graph.java:988) StopUnlinked - 573 22 | 10:35:13.140 INFO (Graph.java:988) TurnRestrictionBad - 496 23 | 10:35:13.140 INFO (Graph.java:988) TurnRestrictionException - 106 24 | 10:35:13.140 INFO (Graph.java:988) TurnRestrictionUnknown - 59 25 | 10:35:13.362 INFO (Graph.java:826) Main graph size: |V|=1113693 |E|=2926193 26 | 10:35:13.362 INFO (Graph.java:827) Writing graph /opt/opentripplanner/build/default/Graph.obj ... 27 | ... 28 | Successfully built cf2ff3e4936f 29 | Successfully tagged 02-otp-and-graph-building_graph:latest 30 | WARNING: Image for service graph was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. 31 | Creating 02-otp-and-graph-building_graph_1 ... done 32 | Creating 02-otp-and-graph-building_opentripplanner_1 ... done 33 | $ 34 | ``` 35 | 36 | To verify that the OpenTripPlanner started successfully, you may check for the following lines in the logs: 37 | ```sh 38 | $ docker logs 02-otp-and-graph-building_opentripplanner_1 39 | 40 | ... 41 | 12:14:53.850 INFO (NetworkListener.java:755) Started listener bound to [0.0.0.0:8080] 42 | 12:14:53.863 INFO (NetworkListener.java:755) Started listener bound to [0.0.0.0:8081] 43 | 12:14:53.865 INFO (HttpServer.java:300) [HttpServer] Started. 44 | 12:14:53.865 INFO (GrizzlyServer.java:154) Grizzly server running. 45 | ``` 46 | 47 | Now OpenTripPlanner is ready and you may access the internal OTP front end via http://localhost:8090 (Note the port is 8090 as 8080 is mapped to 8090 in the docker-compose.yml). 48 | 49 | If that worked, you may adapt the config to supply your proper data. 50 | 51 | ## Building and running OpenTripPlanner with your config 52 | 53 | If you want to build and run OpenTripPlanner with your own GTFS/OSM data, copy `.env`to e.g. `.env.mycity`, edit especially the GTFS_URL and OSM_URL variables to point to your data: 54 | 55 | ``` 56 | # URL to the GTFS feed used for routing 57 | GTFS_URL=https://www.openvvs.de/dataset/e66f03e4-79f2-41d0-90f1-166ca609e491/resource/bfbb59c7-767c-4bca-bbb2-d8d32a3e0378/download/google_transit.zip 58 | # URL to the OSM region used for routing. 59 | OSM_URL=https://download.geofabrik.de/europe/germany/baden-wuerttemberg/stuttgart-regbez-latest.osm.pbf 60 | # Memory allocated to OpenTripPlanner when building the Graph 61 | GRAPH_BUILD_MEMORY=5G 62 | # Port to access OpenTripPlanner on the host machine 63 | OTP_PORT=8090 64 | 65 | # Image used to build (and run) OpenTripPlanner 66 | OTP_IMAGE=mfdz/opentripplanner 67 | # Image tag used to build (and run) OpenTripPlanner 68 | OTP_TAG=latest 69 | ``` 70 | 71 | Finally run docker-compose specifying your adapted config file (be sure to pass the --build flag, so containers are rebuilt): 72 | 73 | *Note*: Please make sure that you have at least `docker-compose` 1.25.0. 74 | 75 | ```sh 76 | $ docker-compose --env-file=.env.mycity up --build -d 77 | ``` 78 | -------------------------------------------------------------------------------- /02-otp-and-graph-building/build-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "areaVisibility": true, 3 | "parentStopLinking": true, 4 | "osmWayPropertySet": "germany" 5 | } -------------------------------------------------------------------------------- /02-otp-and-graph-building/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | opentripplanner: 5 | image: ${OTP_IMAGE}:${OTP_TAG} 6 | build: 7 | context: . 8 | args: 9 | - OTP_IMAGE=${OTP_IMAGE} 10 | - OTP_TAG=${OTP_TAG} 11 | - gtfs_url=${GTFS_URL} 12 | - osm_pbf_url=${OSM_URL} 13 | - memory=${GRAPH_BUILD_MEMORY} 14 | ports: 15 | - "${OTP_PORT}:8080" 16 | healthcheck: 17 | test: ["CMD", "curl", "-f", "http://localhost"] 18 | interval: 15s 19 | timeout: 10s 20 | retries: 3 21 | -------------------------------------------------------------------------------- /02-otp-and-graph-building/otp-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "otpFeatures" : { 3 | "SandboxAPILegacyGraphQLApi": true, 4 | "SandboxAPIMapboxVectorTilesApi": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /02-otp-and-graph-building/router-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "routingDefaults": { 3 | "walkSpeed": 1.3, 4 | "transferSlack": 120, 5 | "maxTransfers": 4, 6 | "waitReluctance": 0.95, 7 | "waitAtBeginningFactor": 0.7, 8 | "walkReluctance": 1.75, 9 | "stairsReluctance": 1.65, 10 | "walkBoardCost": 540, 11 | "comment": "Ignore walkOnStreetReluctance as implementation is too simple and causes unexpected detours", 12 | "ignored_walkOnStreetReluctance": 1.5, 13 | "carParkCarLegWeight": 2, 14 | "itineraryFiltering": 1.0 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/.dockerignore: -------------------------------------------------------------------------------- 1 | docker-compose.yml 2 | Dockerfile 3 | *.md 4 | logs/ -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/.env: -------------------------------------------------------------------------------- 1 | # --- Digitransit Config 2 | ROUTER=hbnext 3 | # API URL (usually starts with api., for development, you'll probably need to configure /etc/hosts to map api.localhost to 127.0.0.1) 4 | API_URL=http://api.localhost:8080 5 | DT_IMAGE=stadtnavi/digitransit-ui 6 | DT_TAG=next 7 | # --- OpenTripPlanner Config 8 | # URL to the GTFS feed used for routing 9 | GTFS_URL=https://www.openvvs.de/dataset/e66f03e4-79f2-41d0-90f1-166ca609e491/resource/bfbb59c7-767c-4bca-bbb2-d8d32a3e0378/download/google_transit.zip 10 | # URL to the OSM region used for routing. 11 | OSM_URL=https://download.geofabrik.de/europe/germany/baden-wuerttemberg/stuttgart-regbez-latest.osm.pbf 12 | # Memory allocated to OpenTripPlanner when building the Graph 13 | GRAPH_BUILD_MEMORY=5G 14 | # Port to access OpenTripPlanner on the host machine 15 | OTP_PORT=8090 16 | 17 | # Image used to build (and run) OpenTripPlanner 18 | OTP_IMAGE=mfdz/opentripplanner 19 | # Image tag used to build (and run) OpenTripPlanner 20 | OTP_TAG=latest 21 | -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG OTP_TAG=latest 2 | ARG OTP_IMAGE=mfdz/opentripplanner 3 | 4 | FROM $OTP_IMAGE:$OTP_TAG AS otp 5 | 6 | # defined empty, so we can access the arg as env later again 7 | ARG gtfs_url=https://www.openvvs.de/dataset/e66f03e4-79f2-41d0-90f1-166ca609e491/resource/bfbb59c7-767c-4bca-bbb2-d8d32a3e0378/download/google_transit.zip 8 | ENV GTFS_URL=$gtfs_url 9 | ARG osm_pbf_url=https://download.geofabrik.de/europe/germany/baden-wuerttemberg/stuttgart-regbez-latest.osm.pbf 10 | ENV OSM_PBF_URL=$osm_pbf_url 11 | ARG memory=31G 12 | ENV MEMORY=$memory 13 | 14 | RUN apt-get update && apt-get install zip -y 15 | 16 | RUN mkdir -p /opt/opentripplanner/build/ 17 | 18 | # add build data 19 | # NOTE: we're using dockers caching here. Add items in order of least to most frequent changes 20 | ADD router-config.json /opt/opentripplanner/build/ 21 | ADD build-config.json /opt/opentripplanner/build/ 22 | ADD otp-config.json /opt/opentripplanner/build/ 23 | ADD $OSM_PBF_URL /opt/opentripplanner/build/ 24 | ADD $GTFS_URL /opt/opentripplanner/build/gtfs.zip 25 | 26 | # print version 27 | RUN java -jar otp-shaded.jar --version | tee build/version.txt 28 | 29 | # build 30 | RUN java -Xmx$MEMORY -jar otp-shaded.jar --build --save /opt/opentripplanner/build/ | tee build/build.log 31 | 32 | # 33 | ENTRYPOINT java -Xmx$MEMORY -jar otp-shaded.jar --load --serve /opt/opentripplanner/build/ 34 | -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/README.md: -------------------------------------------------------------------------------- 1 | # stadtnavi Tutorial - Running OPT and DT jointly 2 | 3 | 4 | ## Combining all containers 5 | 6 | In this tutorial step, we combine the customized Digitransit from step 1 and the custom configured OpenTripPlanner from step 2. 7 | 8 | At first, we try again to run the tutorial step unchanged. 9 | 10 | digitransit-proxy publishes the digitransit UI under and the OpenTripPlanner and map services using the subdomain api.. 11 | 12 | Both domains should refer to the same IP adress. For development purposes, we add a mapping for api.localhost to the local dns config in /etc/hosts: 13 | 14 | ```sh 15 | echo "127.0.0.1 api.localhost" | sudo tee -a /etc/hosts 16 | ``` 17 | 18 | This tutorial step will start the services highlighted in the following diagram: 19 | 20 | Start all containers via: 21 | 22 | ```sh 23 | $ docker-compose up -d 24 | ``` 25 | 26 | ## Customizing the setup 27 | Now again copy the `.env` file to e.g. `.env.mycity` and adapt ROUTER, GTFS_URL and OSM_URL to reflect the digitransit router config you created in step 1 and the data files you chose for step 2 already. 28 | 29 | ```sh 30 | $ docker-compose --env-file=.env.mycity up --build -d 31 | ``` 32 | 33 | After successful start, you should be able to acccess digitransit via http://localhost:8080/ 34 | 35 | -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/build-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "areaVisibility": true, 3 | "parentStopLinking": true, 4 | "osmWayPropertySet": "germany" 5 | } -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | digitransit-proxy: 5 | image: stadtnavi/digitransit-proxy:minimal 6 | ports: 7 | - 8080:8080 8 | depends_on: 9 | - "opentripplanner" 10 | digitransit-ui: 11 | image: ${DT_IMAGE}:${DT_TAG} 12 | environment: 13 | - CONFIG=${ROUTER:-hb} 14 | - GEOCODING_BASE_URL=https://photon.stadtnavi.eu/pelias/v1 15 | - API_URL=${API_URL} 16 | depends_on: 17 | - "opentripplanner" 18 | hsl-map-server: 19 | image: stadtnavi/hsl-map-server:latest 20 | environment: 21 | - OTP_URL=opentripplanner:8080/otp/routers/default/index/graphql 22 | depends_on: 23 | - "opentripplanner" 24 | opentripplanner: 25 | image: ${OTP_IMAGE}:${OTP_TAG} 26 | build: 27 | context: . 28 | args: 29 | - OTP_IMAGE=${OTP_IMAGE} 30 | - OTP_TAG=${OTP_TAG} 31 | - gtfs_url=${GTFS_URL} 32 | - osm_pbf_url=${OSM_URL} 33 | - memory=${GRAPH_BUILD_MEMORY} 34 | ports: 35 | - "${OTP_PORT}:8080" 36 | healthcheck: 37 | test: ["CMD", "curl", "-f", "http://localhost:8080/"] 38 | interval: 15s 39 | timeout: 10s 40 | retries: 30 41 | -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/otp-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "otpFeatures" : { 3 | "SandboxAPILegacyGraphQLApi": true, 4 | "SandboxAPIMapboxVectorTilesApi": true 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /03-running-otp-and-digitransit/router-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "routingDefaults": { 3 | "walkSpeed": 1.3, 4 | "transferSlack": 120, 5 | "maxTransfers": 4, 6 | "waitReluctance": 0.95, 7 | "waitAtBeginningFactor": 0.7, 8 | "walkReluctance": 1.75, 9 | "stairsReluctance": 1.65, 10 | "walkBoardCost": 540, 11 | "comment": "Ignore walkOnStreetReluctance as implementation is too simple and causes unexpected detours", 12 | "ignored_walkOnStreetReluctance": 1.5, 13 | "carParkCarLegWeight": 2, 14 | "itineraryFiltering": 1.0 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /04-adding-geojson-layers/README.md: -------------------------------------------------------------------------------- 1 | ### Adding custom map Layer 2 | We use geojson files to render static map layers(e.g. bike park layer). Downloading and modifying these files require a lot of repetetive work, that is why we implemented automated python scripts. These scripts are in the `digitransit-overpass-layers` repository. By default they are configured for Herrenberg but with some environmental variables, they can be used for any other city. In the following steps, we show how to download and customize geojson files, using the python scripts, and then how to add it to the digitransit-ui. 3 | 4 | Requirement: python3.6 or newer installed 5 | 6 | 1. clone the `digitransit-overpass-layers` repository to the same folder where `digitransit-ui` is located 7 | - run: `git clone https://github.com/stadtnavi/digitransit-overpass-layers.git` 8 | - then: `cd digitransit-overpass-layers` 9 | 2. set some environmental variable 10 | - `ENV_BBOX` specifies the place where the overpass-turbo API should look for different POIs 11 | - `ENV_DDIR` is used to declare the target folder, where the geojson files should be downloaded 12 | - `ENV_ICNSRC` declares the directory of the icons for each layer 13 | First lets specify the `ENV_BBOX`: 14 | ``` 15 | $ export ENV_BBOX="48.395,9.0901,48.6075,9.3616" 16 | $ echo $ENV_BBOX 17 | 48.395,9.0901,48.6075,9.3616 18 | ``` 19 | then the `ENV_DDIR`: 20 | ``` 21 | $ export ENV_DDIR=../digitransit-ui/static/assets/geojson/rt-layers/ 22 | $ echo $ENV_DDIR 23 | ../digitransit-ui/static/assets/geojson/rt-layers/ 24 | ``` 25 | 3. install python packages 26 | `pip install overpass osmtogeojson` 27 | 4. run the scripts 28 | `python generate-layers.py` 29 | *Note: If you get `MultipleRequestError` just try to re-run the script if it does not help download the data from the stadnavi-tutorial repository. The files are located at `04-adding-geojson-layers/` from where you can copy the `rt-layers` folder to `digitransit-ui/static/assets/geojson/`.* 30 | 5. add some configuration 31 | paste the following code to the end of `app/configurations/config.rt.js` file after the comment '// geojson config:' 32 | ``` 33 | geoJson: { 34 | layers: [ 35 | // bicycleinfrastructure includes shops, repair stations, 36 | { 37 | name: { 38 | fi: '', 39 | en: 'Bicycle parking', 40 | de: "Fahrradstellplatz", 41 | }, 42 | url: '/assets/geojson/rt-layers/bicycle-parking.geojson', 43 | }, 44 | { 45 | name: { 46 | fi: '', 47 | en: 'Bicycle infrastructure', 48 | de: "Rund um's Fahrrad", 49 | }, 50 | url: '/assets/geojson/rt-layers/bicycleinfrastructure.geojson', 51 | }, 52 | { 53 | name: { 54 | fi: '', 55 | en: 'Car park', 56 | de: "Autoparkplatz", 57 | }, 58 | url: '/assets/geojson/rt-layers/car-parking.geojson', 59 | }, 60 | // Charging stations 61 | { 62 | name: { 63 | fi: '', 64 | en: 'Charging stations', 65 | de: 'Ladestationen', 66 | }, 67 | url: '/assets/geojson/rt-layers/charging.geojson', 68 | }, 69 | // Nette Toilette layer 70 | { 71 | name: { 72 | fi: '', 73 | en: 'Public Toilets', 74 | de: 'Nette Toilette', 75 | }, 76 | url: '/assets/geojson/rt-layers/toilet.geojson', 77 | isOffByDefault: true, 78 | }, 79 | ], 80 | } 81 | ``` 82 | 6. run the application 83 | `$ CONFIG=rt yarn run dev` 84 | 7. check the layers 85 | Now you should be able to enable or disable each layer from the map layers selector. -------------------------------------------------------------------------------- /04-adding-geojson-layers/rt-layers/bicycleinfrastructure.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": { 7 | "name": "T\u00fcbinger Tor", 8 | "name_en": "T\u00fcbinger Tor", 9 | "name_de": "T\u00fcbinger Tor", 10 | "popupContent": "", 11 | "popupContent_de": "", 12 | "popupContent_en": "", 13 | "id": "Fahrradreparaturstation_0", 14 | "icon": { 15 | "id": "bikeRepIcon", 16 | "svg": " " 17 | } 18 | }, 19 | "geometry": { 20 | "type": "Point", 21 | "coordinates": [ 22 | 9.2086163, 23 | 48.4907981 24 | ] 25 | } 26 | }, 27 | { 28 | "type": "Feature", 29 | "properties": { 30 | "name": "Charlottenstra\u00dfe", 31 | "name_en": "Charlottenstra\u00dfe", 32 | "name_de": "Charlottenstra\u00dfe", 33 | "popupContent": "", 34 | "popupContent_de": "", 35 | "popupContent_en": "", 36 | "id": "Fahrradreparaturstation_1", 37 | "icon": { 38 | "id": "bikeRepIcon" 39 | } 40 | }, 41 | "geometry": { 42 | "type": "Point", 43 | "coordinates": [ 44 | 9.2204059, 45 | 48.4941392 46 | ] 47 | } 48 | }, 49 | { 50 | "type": "Feature", 51 | "properties": { 52 | "name": "Hauptbahnhof", 53 | "name_en": "Hauptbahnhof", 54 | "name_de": "Hauptbahnhof", 55 | "popupContent": "", 56 | "popupContent_de": "", 57 | "popupContent_en": "", 58 | "id": "Fahrradreparaturstation_2", 59 | "icon": { 60 | "id": "bikeRepIcon" 61 | } 62 | }, 63 | "geometry": { 64 | "type": "Point", 65 | "coordinates": [ 66 | 9.2087243, 67 | 48.4948666 68 | ] 69 | } 70 | }, 71 | { 72 | "type": "Feature", 73 | "properties": { 74 | "name": "Albtorplatz", 75 | "name_en": "Albtorplatz", 76 | "name_de": "Albtorplatz", 77 | "popupContent": "", 78 | "popupContent_de": "", 79 | "popupContent_en": "", 80 | "id": "Fahrradreparaturstation_3", 81 | "icon": { 82 | "id": "bikeRepIcon" 83 | } 84 | }, 85 | "geometry": { 86 | "type": "Point", 87 | "coordinates": [ 88 | 9.2161637, 89 | 48.4902854 90 | ] 91 | } 92 | }, 93 | { 94 | "type": "Feature", 95 | "properties": { 96 | "name_en": "Bicycle repair station", 97 | "name_de": "Fahrradreparaturstation", 98 | "name": "Fahrradreparaturstation", 99 | "popupContent": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 100 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 101 | "popupContent_en": "Fee: no, Opening hours: 24/7", 102 | "id": "Fahrradreparaturstation_4", 103 | "icon": { 104 | "id": "bikeRepIcon" 105 | } 106 | }, 107 | "geometry": { 108 | "type": "Point", 109 | "coordinates": [ 110 | 9.1571712, 111 | 48.4960004 112 | ] 113 | } 114 | }, 115 | { 116 | "type": "Feature", 117 | "properties": { 118 | "name_en": "Bicycle repair station", 119 | "name_de": "Fahrradreparaturstation", 120 | "name": "Fahrradreparaturstation", 121 | "popupContent": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 122 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 123 | "popupContent_en": "Fee: no, Opening hours: 24/7", 124 | "id": "Fahrradreparaturstation_5", 125 | "icon": { 126 | "id": "bikeRepIcon" 127 | } 128 | }, 129 | "geometry": { 130 | "type": "Point", 131 | "coordinates": [ 132 | 9.0988933, 133 | 48.6004502 134 | ] 135 | } 136 | }, 137 | { 138 | "type": "Feature", 139 | "properties": { 140 | "name_en": "Bicycle repair station", 141 | "name_de": "Fahrradreparaturstation", 142 | "name": "Fahrradreparaturstation", 143 | "popupContent": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 144 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 145 | "popupContent_en": "Fee: no, Opening hours: 24/7", 146 | "id": "Fahrradreparaturstation_6", 147 | "icon": { 148 | "id": "bikeRepIcon" 149 | } 150 | }, 151 | "geometry": { 152 | "type": "Point", 153 | "coordinates": [ 154 | 9.2067643, 155 | 48.5210224 156 | ] 157 | } 158 | }, 159 | { 160 | "type": "Feature", 161 | "properties": { 162 | "name_en": "Bicycle repair station", 163 | "name_de": "Fahrradreparaturstation", 164 | "name": "Fahrradreparaturstation", 165 | "popupContent": "", 166 | "popupContent_de": "", 167 | "popupContent_en": "", 168 | "id": "Fahrradreparaturstation_7", 169 | "icon": { 170 | "id": "bikeRepIcon" 171 | } 172 | }, 173 | "geometry": { 174 | "type": "Point", 175 | "coordinates": [ 176 | 9.175219, 177 | 48.5223615 178 | ] 179 | } 180 | }, 181 | { 182 | "type": "Feature", 183 | "properties": { 184 | "name_en": "Bicycle repair station", 185 | "name_de": "Fahrradreparaturstation", 186 | "name": "Fahrradreparaturstation", 187 | "popupContent": "\u00d6ffnungszeiten: 24/7", 188 | "popupContent_de": "\u00d6ffnungszeiten: 24/7", 189 | "popupContent_en": "Opening hours: 24/7", 190 | "id": "Fahrradreparaturstation_8", 191 | "icon": { 192 | "id": "bikeRepIcon" 193 | } 194 | }, 195 | "geometry": { 196 | "type": "Point", 197 | "coordinates": [ 198 | 9.1415793, 199 | 48.5335676 200 | ] 201 | } 202 | }, 203 | { 204 | "type": "Feature", 205 | "properties": { 206 | "name_en": "Bicycle repair station", 207 | "name_de": "Fahrradreparaturstation", 208 | "name": "Fahrradreparaturstation", 209 | "popupContent": "", 210 | "popupContent_de": "", 211 | "popupContent_en": "", 212 | "id": "Fahrradreparaturstation_9", 213 | "icon": { 214 | "id": "bikeRepIcon" 215 | } 216 | }, 217 | "geometry": { 218 | "type": "Point", 219 | "coordinates": [ 220 | 9.2364268, 221 | 48.5153384 222 | ] 223 | } 224 | }, 225 | { 226 | "type": "Feature", 227 | "properties": { 228 | "name_en": "Bicycle repair station", 229 | "name_de": "Fahrradreparaturstation", 230 | "name": "Fahrradreparaturstation", 231 | "popupContent": "", 232 | "popupContent_de": "", 233 | "popupContent_en": "", 234 | "id": "Fahrradreparaturstation_10", 235 | "icon": { 236 | "id": "bikeRepIcon" 237 | } 238 | }, 239 | "geometry": { 240 | "type": "Point", 241 | "coordinates": [ 242 | 9.2289041, 243 | 48.4864621 244 | ] 245 | } 246 | }, 247 | { 248 | "type": "Feature", 249 | "properties": { 250 | "name_en": "Bicycle repair station", 251 | "name_de": "Fahrradreparaturstation", 252 | "name": "Fahrradreparaturstation", 253 | "popupContent": "", 254 | "popupContent_de": "", 255 | "popupContent_en": "", 256 | "id": "Fahrradreparaturstation_11", 257 | "icon": { 258 | "id": "bikeRepIcon" 259 | } 260 | }, 261 | "geometry": { 262 | "type": "Point", 263 | "coordinates": [ 264 | 9.1508607, 265 | 48.4321267 266 | ] 267 | } 268 | }, 269 | { 270 | "type": "Feature", 271 | "properties": { 272 | "name_en": "Bicycle repair station", 273 | "name_de": "Fahrradreparaturstation", 274 | "name": "Fahrradreparaturstation", 275 | "popupContent": "", 276 | "popupContent_de": "", 277 | "popupContent_en": "", 278 | "id": "Fahrradreparaturstation_12", 279 | "icon": { 280 | "id": "bikeRepIcon" 281 | } 282 | }, 283 | "geometry": { 284 | "type": "Point", 285 | "coordinates": [ 286 | 9.2279556, 287 | 48.4554867 288 | ] 289 | } 290 | }, 291 | { 292 | "type": "Feature", 293 | "properties": { 294 | "name": "Rad Rolf", 295 | "name_en": "Rad Rolf", 296 | "name_de": "Rad Rolf", 297 | "popupContent": "Telefon: +49 72127 70645", 298 | "popupContent_de": "Telefon: +49 72127 70645", 299 | "popupContent_en": "Phone: +49 72127 70645", 300 | "id": "Fahrradgesch\u00e4ft_0", 301 | "icon": { 302 | "id": "bikeShopIcon", 303 | "svg": " SHOP " 304 | } 305 | }, 306 | "geometry": { 307 | "type": "Point", 308 | "coordinates": [ 309 | 9.2051679, 310 | 48.560482 311 | ] 312 | } 313 | }, 314 | { 315 | "type": "Feature", 316 | "properties": { 317 | "name": "Siggi's Radlager", 318 | "name_en": "Siggi's Radlager", 319 | "name_de": "Siggi's Radlager", 320 | "popupContent": "Telefon: +49 7127 887020, Barrierefrei: nein", 321 | "popupContent_de": "Telefon: +49 7127 887020, Barrierefrei: nein", 322 | "popupContent_en": "Phone: +49 7127 887020, Wheelchair: no", 323 | "id": "Fahrradgesch\u00e4ft_1", 324 | "icon": { 325 | "id": "bikeShopIcon" 326 | } 327 | }, 328 | "geometry": { 329 | "type": "Point", 330 | "coordinates": [ 331 | 9.211016, 332 | 48.5575456 333 | ] 334 | } 335 | }, 336 | { 337 | "type": "Feature", 338 | "properties": { 339 | "name": "Fahrradladen", 340 | "name_en": "Fahrradladen", 341 | "name_de": "Fahrradladen", 342 | "popupContent": "", 343 | "popupContent_de": "", 344 | "popupContent_en": "", 345 | "id": "Fahrradgesch\u00e4ft_2", 346 | "icon": { 347 | "id": "bikeShopIcon" 348 | } 349 | }, 350 | "geometry": { 351 | "type": "Point", 352 | "coordinates": [ 353 | 9.2686596, 354 | 48.5612482 355 | ] 356 | } 357 | }, 358 | { 359 | "type": "Feature", 360 | "properties": { 361 | "name": "TransVelo", 362 | "name_en": "TransVelo", 363 | "name_de": "TransVelo", 364 | "popupContent": "\u00d6ffnungszeiten: Mo-Fr 09:30-19:00; Sa 09:30-16:00; So,PH off, Telefon: +49 7121 470726, Barrierefrei: ja", 365 | "popupContent_de": "\u00d6ffnungszeiten: Mo-Fr 09:30-19:00; Sa 09:30-16:00; So,PH off, Telefon: +49 7121 470726, Barrierefrei: ja", 366 | "popupContent_en": "Opening hours: Mo-Fr 09:30-19:00; Sa 09:30-16:00; Su,PH off, Phone: +49 7121 470726, Wheelchair: yes", 367 | "id": "Fahrradgesch\u00e4ft_3", 368 | "icon": { 369 | "id": "bikeShopIcon" 370 | } 371 | }, 372 | "geometry": { 373 | "type": "Point", 374 | "coordinates": [ 375 | 9.2169185, 376 | 48.4926996 377 | ] 378 | } 379 | }, 380 | { 381 | "type": "Feature", 382 | "properties": { 383 | "name": "Fahrrad Ochs", 384 | "name_en": "Fahrrad Ochs", 385 | "name_de": "Fahrrad Ochs", 386 | "popupContent": "", 387 | "popupContent_de": "", 388 | "popupContent_en": "", 389 | "id": "Fahrradgesch\u00e4ft_4", 390 | "icon": { 391 | "id": "bikeShopIcon" 392 | } 393 | }, 394 | "geometry": { 395 | "type": "Point", 396 | "coordinates": [ 397 | 9.2534367, 398 | 48.483148 399 | ] 400 | } 401 | }, 402 | { 403 | "type": "Feature", 404 | "properties": { 405 | "name": "Country-Bike-Shop Eberle", 406 | "name_en": "Country-Bike-Shop Eberle", 407 | "name_de": "Country-Bike-Shop Eberle", 408 | "popupContent": "", 409 | "popupContent_de": "", 410 | "popupContent_en": "", 411 | "id": "Fahrradgesch\u00e4ft_5", 412 | "icon": { 413 | "id": "bikeShopIcon" 414 | } 415 | }, 416 | "geometry": { 417 | "type": "Point", 418 | "coordinates": [ 419 | 9.3431394, 420 | 48.5295389 421 | ] 422 | } 423 | }, 424 | { 425 | "type": "Feature", 426 | "properties": { 427 | "name": "Fahrrad Sauer", 428 | "name_en": "Fahrrad Sauer", 429 | "name_de": "Fahrrad Sauer", 430 | "popupContent": "\u00d6ffnungszeiten: Di-Fr 09:00-12:30,14:00-18:30; Sa 09:00-16:00, Barrierefrei: nein", 431 | "popupContent_de": "\u00d6ffnungszeiten: Di-Fr 09:00-12:30,14:00-18:30; Sa 09:00-16:00, Barrierefrei: nein", 432 | "popupContent_en": "Opening hours: Tu-Fr 09:00-12:30,14:00-18:30; Sa 09:00-16:00, Wheelchair: no", 433 | "id": "Fahrradgesch\u00e4ft_6", 434 | "icon": { 435 | "id": "bikeShopIcon" 436 | } 437 | }, 438 | "geometry": { 439 | "type": "Point", 440 | "coordinates": [ 441 | 9.1818115, 442 | 48.4982103 443 | ] 444 | } 445 | }, 446 | { 447 | "type": "Feature", 448 | "properties": { 449 | "name": "WOF Bikebox", 450 | "name_en": "WOF Bikebox", 451 | "name_de": "WOF Bikebox", 452 | "popupContent": "", 453 | "popupContent_de": "", 454 | "popupContent_en": "", 455 | "id": "Fahrradgesch\u00e4ft_7", 456 | "icon": { 457 | "id": "bikeShopIcon" 458 | } 459 | }, 460 | "geometry": { 461 | "type": "Point", 462 | "coordinates": [ 463 | 9.1843544, 464 | 48.4069303 465 | ] 466 | } 467 | }, 468 | { 469 | "type": "Feature", 470 | "properties": { 471 | "name": "Radwerk", 472 | "name_en": "Radwerk", 473 | "name_de": "Radwerk", 474 | "popupContent": "Barrierefrei: nein", 475 | "popupContent_de": "Barrierefrei: nein", 476 | "popupContent_en": "Wheelchair: no", 477 | "id": "Fahrradgesch\u00e4ft_8", 478 | "icon": { 479 | "id": "bikeShopIcon" 480 | } 481 | }, 482 | "geometry": { 483 | "type": "Point", 484 | "coordinates": [ 485 | 9.2767958, 486 | 48.5412854 487 | ] 488 | } 489 | }, 490 | { 491 | "type": "Feature", 492 | "properties": { 493 | "name": "Fahrradwerkstatt Ermstal", 494 | "name_en": "Fahrradwerkstatt Ermstal", 495 | "name_de": "Fahrradwerkstatt Ermstal", 496 | "popupContent": "", 497 | "popupContent_de": "", 498 | "popupContent_en": "", 499 | "id": "Fahrradgesch\u00e4ft_9", 500 | "icon": { 501 | "id": "bikeShopIcon" 502 | } 503 | }, 504 | "geometry": { 505 | "type": "Point", 506 | "coordinates": [ 507 | 9.299382, 508 | 48.5313582 509 | ] 510 | } 511 | }, 512 | { 513 | "type": "Feature", 514 | "properties": { 515 | "name": "Alles-Bike", 516 | "name_en": "Alles-Bike", 517 | "name_de": "Alles-Bike", 518 | "popupContent": "", 519 | "popupContent_de": "", 520 | "popupContent_en": "", 521 | "id": "Fahrradgesch\u00e4ft_10", 522 | "icon": { 523 | "id": "bikeShopIcon" 524 | } 525 | }, 526 | "geometry": { 527 | "type": "Point", 528 | "coordinates": [ 529 | 9.230198, 530 | 48.5887199 531 | ] 532 | } 533 | }, 534 | { 535 | "type": "Feature", 536 | "properties": { 537 | "name": "die fahrradwerkstatt", 538 | "name_en": "die fahrradwerkstatt", 539 | "name_de": "die fahrradwerkstatt", 540 | "popupContent": "Telefon: +49 7121 9307220, \u00d6ffnungszeiten: Di-Fr 10:00-13:00,14:00-18:00", 541 | "popupContent_de": "Telefon: +49 7121 9307220, \u00d6ffnungszeiten: Di-Fr 10:00-13:00,14:00-18:00", 542 | "popupContent_en": "Phone: +49 7121 9307220, Opening hours: Tu-Fr 10:00-13:00,14:00-18:00", 543 | "id": "Fahrradgesch\u00e4ft_11", 544 | "icon": { 545 | "id": "bikeShopIcon" 546 | } 547 | }, 548 | "geometry": { 549 | "type": "Point", 550 | "coordinates": [ 551 | 9.1976322, 552 | 48.4938141 553 | ] 554 | } 555 | }, 556 | { 557 | "type": "Feature", 558 | "properties": { 559 | "name": "Fahrrad Heim", 560 | "name_en": "Fahrrad Heim", 561 | "name_de": "Fahrrad Heim", 562 | "popupContent": "Telefon: +49 7127 3041", 563 | "popupContent_de": "Telefon: +49 7127 3041", 564 | "popupContent_en": "Phone: +49 7127 3041", 565 | "id": "Fahrradgesch\u00e4ft_12", 566 | "icon": { 567 | "id": "bikeShopIcon" 568 | } 569 | }, 570 | "geometry": { 571 | "type": "Point", 572 | "coordinates": [ 573 | 9.1798899, 574 | 48.5817267 575 | ] 576 | } 577 | }, 578 | { 579 | "type": "Feature", 580 | "properties": { 581 | "name": "Pro Fahrrad", 582 | "name_en": "Pro Fahrrad", 583 | "name_de": "Pro Fahrrad", 584 | "popupContent": "Telefon: +49 7121 799843", 585 | "popupContent_de": "Telefon: +49 7121 799843", 586 | "popupContent_en": "Phone: +49 7121 799843", 587 | "id": "Fahrradgesch\u00e4ft_13", 588 | "icon": { 589 | "id": "bikeShopIcon" 590 | } 591 | }, 592 | "geometry": { 593 | "type": "Point", 594 | "coordinates": [ 595 | 9.2331658, 596 | 48.478274 597 | ] 598 | } 599 | }, 600 | { 601 | "type": "Feature", 602 | "properties": { 603 | "name": "Hardys Roadbikes und Mountainbikes", 604 | "name_en": "Hardys Roadbikes und Mountainbikes", 605 | "name_de": "Hardys Roadbikes und Mountainbikes", 606 | "popupContent": "Telefon: +49 7123 7261471, \u00d6ffnungszeiten: Mo-Fr 10:00-13:00,14:00-19:00; Do 10:00-13:00,14:00-20:00; Sa 09:00-14:00", 607 | "popupContent_de": "Telefon: +49 7123 7261471, \u00d6ffnungszeiten: Mo-Fr 10:00-13:00,14:00-19:00; Do 10:00-13:00,14:00-20:00; Sa 09:00-14:00", 608 | "popupContent_en": "Phone: +49 7123 7261471, Opening hours: Mo-Fr 10:00-13:00,14:00-19:00; Th 10:00-13:00,14:00-20:00; Sa 09:00-14:00", 609 | "id": "Fahrradgesch\u00e4ft_14", 610 | "icon": { 611 | "id": "bikeShopIcon" 612 | } 613 | }, 614 | "geometry": { 615 | "type": "Point", 616 | "coordinates": [ 617 | 9.299677, 618 | 48.5312769 619 | ] 620 | } 621 | }, 622 | { 623 | "type": "Feature", 624 | "properties": { 625 | "name": "aet E-Bike Center", 626 | "name_en": "aet E-Bike Center", 627 | "name_de": "aet E-Bike Center", 628 | "popupContent": "Telefon: +49 7121 504455, \u00d6ffnungszeiten: Mo-Fr 10:00-19:00; Sa 10:00-15:00", 629 | "popupContent_de": "Telefon: +49 7121 504455, \u00d6ffnungszeiten: Mo-Fr 10:00-19:00; Sa 10:00-15:00", 630 | "popupContent_en": "Phone: +49 7121 504455, Opening hours: Mo-Fr 10:00-19:00; Sa 10:00-15:00", 631 | "id": "Fahrradgesch\u00e4ft_15", 632 | "icon": { 633 | "id": "bikeShopIcon" 634 | } 635 | }, 636 | "geometry": { 637 | "type": "Point", 638 | "coordinates": [ 639 | 9.199842, 640 | 48.49793 641 | ] 642 | } 643 | }, 644 | { 645 | "type": "Feature", 646 | "properties": { 647 | "name": "Lackus Zweiradcenter", 648 | "name_en": "Lackus Zweiradcenter", 649 | "name_de": "Lackus Zweiradcenter", 650 | "popupContent": "", 651 | "popupContent_de": "", 652 | "popupContent_en": "", 653 | "id": "Fahrradgesch\u00e4ft_16", 654 | "icon": { 655 | "id": "bikeShopIcon" 656 | } 657 | }, 658 | "geometry": { 659 | "type": "Point", 660 | "coordinates": [ 661 | 9.2846178, 662 | 48.5397072 663 | ] 664 | } 665 | }, 666 | { 667 | "type": "Feature", 668 | "properties": { 669 | "name": "renn+bikesport Axel Sch\u00e4fer", 670 | "name_en": "renn+bikesport Axel Sch\u00e4fer", 671 | "name_de": "renn+bikesport Axel Sch\u00e4fer", 672 | "popupContent": "", 673 | "popupContent_de": "", 674 | "popupContent_en": "", 675 | "id": "Fahrradgesch\u00e4ft_17", 676 | "icon": { 677 | "id": "bikeShopIcon" 678 | } 679 | }, 680 | "geometry": { 681 | "type": "Point", 682 | "coordinates": [ 683 | 9.253774, 684 | 48.4388673 685 | ] 686 | } 687 | }, 688 | { 689 | "type": "Feature", 690 | "properties": { 691 | "name": "e-motion e-Bike Welt Reutlingen", 692 | "name_en": "e-motion e-Bike Welt Reutlingen", 693 | "name_de": "e-motion e-Bike Welt Reutlingen", 694 | "popupContent": "Telefon: +49 7121 7542200", 695 | "popupContent_de": "Telefon: +49 7121 7542200", 696 | "popupContent_en": "Phone: +49 7121 7542200", 697 | "id": "Fahrradgesch\u00e4ft_18", 698 | "icon": { 699 | "id": "bikeShopIcon" 700 | } 701 | }, 702 | "geometry": { 703 | "type": "Point", 704 | "coordinates": [ 705 | 9.1567307, 706 | 48.4913672 707 | ] 708 | } 709 | }, 710 | { 711 | "type": "Feature", 712 | "properties": { 713 | "name": "Limb\u00e4cher E Bike", 714 | "name_en": "Limb\u00e4cher E Bike", 715 | "name_de": "Limb\u00e4cher E Bike", 716 | "popupContent": "", 717 | "popupContent_de": "", 718 | "popupContent_en": "", 719 | "id": "Fahrradgesch\u00e4ft_19", 720 | "icon": { 721 | "id": "bikeShopIcon" 722 | } 723 | }, 724 | "geometry": { 725 | "type": "Point", 726 | "coordinates": [ 727 | 9.1698926, 728 | 48.5022968 729 | ] 730 | } 731 | } 732 | ] 733 | } -------------------------------------------------------------------------------- /04-adding-geojson-layers/rt-layers/car-parking.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": { 7 | "name": "B\u00f6smanns\u00e4cker", 8 | "name_en": "B\u00f6smanns\u00e4cker", 9 | "name_de": "B\u00f6smanns\u00e4cker", 10 | "popupContent": "Stellpl\u00e4tze: 500, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 11 | "popupContent_de": "Stellpl\u00e4tze: 500, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 12 | "popupContent_en": "Capacity: 500, Fee: no, Wheelchair: yes", 13 | "id": "Parkplatz_0", 14 | "icon": { 15 | "id": "carParkOpIcon", 16 | "svg": " " 17 | } 18 | }, 19 | "geometry": { 20 | "type": "Point", 21 | "coordinates": [ 22 | 9.1950302, 23 | 48.4940816 24 | ] 25 | } 26 | }, 27 | { 28 | "type": "Feature", 29 | "properties": { 30 | "name_en": "Car parking", 31 | "name_de": "Parkplatz", 32 | "name": "Parkplatz", 33 | "popupContent": "Stellpl\u00e4tze: 20", 34 | "popupContent_de": "Stellpl\u00e4tze: 20", 35 | "popupContent_en": "Capacity: 20", 36 | "id": "Parkplatz_1", 37 | "icon": { 38 | "id": "carParkOpIcon" 39 | } 40 | }, 41 | "geometry": { 42 | "type": "Point", 43 | "coordinates": [ 44 | 9.3565148, 45 | 48.5886369 46 | ] 47 | } 48 | }, 49 | { 50 | "type": "Feature", 51 | "properties": { 52 | "name_en": "Car parking", 53 | "name_de": "Parkplatz", 54 | "name": "Parkplatz", 55 | "popupContent": "Stellpl\u00e4tze: 25", 56 | "popupContent_de": "Stellpl\u00e4tze: 25", 57 | "popupContent_en": "Capacity: 25", 58 | "id": "Parkplatz_2", 59 | "icon": { 60 | "id": "carParkOpIcon" 61 | } 62 | }, 63 | "geometry": { 64 | "type": "Point", 65 | "coordinates": [ 66 | 9.3565967, 67 | 48.5885188 68 | ] 69 | } 70 | }, 71 | { 72 | "type": "Feature", 73 | "properties": { 74 | "name_en": "Car parking", 75 | "name_de": "Parkplatz", 76 | "name": "Parkplatz", 77 | "popupContent": "Stellpl\u00e4tze: 25", 78 | "popupContent_de": "Stellpl\u00e4tze: 25", 79 | "popupContent_en": "Capacity: 25", 80 | "id": "Parkplatz_3", 81 | "icon": { 82 | "id": "carParkOpIcon" 83 | } 84 | }, 85 | "geometry": { 86 | "type": "Point", 87 | "coordinates": [ 88 | 9.3547117, 89 | 48.597288 90 | ] 91 | } 92 | }, 93 | { 94 | "type": "Feature", 95 | "properties": { 96 | "name": "Ortsmitte", 97 | "name_en": "Ortsmitte", 98 | "name_de": "Ortsmitte", 99 | "popupContent": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: nein", 100 | "popupContent_de": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: nein", 101 | "popupContent_en": "Capacity: 12, Fee: no", 102 | "id": "Parkplatz_4", 103 | "icon": { 104 | "id": "carParkOpIcon" 105 | } 106 | }, 107 | "geometry": { 108 | "type": "Point", 109 | "coordinates": [ 110 | 9.1198979, 111 | 48.5204774 112 | ] 113 | } 114 | }, 115 | { 116 | "type": "Feature", 117 | "properties": { 118 | "name_en": "Car parking", 119 | "name_de": "Parkplatz", 120 | "name": "Parkplatz", 121 | "popupContent": "Stellpl\u00e4tze: 40, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 122 | "popupContent_de": "Stellpl\u00e4tze: 40, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 123 | "popupContent_en": "Capacity: 40, Fee: no, Wheelchair: yes", 124 | "id": "Parkplatz_5", 125 | "icon": { 126 | "id": "carParkOpIcon" 127 | } 128 | }, 129 | "geometry": { 130 | "type": "Point", 131 | "coordinates": [ 132 | 9.3380608, 133 | 48.4522984 134 | ] 135 | } 136 | }, 137 | { 138 | "type": "Feature", 139 | "properties": { 140 | "name": "Stahleck", 141 | "name_en": "Stahleck", 142 | "name_de": "Stahleck", 143 | "popupContent": "Stellpl\u00e4tze: 40, Geb\u00fchrenpflichtig: nein", 144 | "popupContent_de": "Stellpl\u00e4tze: 40, Geb\u00fchrenpflichtig: nein", 145 | "popupContent_en": "Capacity: 40, Fee: no", 146 | "id": "Parkplatz_6", 147 | "icon": { 148 | "id": "carParkOpIcon" 149 | } 150 | }, 151 | "geometry": { 152 | "type": "Point", 153 | "coordinates": [ 154 | 9.304799, 155 | 48.4443596 156 | ] 157 | } 158 | }, 159 | { 160 | "type": "Feature", 161 | "properties": { 162 | "name_en": "Car parking", 163 | "name_de": "Parkplatz", 164 | "name": "Parkplatz", 165 | "popupContent": "Stellpl\u00e4tze: 12", 166 | "popupContent_de": "Stellpl\u00e4tze: 12", 167 | "popupContent_en": "Capacity: 12", 168 | "id": "Parkplatz_7", 169 | "icon": { 170 | "id": "carParkOpIcon" 171 | } 172 | }, 173 | "geometry": { 174 | "type": "Point", 175 | "coordinates": [ 176 | 9.3167492, 177 | 48.4395208 178 | ] 179 | } 180 | }, 181 | { 182 | "type": "Feature", 183 | "properties": { 184 | "name_en": "Car parking", 185 | "name_de": "Parkplatz", 186 | "name": "Parkplatz", 187 | "popupContent": "Stellpl\u00e4tze: 16, Geb\u00fchrenpflichtig: nein", 188 | "popupContent_de": "Stellpl\u00e4tze: 16, Geb\u00fchrenpflichtig: nein", 189 | "popupContent_en": "Capacity: 16, Fee: no", 190 | "id": "Parkplatz_8", 191 | "icon": { 192 | "id": "carParkOpIcon" 193 | } 194 | }, 195 | "geometry": { 196 | "type": "Point", 197 | "coordinates": [ 198 | 9.2420255, 199 | 48.4598485 200 | ] 201 | } 202 | }, 203 | { 204 | "type": "Feature", 205 | "properties": { 206 | "name": "Bahnhof", 207 | "name_en": "Bahnhof", 208 | "name_de": "Bahnhof", 209 | "popupContent": "Stellpl\u00e4tze: 260, Geb\u00fchrenpflichtig: mo-sa 6:00-23:00, Barrierefrei: ja", 210 | "popupContent_de": "Stellpl\u00e4tze: 260, Geb\u00fchrenpflichtig: mo-sa 6:00-23:00, Barrierefrei: ja", 211 | "popupContent_en": "Capacity: 260, Fee: mo-sa 6:00-23:00, Wheelchair: yes", 212 | "id": "Parkplatz_9", 213 | "icon": { 214 | "id": "carParkOpIcon" 215 | } 216 | }, 217 | "geometry": { 218 | "type": "Point", 219 | "coordinates": [ 220 | 9.2117748, 221 | 48.4982222 222 | ] 223 | } 224 | }, 225 | { 226 | "type": "Feature", 227 | "properties": { 228 | "name": "Kaiserstra\u00dfe", 229 | "name_en": "Kaiserstra\u00dfe", 230 | "name_de": "Kaiserstra\u00dfe", 231 | "popupContent": "Stellpl\u00e4tze: 25, Geb\u00fchrenpflichtig: ja", 232 | "popupContent_de": "Stellpl\u00e4tze: 25, Geb\u00fchrenpflichtig: ja", 233 | "popupContent_en": "Capacity: 25, Fee: yes", 234 | "id": "Parkplatz_10", 235 | "icon": { 236 | "id": "carParkOpIcon" 237 | } 238 | }, 239 | "geometry": { 240 | "type": "Point", 241 | "coordinates": [ 242 | 9.2204192, 243 | 48.4904193 244 | ] 245 | } 246 | }, 247 | { 248 | "type": "Feature", 249 | "properties": { 250 | "name_en": "Car parking", 251 | "name_de": "Parkplatz", 252 | "name": "Parkplatz", 253 | "popupContent": "Stellpl\u00e4tze: 177, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 254 | "popupContent_de": "Stellpl\u00e4tze: 177, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 255 | "popupContent_en": "Capacity: 177, Fee: yes, Wheelchair: yes", 256 | "id": "Parkplatz_11", 257 | "icon": { 258 | "id": "carParkOpIcon" 259 | } 260 | }, 261 | "geometry": { 262 | "type": "Point", 263 | "coordinates": [ 264 | 9.2116257, 265 | 48.497376 266 | ] 267 | } 268 | }, 269 | { 270 | "type": "Feature", 271 | "properties": { 272 | "name_en": "Car parking", 273 | "name_de": "Parkplatz", 274 | "name": "Parkplatz", 275 | "popupContent": "Stellpl\u00e4tze: 25", 276 | "popupContent_de": "Stellpl\u00e4tze: 25", 277 | "popupContent_en": "Capacity: 25", 278 | "id": "Parkplatz_12", 279 | "icon": { 280 | "id": "carParkOpIcon" 281 | } 282 | }, 283 | "geometry": { 284 | "type": "Point", 285 | "coordinates": [ 286 | 9.2995362, 287 | 48.5424794 288 | ] 289 | } 290 | }, 291 | { 292 | "type": "Feature", 293 | "properties": { 294 | "name_en": "Car parking", 295 | "name_de": "Parkplatz", 296 | "name": "Parkplatz", 297 | "popupContent": "Stellpl\u00e4tze: 30", 298 | "popupContent_de": "Stellpl\u00e4tze: 30", 299 | "popupContent_en": "Capacity: 30", 300 | "id": "Parkplatz_13", 301 | "icon": { 302 | "id": "carParkOpIcon" 303 | } 304 | }, 305 | "geometry": { 306 | "type": "Point", 307 | "coordinates": [ 308 | 9.1938632, 309 | 48.4741583 310 | ] 311 | } 312 | }, 313 | { 314 | "type": "Feature", 315 | "properties": { 316 | "name_en": "Car parking", 317 | "name_de": "Parkplatz", 318 | "name": "Parkplatz", 319 | "popupContent": "Stellpl\u00e4tze: 14, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 320 | "popupContent_de": "Stellpl\u00e4tze: 14, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 321 | "popupContent_en": "Capacity: 14, Fee: no, Wheelchair: yes", 322 | "id": "Parkplatz_14", 323 | "icon": { 324 | "id": "carParkOpIcon" 325 | } 326 | }, 327 | "geometry": { 328 | "type": "Point", 329 | "coordinates": [ 330 | 9.15203, 331 | 48.44117 332 | ] 333 | } 334 | }, 335 | { 336 | "type": "Feature", 337 | "properties": { 338 | "name": "Sportplatz", 339 | "name_en": "Sportplatz", 340 | "name_de": "Sportplatz", 341 | "popupContent": "Stellpl\u00e4tze: 60, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 342 | "popupContent_de": "Stellpl\u00e4tze: 60, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 343 | "popupContent_en": "Capacity: 60, Fee: no, Wheelchair: yes", 344 | "id": "Parkplatz_15", 345 | "icon": { 346 | "id": "carParkOpIcon" 347 | } 348 | }, 349 | "geometry": { 350 | "type": "Point", 351 | "coordinates": [ 352 | 9.0987408, 353 | 48.6003895 354 | ] 355 | } 356 | }, 357 | { 358 | "type": "Feature", 359 | "properties": { 360 | "name_en": "Car parking", 361 | "name_de": "Parkplatz", 362 | "name": "Parkplatz", 363 | "popupContent": "Stellpl\u00e4tze: 15", 364 | "popupContent_de": "Stellpl\u00e4tze: 15", 365 | "popupContent_en": "Capacity: 15", 366 | "id": "Parkplatz_16", 367 | "icon": { 368 | "id": "carParkOpIcon" 369 | } 370 | }, 371 | "geometry": { 372 | "type": "Point", 373 | "coordinates": [ 374 | 9.1508931, 375 | 48.4318081 376 | ] 377 | } 378 | }, 379 | { 380 | "type": "Feature", 381 | "properties": { 382 | "name_en": "Car parking", 383 | "name_de": "Parkplatz", 384 | "name": "Parkplatz", 385 | "popupContent": "Stellpl\u00e4tze: 17, Barrierefrei: ja", 386 | "popupContent_de": "Stellpl\u00e4tze: 17, Barrierefrei: ja", 387 | "popupContent_en": "Capacity: 17, Wheelchair: yes", 388 | "id": "Parkplatz_17", 389 | "icon": { 390 | "id": "carParkOpIcon" 391 | } 392 | }, 393 | "geometry": { 394 | "type": "Point", 395 | "coordinates": [ 396 | 9.1007865, 397 | 48.6037871 398 | ] 399 | } 400 | }, 401 | { 402 | "type": "Feature", 403 | "properties": { 404 | "name_en": "Car parking", 405 | "name_de": "Parkplatz", 406 | "name": "Parkplatz", 407 | "popupContent": "Stellpl\u00e4tze: 30", 408 | "popupContent_de": "Stellpl\u00e4tze: 30", 409 | "popupContent_en": "Capacity: 30", 410 | "id": "Parkplatz_18", 411 | "icon": { 412 | "id": "carParkOpIcon" 413 | } 414 | }, 415 | "geometry": { 416 | "type": "Point", 417 | "coordinates": [ 418 | 9.1979019, 419 | 48.562083 420 | ] 421 | } 422 | }, 423 | { 424 | "type": "Feature", 425 | "properties": { 426 | "name_en": "Car parking", 427 | "name_de": "Parkplatz", 428 | "name": "Parkplatz", 429 | "popupContent": "Stellpl\u00e4tze: 20, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 430 | "popupContent_de": "Stellpl\u00e4tze: 20, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 431 | "popupContent_en": "Capacity: 20, Fee: no, Wheelchair: yes", 432 | "id": "Parkplatz_19", 433 | "icon": { 434 | "id": "carParkOpIcon" 435 | } 436 | }, 437 | "geometry": { 438 | "type": "Point", 439 | "coordinates": [ 440 | 9.0942043, 441 | 48.606454 442 | ] 443 | } 444 | }, 445 | { 446 | "type": "Feature", 447 | "properties": { 448 | "name_en": "Car parking", 449 | "name_de": "Parkplatz", 450 | "name": "Parkplatz", 451 | "popupContent": "Stellpl\u00e4tze: 18, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 452 | "popupContent_de": "Stellpl\u00e4tze: 18, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 453 | "popupContent_en": "Capacity: 18, Fee: no, Wheelchair: yes", 454 | "id": "Parkplatz_20", 455 | "icon": { 456 | "id": "carParkOpIcon" 457 | } 458 | }, 459 | "geometry": { 460 | "type": "Point", 461 | "coordinates": [ 462 | 9.106176, 463 | 48.6063853 464 | ] 465 | } 466 | }, 467 | { 468 | "type": "Feature", 469 | "properties": { 470 | "name_en": "Car parking", 471 | "name_de": "Parkplatz", 472 | "name": "Parkplatz", 473 | "popupContent": "Stellpl\u00e4tze: 17, Geb\u00fchrenpflichtig: nein", 474 | "popupContent_de": "Stellpl\u00e4tze: 17, Geb\u00fchrenpflichtig: nein", 475 | "popupContent_en": "Capacity: 17, Fee: no", 476 | "id": "Parkplatz_21", 477 | "icon": { 478 | "id": "carParkOpIcon" 479 | } 480 | }, 481 | "geometry": { 482 | "type": "Point", 483 | "coordinates": [ 484 | 9.291185, 485 | 48.5072822 486 | ] 487 | } 488 | }, 489 | { 490 | "type": "Feature", 491 | "properties": { 492 | "name_en": "Car parking", 493 | "name_de": "Parkplatz", 494 | "name": "Parkplatz", 495 | "popupContent": "Stellpl\u00e4tze: 40", 496 | "popupContent_de": "Stellpl\u00e4tze: 40", 497 | "popupContent_en": "Capacity: 40", 498 | "id": "Parkplatz_22", 499 | "icon": { 500 | "id": "carParkOpIcon" 501 | } 502 | }, 503 | "geometry": { 504 | "type": "Point", 505 | "coordinates": [ 506 | 9.3191751, 507 | 48.5517219 508 | ] 509 | } 510 | }, 511 | { 512 | "type": "Feature", 513 | "properties": { 514 | "name_en": "Car parking", 515 | "name_de": "Parkplatz", 516 | "name": "Parkplatz", 517 | "popupContent": "Stellpl\u00e4tze: 20", 518 | "popupContent_de": "Stellpl\u00e4tze: 20", 519 | "popupContent_en": "Capacity: 20", 520 | "id": "Parkplatz_23", 521 | "icon": { 522 | "id": "carParkOpIcon" 523 | } 524 | }, 525 | "geometry": { 526 | "type": "Point", 527 | "coordinates": [ 528 | 9.3067105, 529 | 48.5450757 530 | ] 531 | } 532 | }, 533 | { 534 | "type": "Feature", 535 | "properties": { 536 | "name_en": "Car parking", 537 | "name_de": "Parkplatz", 538 | "name": "Parkplatz", 539 | "popupContent": "Stellpl\u00e4tze: 15, Geb\u00fchrenpflichtig: nein", 540 | "popupContent_de": "Stellpl\u00e4tze: 15, Geb\u00fchrenpflichtig: nein", 541 | "popupContent_en": "Capacity: 15, Fee: no", 542 | "id": "Parkplatz_24", 543 | "icon": { 544 | "id": "carParkOpIcon" 545 | } 546 | }, 547 | "geometry": { 548 | "type": "Point", 549 | "coordinates": [ 550 | 9.1851721, 551 | 48.5336183 552 | ] 553 | } 554 | }, 555 | { 556 | "type": "Feature", 557 | "properties": { 558 | "name_en": "Car parking", 559 | "name_de": "Parkplatz", 560 | "name": "Parkplatz", 561 | "popupContent": "Stellpl\u00e4tze: 19", 562 | "popupContent_de": "Stellpl\u00e4tze: 19", 563 | "popupContent_en": "Capacity: 19", 564 | "id": "Parkplatz_25", 565 | "icon": { 566 | "id": "carParkOpIcon" 567 | } 568 | }, 569 | "geometry": { 570 | "type": "Point", 571 | "coordinates": [ 572 | 9.2311809, 573 | 48.4673204 574 | ] 575 | } 576 | }, 577 | { 578 | "type": "Feature", 579 | "properties": { 580 | "name_en": "Car parking", 581 | "name_de": "Parkplatz", 582 | "name": "Parkplatz", 583 | "popupContent": "Stellpl\u00e4tze: 15, Geb\u00fchrenpflichtig: nein", 584 | "popupContent_de": "Stellpl\u00e4tze: 15, Geb\u00fchrenpflichtig: nein", 585 | "popupContent_en": "Capacity: 15, Fee: no", 586 | "id": "Parkplatz_26", 587 | "icon": { 588 | "id": "carParkOpIcon" 589 | } 590 | }, 591 | "geometry": { 592 | "type": "Point", 593 | "coordinates": [ 594 | 9.1844604, 595 | 48.5879198 596 | ] 597 | } 598 | }, 599 | { 600 | "type": "Feature", 601 | "properties": { 602 | "name_en": "Car parking", 603 | "name_de": "Parkplatz", 604 | "name": "Parkplatz", 605 | "popupContent": "Stellpl\u00e4tze: 30, Geb\u00fchrenpflichtig: nein", 606 | "popupContent_de": "Stellpl\u00e4tze: 30, Geb\u00fchrenpflichtig: nein", 607 | "popupContent_en": "Capacity: 30, Fee: no", 608 | "id": "Parkplatz_27", 609 | "icon": { 610 | "id": "carParkOpIcon" 611 | } 612 | }, 613 | "geometry": { 614 | "type": "Point", 615 | "coordinates": [ 616 | 9.1400731, 617 | 48.5285554 618 | ] 619 | } 620 | }, 621 | { 622 | "type": "Feature", 623 | "properties": { 624 | "name_en": "Car parking", 625 | "name_de": "Parkplatz", 626 | "name": "Parkplatz", 627 | "popupContent": "Stellpl\u00e4tze: 11, Geb\u00fchrenpflichtig: nein", 628 | "popupContent_de": "Stellpl\u00e4tze: 11, Geb\u00fchrenpflichtig: nein", 629 | "popupContent_en": "Capacity: 11, Fee: no", 630 | "id": "Parkplatz_28", 631 | "icon": { 632 | "id": "carParkOpIcon" 633 | } 634 | }, 635 | "geometry": { 636 | "type": "Point", 637 | "coordinates": [ 638 | 9.1494588, 639 | 48.5314475 640 | ] 641 | } 642 | }, 643 | { 644 | "type": "Feature", 645 | "properties": { 646 | "name_en": "Car parking", 647 | "name_de": "Parkplatz", 648 | "name": "Parkplatz", 649 | "popupContent": "Stellpl\u00e4tze: 13", 650 | "popupContent_de": "Stellpl\u00e4tze: 13", 651 | "popupContent_en": "Capacity: 13", 652 | "id": "Parkplatz_29", 653 | "icon": { 654 | "id": "carParkOpIcon" 655 | } 656 | }, 657 | "geometry": { 658 | "type": "Point", 659 | "coordinates": [ 660 | 9.1066012, 661 | 48.4882611 662 | ] 663 | } 664 | }, 665 | { 666 | "type": "Feature", 667 | "properties": { 668 | "name_en": "Car parking", 669 | "name_de": "Parkplatz", 670 | "name": "Parkplatz", 671 | "popupContent": "Stellpl\u00e4tze: 20", 672 | "popupContent_de": "Stellpl\u00e4tze: 20", 673 | "popupContent_en": "Capacity: 20", 674 | "id": "Parkplatz_30", 675 | "icon": { 676 | "id": "carParkOpIcon" 677 | } 678 | }, 679 | "geometry": { 680 | "type": "Point", 681 | "coordinates": [ 682 | 9.2767624, 683 | 48.5484943 684 | ] 685 | } 686 | }, 687 | { 688 | "type": "Feature", 689 | "properties": { 690 | "name": "Parkplatz Friedhof", 691 | "name_en": "Parkplatz Friedhof", 692 | "name_de": "Parkplatz Friedhof", 693 | "popupContent": "Stellpl\u00e4tze: 30, Geb\u00fchrenpflichtig: nein", 694 | "popupContent_de": "Stellpl\u00e4tze: 30, Geb\u00fchrenpflichtig: nein", 695 | "popupContent_en": "Capacity: 30, Fee: no", 696 | "id": "Parkplatz_31", 697 | "icon": { 698 | "id": "carParkOpIcon" 699 | } 700 | }, 701 | "geometry": { 702 | "type": "Point", 703 | "coordinates": [ 704 | 9.3420444, 705 | 48.5308823 706 | ] 707 | } 708 | }, 709 | { 710 | "type": "Feature", 711 | "properties": { 712 | "name_en": "Car parking", 713 | "name_de": "Parkplatz", 714 | "name": "Parkplatz", 715 | "popupContent": "Stellpl\u00e4tze: 75", 716 | "popupContent_de": "Stellpl\u00e4tze: 75", 717 | "popupContent_en": "Capacity: 75", 718 | "id": "Parkplatz_32", 719 | "icon": { 720 | "id": "carParkOpIcon" 721 | } 722 | }, 723 | "geometry": { 724 | "type": "Point", 725 | "coordinates": [ 726 | 9.1980329, 727 | 48.4763155 728 | ] 729 | } 730 | }, 731 | { 732 | "type": "Feature", 733 | "properties": { 734 | "name_en": "Car parking", 735 | "name_de": "Parkplatz", 736 | "name": "Parkplatz", 737 | "popupContent": "Stellpl\u00e4tze: 100, Geb\u00fchrenpflichtig: nein", 738 | "popupContent_de": "Stellpl\u00e4tze: 100, Geb\u00fchrenpflichtig: nein", 739 | "popupContent_en": "Capacity: 100, Fee: no", 740 | "id": "Parkplatz_33", 741 | "icon": { 742 | "id": "carParkOpIcon" 743 | } 744 | }, 745 | "geometry": { 746 | "type": "Point", 747 | "coordinates": [ 748 | 9.2532879, 749 | 48.5558751 750 | ] 751 | } 752 | }, 753 | { 754 | "type": "Feature", 755 | "properties": { 756 | "name": "Parkplatz Kelternplatz", 757 | "name_en": "Parkplatz Kelternplatz", 758 | "name_de": "Parkplatz Kelternplatz", 759 | "popupContent": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 760 | "popupContent_de": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 761 | "popupContent_en": "Capacity: 12, Fee: yes, Wheelchair: yes", 762 | "id": "Parkplatz_34", 763 | "icon": { 764 | "id": "carParkOpIcon" 765 | } 766 | }, 767 | "geometry": { 768 | "type": "Point", 769 | "coordinates": [ 770 | 9.2867671, 771 | 48.5409171 772 | ] 773 | } 774 | }, 775 | { 776 | "type": "Feature", 777 | "properties": { 778 | "name_en": "Car parking", 779 | "name_de": "Parkplatz", 780 | "name": "Parkplatz", 781 | "popupContent": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: nein, Barrierefrei: begrenzt", 782 | "popupContent_de": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: nein, Barrierefrei: begrenzt", 783 | "popupContent_en": "Capacity: 12, Fee: no, Wheelchair: limited", 784 | "id": "Parkplatz_35", 785 | "icon": { 786 | "id": "carParkOpIcon" 787 | } 788 | }, 789 | "geometry": { 790 | "type": "Point", 791 | "coordinates": [ 792 | 9.2257053, 793 | 48.4668493 794 | ] 795 | } 796 | }, 797 | { 798 | "type": "Feature", 799 | "properties": { 800 | "name_en": "Car parking", 801 | "name_de": "Parkplatz", 802 | "name": "Parkplatz", 803 | "popupContent": "Stellpl\u00e4tze: 50, Geb\u00fchrenpflichtig: ja", 804 | "popupContent_de": "Stellpl\u00e4tze: 50, Geb\u00fchrenpflichtig: ja", 805 | "popupContent_en": "Capacity: 50, Fee: yes", 806 | "id": "Parkplatz_36", 807 | "icon": { 808 | "id": "carParkOpIcon" 809 | } 810 | }, 811 | "geometry": { 812 | "type": "Point", 813 | "coordinates": [ 814 | 9.2869689, 815 | 48.5404566 816 | ] 817 | } 818 | }, 819 | { 820 | "type": "Feature", 821 | "properties": { 822 | "name": "Bahnhof", 823 | "name_en": "Bahnhof", 824 | "name_de": "Bahnhof", 825 | "popupContent": "Stellpl\u00e4tze: 260, Geb\u00fchrenpflichtig: mo-sa 6:00-23:00, Barrierefrei: ja", 826 | "popupContent_de": "Stellpl\u00e4tze: 260, Geb\u00fchrenpflichtig: mo-sa 6:00-23:00, Barrierefrei: ja", 827 | "popupContent_en": "Capacity: 260, Fee: mo-sa 6:00-23:00, Wheelchair: yes", 828 | "id": "Park-Und-Ride_0", 829 | "icon": { 830 | "id": "carPRIcon", 831 | "svg": " " 832 | } 833 | }, 834 | "geometry": { 835 | "type": "Point", 836 | "coordinates": [ 837 | 9.2117748, 838 | 48.4982222 839 | ] 840 | } 841 | }, 842 | { 843 | "type": "Feature", 844 | "properties": { 845 | "name_en": "Park and Ride", 846 | "name_de": "Park-Und-Ride", 847 | "name": "Park-Und-Ride", 848 | "popupContent": "Geb\u00fchrenpflichtig: nein", 849 | "popupContent_de": "Geb\u00fchrenpflichtig: nein", 850 | "popupContent_en": "Fee: no", 851 | "id": "Park-Und-Ride_1", 852 | "icon": { 853 | "id": "carPRIcon" 854 | } 855 | }, 856 | "geometry": { 857 | "type": "Point", 858 | "coordinates": [ 859 | 9.2046, 860 | 48.511858 861 | ] 862 | } 863 | }, 864 | { 865 | "type": "Feature", 866 | "properties": { 867 | "name_en": "Park and Ride", 868 | "name_de": "Park-Und-Ride", 869 | "name": "Park-Und-Ride", 870 | "popupContent": "", 871 | "popupContent_de": "", 872 | "popupContent_en": "", 873 | "id": "Park-Und-Ride_2", 874 | "icon": { 875 | "id": "carPRIcon" 876 | } 877 | }, 878 | "geometry": { 879 | "type": "Point", 880 | "coordinates": [ 881 | 9.2904987, 882 | 48.5390697 883 | ] 884 | } 885 | }, 886 | { 887 | "type": "Feature", 888 | "properties": { 889 | "name_en": "Park and Ride", 890 | "name_de": "Park-Und-Ride", 891 | "name": "Park-Und-Ride", 892 | "popupContent": "Stellpl\u00e4tze: 20, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 893 | "popupContent_de": "Stellpl\u00e4tze: 20, Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 894 | "popupContent_en": "Capacity: 20, Fee: no, Wheelchair: yes", 895 | "id": "Park-Und-Ride_3", 896 | "icon": { 897 | "id": "carPRIcon" 898 | } 899 | }, 900 | "geometry": { 901 | "type": "Point", 902 | "coordinates": [ 903 | 9.0942043, 904 | 48.606454 905 | ] 906 | } 907 | }, 908 | { 909 | "type": "Feature", 910 | "properties": { 911 | "name_en": "Park and Ride", 912 | "name_de": "Park-Und-Ride", 913 | "name": "Park-Und-Ride", 914 | "popupContent": "Geb\u00fchrenpflichtig: ja", 915 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 916 | "popupContent_en": "Fee: yes", 917 | "id": "Park-Und-Ride_4", 918 | "icon": { 919 | "id": "carPRIcon" 920 | } 921 | }, 922 | "geometry": { 923 | "type": "Point", 924 | "coordinates": [ 925 | 9.289457, 926 | 48.5419857 927 | ] 928 | } 929 | }, 930 | { 931 | "type": "Feature", 932 | "properties": { 933 | "name_en": "Park and Ride", 934 | "name_de": "Park-Und-Ride", 935 | "name": "Park-Und-Ride", 936 | "popupContent": "Barrierefrei: ja", 937 | "popupContent_de": "Barrierefrei: ja", 938 | "popupContent_en": "Wheelchair: yes", 939 | "id": "Park-Und-Ride_5", 940 | "icon": { 941 | "id": "carPRIcon" 942 | } 943 | }, 944 | "geometry": { 945 | "type": "Point", 946 | "coordinates": [ 947 | 9.2895966, 948 | 48.5409552 949 | ] 950 | } 951 | }, 952 | { 953 | "type": "Feature", 954 | "properties": { 955 | "name": "Dorfgemeinschaftshaus", 956 | "name_en": "Dorfgemeinschaftshaus", 957 | "name_de": "Dorfgemeinschaftshaus", 958 | "popupContent": "Geb\u00fchrenpflichtig: nein", 959 | "popupContent_de": "Geb\u00fchrenpflichtig: nein", 960 | "popupContent_en": "Fee: no", 961 | "id": "Park-Und-Ride_6", 962 | "icon": { 963 | "id": "carPRIcon" 964 | } 965 | }, 966 | "geometry": { 967 | "type": "Point", 968 | "coordinates": [ 969 | 9.2743071, 970 | 48.5717984 971 | ] 972 | } 973 | }, 974 | { 975 | "type": "Feature", 976 | "properties": { 977 | "name_en": "Park and Ride", 978 | "name_de": "Park-Und-Ride", 979 | "name": "Park-Und-Ride", 980 | "popupContent": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 981 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 982 | "popupContent_en": "Fee: no, Wheelchair: yes", 983 | "id": "Park-Und-Ride_7", 984 | "icon": { 985 | "id": "carPRIcon" 986 | } 987 | }, 988 | "geometry": { 989 | "type": "Point", 990 | "coordinates": [ 991 | 9.2740883, 992 | 48.5725562 993 | ] 994 | } 995 | }, 996 | { 997 | "type": "Feature", 998 | "properties": { 999 | "name_en": "Park and Ride", 1000 | "name_de": "Park-Und-Ride", 1001 | "name": "Park-Und-Ride", 1002 | "popupContent": "", 1003 | "popupContent_de": "", 1004 | "popupContent_en": "", 1005 | "id": "Park-Und-Ride_8", 1006 | "icon": { 1007 | "id": "carPRIcon" 1008 | } 1009 | }, 1010 | "geometry": { 1011 | "type": "Point", 1012 | "coordinates": [ 1013 | 9.2293924, 1014 | 48.4828921 1015 | ] 1016 | } 1017 | }, 1018 | { 1019 | "type": "Feature", 1020 | "properties": { 1021 | "name_en": "Park and Ride", 1022 | "name_de": "Park-Und-Ride", 1023 | "name": "Park-Und-Ride", 1024 | "popupContent": "Stellpl\u00e4tze: 5, Geb\u00fchrenpflichtig: nein", 1025 | "popupContent_de": "Stellpl\u00e4tze: 5, Geb\u00fchrenpflichtig: nein", 1026 | "popupContent_en": "Capacity: 5, Fee: no", 1027 | "id": "Park-Und-Ride_9", 1028 | "icon": { 1029 | "id": "carPRIcon" 1030 | } 1031 | }, 1032 | "geometry": { 1033 | "type": "Point", 1034 | "coordinates": [ 1035 | 9.1388375, 1036 | 48.5295475 1037 | ] 1038 | } 1039 | }, 1040 | { 1041 | "type": "Feature", 1042 | "properties": { 1043 | "name_en": "Park and Ride", 1044 | "name_de": "Park-Und-Ride", 1045 | "name": "Park-Und-Ride", 1046 | "popupContent": "Stellpl\u00e4tze: 10, Geb\u00fchrenpflichtig: nein", 1047 | "popupContent_de": "Stellpl\u00e4tze: 10, Geb\u00fchrenpflichtig: nein", 1048 | "popupContent_en": "Capacity: 10, Fee: no", 1049 | "id": "Park-Und-Ride_10", 1050 | "icon": { 1051 | "id": "carPRIcon" 1052 | } 1053 | }, 1054 | "geometry": { 1055 | "type": "Point", 1056 | "coordinates": [ 1057 | 9.1389306, 1058 | 48.5293702 1059 | ] 1060 | } 1061 | }, 1062 | { 1063 | "type": "Feature", 1064 | "properties": { 1065 | "name_en": "Park and Ride", 1066 | "name_de": "Park-Und-Ride", 1067 | "name": "Park-Und-Ride", 1068 | "popupContent": "Stellpl\u00e4tze: 30, Geb\u00fchrenpflichtig: nein", 1069 | "popupContent_de": "Stellpl\u00e4tze: 30, Geb\u00fchrenpflichtig: nein", 1070 | "popupContent_en": "Capacity: 30, Fee: no", 1071 | "id": "Park-Und-Ride_11", 1072 | "icon": { 1073 | "id": "carPRIcon" 1074 | } 1075 | }, 1076 | "geometry": { 1077 | "type": "Point", 1078 | "coordinates": [ 1079 | 9.1400731, 1080 | 48.5285554 1081 | ] 1082 | } 1083 | }, 1084 | { 1085 | "type": "Feature", 1086 | "properties": { 1087 | "name_en": "Park and Ride", 1088 | "name_de": "Park-Und-Ride", 1089 | "name": "Park-Und-Ride", 1090 | "popupContent": "", 1091 | "popupContent_de": "", 1092 | "popupContent_en": "", 1093 | "id": "Park-Und-Ride_12", 1094 | "icon": { 1095 | "id": "carPRIcon" 1096 | } 1097 | }, 1098 | "geometry": { 1099 | "type": "Point", 1100 | "coordinates": [ 1101 | 9.3594226, 1102 | 48.5950315 1103 | ] 1104 | } 1105 | }, 1106 | { 1107 | "type": "Feature", 1108 | "properties": { 1109 | "name_en": "Park and Ride", 1110 | "name_de": "Park-Und-Ride", 1111 | "name": "Park-Und-Ride", 1112 | "popupContent": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 1113 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 1114 | "popupContent_en": "Fee: no, Wheelchair: yes", 1115 | "id": "Park-Und-Ride_13", 1116 | "icon": { 1117 | "id": "carPRIcon" 1118 | } 1119 | }, 1120 | "geometry": { 1121 | "type": "Point", 1122 | "coordinates": [ 1123 | 9.0928165, 1124 | 48.6070609 1125 | ] 1126 | } 1127 | }, 1128 | { 1129 | "type": "Feature", 1130 | "properties": { 1131 | "name_en": "Park and Ride", 1132 | "name_de": "Park-Und-Ride", 1133 | "name": "Park-Und-Ride", 1134 | "popupContent": "", 1135 | "popupContent_de": "", 1136 | "popupContent_en": "", 1137 | "id": "Park-Und-Ride_14", 1138 | "icon": { 1139 | "id": "carPRIcon" 1140 | } 1141 | }, 1142 | "geometry": { 1143 | "type": "Point", 1144 | "coordinates": [ 1145 | 9.2731796, 1146 | 48.5723876 1147 | ] 1148 | } 1149 | }, 1150 | { 1151 | "type": "Feature", 1152 | "properties": { 1153 | "name": "P3", 1154 | "name_en": "P3", 1155 | "name_de": "P3", 1156 | "popupContent": "Geb\u00fchrenpflichtig: ja", 1157 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 1158 | "popupContent_en": "Fee: yes", 1159 | "id": "Parkhaus/Tiefgarage_0", 1160 | "icon": { 1161 | "id": "carParkCovIcon", 1162 | "svg": " " 1163 | } 1164 | }, 1165 | "geometry": { 1166 | "type": "Point", 1167 | "coordinates": [ 1168 | 9.2173557, 1169 | 48.4832672 1170 | ] 1171 | } 1172 | }, 1173 | { 1174 | "type": "Feature", 1175 | "properties": { 1176 | "name": "Am Bahnhof", 1177 | "name_en": "Am Bahnhof", 1178 | "name_de": "Am Bahnhof", 1179 | "popupContent": "Stellpl\u00e4tze: 620, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Sa 06:30-19:00; PH So off, Barrierefrei: ja", 1180 | "popupContent_de": "Stellpl\u00e4tze: 620, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Sa 06:30-19:00; PH So off, Barrierefrei: ja", 1181 | "popupContent_en": "Capacity: 620, Fee: yes, Opening hours: Mo-Sa 06:30-19:00; PH Su off, Wheelchair: yes", 1182 | "id": "Parkhaus/Tiefgarage_1", 1183 | "icon": { 1184 | "id": "carParkCovIcon" 1185 | } 1186 | }, 1187 | "geometry": { 1188 | "type": "Point", 1189 | "coordinates": [ 1190 | 9.2085465, 1191 | 48.4961715 1192 | ] 1193 | } 1194 | }, 1195 | { 1196 | "type": "Feature", 1197 | "properties": { 1198 | "name": "Rathaus", 1199 | "name_en": "Rathaus", 1200 | "name_de": "Rathaus", 1201 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 06:00-02:30, Sa 06:00-02:30, So 06:00-02:30, Barrierefrei: begrenzt", 1202 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 06:00-02:30, Sa 06:00-02:30, So 06:00-02:30, Barrierefrei: begrenzt", 1203 | "popupContent_en": "Fee: yes, Opening hours: Mo-Fr 06:00-02:30, Sa 06:00-02:30, Su 06:00-02:30, Wheelchair: limited", 1204 | "id": "Parkhaus/Tiefgarage_2", 1205 | "icon": { 1206 | "id": "carParkCovIcon" 1207 | } 1208 | }, 1209 | "geometry": { 1210 | "type": "Point", 1211 | "coordinates": [ 1212 | 9.2104288, 1213 | 48.4909145 1214 | ] 1215 | } 1216 | }, 1217 | { 1218 | "type": "Feature", 1219 | "properties": { 1220 | "name": "Lederstra\u00dfe", 1221 | "name_en": "Lederstra\u00dfe", 1222 | "name_de": "Lederstra\u00dfe", 1223 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7, Barrierefrei: ja", 1224 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7, Barrierefrei: ja", 1225 | "popupContent_en": "Fee: yes, Opening hours: 24/7, Wheelchair: yes", 1226 | "id": "Parkhaus/Tiefgarage_3", 1227 | "icon": { 1228 | "id": "carParkCovIcon" 1229 | } 1230 | }, 1231 | "geometry": { 1232 | "type": "Point", 1233 | "coordinates": [ 1234 | 9.212079, 1235 | 48.4885234 1236 | ] 1237 | } 1238 | }, 1239 | { 1240 | "type": "Feature", 1241 | "properties": { 1242 | "name": "Parkhaus Stadtmitte", 1243 | "name_en": "Parkhaus Stadtmitte", 1244 | "name_de": "Parkhaus Stadtmitte", 1245 | "popupContent": "Geb\u00fchrenpflichtig: ja, Barrierefrei: nein", 1246 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, Barrierefrei: nein", 1247 | "popupContent_en": "Fee: yes, Wheelchair: no", 1248 | "id": "Parkhaus/Tiefgarage_4", 1249 | "icon": { 1250 | "id": "carParkCovIcon" 1251 | } 1252 | }, 1253 | "geometry": { 1254 | "type": "Point", 1255 | "coordinates": [ 1256 | 9.2138409, 1257 | 48.492065 1258 | ] 1259 | } 1260 | }, 1261 | { 1262 | "type": "Feature", 1263 | "properties": { 1264 | "name": "Pomologie", 1265 | "name_en": "Pomologie", 1266 | "name_de": "Pomologie", 1267 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1268 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1269 | "popupContent_en": "Fee: yes, Opening hours: 24/7", 1270 | "id": "Parkhaus/Tiefgarage_5", 1271 | "icon": { 1272 | "id": "carParkCovIcon" 1273 | } 1274 | }, 1275 | "geometry": { 1276 | "type": "Point", 1277 | "coordinates": [ 1278 | 9.2073428, 1279 | 48.4883526 1280 | ] 1281 | } 1282 | }, 1283 | { 1284 | "type": "Feature", 1285 | "properties": { 1286 | "name_en": "Multi-storey/underground car parking", 1287 | "name_de": "Parkhaus/Tiefgarage", 1288 | "name": "Parkhaus/Tiefgarage", 1289 | "popupContent": "Geb\u00fchrenpflichtig: ja", 1290 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 1291 | "popupContent_en": "Fee: yes", 1292 | "id": "Parkhaus/Tiefgarage_6", 1293 | "icon": { 1294 | "id": "carParkCovIcon" 1295 | } 1296 | }, 1297 | "geometry": { 1298 | "type": "Point", 1299 | "coordinates": [ 1300 | 9.2178665, 1301 | 48.4963073 1302 | ] 1303 | } 1304 | }, 1305 | { 1306 | "type": "Feature", 1307 | "properties": { 1308 | "name": "Obere W\u00e4ssere", 1309 | "name_en": "Obere W\u00e4ssere", 1310 | "name_de": "Obere W\u00e4ssere", 1311 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1312 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1313 | "popupContent_en": "Fee: yes, Opening hours: 24/7", 1314 | "id": "Parkhaus/Tiefgarage_7", 1315 | "icon": { 1316 | "id": "carParkCovIcon" 1317 | } 1318 | }, 1319 | "geometry": { 1320 | "type": "Point", 1321 | "coordinates": [ 1322 | 9.2171824, 1323 | 48.4883304 1324 | ] 1325 | } 1326 | }, 1327 | { 1328 | "type": "Feature", 1329 | "properties": { 1330 | "name_en": "Multi-storey/underground car parking", 1331 | "name_de": "Parkhaus/Tiefgarage", 1332 | "name": "Parkhaus/Tiefgarage", 1333 | "popupContent": "", 1334 | "popupContent_de": "", 1335 | "popupContent_en": "", 1336 | "id": "Parkhaus/Tiefgarage_8", 1337 | "icon": { 1338 | "id": "carParkCovIcon" 1339 | } 1340 | }, 1341 | "geometry": { 1342 | "type": "Point", 1343 | "coordinates": [ 1344 | 9.194686, 1345 | 48.4744582 1346 | ] 1347 | } 1348 | }, 1349 | { 1350 | "type": "Feature", 1351 | "properties": { 1352 | "name_en": "Multi-storey/underground car parking", 1353 | "name_de": "Parkhaus/Tiefgarage", 1354 | "name": "Parkhaus/Tiefgarage", 1355 | "popupContent": "Geb\u00fchrenpflichtig: ja", 1356 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 1357 | "popupContent_en": "Fee: yes", 1358 | "id": "Parkhaus/Tiefgarage_9", 1359 | "icon": { 1360 | "id": "carParkCovIcon" 1361 | } 1362 | }, 1363 | "geometry": { 1364 | "type": "Point", 1365 | "coordinates": [ 1366 | 9.2173923, 1367 | 48.4847763 1368 | ] 1369 | } 1370 | }, 1371 | { 1372 | "type": "Feature", 1373 | "properties": { 1374 | "name": "P0", 1375 | "name_en": "P0", 1376 | "name_de": "P0", 1377 | "popupContent": "", 1378 | "popupContent_de": "", 1379 | "popupContent_en": "", 1380 | "id": "Parkhaus/Tiefgarage_10", 1381 | "icon": { 1382 | "id": "carParkCovIcon" 1383 | } 1384 | }, 1385 | "geometry": { 1386 | "type": "Point", 1387 | "coordinates": [ 1388 | 9.2843426, 1389 | 48.5371483 1390 | ] 1391 | } 1392 | }, 1393 | { 1394 | "type": "Feature", 1395 | "properties": { 1396 | "name": "Parkhaus P2", 1397 | "name_en": "Parkhaus P2", 1398 | "name_de": "Parkhaus P2", 1399 | "popupContent": "Geb\u00fchrenpflichtig: ja", 1400 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 1401 | "popupContent_en": "Fee: yes", 1402 | "id": "Parkhaus/Tiefgarage_11", 1403 | "icon": { 1404 | "id": "carParkCovIcon" 1405 | } 1406 | }, 1407 | "geometry": { 1408 | "type": "Point", 1409 | "coordinates": [ 1410 | 9.2811823, 1411 | 48.535174 1412 | ] 1413 | } 1414 | }, 1415 | { 1416 | "type": "Feature", 1417 | "properties": { 1418 | "name": "P3", 1419 | "name_en": "P3", 1420 | "name_de": "P3", 1421 | "popupContent": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 1422 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 1423 | "popupContent_en": "Fee: no, Wheelchair: yes", 1424 | "id": "Parkhaus/Tiefgarage_12", 1425 | "icon": { 1426 | "id": "carParkCovIcon" 1427 | } 1428 | }, 1429 | "geometry": { 1430 | "type": "Point", 1431 | "coordinates": [ 1432 | 9.2777835, 1433 | 48.5321089 1434 | ] 1435 | } 1436 | }, 1437 | { 1438 | "type": "Feature", 1439 | "properties": { 1440 | "name_en": "Multi-storey/underground car parking", 1441 | "name_de": "Parkhaus/Tiefgarage", 1442 | "name": "Parkhaus/Tiefgarage", 1443 | "popupContent": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 1444 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, Barrierefrei: ja", 1445 | "popupContent_en": "Fee: no, Wheelchair: yes", 1446 | "id": "Parkhaus/Tiefgarage_13", 1447 | "icon": { 1448 | "id": "carParkCovIcon" 1449 | } 1450 | }, 1451 | "geometry": { 1452 | "type": "Point", 1453 | "coordinates": [ 1454 | 9.0948529, 1455 | 48.4542742 1456 | ] 1457 | } 1458 | }, 1459 | { 1460 | "type": "Feature", 1461 | "properties": { 1462 | "name": "Parkhaus S\u00e4gem\u00fchle", 1463 | "name_en": "Parkhaus S\u00e4gem\u00fchle", 1464 | "name_de": "Parkhaus S\u00e4gem\u00fchle", 1465 | "popupContent": "", 1466 | "popupContent_de": "", 1467 | "popupContent_en": "", 1468 | "id": "Parkhaus/Tiefgarage_14", 1469 | "icon": { 1470 | "id": "carParkCovIcon" 1471 | } 1472 | }, 1473 | "geometry": { 1474 | "type": "Point", 1475 | "coordinates": [ 1476 | 9.2367664, 1477 | 48.5913017 1478 | ] 1479 | } 1480 | }, 1481 | { 1482 | "type": "Feature", 1483 | "properties": { 1484 | "name": "Rathaus-Tiefgarage", 1485 | "name_en": "Rathaus-Tiefgarage", 1486 | "name_de": "Rathaus-Tiefgarage", 1487 | "popupContent": "Barrierefrei: nein", 1488 | "popupContent_de": "Barrierefrei: nein", 1489 | "popupContent_en": "Wheelchair: no", 1490 | "id": "Parkhaus/Tiefgarage_15", 1491 | "icon": { 1492 | "id": "carParkCovIcon" 1493 | } 1494 | }, 1495 | "geometry": { 1496 | "type": "Point", 1497 | "coordinates": [ 1498 | 9.2835707, 1499 | 48.54051 1500 | ] 1501 | } 1502 | }, 1503 | { 1504 | "type": "Feature", 1505 | "properties": { 1506 | "name": "Parkhaus P2", 1507 | "name_en": "Parkhaus P2", 1508 | "name_de": "Parkhaus P2", 1509 | "popupContent": "Geb\u00fchrenpflichtig: ja", 1510 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 1511 | "popupContent_en": "Fee: yes", 1512 | "id": "Parkhaus/Tiefgarage_16", 1513 | "icon": { 1514 | "id": "carParkCovIcon" 1515 | } 1516 | }, 1517 | "geometry": { 1518 | "type": "Point", 1519 | "coordinates": [ 1520 | 9.280084, 1521 | 48.5356489 1522 | ] 1523 | } 1524 | }, 1525 | { 1526 | "type": "Feature", 1527 | "properties": { 1528 | "name": "P0", 1529 | "name_en": "P0", 1530 | "name_de": "P0", 1531 | "popupContent": "Barrierefrei: begrenzt", 1532 | "popupContent_de": "Barrierefrei: begrenzt", 1533 | "popupContent_en": "Wheelchair: limited", 1534 | "id": "Parkhaus/Tiefgarage_17", 1535 | "icon": { 1536 | "id": "carParkCovIcon" 1537 | } 1538 | }, 1539 | "geometry": { 1540 | "type": "Point", 1541 | "coordinates": [ 1542 | 9.2847348, 1543 | 48.5370894 1544 | ] 1545 | } 1546 | }, 1547 | { 1548 | "type": "Feature", 1549 | "properties": { 1550 | "name": "Parkhaus P1", 1551 | "name_en": "Parkhaus P1", 1552 | "name_de": "Parkhaus P1", 1553 | "popupContent": "Stellpl\u00e4tze: 660, Geb\u00fchrenpflichtig: nein", 1554 | "popupContent_de": "Stellpl\u00e4tze: 660, Geb\u00fchrenpflichtig: nein", 1555 | "popupContent_en": "Capacity: 660, Fee: no", 1556 | "id": "Parkhaus/Tiefgarage_18", 1557 | "icon": { 1558 | "id": "carParkCovIcon" 1559 | } 1560 | }, 1561 | "geometry": { 1562 | "type": "Point", 1563 | "coordinates": [ 1564 | 9.278718, 1565 | 48.5370379 1566 | ] 1567 | } 1568 | }, 1569 | { 1570 | "type": "Feature", 1571 | "properties": { 1572 | "name_en": "Multi-storey/underground car parking", 1573 | "name_de": "Parkhaus/Tiefgarage", 1574 | "name": "Parkhaus/Tiefgarage", 1575 | "popupContent": "Stellpl\u00e4tze: 10", 1576 | "popupContent_de": "Stellpl\u00e4tze: 10", 1577 | "popupContent_en": "Capacity: 10", 1578 | "id": "Parkhaus/Tiefgarage_19", 1579 | "icon": { 1580 | "id": "carParkCovIcon" 1581 | } 1582 | }, 1583 | "geometry": { 1584 | "type": "Point", 1585 | "coordinates": [ 1586 | 9.1869835, 1587 | 48.4860289 1588 | ] 1589 | } 1590 | }, 1591 | { 1592 | "type": "Feature", 1593 | "properties": { 1594 | "name": "Kronprinzenbau", 1595 | "name_en": "Kronprinzenbau", 1596 | "name_de": "Kronprinzenbau", 1597 | "popupContent": "Stellpl\u00e4tze: 200, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 07:00-19:00; Sa 07:00-15:00", 1598 | "popupContent_de": "Stellpl\u00e4tze: 200, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 07:00-19:00; Sa 07:00-15:00", 1599 | "popupContent_en": "Capacity: 200, Fee: yes, Opening hours: Mo-Fr 07:00-19:00; Sa 07:00-15:00", 1600 | "id": "Parkhaus/Tiefgarage_20", 1601 | "icon": { 1602 | "id": "carParkCovIcon" 1603 | } 1604 | }, 1605 | "geometry": { 1606 | "type": "Point", 1607 | "coordinates": [ 1608 | 9.2102469, 1609 | 48.4960494 1610 | ] 1611 | } 1612 | }, 1613 | { 1614 | "type": "Feature", 1615 | "properties": { 1616 | "name": "Wickenhof", 1617 | "name_en": "Wickenhof", 1618 | "name_de": "Wickenhof", 1619 | "popupContent": "Stellpl\u00e4tze: 31, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 1620 | "popupContent_de": "Stellpl\u00e4tze: 31, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 1621 | "popupContent_en": "Capacity: 31, Fee: yes, Wheelchair: yes", 1622 | "id": "Parkhaus/Tiefgarage_21", 1623 | "icon": { 1624 | "id": "carParkCovIcon" 1625 | } 1626 | }, 1627 | "geometry": { 1628 | "type": "Point", 1629 | "coordinates": [ 1630 | 9.227341, 1631 | 48.4646263 1632 | ] 1633 | } 1634 | }, 1635 | { 1636 | "type": "Feature", 1637 | "properties": { 1638 | "name": "Tiefgarage Marktplatz", 1639 | "name_en": "Tiefgarage Marktplatz", 1640 | "name_de": "Tiefgarage Marktplatz", 1641 | "popupContent": "Barrierefrei: nein", 1642 | "popupContent_de": "Barrierefrei: nein", 1643 | "popupContent_en": "Wheelchair: no", 1644 | "id": "Parkhaus/Tiefgarage_22", 1645 | "icon": { 1646 | "id": "carParkCovIcon" 1647 | } 1648 | }, 1649 | "geometry": { 1650 | "type": "Point", 1651 | "coordinates": [ 1652 | 9.2265577, 1653 | 48.4651434 1654 | ] 1655 | } 1656 | }, 1657 | { 1658 | "type": "Feature", 1659 | "properties": { 1660 | "name": "Tiefgarage Rathaus", 1661 | "name_en": "Tiefgarage Rathaus", 1662 | "name_de": "Tiefgarage Rathaus", 1663 | "popupContent": "Barrierefrei: ja", 1664 | "popupContent_de": "Barrierefrei: ja", 1665 | "popupContent_en": "Wheelchair: yes", 1666 | "id": "Parkhaus/Tiefgarage_23", 1667 | "icon": { 1668 | "id": "carParkCovIcon" 1669 | } 1670 | }, 1671 | "geometry": { 1672 | "type": "Point", 1673 | "coordinates": [ 1674 | 9.1515808, 1675 | 48.5153021 1676 | ] 1677 | } 1678 | }, 1679 | { 1680 | "type": "Feature", 1681 | "properties": { 1682 | "name": "Klostersee", 1683 | "name_en": "Klostersee", 1684 | "name_de": "Klostersee", 1685 | "popupContent": "Stellpl\u00e4tze: 41, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 1686 | "popupContent_de": "Stellpl\u00e4tze: 41, Geb\u00fchrenpflichtig: ja, Barrierefrei: ja", 1687 | "popupContent_en": "Capacity: 41, Fee: yes, Wheelchair: yes", 1688 | "id": "Parkhaus/Tiefgarage_24", 1689 | "icon": { 1690 | "id": "carParkCovIcon" 1691 | } 1692 | }, 1693 | "geometry": { 1694 | "type": "Point", 1695 | "coordinates": [ 1696 | 9.2272376, 1697 | 48.4640948 1698 | ] 1699 | } 1700 | }, 1701 | { 1702 | "type": "Feature", 1703 | "properties": { 1704 | "name": "Stadthalle", 1705 | "name_en": "Stadthalle", 1706 | "name_de": "Stadthalle", 1707 | "popupContent": "Stellpl\u00e4tze: 200, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 06:00-01:00, Sa 06:00-01:00, So 06:00-01:00, PH 06:00-01:00", 1708 | "popupContent_de": "Stellpl\u00e4tze: 200, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 06:00-01:00, Sa 06:00-01:00, So 06:00-01:00, PH 06:00-01:00", 1709 | "popupContent_en": "Capacity: 200, Fee: yes, Opening hours: Mo-Fr 06:00-01:00, Sa 06:00-01:00, Su 06:00-01:00, PH 06:00-01:00", 1710 | "id": "Parkhaus/Tiefgarage_25", 1711 | "icon": { 1712 | "id": "carParkCovIcon" 1713 | } 1714 | }, 1715 | "geometry": { 1716 | "type": "Point", 1717 | "coordinates": [ 1718 | 9.2064707, 1719 | 48.4909876 1720 | ] 1721 | } 1722 | }, 1723 | { 1724 | "type": "Feature", 1725 | "properties": { 1726 | "name": "Tiefgarage Nordsternhaus", 1727 | "name_en": "Tiefgarage Nordsternhaus", 1728 | "name_de": "Tiefgarage Nordsternhaus", 1729 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 07:00-21:00; Sa 07:00-21:00;Barrierefrei: ja", 1730 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 07:00-21:00; Sa 07:00-21:00;Barrierefrei: ja", 1731 | "popupContent_en": "Fee: yes, Opening hours: Mo-Fr 07:00-21:00; Sa 07:00-21:00;Wheelchair: yes", 1732 | "id": "Parkhaus/Tiefgarage_26", 1733 | "icon": { 1734 | "id": "carParkCovIcon" 1735 | } 1736 | }, 1737 | "geometry": { 1738 | "type": "Point", 1739 | "coordinates": [ 1740 | 9.2071646, 1741 | 48.4904452 1742 | ] 1743 | } 1744 | }, 1745 | { 1746 | "type": "Feature", 1747 | "properties": { 1748 | "name": "T\u00fcbinger Tor", 1749 | "name_en": "T\u00fcbinger Tor", 1750 | "name_de": "T\u00fcbinger Tor", 1751 | "popupContent": "\u00d6ffnungszeiten: Mo-Fr 06:00-02:30, Sa 06:00-02:30, So 06:00-02:30, Barrierefrei: begrenzt", 1752 | "popupContent_de": "\u00d6ffnungszeiten: Mo-Fr 06:00-02:30, Sa 06:00-02:30, So 06:00-02:30, Barrierefrei: begrenzt", 1753 | "popupContent_en": "Opening hours: Mo-Fr 06:00-02:30, Sa 06:00-02:30, Su 06:00-02:30, Wheelchair: limited", 1754 | "id": "Parkhaus/Tiefgarage_27", 1755 | "icon": { 1756 | "id": "carParkCovIcon" 1757 | } 1758 | }, 1759 | "geometry": { 1760 | "type": "Point", 1761 | "coordinates": [ 1762 | 9.2090815, 1763 | 48.4907364 1764 | ] 1765 | } 1766 | }, 1767 | { 1768 | "type": "Feature", 1769 | "properties": { 1770 | "name": "Echaz-Zentrum", 1771 | "name_en": "Echaz-Zentrum", 1772 | "name_de": "Echaz-Zentrum", 1773 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1774 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1775 | "popupContent_en": "Fee: yes, Opening hours: 24/7", 1776 | "id": "Parkhaus/Tiefgarage_28", 1777 | "icon": { 1778 | "id": "carParkCovIcon" 1779 | } 1780 | }, 1781 | "geometry": { 1782 | "type": "Point", 1783 | "coordinates": [ 1784 | 9.2177278, 1785 | 48.4871123 1786 | ] 1787 | } 1788 | }, 1789 | { 1790 | "type": "Feature", 1791 | "properties": { 1792 | "name": "Gartentor / C&A", 1793 | "name_en": "Gartentor / C&A", 1794 | "name_de": "Gartentor / C&A", 1795 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 08:00-20:30; Sa 08:00-18:30", 1796 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: Mo-Fr 08:00-20:30; Sa 08:00-18:30", 1797 | "popupContent_en": "Fee: yes, Opening hours: Mo-Fr 08:00-20:30; Sa 08:00-18:30", 1798 | "id": "Parkhaus/Tiefgarage_29", 1799 | "icon": { 1800 | "id": "carParkCovIcon" 1801 | } 1802 | }, 1803 | "geometry": { 1804 | "type": "Point", 1805 | "coordinates": [ 1806 | 9.2134799, 1807 | 48.4935394 1808 | ] 1809 | } 1810 | }, 1811 | { 1812 | "type": "Feature", 1813 | "properties": { 1814 | "name": "Leonhardsplatz", 1815 | "name_en": "Leonhardsplatz", 1816 | "name_de": "Leonhardsplatz", 1817 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1818 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1819 | "popupContent_en": "Fee: yes, Opening hours: 24/7", 1820 | "id": "Parkhaus/Tiefgarage_30", 1821 | "icon": { 1822 | "id": "carParkCovIcon" 1823 | } 1824 | }, 1825 | "geometry": { 1826 | "type": "Point", 1827 | "coordinates": [ 1828 | 9.2188903, 1829 | 48.4906708 1830 | ] 1831 | } 1832 | }, 1833 | { 1834 | "type": "Feature", 1835 | "properties": { 1836 | "name": "Obere W\u00e4ssere", 1837 | "name_en": "Obere W\u00e4ssere", 1838 | "name_de": "Obere W\u00e4ssere", 1839 | "popupContent": "Geb\u00fchrenpflichtig: ja", 1840 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 1841 | "popupContent_en": "Fee: yes", 1842 | "id": "Parkhaus/Tiefgarage_31", 1843 | "icon": { 1844 | "id": "carParkCovIcon" 1845 | } 1846 | }, 1847 | "geometry": { 1848 | "type": "Point", 1849 | "coordinates": [ 1850 | 9.2166948, 1851 | 48.4888588 1852 | ] 1853 | } 1854 | }, 1855 | { 1856 | "type": "Feature", 1857 | "properties": { 1858 | "name": "Parkhaus Kaiserpassage", 1859 | "name_en": "Parkhaus Kaiserpassage", 1860 | "name_de": "Parkhaus Kaiserpassage", 1861 | "popupContent": "Stellpl\u00e4tze: 365, Geb\u00fchrenpflichtig: ja", 1862 | "popupContent_de": "Stellpl\u00e4tze: 365, Geb\u00fchrenpflichtig: ja", 1863 | "popupContent_en": "Capacity: 365, Fee: yes", 1864 | "id": "Parkhaus/Tiefgarage_32", 1865 | "icon": { 1866 | "id": "carParkCovIcon" 1867 | } 1868 | }, 1869 | "geometry": { 1870 | "type": "Point", 1871 | "coordinates": [ 1872 | 9.2149655, 1873 | 48.4930699 1874 | ] 1875 | } 1876 | }, 1877 | { 1878 | "type": "Feature", 1879 | "properties": { 1880 | "name": "Postarkaden/Commerzbank", 1881 | "name_en": "Postarkaden/Commerzbank", 1882 | "name_de": "Postarkaden/Commerzbank", 1883 | "popupContent": "Geb\u00fchrenpflichtig: ja", 1884 | "popupContent_de": "Geb\u00fchrenpflichtig: ja", 1885 | "popupContent_en": "Fee: yes", 1886 | "id": "Parkhaus/Tiefgarage_33", 1887 | "icon": { 1888 | "id": "carParkCovIcon" 1889 | } 1890 | }, 1891 | "geometry": { 1892 | "type": "Point", 1893 | "coordinates": [ 1894 | 9.2084004, 1895 | 48.4948208 1896 | ] 1897 | } 1898 | }, 1899 | { 1900 | "type": "Feature", 1901 | "properties": { 1902 | "name": "Reisemobilplatz Outletcity", 1903 | "name_en": "Reisemobilplatz Outletcity", 1904 | "name_de": "Reisemobilplatz Outletcity", 1905 | "popupContent": "Stellpl\u00e4tze: 19, Geb\u00fchrenpflichtig: ja", 1906 | "popupContent_de": "Stellpl\u00e4tze: 19, Geb\u00fchrenpflichtig: ja", 1907 | "popupContent_en": "Capacity: 19, Fee: yes", 1908 | "id": "Wohnmobilstellplatz_0", 1909 | "icon": { 1910 | "id": "caravanIcon", 1911 | "svg": "womoparken\t\t\t\t\t\t\t\t\t\t\t\t\t\t" 1912 | } 1913 | }, 1914 | "geometry": { 1915 | "type": "Point", 1916 | "coordinates": [ 1917 | 9.2762985, 1918 | 48.5323623 1919 | ] 1920 | } 1921 | }, 1922 | { 1923 | "type": "Feature", 1924 | "properties": { 1925 | "name": "Stellplatz am Sch\u00f6nbergbad", 1926 | "name_en": "Stellplatz am Sch\u00f6nbergbad", 1927 | "name_de": "Stellplatz am Sch\u00f6nbergbad", 1928 | "popupContent": "Stellpl\u00e4tze: 9, Geb\u00fchrenpflichtig: nein, Telefon: +49 7121 70300", 1929 | "popupContent_de": "Stellpl\u00e4tze: 9, Geb\u00fchrenpflichtig: nein, Telefon: +49 7121 70300", 1930 | "popupContent_en": "Capacity: 9, Fee: no, Phone: +49 7121 70300", 1931 | "id": "Wohnmobilstellplatz_1", 1932 | "icon": { 1933 | "id": "caravanIcon" 1934 | } 1935 | }, 1936 | "geometry": { 1937 | "type": "Point", 1938 | "coordinates": [ 1939 | 9.2278745, 1940 | 48.4552904 1941 | ] 1942 | } 1943 | }, 1944 | { 1945 | "type": "Feature", 1946 | "properties": { 1947 | "name": "Wohnmobilstellplatz Kohlberg am Jusi", 1948 | "name_en": "Wohnmobilstellplatz Kohlberg am Jusi", 1949 | "name_de": "Wohnmobilstellplatz Kohlberg am Jusi", 1950 | "popupContent": "Stellpl\u00e4tze: 6, Geb\u00fchrenpflichtig: nein, Telefon: +49 7025 910180", 1951 | "popupContent_de": "Stellpl\u00e4tze: 6, Geb\u00fchrenpflichtig: nein, Telefon: +49 7025 910180", 1952 | "popupContent_en": "Capacity: 6, Fee: no, Phone: +49 7025 910180", 1953 | "id": "Wohnmobilstellplatz_2", 1954 | "icon": { 1955 | "id": "caravanIcon" 1956 | } 1957 | }, 1958 | "geometry": { 1959 | "type": "Point", 1960 | "coordinates": [ 1961 | 9.3460062, 1962 | 48.5573898 1963 | ] 1964 | } 1965 | }, 1966 | { 1967 | "type": "Feature", 1968 | "properties": { 1969 | "name": "Reutlinger Wohnmobilstellplatz", 1970 | "name_en": "Reutlinger Wohnmobilstellplatz", 1971 | "name_de": "Reutlinger Wohnmobilstellplatz", 1972 | "popupContent": "Stellpl\u00e4tze: 10, Geb\u00fchrenpflichtig: ja", 1973 | "popupContent_de": "Stellpl\u00e4tze: 10, Geb\u00fchrenpflichtig: ja", 1974 | "popupContent_en": "Capacity: 10, Fee: yes", 1975 | "id": "Wohnmobilstellplatz_3", 1976 | "icon": { 1977 | "id": "caravanIcon" 1978 | } 1979 | }, 1980 | "geometry": { 1981 | "type": "Point", 1982 | "coordinates": [ 1983 | 9.1937489, 1984 | 48.4743354 1985 | ] 1986 | } 1987 | } 1988 | ] 1989 | } -------------------------------------------------------------------------------- /04-adding-geojson-layers/rt-layers/charging.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": { 7 | "name": "Ladestation", 8 | "name_en": "Ladestation", 9 | "name_de": "Ladestation", 10 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 07:00-17:00", 11 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 07:00-17:00", 12 | "popupContent_en": "Capacity: 2, Opening hours: Mo-Fr 07:00-17:00", 13 | "id": "Fahrradladestation_0", 14 | "icon": { 15 | "id": "bikeChargeIcon", 16 | "svg": " " 17 | } 18 | }, 19 | "geometry": { 20 | "type": "Point", 21 | "coordinates": [ 22 | 9.2590623, 23 | 48.5562572 24 | ] 25 | } 26 | }, 27 | { 28 | "type": "Feature", 29 | "properties": { 30 | "name": "Charging station", 31 | "name_en": "Charging station", 32 | "name_de": "Charging station", 33 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 34 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 35 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 36 | "id": "Fahrradladestation_1", 37 | "icon": { 38 | "id": "bikeChargeIcon" 39 | } 40 | }, 41 | "geometry": { 42 | "type": "Point", 43 | "coordinates": [ 44 | 9.275659, 45 | 48.5413976 46 | ] 47 | } 48 | }, 49 | { 50 | "type": "Feature", 51 | "properties": { 52 | "name": "e-bike", 53 | "name_en": "e-bike", 54 | "name_de": "e-bike", 55 | "popupContent": "Stellpl\u00e4tze: 4, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 56 | "popupContent_de": "Stellpl\u00e4tze: 4, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 57 | "popupContent_en": "Capacity: 4, Fee: no, Opening hours: 24/7", 58 | "id": "Fahrradladestation_2", 59 | "icon": { 60 | "id": "bikeChargeIcon" 61 | } 62 | }, 63 | "geometry": { 64 | "type": "Point", 65 | "coordinates": [ 66 | 9.2267282, 67 | 48.4642191 68 | ] 69 | } 70 | }, 71 | { 72 | "type": "Feature", 73 | "properties": { 74 | "name": "e-bike", 75 | "name_en": "e-bike", 76 | "name_de": "e-bike", 77 | "popupContent": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: nein", 78 | "popupContent_de": "Stellpl\u00e4tze: 12, Geb\u00fchrenpflichtig: nein", 79 | "popupContent_en": "Capacity: 12, Fee: no", 80 | "id": "Fahrradladestation_3", 81 | "icon": { 82 | "id": "bikeChargeIcon" 83 | } 84 | }, 85 | "geometry": { 86 | "type": "Point", 87 | "coordinates": [ 88 | 9.2113854, 89 | 48.4911961 90 | ] 91 | } 92 | }, 93 | { 94 | "type": "Feature", 95 | "properties": { 96 | "name": "e-bike", 97 | "name_en": "e-bike", 98 | "name_de": "e-bike", 99 | "popupContent": "Stellpl\u00e4tze: 3, Geb\u00fchrenpflichtig: nein", 100 | "popupContent_de": "Stellpl\u00e4tze: 3, Geb\u00fchrenpflichtig: nein", 101 | "popupContent_en": "Capacity: 3, Fee: no", 102 | "id": "Fahrradladestation_4", 103 | "icon": { 104 | "id": "bikeChargeIcon" 105 | } 106 | }, 107 | "geometry": { 108 | "type": "Point", 109 | "coordinates": [ 110 | 9.2181194, 111 | 48.4941152 112 | ] 113 | } 114 | }, 115 | { 116 | "type": "Feature", 117 | "properties": { 118 | "name_en": "Bicycle charging station", 119 | "name_de": "Fahrradladestation", 120 | "name": "Fahrradladestation", 121 | "popupContent": "Stellpl\u00e4tze: 4, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 122 | "popupContent_de": "Stellpl\u00e4tze: 4, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 123 | "popupContent_en": "Capacity: 4, Fee: no, Opening hours: 24/7", 124 | "id": "Fahrradladestation_5", 125 | "icon": { 126 | "id": "bikeChargeIcon" 127 | } 128 | }, 129 | "geometry": { 130 | "type": "Point", 131 | "coordinates": [ 132 | 9.1477526, 133 | 48.4955517 134 | ] 135 | } 136 | }, 137 | { 138 | "type": "Feature", 139 | "properties": { 140 | "name_en": "Bicycle charging station", 141 | "name_de": "Fahrradladestation", 142 | "name": "Fahrradladestation", 143 | "popupContent": "", 144 | "popupContent_de": "", 145 | "popupContent_en": "", 146 | "id": "Fahrradladestation_6", 147 | "icon": { 148 | "id": "bikeChargeIcon" 149 | } 150 | }, 151 | "geometry": { 152 | "type": "Point", 153 | "coordinates": [ 154 | 9.0964273, 155 | 48.6034781 156 | ] 157 | } 158 | }, 159 | { 160 | "type": "Feature", 161 | "properties": { 162 | "name": "Chargercube", 163 | "name_en": "Chargercube", 164 | "name_de": "Chargercube", 165 | "popupContent": "Stellpl\u00e4tze: 8, \u00d6ffnungszeiten: 24/7", 166 | "popupContent_de": "Stellpl\u00e4tze: 8, \u00d6ffnungszeiten: 24/7", 167 | "popupContent_en": "Capacity: 8, Opening hours: 24/7", 168 | "id": "Fahrradladestation_7", 169 | "icon": { 170 | "id": "bikeChargeIcon" 171 | } 172 | }, 173 | "geometry": { 174 | "type": "Point", 175 | "coordinates": [ 176 | 9.1416261, 177 | 48.5335414 178 | ] 179 | } 180 | }, 181 | { 182 | "type": "Feature", 183 | "properties": { 184 | "name": "E-Bike", 185 | "name_en": "E-Bike", 186 | "name_de": "E-Bike", 187 | "popupContent": "", 188 | "popupContent_de": "", 189 | "popupContent_en": "", 190 | "id": "Fahrradladestation_8", 191 | "icon": { 192 | "id": "bikeChargeIcon" 193 | } 194 | }, 195 | "geometry": { 196 | "type": "Point", 197 | "coordinates": [ 198 | 9.2838283, 199 | 48.4592133 200 | ] 201 | } 202 | }, 203 | { 204 | "type": "Feature", 205 | "properties": { 206 | "name": "E-Bike Charging Cube", 207 | "name_en": "E-Bike Charging Cube", 208 | "name_de": "E-Bike Charging Cube", 209 | "popupContent": "Stellpl\u00e4tze: 10, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 210 | "popupContent_de": "Stellpl\u00e4tze: 10, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 211 | "popupContent_en": "Capacity: 10, Fee: no, Opening hours: 24/7", 212 | "id": "Fahrradladestation_9", 213 | "icon": { 214 | "id": "bikeChargeIcon" 215 | } 216 | }, 217 | "geometry": { 218 | "type": "Point", 219 | "coordinates": [ 220 | 9.2095297, 221 | 48.4951816 222 | ] 223 | } 224 | }, 225 | { 226 | "type": "Feature", 227 | "properties": { 228 | "name_en": "Bicycle charging station", 229 | "name_de": "Fahrradladestation", 230 | "name": "Fahrradladestation", 231 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja", 232 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja", 233 | "popupContent_en": "Capacity: 2, Fee: yes", 234 | "id": "Fahrradladestation_10", 235 | "icon": { 236 | "id": "bikeChargeIcon" 237 | } 238 | }, 239 | "geometry": { 240 | "type": "Point", 241 | "coordinates": [ 242 | 9.2625625, 243 | 48.6043477 244 | ] 245 | } 246 | }, 247 | { 248 | "type": "Feature", 249 | "properties": { 250 | "name": "ChargerCube", 251 | "name_en": "ChargerCube", 252 | "name_de": "ChargerCube", 253 | "popupContent": "Stellpl\u00e4tze: 8, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 254 | "popupContent_de": "Stellpl\u00e4tze: 8, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 255 | "popupContent_en": "Capacity: 8, Fee: no, Opening hours: 24/7", 256 | "id": "Fahrradladestation_11", 257 | "icon": { 258 | "id": "bikeChargeIcon" 259 | } 260 | }, 261 | "geometry": { 262 | "type": "Point", 263 | "coordinates": [ 264 | 9.2277682, 265 | 48.4554227 266 | ] 267 | } 268 | }, 269 | { 270 | "type": "Feature", 271 | "properties": { 272 | "name": "Rathaus Wannweil", 273 | "name_en": "Rathaus Wannweil", 274 | "name_de": "Rathaus Wannweil", 275 | "popupContent": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 276 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 277 | "popupContent_en": "Fee: no, Opening hours: 24/7", 278 | "id": "Fahrradladestation_12", 279 | "icon": { 280 | "id": "bikeChargeIcon" 281 | } 282 | }, 283 | "geometry": { 284 | "type": "Point", 285 | "coordinates": [ 286 | 9.15113, 287 | 48.5154917 288 | ] 289 | } 290 | }, 291 | { 292 | "type": "Feature", 293 | "properties": { 294 | "name_en": "Bicycle charging station", 295 | "name_de": "Fahrradladestation", 296 | "name": "Fahrradladestation", 297 | "popupContent": "Stellpl\u00e4tze: 4, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 298 | "popupContent_de": "Stellpl\u00e4tze: 4, Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: 24/7", 299 | "popupContent_en": "Capacity: 4, Fee: no, Opening hours: 24/7", 300 | "id": "Fahrradladestation_13", 301 | "icon": { 302 | "id": "bikeChargeIcon" 303 | } 304 | }, 305 | "geometry": { 306 | "type": "Point", 307 | "coordinates": [ 308 | 9.1418369, 309 | 48.481208 310 | ] 311 | } 312 | }, 313 | { 314 | "type": "Feature", 315 | "properties": { 316 | "name": "Schnell-Ladestation", 317 | "name_en": "Schnell-Ladestation", 318 | "name_de": "Schnell-Ladestation", 319 | "popupContent": "Stellpl\u00e4tze: 2", 320 | "popupContent_de": "Stellpl\u00e4tze: 2", 321 | "popupContent_en": "Capacity: 2", 322 | "id": "Elektroauto-Ladestation_0", 323 | "icon": { 324 | "id": "carChargeIcon", 325 | "svg": " " 326 | } 327 | }, 328 | "geometry": { 329 | "type": "Point", 330 | "coordinates": [ 331 | 9.2682587, 332 | 48.5707378 333 | ] 334 | } 335 | }, 336 | { 337 | "type": "Feature", 338 | "properties": { 339 | "name_en": "Car charging station", 340 | "name_de": "Elektroauto-Ladestation", 341 | "name": "Elektroauto-Ladestation", 342 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 343 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 344 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 345 | "id": "Elektroauto-Ladestation_1", 346 | "icon": { 347 | "id": "carChargeIcon" 348 | } 349 | }, 350 | "geometry": { 351 | "type": "Point", 352 | "coordinates": [ 353 | 9.212192, 354 | 48.4884396 355 | ] 356 | } 357 | }, 358 | { 359 | "type": "Feature", 360 | "properties": { 361 | "name": "Ladestation", 362 | "name_en": "Ladestation", 363 | "name_de": "Ladestation", 364 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 07:00-17:00", 365 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 07:00-17:00", 366 | "popupContent_en": "Capacity: 2, Opening hours: Mo-Fr 07:00-17:00", 367 | "id": "Elektroauto-Ladestation_2", 368 | "icon": { 369 | "id": "carChargeIcon" 370 | } 371 | }, 372 | "geometry": { 373 | "type": "Point", 374 | "coordinates": [ 375 | 9.2590623, 376 | 48.5562572 377 | ] 378 | } 379 | }, 380 | { 381 | "type": "Feature", 382 | "properties": { 383 | "name_en": "Car charging station", 384 | "name_de": "Elektroauto-Ladestation", 385 | "name": "Elektroauto-Ladestation", 386 | "popupContent": "Stellpl\u00e4tze: 2", 387 | "popupContent_de": "Stellpl\u00e4tze: 2", 388 | "popupContent_en": "Capacity: 2", 389 | "id": "Elektroauto-Ladestation_3", 390 | "icon": { 391 | "id": "carChargeIcon" 392 | } 393 | }, 394 | "geometry": { 395 | "type": "Point", 396 | "coordinates": [ 397 | 9.2815698, 398 | 48.5371795 399 | ] 400 | } 401 | }, 402 | { 403 | "type": "Feature", 404 | "properties": { 405 | "name": "Charging station", 406 | "name_en": "Charging station", 407 | "name_de": "Charging station", 408 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 409 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 410 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 411 | "id": "Elektroauto-Ladestation_4", 412 | "icon": { 413 | "id": "carChargeIcon" 414 | } 415 | }, 416 | "geometry": { 417 | "type": "Point", 418 | "coordinates": [ 419 | 9.275659, 420 | 48.5413976 421 | ] 422 | } 423 | }, 424 | { 425 | "type": "Feature", 426 | "properties": { 427 | "name_en": "Car charging station", 428 | "name_de": "Elektroauto-Ladestation", 429 | "name": "Elektroauto-Ladestation", 430 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 431 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 432 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 433 | "id": "Elektroauto-Ladestation_5", 434 | "icon": { 435 | "id": "carChargeIcon" 436 | } 437 | }, 438 | "geometry": { 439 | "type": "Point", 440 | "coordinates": [ 441 | 9.206995, 442 | 48.4913407 443 | ] 444 | } 445 | }, 446 | { 447 | "type": "Feature", 448 | "properties": { 449 | "name_en": "Car charging station", 450 | "name_de": "Elektroauto-Ladestation", 451 | "name": "Elektroauto-Ladestation", 452 | "popupContent": "Stellpl\u00e4tze: 1, \u00d6ffnungszeiten: 24/7", 453 | "popupContent_de": "Stellpl\u00e4tze: 1, \u00d6ffnungszeiten: 24/7", 454 | "popupContent_en": "Capacity: 1, Opening hours: 24/7", 455 | "id": "Elektroauto-Ladestation_6", 456 | "icon": { 457 | "id": "carChargeIcon" 458 | } 459 | }, 460 | "geometry": { 461 | "type": "Point", 462 | "coordinates": [ 463 | 9.2082642, 464 | 48.4959725 465 | ] 466 | } 467 | }, 468 | { 469 | "type": "Feature", 470 | "properties": { 471 | "name_en": "Car charging station", 472 | "name_de": "Elektroauto-Ladestation", 473 | "name": "Elektroauto-Ladestation", 474 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 475 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 476 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 477 | "id": "Elektroauto-Ladestation_7", 478 | "icon": { 479 | "id": "carChargeIcon" 480 | } 481 | }, 482 | "geometry": { 483 | "type": "Point", 484 | "coordinates": [ 485 | 9.2171223, 486 | 48.4884338 487 | ] 488 | } 489 | }, 490 | { 491 | "type": "Feature", 492 | "properties": { 493 | "name_en": "Car charging station", 494 | "name_de": "Elektroauto-Ladestation", 495 | "name": "Elektroauto-Ladestation", 496 | "popupContent": "Stellpl\u00e4tze: 2", 497 | "popupContent_de": "Stellpl\u00e4tze: 2", 498 | "popupContent_en": "Capacity: 2", 499 | "id": "Elektroauto-Ladestation_8", 500 | "icon": { 501 | "id": "carChargeIcon" 502 | } 503 | }, 504 | "geometry": { 505 | "type": "Point", 506 | "coordinates": [ 507 | 9.278465, 508 | 48.5410663 509 | ] 510 | } 511 | }, 512 | { 513 | "type": "Feature", 514 | "properties": { 515 | "name_en": "Car charging station", 516 | "name_de": "Elektroauto-Ladestation", 517 | "name": "Elektroauto-Ladestation", 518 | "popupContent": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 519 | "popupContent_de": "Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 520 | "popupContent_en": "Fee: yes, Opening hours: 24/7", 521 | "id": "Elektroauto-Ladestation_9", 522 | "icon": { 523 | "id": "carChargeIcon" 524 | } 525 | }, 526 | "geometry": { 527 | "type": "Point", 528 | "coordinates": [ 529 | 9.2187546, 530 | 48.4904783 531 | ] 532 | } 533 | }, 534 | { 535 | "type": "Feature", 536 | "properties": { 537 | "name_en": "Car charging station", 538 | "name_de": "Elektroauto-Ladestation", 539 | "name": "Elektroauto-Ladestation", 540 | "popupContent": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: Mo-Fr 07:00-19:00; Sa 07:00-16:00", 541 | "popupContent_de": "Geb\u00fchrenpflichtig: nein, \u00d6ffnungszeiten: Mo-Fr 07:00-19:00; Sa 07:00-16:00", 542 | "popupContent_en": "Fee: no, Opening hours: Mo-Fr 07:00-19:00; Sa 07:00-16:00", 543 | "id": "Elektroauto-Ladestation_10", 544 | "icon": { 545 | "id": "carChargeIcon" 546 | } 547 | }, 548 | "geometry": { 549 | "type": "Point", 550 | "coordinates": [ 551 | 9.2275692, 552 | 48.475326 553 | ] 554 | } 555 | }, 556 | { 557 | "type": "Feature", 558 | "properties": { 559 | "name_en": "Car charging station", 560 | "name_de": "Elektroauto-Ladestation", 561 | "name": "Elektroauto-Ladestation", 562 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 563 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 564 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 565 | "id": "Elektroauto-Ladestation_11", 566 | "icon": { 567 | "id": "carChargeIcon" 568 | } 569 | }, 570 | "geometry": { 571 | "type": "Point", 572 | "coordinates": [ 573 | 9.1873384, 574 | 48.4941281 575 | ] 576 | } 577 | }, 578 | { 579 | "type": "Feature", 580 | "properties": { 581 | "name_en": "Car charging station", 582 | "name_de": "Elektroauto-Ladestation", 583 | "name": "Elektroauto-Ladestation", 584 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 585 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 586 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 587 | "id": "Elektroauto-Ladestation_12", 588 | "icon": { 589 | "id": "carChargeIcon" 590 | } 591 | }, 592 | "geometry": { 593 | "type": "Point", 594 | "coordinates": [ 595 | 9.2105135, 596 | 48.4969159 597 | ] 598 | } 599 | }, 600 | { 601 | "type": "Feature", 602 | "properties": { 603 | "name_en": "Car charging station", 604 | "name_de": "Elektroauto-Ladestation", 605 | "name": "Elektroauto-Ladestation", 606 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 607 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 608 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 609 | "id": "Elektroauto-Ladestation_13", 610 | "icon": { 611 | "id": "carChargeIcon" 612 | } 613 | }, 614 | "geometry": { 615 | "type": "Point", 616 | "coordinates": [ 617 | 9.2154855, 618 | 48.4915692 619 | ] 620 | } 621 | }, 622 | { 623 | "type": "Feature", 624 | "properties": { 625 | "name_en": "Car charging station", 626 | "name_de": "Elektroauto-Ladestation", 627 | "name": "Elektroauto-Ladestation", 628 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 629 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 630 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 631 | "id": "Elektroauto-Ladestation_14", 632 | "icon": { 633 | "id": "carChargeIcon" 634 | } 635 | }, 636 | "geometry": { 637 | "type": "Point", 638 | "coordinates": [ 639 | 9.2062541, 640 | 48.5017666 641 | ] 642 | } 643 | }, 644 | { 645 | "type": "Feature", 646 | "properties": { 647 | "name_en": "Car charging station", 648 | "name_de": "Elektroauto-Ladestation", 649 | "name": "Elektroauto-Ladestation", 650 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 651 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 652 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 653 | "id": "Elektroauto-Ladestation_15", 654 | "icon": { 655 | "id": "carChargeIcon" 656 | } 657 | }, 658 | "geometry": { 659 | "type": "Point", 660 | "coordinates": [ 661 | 9.2164085, 662 | 48.4932495 663 | ] 664 | } 665 | }, 666 | { 667 | "type": "Feature", 668 | "properties": { 669 | "name_en": "Car charging station", 670 | "name_de": "Elektroauto-Ladestation", 671 | "name": "Elektroauto-Ladestation", 672 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 673 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 674 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 675 | "id": "Elektroauto-Ladestation_16", 676 | "icon": { 677 | "id": "carChargeIcon" 678 | } 679 | }, 680 | "geometry": { 681 | "type": "Point", 682 | "coordinates": [ 683 | 9.2591049, 684 | 48.4862403 685 | ] 686 | } 687 | }, 688 | { 689 | "type": "Feature", 690 | "properties": { 691 | "name_en": "Car charging station", 692 | "name_de": "Elektroauto-Ladestation", 693 | "name": "Elektroauto-Ladestation", 694 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 695 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 696 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 697 | "id": "Elektroauto-Ladestation_17", 698 | "icon": { 699 | "id": "carChargeIcon" 700 | } 701 | }, 702 | "geometry": { 703 | "type": "Point", 704 | "coordinates": [ 705 | 9.2165827, 706 | 48.4849454 707 | ] 708 | } 709 | }, 710 | { 711 | "type": "Feature", 712 | "properties": { 713 | "name_en": "Car charging station", 714 | "name_de": "Elektroauto-Ladestation", 715 | "name": "Elektroauto-Ladestation", 716 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 717 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 718 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 719 | "id": "Elektroauto-Ladestation_18", 720 | "icon": { 721 | "id": "carChargeIcon" 722 | } 723 | }, 724 | "geometry": { 725 | "type": "Point", 726 | "coordinates": [ 727 | 9.2069015, 728 | 48.5207676 729 | ] 730 | } 731 | }, 732 | { 733 | "type": "Feature", 734 | "properties": { 735 | "name_en": "Car charging station", 736 | "name_de": "Elektroauto-Ladestation", 737 | "name": "Elektroauto-Ladestation", 738 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 739 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 740 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 741 | "id": "Elektroauto-Ladestation_19", 742 | "icon": { 743 | "id": "carChargeIcon" 744 | } 745 | }, 746 | "geometry": { 747 | "type": "Point", 748 | "coordinates": [ 749 | 9.2044969, 750 | 48.5116346 751 | ] 752 | } 753 | }, 754 | { 755 | "type": "Feature", 756 | "properties": { 757 | "name_en": "Car charging station", 758 | "name_de": "Elektroauto-Ladestation", 759 | "name": "Elektroauto-Ladestation", 760 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 761 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 762 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 763 | "id": "Elektroauto-Ladestation_20", 764 | "icon": { 765 | "id": "carChargeIcon" 766 | } 767 | }, 768 | "geometry": { 769 | "type": "Point", 770 | "coordinates": [ 771 | 9.194985, 772 | 48.4761164 773 | ] 774 | } 775 | }, 776 | { 777 | "type": "Feature", 778 | "properties": { 779 | "name_en": "Car charging station", 780 | "name_de": "Elektroauto-Ladestation", 781 | "name": "Elektroauto-Ladestation", 782 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 783 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 784 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 785 | "id": "Elektroauto-Ladestation_21", 786 | "icon": { 787 | "id": "carChargeIcon" 788 | } 789 | }, 790 | "geometry": { 791 | "type": "Point", 792 | "coordinates": [ 793 | 9.2298514, 794 | 48.4826095 795 | ] 796 | } 797 | }, 798 | { 799 | "type": "Feature", 800 | "properties": { 801 | "name_en": "Car charging station", 802 | "name_de": "Elektroauto-Ladestation", 803 | "name": "Elektroauto-Ladestation", 804 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 805 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 806 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 807 | "id": "Elektroauto-Ladestation_22", 808 | "icon": { 809 | "id": "carChargeIcon" 810 | } 811 | }, 812 | "geometry": { 813 | "type": "Point", 814 | "coordinates": [ 815 | 9.2007339, 816 | 48.4926611 817 | ] 818 | } 819 | }, 820 | { 821 | "type": "Feature", 822 | "properties": { 823 | "name_en": "Car charging station", 824 | "name_de": "Elektroauto-Ladestation", 825 | "name": "Elektroauto-Ladestation", 826 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 827 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 828 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 829 | "id": "Elektroauto-Ladestation_23", 830 | "icon": { 831 | "id": "carChargeIcon" 832 | } 833 | }, 834 | "geometry": { 835 | "type": "Point", 836 | "coordinates": [ 837 | 9.2213751, 838 | 48.4164126 839 | ] 840 | } 841 | }, 842 | { 843 | "type": "Feature", 844 | "properties": { 845 | "name_en": "Car charging station", 846 | "name_de": "Elektroauto-Ladestation", 847 | "name": "Elektroauto-Ladestation", 848 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 849 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 850 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 851 | "id": "Elektroauto-Ladestation_24", 852 | "icon": { 853 | "id": "carChargeIcon" 854 | } 855 | }, 856 | "geometry": { 857 | "type": "Point", 858 | "coordinates": [ 859 | 9.2214513, 860 | 48.4656809 861 | ] 862 | } 863 | }, 864 | { 865 | "type": "Feature", 866 | "properties": { 867 | "name_en": "Car charging station", 868 | "name_de": "Elektroauto-Ladestation", 869 | "name": "Elektroauto-Ladestation", 870 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 871 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 872 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 873 | "id": "Elektroauto-Ladestation_25", 874 | "icon": { 875 | "id": "carChargeIcon" 876 | } 877 | }, 878 | "geometry": { 879 | "type": "Point", 880 | "coordinates": [ 881 | 9.1536954, 882 | 48.4976629 883 | ] 884 | } 885 | }, 886 | { 887 | "type": "Feature", 888 | "properties": { 889 | "name_en": "Car charging station", 890 | "name_de": "Elektroauto-Ladestation", 891 | "name": "Elektroauto-Ladestation", 892 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja", 893 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja", 894 | "popupContent_en": "Capacity: 2, Fee: yes", 895 | "id": "Elektroauto-Ladestation_26", 896 | "icon": { 897 | "id": "carChargeIcon" 898 | } 899 | }, 900 | "geometry": { 901 | "type": "Point", 902 | "coordinates": [ 903 | 9.2264482, 904 | 48.4652879 905 | ] 906 | } 907 | }, 908 | { 909 | "type": "Feature", 910 | "properties": { 911 | "name_en": "Car charging station", 912 | "name_de": "Elektroauto-Ladestation", 913 | "name": "Elektroauto-Ladestation", 914 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 915 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 916 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 917 | "id": "Elektroauto-Ladestation_27", 918 | "icon": { 919 | "id": "carChargeIcon" 920 | } 921 | }, 922 | "geometry": { 923 | "type": "Point", 924 | "coordinates": [ 925 | 9.0939675, 926 | 48.6065761 927 | ] 928 | } 929 | }, 930 | { 931 | "type": "Feature", 932 | "properties": { 933 | "name_en": "Car charging station", 934 | "name_de": "Elektroauto-Ladestation", 935 | "name": "Elektroauto-Ladestation", 936 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 937 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 938 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 939 | "id": "Elektroauto-Ladestation_28", 940 | "icon": { 941 | "id": "carChargeIcon" 942 | } 943 | }, 944 | "geometry": { 945 | "type": "Point", 946 | "coordinates": [ 947 | 9.1500664, 948 | 48.5309585 949 | ] 950 | } 951 | }, 952 | { 953 | "type": "Feature", 954 | "properties": { 955 | "name_en": "Car charging station", 956 | "name_de": "Elektroauto-Ladestation", 957 | "name": "Elektroauto-Ladestation", 958 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 959 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 960 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 961 | "id": "Elektroauto-Ladestation_29", 962 | "icon": { 963 | "id": "carChargeIcon" 964 | } 965 | }, 966 | "geometry": { 967 | "type": "Point", 968 | "coordinates": [ 969 | 9.1499832, 970 | 48.5309341 971 | ] 972 | } 973 | }, 974 | { 975 | "type": "Feature", 976 | "properties": { 977 | "name_en": "Car charging station", 978 | "name_de": "Elektroauto-Ladestation", 979 | "name": "Elektroauto-Ladestation", 980 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 981 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 982 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 983 | "id": "Elektroauto-Ladestation_30", 984 | "icon": { 985 | "id": "carChargeIcon" 986 | } 987 | }, 988 | "geometry": { 989 | "type": "Point", 990 | "coordinates": [ 991 | 9.1578048, 992 | 48.496224 993 | ] 994 | } 995 | }, 996 | { 997 | "type": "Feature", 998 | "properties": { 999 | "name_en": "Car charging station", 1000 | "name_de": "Elektroauto-Ladestation", 1001 | "name": "Elektroauto-Ladestation", 1002 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1003 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1004 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1005 | "id": "Elektroauto-Ladestation_31", 1006 | "icon": { 1007 | "id": "carChargeIcon" 1008 | } 1009 | }, 1010 | "geometry": { 1011 | "type": "Point", 1012 | "coordinates": [ 1013 | 9.1578057, 1014 | 48.4962688 1015 | ] 1016 | } 1017 | }, 1018 | { 1019 | "type": "Feature", 1020 | "properties": { 1021 | "name_en": "Car charging station", 1022 | "name_de": "Elektroauto-Ladestation", 1023 | "name": "Elektroauto-Ladestation", 1024 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1025 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1026 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 1027 | "id": "Elektroauto-Ladestation_32", 1028 | "icon": { 1029 | "id": "carChargeIcon" 1030 | } 1031 | }, 1032 | "geometry": { 1033 | "type": "Point", 1034 | "coordinates": [ 1035 | 9.2548552, 1036 | 48.4302436 1037 | ] 1038 | } 1039 | }, 1040 | { 1041 | "type": "Feature", 1042 | "properties": { 1043 | "name_en": "Car charging station", 1044 | "name_de": "Elektroauto-Ladestation", 1045 | "name": "Elektroauto-Ladestation", 1046 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1047 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1048 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1049 | "id": "Elektroauto-Ladestation_33", 1050 | "icon": { 1051 | "id": "carChargeIcon" 1052 | } 1053 | }, 1054 | "geometry": { 1055 | "type": "Point", 1056 | "coordinates": [ 1057 | 9.1941642, 1058 | 48.4935695 1059 | ] 1060 | } 1061 | }, 1062 | { 1063 | "type": "Feature", 1064 | "properties": { 1065 | "name_en": "Car charging station", 1066 | "name_de": "Elektroauto-Ladestation", 1067 | "name": "Elektroauto-Ladestation", 1068 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1069 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1070 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1071 | "id": "Elektroauto-Ladestation_34", 1072 | "icon": { 1073 | "id": "carChargeIcon" 1074 | } 1075 | }, 1076 | "geometry": { 1077 | "type": "Point", 1078 | "coordinates": [ 1079 | 9.0971269, 1080 | 48.4539262 1081 | ] 1082 | } 1083 | }, 1084 | { 1085 | "type": "Feature", 1086 | "properties": { 1087 | "name_en": "Car charging station", 1088 | "name_de": "Elektroauto-Ladestation", 1089 | "name": "Elektroauto-Ladestation", 1090 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1091 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1092 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1093 | "id": "Elektroauto-Ladestation_35", 1094 | "icon": { 1095 | "id": "carChargeIcon" 1096 | } 1097 | }, 1098 | "geometry": { 1099 | "type": "Point", 1100 | "coordinates": [ 1101 | 9.1379502, 1102 | 48.4962357 1103 | ] 1104 | } 1105 | }, 1106 | { 1107 | "type": "Feature", 1108 | "properties": { 1109 | "name_en": "Car charging station", 1110 | "name_de": "Elektroauto-Ladestation", 1111 | "name": "Elektroauto-Ladestation", 1112 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1113 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1114 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1115 | "id": "Elektroauto-Ladestation_36", 1116 | "icon": { 1117 | "id": "carChargeIcon" 1118 | } 1119 | }, 1120 | "geometry": { 1121 | "type": "Point", 1122 | "coordinates": [ 1123 | 9.2062199, 1124 | 48.546707 1125 | ] 1126 | } 1127 | }, 1128 | { 1129 | "type": "Feature", 1130 | "properties": { 1131 | "name_en": "Car charging station", 1132 | "name_de": "Elektroauto-Ladestation", 1133 | "name": "Elektroauto-Ladestation", 1134 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1135 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1136 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1137 | "id": "Elektroauto-Ladestation_37", 1138 | "icon": { 1139 | "id": "carChargeIcon" 1140 | } 1141 | }, 1142 | "geometry": { 1143 | "type": "Point", 1144 | "coordinates": [ 1145 | 9.1767718, 1146 | 48.5005919 1147 | ] 1148 | } 1149 | }, 1150 | { 1151 | "type": "Feature", 1152 | "properties": { 1153 | "name_en": "Car charging station", 1154 | "name_de": "Elektroauto-Ladestation", 1155 | "name": "Elektroauto-Ladestation", 1156 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1157 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1158 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1159 | "id": "Elektroauto-Ladestation_38", 1160 | "icon": { 1161 | "id": "carChargeIcon" 1162 | } 1163 | }, 1164 | "geometry": { 1165 | "type": "Point", 1166 | "coordinates": [ 1167 | 9.2030507, 1168 | 48.5321508 1169 | ] 1170 | } 1171 | }, 1172 | { 1173 | "type": "Feature", 1174 | "properties": { 1175 | "name_en": "Car charging station", 1176 | "name_de": "Elektroauto-Ladestation", 1177 | "name": "Elektroauto-Ladestation", 1178 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1179 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1180 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1181 | "id": "Elektroauto-Ladestation_39", 1182 | "icon": { 1183 | "id": "carChargeIcon" 1184 | } 1185 | }, 1186 | "geometry": { 1187 | "type": "Point", 1188 | "coordinates": [ 1189 | 9.2048572, 1190 | 48.4980895 1191 | ] 1192 | } 1193 | }, 1194 | { 1195 | "type": "Feature", 1196 | "properties": { 1197 | "name_en": "Car charging station", 1198 | "name_de": "Elektroauto-Ladestation", 1199 | "name": "Elektroauto-Ladestation", 1200 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1201 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1202 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1203 | "id": "Elektroauto-Ladestation_40", 1204 | "icon": { 1205 | "id": "carChargeIcon" 1206 | } 1207 | }, 1208 | "geometry": { 1209 | "type": "Point", 1210 | "coordinates": [ 1211 | 9.2070875, 1212 | 48.488146 1213 | ] 1214 | } 1215 | }, 1216 | { 1217 | "type": "Feature", 1218 | "properties": { 1219 | "name_en": "Car charging station", 1220 | "name_de": "Elektroauto-Ladestation", 1221 | "name": "Elektroauto-Ladestation", 1222 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1223 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1224 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1225 | "id": "Elektroauto-Ladestation_41", 1226 | "icon": { 1227 | "id": "carChargeIcon" 1228 | } 1229 | }, 1230 | "geometry": { 1231 | "type": "Point", 1232 | "coordinates": [ 1233 | 9.1938387, 1234 | 48.4850301 1235 | ] 1236 | } 1237 | }, 1238 | { 1239 | "type": "Feature", 1240 | "properties": { 1241 | "name_en": "Car charging station", 1242 | "name_de": "Elektroauto-Ladestation", 1243 | "name": "Elektroauto-Ladestation", 1244 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1245 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1246 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 1247 | "id": "Elektroauto-Ladestation_42", 1248 | "icon": { 1249 | "id": "carChargeIcon" 1250 | } 1251 | }, 1252 | "geometry": { 1253 | "type": "Point", 1254 | "coordinates": [ 1255 | 9.2225383, 1256 | 48.4843683 1257 | ] 1258 | } 1259 | }, 1260 | { 1261 | "type": "Feature", 1262 | "properties": { 1263 | "name_en": "Car charging station", 1264 | "name_de": "Elektroauto-Ladestation", 1265 | "name": "Elektroauto-Ladestation", 1266 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1267 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1268 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 1269 | "id": "Elektroauto-Ladestation_43", 1270 | "icon": { 1271 | "id": "carChargeIcon" 1272 | } 1273 | }, 1274 | "geometry": { 1275 | "type": "Point", 1276 | "coordinates": [ 1277 | 9.2091308, 1278 | 48.4902139 1279 | ] 1280 | } 1281 | }, 1282 | { 1283 | "type": "Feature", 1284 | "properties": { 1285 | "name_en": "Car charging station", 1286 | "name_de": "Elektroauto-Ladestation", 1287 | "name": "Elektroauto-Ladestation", 1288 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 08:00-21:00; Sa 08:00-21:00; So off;", 1289 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 08:00-21:00; Sa 08:00-21:00; So off;", 1290 | "popupContent_en": "Capacity: 2, Opening hours: Mo-Fr 08:00-21:00; Sa 08:00-21:00; Su off;", 1291 | "id": "Elektroauto-Ladestation_44", 1292 | "icon": { 1293 | "id": "carChargeIcon" 1294 | } 1295 | }, 1296 | "geometry": { 1297 | "type": "Point", 1298 | "coordinates": [ 1299 | 9.2178384, 1300 | 48.5124876 1301 | ] 1302 | } 1303 | }, 1304 | { 1305 | "type": "Feature", 1306 | "properties": { 1307 | "name_en": "Car charging station", 1308 | "name_de": "Elektroauto-Ladestation", 1309 | "name": "Elektroauto-Ladestation", 1310 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 08:00-21:00; Sa 08:00-21:00; So off;", 1311 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 08:00-21:00; Sa 08:00-21:00; So off;", 1312 | "popupContent_en": "Capacity: 2, Opening hours: Mo-Fr 08:00-21:00; Sa 08:00-21:00; Su off;", 1313 | "id": "Elektroauto-Ladestation_45", 1314 | "icon": { 1315 | "id": "carChargeIcon" 1316 | } 1317 | }, 1318 | "geometry": { 1319 | "type": "Point", 1320 | "coordinates": [ 1321 | 9.1580926, 1322 | 48.4951808 1323 | ] 1324 | } 1325 | }, 1326 | { 1327 | "type": "Feature", 1328 | "properties": { 1329 | "name_en": "Car charging station", 1330 | "name_de": "Elektroauto-Ladestation", 1331 | "name": "Elektroauto-Ladestation", 1332 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1333 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1334 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 1335 | "id": "Elektroauto-Ladestation_46", 1336 | "icon": { 1337 | "id": "carChargeIcon" 1338 | } 1339 | }, 1340 | "geometry": { 1341 | "type": "Point", 1342 | "coordinates": [ 1343 | 9.2105958, 1344 | 48.4965076 1345 | ] 1346 | } 1347 | }, 1348 | { 1349 | "type": "Feature", 1350 | "properties": { 1351 | "name_en": "Car charging station", 1352 | "name_de": "Elektroauto-Ladestation", 1353 | "name": "Elektroauto-Ladestation", 1354 | "popupContent": "Stellpl\u00e4tze: 20, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1355 | "popupContent_de": "Stellpl\u00e4tze: 20, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1356 | "popupContent_en": "Capacity: 20, Fee: yes, Opening hours: 24/7", 1357 | "id": "Elektroauto-Ladestation_47", 1358 | "icon": { 1359 | "id": "carChargeIcon" 1360 | } 1361 | }, 1362 | "geometry": { 1363 | "type": "Point", 1364 | "coordinates": [ 1365 | 9.1878372, 1366 | 48.4975541 1367 | ] 1368 | } 1369 | }, 1370 | { 1371 | "type": "Feature", 1372 | "properties": { 1373 | "name_en": "Car charging station", 1374 | "name_de": "Elektroauto-Ladestation", 1375 | "name": "Elektroauto-Ladestation", 1376 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 08:00-21:00; Sa 08:00-21:00; So off;", 1377 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: Mo-Fr 08:00-21:00; Sa 08:00-21:00; So off;", 1378 | "popupContent_en": "Capacity: 2, Opening hours: Mo-Fr 08:00-21:00; Sa 08:00-21:00; Su off;", 1379 | "id": "Elektroauto-Ladestation_48", 1380 | "icon": { 1381 | "id": "carChargeIcon" 1382 | } 1383 | }, 1384 | "geometry": { 1385 | "type": "Point", 1386 | "coordinates": [ 1387 | 9.2078889, 1388 | 48.5022728 1389 | ] 1390 | } 1391 | }, 1392 | { 1393 | "type": "Feature", 1394 | "properties": { 1395 | "name_en": "Car charging station", 1396 | "name_de": "Elektroauto-Ladestation", 1397 | "name": "Elektroauto-Ladestation", 1398 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1399 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1400 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1401 | "id": "Elektroauto-Ladestation_49", 1402 | "icon": { 1403 | "id": "carChargeIcon" 1404 | } 1405 | }, 1406 | "geometry": { 1407 | "type": "Point", 1408 | "coordinates": [ 1409 | 9.2278977, 1410 | 48.5198196 1411 | ] 1412 | } 1413 | }, 1414 | { 1415 | "type": "Feature", 1416 | "properties": { 1417 | "name_en": "Car charging station", 1418 | "name_de": "Elektroauto-Ladestation", 1419 | "name": "Elektroauto-Ladestation", 1420 | "popupContent": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1421 | "popupContent_de": "Stellpl\u00e4tze: 2, \u00d6ffnungszeiten: 24/7", 1422 | "popupContent_en": "Capacity: 2, Opening hours: 24/7", 1423 | "id": "Elektroauto-Ladestation_50", 1424 | "icon": { 1425 | "id": "carChargeIcon" 1426 | } 1427 | }, 1428 | "geometry": { 1429 | "type": "Point", 1430 | "coordinates": [ 1431 | 9.1531898, 1432 | 48.4965903 1433 | ] 1434 | } 1435 | }, 1436 | { 1437 | "type": "Feature", 1438 | "properties": { 1439 | "name_en": "Car charging station", 1440 | "name_de": "Elektroauto-Ladestation", 1441 | "name": "Elektroauto-Ladestation", 1442 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1443 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1444 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1445 | "id": "Elektroauto-Ladestation_51", 1446 | "icon": { 1447 | "id": "carChargeIcon" 1448 | } 1449 | }, 1450 | "geometry": { 1451 | "type": "Point", 1452 | "coordinates": [ 1453 | 9.1347986, 1454 | 48.4933182 1455 | ] 1456 | } 1457 | }, 1458 | { 1459 | "type": "Feature", 1460 | "properties": { 1461 | "name_en": "Car charging station", 1462 | "name_de": "Elektroauto-Ladestation", 1463 | "name": "Elektroauto-Ladestation", 1464 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1465 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1466 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1467 | "id": "Elektroauto-Ladestation_52", 1468 | "icon": { 1469 | "id": "carChargeIcon" 1470 | } 1471 | }, 1472 | "geometry": { 1473 | "type": "Point", 1474 | "coordinates": [ 1475 | 9.1347671, 1476 | 48.4933631 1477 | ] 1478 | } 1479 | }, 1480 | { 1481 | "type": "Feature", 1482 | "properties": { 1483 | "name_en": "Car charging station", 1484 | "name_de": "Elektroauto-Ladestation", 1485 | "name": "Elektroauto-Ladestation", 1486 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1487 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1488 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1489 | "id": "Elektroauto-Ladestation_53", 1490 | "icon": { 1491 | "id": "carChargeIcon" 1492 | } 1493 | }, 1494 | "geometry": { 1495 | "type": "Point", 1496 | "coordinates": [ 1497 | 9.1814402, 1498 | 48.5870425 1499 | ] 1500 | } 1501 | }, 1502 | { 1503 | "type": "Feature", 1504 | "properties": { 1505 | "name_en": "Car charging station", 1506 | "name_de": "Elektroauto-Ladestation", 1507 | "name": "Elektroauto-Ladestation", 1508 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1509 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1510 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1511 | "id": "Elektroauto-Ladestation_54", 1512 | "icon": { 1513 | "id": "carChargeIcon" 1514 | } 1515 | }, 1516 | "geometry": { 1517 | "type": "Point", 1518 | "coordinates": [ 1519 | 9.2183822, 1520 | 48.4938379 1521 | ] 1522 | } 1523 | }, 1524 | { 1525 | "type": "Feature", 1526 | "properties": { 1527 | "name_en": "Car charging station", 1528 | "name_de": "Elektroauto-Ladestation", 1529 | "name": "Elektroauto-Ladestation", 1530 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1531 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1532 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1533 | "id": "Elektroauto-Ladestation_55", 1534 | "icon": { 1535 | "id": "carChargeIcon" 1536 | } 1537 | }, 1538 | "geometry": { 1539 | "type": "Point", 1540 | "coordinates": [ 1541 | 9.1482673, 1542 | 48.4337241 1543 | ] 1544 | } 1545 | }, 1546 | { 1547 | "type": "Feature", 1548 | "properties": { 1549 | "name_en": "Car charging station", 1550 | "name_de": "Elektroauto-Ladestation", 1551 | "name": "Elektroauto-Ladestation", 1552 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1553 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1554 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1555 | "id": "Elektroauto-Ladestation_56", 1556 | "icon": { 1557 | "id": "carChargeIcon" 1558 | } 1559 | }, 1560 | "geometry": { 1561 | "type": "Point", 1562 | "coordinates": [ 1563 | 9.1912939, 1564 | 48.592564 1565 | ] 1566 | } 1567 | }, 1568 | { 1569 | "type": "Feature", 1570 | "properties": { 1571 | "name_en": "Car charging station", 1572 | "name_de": "Elektroauto-Ladestation", 1573 | "name": "Elektroauto-Ladestation", 1574 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1575 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1576 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1577 | "id": "Elektroauto-Ladestation_57", 1578 | "icon": { 1579 | "id": "carChargeIcon" 1580 | } 1581 | }, 1582 | "geometry": { 1583 | "type": "Point", 1584 | "coordinates": [ 1585 | 9.2284217, 1586 | 48.5648384 1587 | ] 1588 | } 1589 | }, 1590 | { 1591 | "type": "Feature", 1592 | "properties": { 1593 | "name_en": "Car charging station", 1594 | "name_de": "Elektroauto-Ladestation", 1595 | "name": "Elektroauto-Ladestation", 1596 | "popupContent": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1597 | "popupContent_de": "Stellpl\u00e4tze: 2, Geb\u00fchrenpflichtig: ja, \u00d6ffnungszeiten: 24/7", 1598 | "popupContent_en": "Capacity: 2, Fee: yes, Opening hours: 24/7", 1599 | "id": "Elektroauto-Ladestation_58", 1600 | "icon": { 1601 | "id": "carChargeIcon" 1602 | } 1603 | }, 1604 | "geometry": { 1605 | "type": "Point", 1606 | "coordinates": [ 1607 | 9.2198271, 1608 | 48.4911151 1609 | ] 1610 | } 1611 | } 1612 | ] 1613 | } -------------------------------------------------------------------------------- /04-adding-geojson-layers/rt-layers/toilet.geojson: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [] 4 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Legal Code 2 | 3 | CC0 1.0 Universal 4 | 5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE 6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN 7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS 8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES 9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS 10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM 11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED 12 | HEREUNDER. 13 | 14 | Statement of Purpose 15 | 16 | The laws of most jurisdictions throughout the world automatically confer 17 | exclusive Copyright and Related Rights (defined below) upon the creator 18 | and subsequent owner(s) (each and all, an "owner") of an original work of 19 | authorship and/or a database (each, a "Work"). 20 | 21 | Certain owners wish to permanently relinquish those rights to a Work for 22 | the purpose of contributing to a commons of creative, cultural and 23 | scientific works ("Commons") that the public can reliably and without fear 24 | of later claims of infringement build upon, modify, incorporate in other 25 | works, reuse and redistribute as freely as possible in any form whatsoever 26 | and for any purposes, including without limitation commercial purposes. 27 | These owners may contribute to the Commons to promote the ideal of a free 28 | culture and the further production of creative, cultural and scientific 29 | works, or to gain reputation or greater distribution for their Work in 30 | part through the use and efforts of others. 31 | 32 | For these and/or other purposes and motivations, and without any 33 | expectation of additional consideration or compensation, the person 34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she 35 | is an owner of Copyright and Related Rights in the Work, voluntarily 36 | elects to apply CC0 to the Work and publicly distribute the Work under its 37 | terms, with knowledge of his or her Copyright and Related Rights in the 38 | Work and the meaning and intended legal effect of CC0 on those rights. 39 | 40 | 1. Copyright and Related Rights. A Work made available under CC0 may be 41 | protected by copyright and related or neighboring rights ("Copyright and 42 | Related Rights"). Copyright and Related Rights include, but are not 43 | limited to, the following: 44 | 45 | i. the right to reproduce, adapt, distribute, perform, display, 46 | communicate, and translate a Work; 47 | ii. moral rights retained by the original author(s) and/or performer(s); 48 | iii. publicity and privacy rights pertaining to a person's image or 49 | likeness depicted in a Work; 50 | iv. rights protecting against unfair competition in regards to a Work, 51 | subject to the limitations in paragraph 4(a), below; 52 | v. rights protecting the extraction, dissemination, use and reuse of data 53 | in a Work; 54 | vi. database rights (such as those arising under Directive 96/9/EC of the 55 | European Parliament and of the Council of 11 March 1996 on the legal 56 | protection of databases, and under any national implementation 57 | thereof, including any amended or successor version of such 58 | directive); and 59 | vii. other similar, equivalent or corresponding rights throughout the 60 | world based on applicable law or treaty, and any national 61 | implementations thereof. 62 | 63 | 2. Waiver. To the greatest extent permitted by, but not in contravention 64 | of, applicable law, Affirmer hereby overtly, fully, permanently, 65 | irrevocably and unconditionally waives, abandons, and surrenders all of 66 | Affirmer's Copyright and Related Rights and associated claims and causes 67 | of action, whether now known or unknown (including existing as well as 68 | future claims and causes of action), in the Work (i) in all territories 69 | worldwide, (ii) for the maximum duration provided by applicable law or 70 | treaty (including future time extensions), (iii) in any current or future 71 | medium and for any number of copies, and (iv) for any purpose whatsoever, 72 | including without limitation commercial, advertising or promotional 73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each 74 | member of the public at large and to the detriment of Affirmer's heirs and 75 | successors, fully intending that such Waiver shall not be subject to 76 | revocation, rescission, cancellation, termination, or any other legal or 77 | equitable action to disrupt the quiet enjoyment of the Work by the public 78 | as contemplated by Affirmer's express Statement of Purpose. 79 | 80 | 3. Public License Fallback. Should any part of the Waiver for any reason 81 | be judged legally invalid or ineffective under applicable law, then the 82 | Waiver shall be preserved to the maximum extent permitted taking into 83 | account Affirmer's express Statement of Purpose. In addition, to the 84 | extent the Waiver is so judged Affirmer hereby grants to each affected 85 | person a royalty-free, non transferable, non sublicensable, non exclusive, 86 | irrevocable and unconditional license to exercise Affirmer's Copyright and 87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the 88 | maximum duration provided by applicable law or treaty (including future 89 | time extensions), (iii) in any current or future medium and for any number 90 | of copies, and (iv) for any purpose whatsoever, including without 91 | limitation commercial, advertising or promotional purposes (the 92 | "License"). The License shall be deemed effective as of the date CC0 was 93 | applied by Affirmer to the Work. Should any part of the License for any 94 | reason be judged legally invalid or ineffective under applicable law, such 95 | partial invalidity or ineffectiveness shall not invalidate the remainder 96 | of the License, and in such case Affirmer hereby affirms that he or she 97 | will not (i) exercise any of his or her remaining Copyright and Related 98 | Rights in the Work or (ii) assert any associated claims and causes of 99 | action with respect to the Work, in either case contrary to Affirmer's 100 | express Statement of Purpose. 101 | 102 | 4. Limitations and Disclaimers. 103 | 104 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 105 | surrendered, licensed or otherwise affected by this document. 106 | b. Affirmer offers the Work as-is and makes no representations or 107 | warranties of any kind concerning the Work, express, implied, 108 | statutory or otherwise, including without limitation warranties of 109 | title, merchantability, fitness for a particular purpose, non 110 | infringement, or the absence of latent or other defects, accuracy, or 111 | the present or absence of errors, whether or not discoverable, all to 112 | the greatest extent permissible under applicable law. 113 | c. Affirmer disclaims responsibility for clearing rights of other persons 114 | that may apply to the Work or any use thereof, including without 115 | limitation any person's Copyright and Related Rights in the Work. 116 | Further, Affirmer disclaims responsibility for obtaining any necessary 117 | consents, permissions or other rights required for any use of the 118 | Work. 119 | d. Affirmer understands and acknowledges that Creative Commons is not a 120 | party to this document and has no duty or obligation with respect to 121 | this CC0 or use of the Work. 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # stadtnavi tutorial 2 | This is a step by step introduction how to setup a stadtnavi instance. It aims developers wanting to get up and running quickly, using docker (and docker compose) as a deployment tool. For setups closer to production, please consult e.g. the [transportkollektiv digitransit cookbook](https://transportkollektiv.github.io/digitransit-setup/). 3 | 4 | ## [Step 1](01-installing-and-running-ui/README.md) 5 | Step 1 illustrates, how to start and customize a digitransit-ui frontend, connecting to existining backend services. 6 | 7 | ## [Step 2](02-otp-and-graph-building/README.md) 8 | Step 2 shows, how to run an OpenTripPlanner backend service and explains how to customize it for a specific region. 9 | 10 | ## [Step 3](03-running-otp-and-digitransit/README.md) 11 | Step 3 shows, how to run the customized digitransit-ui, the OpenTripPlanner backend service and the map server to display POIs. 12 | 13 | ## Credits 14 | This tutorial, as well the whole stadtnavi projects builds on work done by the OpenTripPlanner project, by HSLDevCom who developed Digitransit, as well as many inspiring ideas from the open transport community, especially the [Verschwoerhaus Ulm](https://verschwoerhaus.de) and [Code for Münster](https://codeformuenster.org). Last but not least, this project was sponsored by the German Ministry of Transportation ([BMVI](https://www.bmvi.de/)) and the city of [Herrenberg](https://herrenberg.de/). Thanks to all of you. 15 | --------------------------------------------------------------------------------