diff --git a/.drone.yml b/.drone.yml
deleted file mode 100644
index 1ea50ce..0000000
--- a/.drone.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-kind: pipeline
-type: kubernetes
-name: build-apk
-
-clone:
- depth: 1
-
-steps:
- - name: build
- image: cirrusci/flutter:stable
- pull: true
- commands:
- - flutter packages get
- - flutter build apk --release --split-per-abi
- - mkdir apks
- - mv build/app/outputs/apk/*/*/*.apk apks
-
- - name: Publish APK
- image: plugins/gitea-release
- settings:
- api_key:
- from_secret: GITEA_TOKEN
-trigger:
- event:
- - push
\ No newline at end of file
diff --git a/.gitea/workflows/backed_build-image.yaml b/.gitea/workflows/backed_build-image.yaml
new file mode 100644
index 0000000..5542a1f
--- /dev/null
+++ b/.gitea/workflows/backed_build-image.yaml
@@ -0,0 +1,31 @@
+on:
+ pull_request:
+ branches:
+ - main
+
+name: Build and push docker image
+
+jobs:
+ build:
+ name: Build
+ runs-on: ubuntu-latest
+ steps:
+
+ - uses: https://gitea.com/actions/checkout@v4
+
+ - name: Login to Docker Registry
+ uses: docker/login-action@v3
+ with:
+ registry: git.kluster.moll.re
+ username: ${{ gitea.repository_owner }}
+ password: ${{ secrets.DOCKER_PUSH_TOKEN }}
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+
+ - name: Build and push
+ uses: docker/build-push-action@v5
+ with:
+ context: backend
+ tags: git.kluster.moll.re/remoll/fast_network_navigation/backend:latest
+ push: true
diff --git a/.gitea/workflows/build-android.yaml b/.gitea/workflows/frontend_build-android.yaml
similarity index 56%
rename from .gitea/workflows/build-android.yaml
rename to .gitea/workflows/frontend_build-android.yaml
index 76305b1..a1e2d7e 100644
--- a/.gitea/workflows/build-android.yaml
+++ b/.gitea/workflows/frontend_build-android.yaml
@@ -1,42 +1,61 @@
-on: push
-name: Test, Build and Release apk
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - frontend/**
+
+
+name: Build and release APK
+
jobs:
build:
name: Build APK
- runs-on: k8s
+ runs-on: ubuntu-latest
steps:
- name: Install prerequisites
run: |
- sudo apt-get update
- sudo apt-get install -y xz-utils unzip
+ apt-get update
+ apt-get install -y jq
+
- uses: https://gitea.com/actions/checkout@v4
+
- uses: https://github.com/actions/setup-java@v4
with:
java-version: '17'
distribution: 'zulu'
+ - name: Fix flutter SDK folder permission
+ run: git config --global --add safe.directory "*"
+
- uses: https://github.com/subosito/flutter-action@v2
with:
channel: stable
- flutter-version: 3.19.6
+ flutter-version: 3.22.0
cache: true
+
- name: Setup Android SDK
uses: https://github.com/android-actions/setup-android@v3
- run: flutter pub get
- # - run: flutter test
- - run: flutter build apk --debug --split-per-abi
-
+ working-directory: ./frontend
+
+ - run: flutter build apk --release --split-per-abi
+ working-directory: ./frontend
+
- name: Release APK
uses: https://gitea.com/akkuman/gitea-release-action@v1
with:
- files: build/app/outputs/flutter-apk/*.apk
+ files: ./frontend/build/app/outputs/flutter-apk/*.apk
+ name: Testing release
+ release_name: testing
tag: testing
- release_name: Testing release
+ tag_name: testing
release_body: "This is a testing release."
prerelease: true
token: ${{ secrets.GITEA_TOKEN }}
env:
NODE_OPTIONS: '--experimental-fetch'
+
diff --git a/.gitea/workflows/build-web.yaml b/.gitea/workflows/frontend_build-web.yaml
similarity index 61%
rename from .gitea/workflows/build-web.yaml
rename to .gitea/workflows/frontend_build-web.yaml
index cc08a5e..f5980fe 100644
--- a/.gitea/workflows/build-web.yaml
+++ b/.gitea/workflows/frontend_build-web.yaml
@@ -1,21 +1,34 @@
-on: push
-name: Test, Build and Release web
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - frontend/**
+
+
+name: Build web
+
jobs:
build:
name: Build Web
- runs-on: k8s
+ runs-on: ubuntu-latest
steps:
+
- name: Install prerequisites
run: |
sudo apt-get update
sudo apt-get install -y xz-utils
- uses: actions/checkout@v4
+
- uses: https://github.com/subosito/flutter-action@v2
with:
channel: stable
flutter-version: 3.19.6
cache: true
- - run: flutter pub get
- # - run: flutter test
+ - run: flutter pub get
+ working-directory: ./frontend
+
+ - run: flutter build web
+ working-directory: ./frontend
diff --git a/.gitignore b/.gitignore
index 29a3a50..e934adf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,43 +1 @@
-# Miscellaneous
-*.class
-*.log
-*.pyc
-*.swp
-.DS_Store
-.atom/
-.buildlog/
-.history
-.svn/
-migrate_working_dir/
-
-# IntelliJ related
-*.iml
-*.ipr
-*.iws
-.idea/
-
-# The .vscode folder contains launch configuration and tasks you configure in
-# VS Code which you may wish to be included in version control, so this line
-# is commented out by default.
-#.vscode/
-
-# Flutter/Dart/Pub related
-**/doc/api/
-**/ios/Flutter/.last_build_id
-.dart_tool/
-.flutter-plugins
-.flutter-plugins-dependencies
-.pub-cache/
-.pub/
-/build/
-
-# Symbolication related
-app.*.symbols
-
-# Obfuscation related
-app.*.map.json
-
-# Android Studio will place build artifacts here
-/android/app/debug
-/android/app/profile
-/android/app/release
+cache/
diff --git a/backend/.gitignore b/backend/.gitignore
new file mode 100644
index 0000000..2e722c1
--- /dev/null
+++ b/backend/.gitignore
@@ -0,0 +1,164 @@
+# osm-cache
+cache/
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+# For a library or package, you might want to ignore these files since the code is
+# intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+# in version control.
+# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
+.pdm.toml
+.pdm-python
+.pdm-build/
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
\ No newline at end of file
diff --git a/backend/Dockerfile b/backend/Dockerfile
new file mode 100644
index 0000000..79dbe76
--- /dev/null
+++ b/backend/Dockerfile
@@ -0,0 +1,11 @@
+FROM python:3
+
+WORKDIR /app
+COPY Pipfile Pipfile.lock .
+
+RUN pip install pipenv
+RUN pipenv install --deploy --system
+
+COPY . /src
+
+CMD ["pipenv", "run", "python", "/app/src/main.py"]
diff --git a/backend/Pipfile b/backend/Pipfile
new file mode 100644
index 0000000..62e84e8
--- /dev/null
+++ b/backend/Pipfile
@@ -0,0 +1,14 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+numpy = "*"
+scipy = "*"
+fastapi = "*"
+osmpythontools = "*"
+pydantic = "*"
+shapely = "*"
+
+[dev-packages]
diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock
new file mode 100644
index 0000000..2e5aac3
--- /dev/null
+++ b/backend/Pipfile.lock
@@ -0,0 +1,1543 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "0f88c01cde3be9a6332acec33fa0ccf13b6e122a6df8ee5cfefa52ba1e98034f"
+ },
+ "pipfile-spec": 6,
+ "requires": {},
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {
+ "annotated-types": {
+ "hashes": [
+ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
+ "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.7.0"
+ },
+ "anyio": {
+ "hashes": [
+ "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94",
+ "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==4.4.0"
+ },
+ "beautifulsoup4": {
+ "hashes": [
+ "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051",
+ "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"
+ ],
+ "markers": "python_full_version >= '3.6.0'",
+ "version": "==4.12.3"
+ },
+ "certifi": {
+ "hashes": [
+ "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516",
+ "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==2024.6.2"
+ },
+ "click": {
+ "hashes": [
+ "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
+ "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==8.1.7"
+ },
+ "contourpy": {
+ "hashes": [
+ "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2",
+ "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9",
+ "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9",
+ "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4",
+ "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce",
+ "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7",
+ "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f",
+ "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922",
+ "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4",
+ "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e",
+ "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b",
+ "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619",
+ "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205",
+ "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480",
+ "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965",
+ "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c",
+ "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd",
+ "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5",
+ "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f",
+ "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc",
+ "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec",
+ "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd",
+ "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b",
+ "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9",
+ "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe",
+ "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce",
+ "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609",
+ "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8",
+ "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0",
+ "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f",
+ "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8",
+ "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b",
+ "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364",
+ "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040",
+ "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f",
+ "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083",
+ "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df",
+ "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba",
+ "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445",
+ "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da",
+ "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3",
+ "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72",
+ "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02",
+ "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==1.2.1"
+ },
+ "cycler": {
+ "hashes": [
+ "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30",
+ "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.12.1"
+ },
+ "dnspython": {
+ "hashes": [
+ "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50",
+ "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.6.1"
+ },
+ "email-validator": {
+ "hashes": [
+ "sha256:561977c2d73ce3611850a06fa56b414621e0c8faa9d66f2611407d87465da631",
+ "sha256:cb690f344c617a714f22e66ae771445a1ceb46821152df8e165c5f9a364582b7"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.2.0"
+ },
+ "exceptiongroup": {
+ "hashes": [
+ "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad",
+ "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"
+ ],
+ "markers": "python_version < '3.11'",
+ "version": "==1.2.1"
+ },
+ "fastapi": {
+ "hashes": [
+ "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0",
+ "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==0.111.0"
+ },
+ "fastapi-cli": {
+ "hashes": [
+ "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809",
+ "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.0.4"
+ },
+ "fonttools": {
+ "hashes": [
+ "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d",
+ "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64",
+ "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2",
+ "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4",
+ "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6",
+ "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b",
+ "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f",
+ "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380",
+ "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e",
+ "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749",
+ "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20",
+ "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0",
+ "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4",
+ "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5",
+ "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206",
+ "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9",
+ "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac",
+ "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1",
+ "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce",
+ "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4",
+ "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12",
+ "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca",
+ "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d",
+ "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068",
+ "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796",
+ "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec",
+ "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea",
+ "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f",
+ "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005",
+ "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2",
+ "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06",
+ "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109",
+ "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002",
+ "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9",
+ "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a",
+ "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68",
+ "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6",
+ "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161",
+ "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd",
+ "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d",
+ "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee",
+ "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==4.53.0"
+ },
+ "geojson": {
+ "hashes": [
+ "sha256:58a7fa40727ea058efc28b0e9ff0099eadf6d0965e04690830208d3ef571adac",
+ "sha256:68a9771827237adb8c0c71f8527509c8f5bef61733aa434cefc9c9d4f0ebe8f3"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.1.0"
+ },
+ "h11": {
+ "hashes": [
+ "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
+ "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==0.14.0"
+ },
+ "httpcore": {
+ "hashes": [
+ "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61",
+ "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==1.0.5"
+ },
+ "httptools": {
+ "hashes": [
+ "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563",
+ "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142",
+ "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d",
+ "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b",
+ "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4",
+ "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb",
+ "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658",
+ "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084",
+ "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2",
+ "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97",
+ "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837",
+ "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3",
+ "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58",
+ "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da",
+ "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d",
+ "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90",
+ "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0",
+ "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1",
+ "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2",
+ "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e",
+ "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0",
+ "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf",
+ "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc",
+ "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3",
+ "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503",
+ "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a",
+ "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3",
+ "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949",
+ "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84",
+ "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb",
+ "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a",
+ "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f",
+ "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e",
+ "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81",
+ "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185",
+ "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3"
+ ],
+ "version": "==0.6.1"
+ },
+ "httpx": {
+ "hashes": [
+ "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5",
+ "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.27.0"
+ },
+ "idna": {
+ "hashes": [
+ "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc",
+ "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"
+ ],
+ "markers": "python_version >= '3.5'",
+ "version": "==3.7"
+ },
+ "jinja2": {
+ "hashes": [
+ "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369",
+ "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==3.1.4"
+ },
+ "kiwisolver": {
+ "hashes": [
+ "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf",
+ "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e",
+ "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af",
+ "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f",
+ "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046",
+ "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3",
+ "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5",
+ "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71",
+ "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee",
+ "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3",
+ "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9",
+ "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b",
+ "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985",
+ "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea",
+ "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16",
+ "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89",
+ "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c",
+ "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9",
+ "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712",
+ "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342",
+ "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a",
+ "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958",
+ "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d",
+ "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a",
+ "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130",
+ "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff",
+ "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898",
+ "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b",
+ "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f",
+ "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265",
+ "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93",
+ "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929",
+ "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635",
+ "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709",
+ "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b",
+ "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb",
+ "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a",
+ "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920",
+ "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e",
+ "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544",
+ "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45",
+ "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390",
+ "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77",
+ "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355",
+ "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff",
+ "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4",
+ "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7",
+ "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20",
+ "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c",
+ "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162",
+ "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228",
+ "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437",
+ "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc",
+ "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a",
+ "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901",
+ "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4",
+ "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770",
+ "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525",
+ "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad",
+ "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a",
+ "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29",
+ "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90",
+ "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250",
+ "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d",
+ "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3",
+ "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54",
+ "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f",
+ "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1",
+ "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da",
+ "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238",
+ "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa",
+ "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523",
+ "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0",
+ "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205",
+ "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3",
+ "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4",
+ "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac",
+ "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9",
+ "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb",
+ "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced",
+ "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd",
+ "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0",
+ "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da",
+ "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18",
+ "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9",
+ "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276",
+ "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333",
+ "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b",
+ "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db",
+ "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126",
+ "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9",
+ "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09",
+ "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0",
+ "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec",
+ "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7",
+ "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff",
+ "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9",
+ "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192",
+ "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8",
+ "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d",
+ "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6",
+ "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797",
+ "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892",
+ "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.4.5"
+ },
+ "lxml": {
+ "hashes": [
+ "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3",
+ "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a",
+ "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0",
+ "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b",
+ "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f",
+ "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6",
+ "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73",
+ "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d",
+ "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad",
+ "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b",
+ "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a",
+ "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5",
+ "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab",
+ "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316",
+ "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6",
+ "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df",
+ "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca",
+ "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264",
+ "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8",
+ "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f",
+ "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b",
+ "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3",
+ "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5",
+ "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed",
+ "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab",
+ "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5",
+ "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726",
+ "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d",
+ "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632",
+ "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706",
+ "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8",
+ "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472",
+ "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835",
+ "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf",
+ "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db",
+ "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d",
+ "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545",
+ "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9",
+ "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be",
+ "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe",
+ "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905",
+ "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438",
+ "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db",
+ "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776",
+ "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c",
+ "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed",
+ "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd",
+ "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484",
+ "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d",
+ "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6",
+ "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30",
+ "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182",
+ "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61",
+ "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425",
+ "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb",
+ "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1",
+ "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511",
+ "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e",
+ "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207",
+ "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b",
+ "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585",
+ "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56",
+ "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391",
+ "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85",
+ "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147",
+ "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18",
+ "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1",
+ "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa",
+ "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48",
+ "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3",
+ "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184",
+ "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67",
+ "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7",
+ "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34",
+ "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706",
+ "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8",
+ "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c",
+ "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115",
+ "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009",
+ "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466",
+ "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526",
+ "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d",
+ "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525",
+ "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14",
+ "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3",
+ "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0",
+ "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b",
+ "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1",
+ "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f",
+ "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf",
+ "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf",
+ "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0",
+ "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b",
+ "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff",
+ "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88",
+ "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2",
+ "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40",
+ "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716",
+ "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2",
+ "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2",
+ "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a",
+ "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734",
+ "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87",
+ "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48",
+ "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36",
+ "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b",
+ "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07",
+ "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c",
+ "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573",
+ "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001",
+ "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9",
+ "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3",
+ "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce",
+ "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3",
+ "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04",
+ "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927",
+ "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083",
+ "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d",
+ "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32",
+ "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9",
+ "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f",
+ "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2",
+ "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c",
+ "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d",
+ "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393",
+ "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8",
+ "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6",
+ "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66",
+ "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5",
+ "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97",
+ "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196",
+ "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836",
+ "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae",
+ "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297",
+ "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421",
+ "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6",
+ "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981",
+ "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30",
+ "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30",
+ "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f",
+ "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324",
+ "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"
+ ],
+ "markers": "python_version >= '3.6'",
+ "version": "==5.2.2"
+ },
+ "markdown-it-py": {
+ "hashes": [
+ "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1",
+ "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==3.0.0"
+ },
+ "markupsafe": {
+ "hashes": [
+ "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf",
+ "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff",
+ "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f",
+ "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3",
+ "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532",
+ "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f",
+ "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617",
+ "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df",
+ "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4",
+ "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906",
+ "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f",
+ "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4",
+ "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8",
+ "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371",
+ "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2",
+ "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465",
+ "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52",
+ "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6",
+ "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169",
+ "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad",
+ "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2",
+ "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0",
+ "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029",
+ "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f",
+ "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a",
+ "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced",
+ "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5",
+ "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c",
+ "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf",
+ "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9",
+ "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb",
+ "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad",
+ "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3",
+ "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1",
+ "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46",
+ "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc",
+ "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a",
+ "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee",
+ "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900",
+ "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5",
+ "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea",
+ "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f",
+ "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5",
+ "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e",
+ "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a",
+ "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f",
+ "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50",
+ "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a",
+ "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b",
+ "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4",
+ "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff",
+ "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2",
+ "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46",
+ "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b",
+ "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf",
+ "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5",
+ "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5",
+ "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab",
+ "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd",
+ "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==2.1.5"
+ },
+ "matplotlib": {
+ "hashes": [
+ "sha256:063af8587fceeac13b0936c42a2b6c732c2ab1c98d38abc3337e430e1ff75e38",
+ "sha256:06a478f0d67636554fa78558cfbcd7b9dba85b51f5c3b5a0c9be49010cf5f321",
+ "sha256:0a490715b3b9984fa609116481b22178348c1a220a4499cda79132000a79b4db",
+ "sha256:0fc51eaa5262553868461c083d9adadb11a6017315f3a757fc45ec6ec5f02888",
+ "sha256:13beb4840317d45ffd4183a778685e215939be7b08616f431c7795276e067463",
+ "sha256:290d304e59be2b33ef5c2d768d0237f5bd132986bdcc66f80bc9bcc300066a03",
+ "sha256:2bcee1dffaf60fe7656183ac2190bd630842ff87b3153afb3e384d966b57fe56",
+ "sha256:2e7f03e5cbbfacdd48c8ea394d365d91ee8f3cae7e6ec611409927b5ed997ee4",
+ "sha256:3f988bafb0fa39d1074ddd5bacd958c853e11def40800c5824556eb630f94d3b",
+ "sha256:52146fc3bd7813cc784562cb93a15788be0b2875c4655e2cc6ea646bfa30344b",
+ "sha256:550cdda3adbd596078cca7d13ed50b77879104e2e46392dcd7c75259d8f00e85",
+ "sha256:616fabf4981a3b3c5a15cd95eba359c8489c4e20e03717aea42866d8d0465956",
+ "sha256:76cce0f31b351e3551d1f3779420cf8f6ec0d4a8cf9c0237a3b549fd28eb4abb",
+ "sha256:7ff2e239c26be4f24bfa45860c20ffccd118d270c5b5d081fa4ea409b5469fcd",
+ "sha256:8146ce83cbc5dc71c223a74a1996d446cd35cfb6a04b683e1446b7e6c73603b7",
+ "sha256:81c40af649d19c85f8073e25e5806926986806fa6d54be506fbf02aef47d5a89",
+ "sha256:9a2fa6d899e17ddca6d6526cf6e7ba677738bf2a6a9590d702c277204a7c6152",
+ "sha256:a5be985db2596d761cdf0c2eaf52396f26e6a64ab46bd8cd810c48972349d1be",
+ "sha256:af4001b7cae70f7eaacfb063db605280058246de590fa7874f00f62259f2df7e",
+ "sha256:bd4f2831168afac55b881db82a7730992aa41c4f007f1913465fb182d6fb20c0",
+ "sha256:bdd1ecbe268eb3e7653e04f451635f0fb0f77f07fd070242b44c076c9106da84",
+ "sha256:c53aeb514ccbbcbab55a27f912d79ea30ab21ee0531ee2c09f13800efb272674",
+ "sha256:c79f3a585f1368da6049318bdf1f85568d8d04b2e89fc24b7e02cc9b62017382",
+ "sha256:cd53c79fd02f1c1808d2cfc87dd3cf4dbc63c5244a58ee7944497107469c8d8a",
+ "sha256:d38e85a1a6d732f645f1403ce5e6727fd9418cd4574521d5803d3d94911038e5",
+ "sha256:d91a4ffc587bacf5c4ce4ecfe4bcd23a4b675e76315f2866e588686cc97fccdf",
+ "sha256:e6d29ea6c19e34b30fb7d88b7081f869a03014f66fe06d62cc77d5a6ea88ed7a",
+ "sha256:eaf3978060a106fab40c328778b148f590e27f6fa3cd15a19d6892575bce387d",
+ "sha256:fe428e191ea016bb278758c8ee82a8129c51d81d8c4bc0846c09e7e8e9057241"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==3.9.0"
+ },
+ "mdurl": {
+ "hashes": [
+ "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
+ "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==0.1.2"
+ },
+ "numpy": {
+ "hashes": [
+ "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f",
+ "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238",
+ "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f",
+ "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95",
+ "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a",
+ "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a",
+ "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2",
+ "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2",
+ "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f",
+ "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609",
+ "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f",
+ "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad",
+ "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86",
+ "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65",
+ "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb",
+ "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995",
+ "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a",
+ "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85",
+ "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4",
+ "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275",
+ "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1",
+ "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196",
+ "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d",
+ "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e",
+ "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514",
+ "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f",
+ "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6",
+ "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4",
+ "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44",
+ "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df",
+ "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581",
+ "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787",
+ "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5",
+ "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc",
+ "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871",
+ "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54",
+ "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2",
+ "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98",
+ "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9",
+ "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864",
+ "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de",
+ "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289",
+ "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b",
+ "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c",
+ "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==2.0.0"
+ },
+ "orjson": {
+ "hashes": [
+ "sha256:03b565c3b93f5d6e001db48b747d31ea3819b89abf041ee10ac6988886d18e01",
+ "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa",
+ "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5",
+ "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04",
+ "sha256:1670fe88b116c2745a3a30b0f099b699a02bb3482c2591514baf5433819e4f4d",
+ "sha256:185c394ef45b18b9a7d8e8f333606e2e8194a50c6e3c664215aae8cf42c5385e",
+ "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b",
+ "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b",
+ "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268",
+ "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211",
+ "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c",
+ "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c",
+ "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969",
+ "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a",
+ "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f",
+ "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932",
+ "sha256:584c902ec19ab7928fd5add1783c909094cc53f31ac7acfada817b0847975f26",
+ "sha256:5a35455cc0b0b3a1eaf67224035f5388591ec72b9b6136d66b49a553ce9eb1e6",
+ "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214",
+ "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2",
+ "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f",
+ "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96",
+ "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a",
+ "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d",
+ "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38",
+ "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807",
+ "sha256:8a11d459338f96a9aa7f232ba95679fc0c7cedbd1b990d736467894210205c09",
+ "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6",
+ "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e",
+ "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5",
+ "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86",
+ "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63",
+ "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2",
+ "sha256:c05f16701ab2a4ca146d0bca950af254cb7c02f3c01fca8efbbad82d23b3d9d4",
+ "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595",
+ "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228",
+ "sha256:ca0b3a94ac8d3886c9581b9f9de3ce858263865fdaa383fbc31c310b9eac07c9",
+ "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7",
+ "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40",
+ "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3",
+ "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139",
+ "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1",
+ "sha256:dfc91d4720d48e2a709e9c368d5125b4b5899dced34b5400c3837dadc7d6271b",
+ "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47",
+ "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1",
+ "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==3.10.5"
+ },
+ "osmpythontools": {
+ "hashes": [
+ "sha256:13ff721f760fdad5dd78b4d1461d286b78bba96ee151a7301ee8c11a0c258be9"
+ ],
+ "index": "pypi",
+ "version": "==0.3.5"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002",
+ "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==24.1"
+ },
+ "pandas": {
+ "hashes": [
+ "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863",
+ "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2",
+ "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1",
+ "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad",
+ "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db",
+ "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76",
+ "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51",
+ "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32",
+ "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08",
+ "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b",
+ "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4",
+ "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921",
+ "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288",
+ "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee",
+ "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0",
+ "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24",
+ "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99",
+ "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151",
+ "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd",
+ "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce",
+ "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57",
+ "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef",
+ "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54",
+ "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a",
+ "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238",
+ "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23",
+ "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772",
+ "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce",
+ "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2.2.2"
+ },
+ "pillow": {
+ "hashes": [
+ "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c",
+ "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2",
+ "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb",
+ "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d",
+ "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa",
+ "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3",
+ "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1",
+ "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a",
+ "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd",
+ "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8",
+ "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999",
+ "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599",
+ "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936",
+ "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375",
+ "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d",
+ "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b",
+ "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60",
+ "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572",
+ "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3",
+ "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced",
+ "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f",
+ "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b",
+ "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19",
+ "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f",
+ "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d",
+ "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383",
+ "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795",
+ "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355",
+ "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57",
+ "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09",
+ "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b",
+ "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462",
+ "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf",
+ "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f",
+ "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a",
+ "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad",
+ "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9",
+ "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d",
+ "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45",
+ "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994",
+ "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d",
+ "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338",
+ "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463",
+ "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451",
+ "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591",
+ "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c",
+ "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd",
+ "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32",
+ "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9",
+ "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf",
+ "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5",
+ "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828",
+ "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3",
+ "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5",
+ "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2",
+ "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b",
+ "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2",
+ "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475",
+ "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3",
+ "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb",
+ "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef",
+ "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015",
+ "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002",
+ "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170",
+ "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84",
+ "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57",
+ "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f",
+ "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27",
+ "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==10.3.0"
+ },
+ "pydantic": {
+ "hashes": [
+ "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52",
+ "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.8'",
+ "version": "==2.7.4"
+ },
+ "pydantic-core": {
+ "hashes": [
+ "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3",
+ "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8",
+ "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8",
+ "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30",
+ "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a",
+ "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8",
+ "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d",
+ "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc",
+ "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2",
+ "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab",
+ "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077",
+ "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e",
+ "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9",
+ "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9",
+ "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef",
+ "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1",
+ "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507",
+ "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528",
+ "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558",
+ "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b",
+ "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154",
+ "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724",
+ "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695",
+ "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9",
+ "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851",
+ "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805",
+ "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a",
+ "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5",
+ "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94",
+ "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c",
+ "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d",
+ "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef",
+ "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26",
+ "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2",
+ "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c",
+ "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0",
+ "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2",
+ "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4",
+ "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d",
+ "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2",
+ "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce",
+ "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34",
+ "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f",
+ "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d",
+ "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b",
+ "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07",
+ "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312",
+ "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057",
+ "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d",
+ "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af",
+ "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb",
+ "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd",
+ "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78",
+ "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b",
+ "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223",
+ "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a",
+ "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4",
+ "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5",
+ "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23",
+ "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a",
+ "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4",
+ "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8",
+ "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d",
+ "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443",
+ "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e",
+ "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f",
+ "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e",
+ "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d",
+ "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc",
+ "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443",
+ "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be",
+ "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2",
+ "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee",
+ "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f",
+ "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae",
+ "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864",
+ "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4",
+ "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951",
+ "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.18.4"
+ },
+ "pygments": {
+ "hashes": [
+ "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199",
+ "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.18.0"
+ },
+ "pyparsing": {
+ "hashes": [
+ "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad",
+ "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"
+ ],
+ "markers": "python_full_version >= '3.6.8'",
+ "version": "==3.1.2"
+ },
+ "python-dateutil": {
+ "hashes": [
+ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3",
+ "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==2.9.0.post0"
+ },
+ "python-dotenv": {
+ "hashes": [
+ "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca",
+ "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"
+ ],
+ "version": "==1.0.1"
+ },
+ "python-multipart": {
+ "hashes": [
+ "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026",
+ "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.0.9"
+ },
+ "pytz": {
+ "hashes": [
+ "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812",
+ "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"
+ ],
+ "version": "==2024.1"
+ },
+ "pyyaml": {
+ "hashes": [
+ "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",
+ "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc",
+ "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",
+ "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741",
+ "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206",
+ "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27",
+ "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595",
+ "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62",
+ "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98",
+ "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696",
+ "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290",
+ "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9",
+ "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d",
+ "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6",
+ "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867",
+ "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47",
+ "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",
+ "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",
+ "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3",
+ "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007",
+ "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938",
+ "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0",
+ "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c",
+ "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735",
+ "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d",
+ "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28",
+ "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4",
+ "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba",
+ "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",
+ "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef",
+ "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5",
+ "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd",
+ "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3",
+ "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",
+ "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515",
+ "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c",
+ "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",
+ "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924",
+ "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34",
+ "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",
+ "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",
+ "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673",
+ "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54",
+ "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a",
+ "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b",
+ "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab",
+ "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa",
+ "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c",
+ "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585",
+ "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d",
+ "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"
+ ],
+ "version": "==6.0.1"
+ },
+ "rich": {
+ "hashes": [
+ "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222",
+ "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432"
+ ],
+ "markers": "python_full_version >= '3.7.0'",
+ "version": "==13.7.1"
+ },
+ "scipy": {
+ "hashes": [
+ "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d",
+ "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c",
+ "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca",
+ "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9",
+ "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54",
+ "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16",
+ "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2",
+ "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5",
+ "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59",
+ "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326",
+ "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b",
+ "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1",
+ "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d",
+ "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24",
+ "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627",
+ "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c",
+ "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa",
+ "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949",
+ "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989",
+ "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004",
+ "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f",
+ "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884",
+ "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299",
+ "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94",
+ "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.9'",
+ "version": "==1.13.1"
+ },
+ "shapely": {
+ "hashes": [
+ "sha256:011b77153906030b795791f2fdfa2d68f1a8d7e40bce78b029782ade3afe4f2f",
+ "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0",
+ "sha256:05ffd6491e9e8958b742b0e2e7c346635033d0a5f1a0ea083547fcc854e5d5cf",
+ "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6",
+ "sha256:263bcf0c24d7a57c80991e64ab57cba7a3906e31d2e21b455f493d4aab534aaa",
+ "sha256:2fbdc1140a7d08faa748256438291394967aa54b40009f54e8d9825e75ef6113",
+ "sha256:30982f79f21bb0ff7d7d4a4e531e3fcaa39b778584c2ce81a147f95be1cd58c9",
+ "sha256:31c19a668b5a1eadab82ff070b5a260478ac6ddad3a5b62295095174a8d26398",
+ "sha256:3f9103abd1678cb1b5f7e8e1af565a652e036844166c91ec031eeb25c5ca8af0",
+ "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65",
+ "sha256:4310b5494271e18580d61022c0857eb85d30510d88606fa3b8314790df7f367d",
+ "sha256:464157509ce4efa5ff285c646a38b49f8c5ef8d4b340f722685b09bb033c5ccf",
+ "sha256:485246fcdb93336105c29a5cfbff8a226949db37b7473c89caa26c9bae52a242",
+ "sha256:489c19152ec1f0e5c5e525356bcbf7e532f311bff630c9b6bc2db6f04da6a8b9",
+ "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f",
+ "sha256:55a38dcd1cee2f298d8c2ebc60fc7d39f3b4535684a1e9e2f39a80ae88b0cea7",
+ "sha256:58b0ecc505bbe49a99551eea3f2e8a9b3b24b3edd2a4de1ac0dc17bc75c9ec07",
+ "sha256:5af4cd0d8cf2912bd95f33586600cac9c4b7c5053a036422b97cfe4728d2eb53",
+ "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328",
+ "sha256:5c4849916f71dc44e19ed370421518c0d86cf73b26e8656192fcfcda08218fbd",
+ "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8",
+ "sha256:63f3a80daf4f867bd80f5c97fbe03314348ac1b3b70fb1c0ad255a69e3749879",
+ "sha256:674d7baf0015a6037d5758496d550fc1946f34bfc89c1bf247cabdc415d7747e",
+ "sha256:6cd4ccecc5ea5abd06deeaab52fcdba372f649728050c6143cc405ee0c166679",
+ "sha256:790a168a808bd00ee42786b8ba883307c0e3684ebb292e0e20009588c426da47",
+ "sha256:7d56ce3e2a6a556b59a288771cf9d091470116867e578bebced8bfc4147fbfd7",
+ "sha256:841f93a0e31e4c64d62ea570d81c35de0f6cea224568b2430d832967536308e6",
+ "sha256:8de4578e838a9409b5b134a18ee820730e507b2d21700c14b71a2b0757396acc",
+ "sha256:92a41d936f7d6743f343be265ace93b7c57f5b231e21b9605716f5a47c2879e7",
+ "sha256:9831816a5d34d5170aa9ed32a64982c3d6f4332e7ecfe62dc97767e163cb0b17",
+ "sha256:994c244e004bc3cfbea96257b883c90a86e8cbd76e069718eb4c6b222a56f78b",
+ "sha256:9dab4c98acfb5fb85f5a20548b5c0abe9b163ad3525ee28822ffecb5c40e724c",
+ "sha256:b79bbd648664aa6f44ef018474ff958b6b296fed5c2d42db60078de3cffbc8aa",
+ "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30",
+ "sha256:c52ed79f683f721b69a10fb9e3d940a468203f5054927215586c5d49a072de8d",
+ "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac",
+ "sha256:d2b4431f522b277c79c34b65da128029a9955e4481462cbf7ebec23aab61fc58",
+ "sha256:ddf4a9bfaac643e62702ed662afc36f6abed2a88a21270e891038f9a19bc08fc",
+ "sha256:de0205cb21ad5ddaef607cda9a3191eadd1e7a62a756ea3a356369675230ac35",
+ "sha256:ec555c9d0db12d7fd777ba3f8b75044c73e576c720a851667432fabb7057da6c",
+ "sha256:fb5cdcbbe3080181498931b52a91a21a781a35dcb859da741c0345c6402bf00c"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.7'",
+ "version": "==2.0.4"
+ },
+ "shellingham": {
+ "hashes": [
+ "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686",
+ "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.5.4"
+ },
+ "six": {
+ "hashes": [
+ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
+ "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+ "version": "==1.16.0"
+ },
+ "sniffio": {
+ "hashes": [
+ "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
+ "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==1.3.1"
+ },
+ "soupsieve": {
+ "hashes": [
+ "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690",
+ "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==2.5"
+ },
+ "starlette": {
+ "hashes": [
+ "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee",
+ "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.37.2"
+ },
+ "typer": {
+ "hashes": [
+ "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914",
+ "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"
+ ],
+ "markers": "python_version >= '3.7'",
+ "version": "==0.12.3"
+ },
+ "typing-extensions": {
+ "hashes": [
+ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+ "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==4.12.2"
+ },
+ "tzdata": {
+ "hashes": [
+ "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd",
+ "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"
+ ],
+ "markers": "python_version >= '2'",
+ "version": "==2024.1"
+ },
+ "ujson": {
+ "hashes": [
+ "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e",
+ "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b",
+ "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6",
+ "sha256:232cc85f8ee3c454c115455195a205074a56ff42608fd6b942aa4c378ac14dd7",
+ "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9",
+ "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd",
+ "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569",
+ "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f",
+ "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51",
+ "sha256:2a890b706b64e0065f02577bf6d8ca3b66c11a5e81fb75d757233a38c07a1f20",
+ "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1",
+ "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf",
+ "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc",
+ "sha256:38d5d36b4aedfe81dfe251f76c0467399d575d1395a1755de391e58985ab1c2e",
+ "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a",
+ "sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539",
+ "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27",
+ "sha256:4c4fc16f11ac1612f05b6f5781b384716719547e142cfd67b65d035bd85af165",
+ "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126",
+ "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1",
+ "sha256:59e02cd37bc7c44d587a0ba45347cc815fb7a5fe48de16bf05caa5f7d0d2e816",
+ "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64",
+ "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8",
+ "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e",
+ "sha256:618efd84dc1acbd6bff8eaa736bb6c074bfa8b8a98f55b61c38d4ca2c1f7f287",
+ "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3",
+ "sha256:61e1591ed9376e5eddda202ec229eddc56c612b61ac6ad07f96b91460bb6c2fb",
+ "sha256:621e34b4632c740ecb491efc7f1fcb4f74b48ddb55e65221995e74e2d00bbff0",
+ "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043",
+ "sha256:67079b1f9fb29ed9a2914acf4ef6c02844b3153913eb735d4bf287ee1db6e557",
+ "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e",
+ "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21",
+ "sha256:7223f41e5bf1f919cd8d073e35b229295aa8e0f7b5de07ed1c8fddac63a6bc5d",
+ "sha256:73814cd1b9db6fc3270e9d8fe3b19f9f89e78ee9d71e8bd6c9a626aeaeaf16bd",
+ "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0",
+ "sha256:7663960f08cd5a2bb152f5ee3992e1af7690a64c0e26d31ba7b3ff5b2ee66337",
+ "sha256:78778a3aa7aafb11e7ddca4e29f46bc5139131037ad628cc10936764282d6753",
+ "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804",
+ "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f",
+ "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f",
+ "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5",
+ "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5",
+ "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1",
+ "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00",
+ "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2",
+ "sha256:a984a3131da7f07563057db1c3020b1350a3e27a8ec46ccbfbf21e5928a43050",
+ "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e",
+ "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4",
+ "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8",
+ "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996",
+ "sha256:b0111b27f2d5c820e7f2dbad7d48e3338c824e7ac4d2a12da3dc6061cc39c8e6",
+ "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1",
+ "sha256:b9500e61fce0cfc86168b248104e954fead61f9be213087153d272e817ec7b4f",
+ "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1",
+ "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4",
+ "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b",
+ "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88",
+ "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518",
+ "sha256:c66962ca7565605b355a9ed478292da628b8f18c0f2793021ca4425abf8b01e5",
+ "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770",
+ "sha256:cc6139531f13148055d691e442e4bc6601f6dba1e6d521b1585d4788ab0bfad4",
+ "sha256:d2c75269f8205b2690db4572a4a36fe47cd1338e4368bc73a7a0e48789e2e35a",
+ "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76",
+ "sha256:d4dc2fd6b3067c0782e7002ac3b38cf48608ee6366ff176bbd02cf969c9c20fe",
+ "sha256:d7d0e0ceeb8fe2468c70ec0c37b439dd554e2aa539a8a56365fd761edb418988",
+ "sha256:d8640fb4072d36b08e95a3a380ba65779d356b2fee8696afeb7794cf0902d0a1",
+ "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5",
+ "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b",
+ "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7",
+ "sha256:e7ce306a42b6b93ca47ac4a3b96683ca554f6d35dd8adc5acfcd55096c8dfcb8",
+ "sha256:e82d4bb2138ab05e18f089a83b6564fee28048771eb63cdecf4b9b549de8a2cc",
+ "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a",
+ "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720",
+ "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3",
+ "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b",
+ "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9",
+ "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1",
+ "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==5.10.0"
+ },
+ "uvicorn": {
+ "extras": [
+ "standard"
+ ],
+ "hashes": [
+ "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81",
+ "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==0.30.1"
+ },
+ "uvloop": {
+ "hashes": [
+ "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd",
+ "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec",
+ "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b",
+ "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc",
+ "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797",
+ "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5",
+ "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2",
+ "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d",
+ "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be",
+ "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd",
+ "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12",
+ "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17",
+ "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef",
+ "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24",
+ "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428",
+ "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1",
+ "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849",
+ "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593",
+ "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd",
+ "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67",
+ "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6",
+ "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3",
+ "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd",
+ "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8",
+ "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7",
+ "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533",
+ "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957",
+ "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650",
+ "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e",
+ "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7",
+ "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"
+ ],
+ "version": "==0.19.0"
+ },
+ "watchfiles": {
+ "hashes": [
+ "sha256:00095dd368f73f8f1c3a7982a9801190cc88a2f3582dd395b289294f8975172b",
+ "sha256:00ad0bcd399503a84cc688590cdffbe7a991691314dde5b57b3ed50a41319a31",
+ "sha256:00f39592cdd124b4ec5ed0b1edfae091567c72c7da1487ae645426d1b0ffcad1",
+ "sha256:030bc4e68d14bcad2294ff68c1ed87215fbd9a10d9dea74e7cfe8a17869785ab",
+ "sha256:052d668a167e9fc345c24203b104c313c86654dd6c0feb4b8a6dfc2462239249",
+ "sha256:067dea90c43bf837d41e72e546196e674f68c23702d3ef80e4e816937b0a3ffd",
+ "sha256:0b04a2cbc30e110303baa6d3ddce8ca3664bc3403be0f0ad513d1843a41c97d1",
+ "sha256:0bc3b2f93a140df6806c8467c7f51ed5e55a931b031b5c2d7ff6132292e803d6",
+ "sha256:0c8e0aa0e8cc2a43561e0184c0513e291ca891db13a269d8d47cb9841ced7c71",
+ "sha256:103622865599f8082f03af4214eaff90e2426edff5e8522c8f9e93dc17caee13",
+ "sha256:1235c11510ea557fe21be5d0e354bae2c655a8ee6519c94617fe63e05bca4171",
+ "sha256:1cc0cba54f47c660d9fa3218158b8963c517ed23bd9f45fe463f08262a4adae1",
+ "sha256:1d9188979a58a096b6f8090e816ccc3f255f137a009dd4bbec628e27696d67c1",
+ "sha256:213792c2cd3150b903e6e7884d40660e0bcec4465e00563a5fc03f30ea9c166c",
+ "sha256:25c817ff2a86bc3de3ed2df1703e3d24ce03479b27bb4527c57e722f8554d971",
+ "sha256:2627a91e8110b8de2406d8b2474427c86f5a62bf7d9ab3654f541f319ef22bcb",
+ "sha256:280a4afbc607cdfc9571b9904b03a478fc9f08bbeec382d648181c695648202f",
+ "sha256:28324d6b28bcb8d7c1041648d7b63be07a16db5510bea923fc80b91a2a6cbed6",
+ "sha256:28585744c931576e535860eaf3f2c0ec7deb68e3b9c5a85ca566d69d36d8dd27",
+ "sha256:28f393c1194b6eaadcdd8f941307fc9bbd7eb567995232c830f6aef38e8a6e88",
+ "sha256:2abeb79209630da981f8ebca30a2c84b4c3516a214451bfc5f106723c5f45843",
+ "sha256:2bdadf6b90c099ca079d468f976fd50062905d61fae183f769637cb0f68ba59a",
+ "sha256:2f350cbaa4bb812314af5dab0eb8d538481e2e2279472890864547f3fe2281ed",
+ "sha256:3218a6f908f6a276941422b035b511b6d0d8328edd89a53ae8c65be139073f84",
+ "sha256:3973145235a38f73c61474d56ad6199124e7488822f3a4fc97c72009751ae3b0",
+ "sha256:3a0d883351a34c01bd53cfa75cd0292e3f7e268bacf2f9e33af4ecede7e21d1d",
+ "sha256:425440e55cd735386ec7925f64d5dde392e69979d4c8459f6bb4e920210407f2",
+ "sha256:4b9f2a128a32a2c273d63eb1fdbf49ad64852fc38d15b34eaa3f7ca2f0d2b797",
+ "sha256:4cc382083afba7918e32d5ef12321421ef43d685b9a67cc452a6e6e18920890e",
+ "sha256:52fc9b0dbf54d43301a19b236b4a4614e610605f95e8c3f0f65c3a456ffd7d35",
+ "sha256:55b7cc10261c2786c41d9207193a85c1db1b725cf87936df40972aab466179b6",
+ "sha256:581f0a051ba7bafd03e17127735d92f4d286af941dacf94bcf823b101366249e",
+ "sha256:5834e1f8b71476a26df97d121c0c0ed3549d869124ed2433e02491553cb468c2",
+ "sha256:5e45fb0d70dda1623a7045bd00c9e036e6f1f6a85e4ef2c8ae602b1dfadf7550",
+ "sha256:61af9efa0733dc4ca462347becb82e8ef4945aba5135b1638bfc20fad64d4f0e",
+ "sha256:68fe0c4d22332d7ce53ad094622b27e67440dacefbaedd29e0794d26e247280c",
+ "sha256:72a44e9481afc7a5ee3291b09c419abab93b7e9c306c9ef9108cb76728ca58d2",
+ "sha256:7a74436c415843af2a769b36bf043b6ccbc0f8d784814ba3d42fc961cdb0a9dc",
+ "sha256:8597b6f9dc410bdafc8bb362dac1cbc9b4684a8310e16b1ff5eee8725d13dcd6",
+ "sha256:8c39987a1397a877217be1ac0fb1d8b9f662c6077b90ff3de2c05f235e6a8f96",
+ "sha256:8c3e3675e6e39dc59b8fe5c914a19d30029e36e9f99468dddffd432d8a7b1c93",
+ "sha256:8dc1fc25a1dedf2dd952909c8e5cb210791e5f2d9bc5e0e8ebc28dd42fed7562",
+ "sha256:8fdebb655bb1ba0122402352b0a4254812717a017d2dc49372a1d47e24073795",
+ "sha256:9165bcab15f2b6d90eedc5c20a7f8a03156b3773e5fb06a790b54ccecdb73385",
+ "sha256:94ebe84a035993bb7668f58a0ebf998174fb723a39e4ef9fce95baabb42b787f",
+ "sha256:9624a68b96c878c10437199d9a8b7d7e542feddda8d5ecff58fdc8e67b460848",
+ "sha256:96eec15e5ea7c0b6eb5bfffe990fc7c6bd833acf7e26704eb18387fb2f5fd087",
+ "sha256:97b94e14b88409c58cdf4a8eaf0e67dfd3ece7e9ce7140ea6ff48b0407a593ec",
+ "sha256:988e981aaab4f3955209e7e28c7794acdb690be1efa7f16f8ea5aba7ffdadacb",
+ "sha256:a8a31bfd98f846c3c284ba694c6365620b637debdd36e46e1859c897123aa232",
+ "sha256:a927b3034d0672f62fb2ef7ea3c9fc76d063c4b15ea852d1db2dc75fe2c09696",
+ "sha256:ace7d060432acde5532e26863e897ee684780337afb775107c0a90ae8dbccfd2",
+ "sha256:aec83c3ba24c723eac14225194b862af176d52292d271c98820199110e31141e",
+ "sha256:b44b70850f0073b5fcc0b31ede8b4e736860d70e2dbf55701e05d3227a154a67",
+ "sha256:b610fb5e27825b570554d01cec427b6620ce9bd21ff8ab775fc3a32f28bba63e",
+ "sha256:b810a2c7878cbdecca12feae2c2ae8af59bea016a78bc353c184fa1e09f76b68",
+ "sha256:bbf8a20266136507abf88b0df2328e6a9a7c7309e8daff124dda3803306a9fdb",
+ "sha256:bd4c06100bce70a20c4b81e599e5886cf504c9532951df65ad1133e508bf20be",
+ "sha256:c2444dc7cb9d8cc5ab88ebe792a8d75709d96eeef47f4c8fccb6df7c7bc5be71",
+ "sha256:c49b76a78c156979759d759339fb62eb0549515acfe4fd18bb151cc07366629c",
+ "sha256:c4a65474fd2b4c63e2c18ac67a0c6c66b82f4e73e2e4d940f837ed3d2fd9d4da",
+ "sha256:c5af2347d17ab0bd59366db8752d9e037982e259cacb2ba06f2c41c08af02c39",
+ "sha256:c668228833c5619f6618699a2c12be057711b0ea6396aeaece4ded94184304ea",
+ "sha256:c7b978c384e29d6c7372209cbf421d82286a807bbcdeb315427687f8371c340a",
+ "sha256:d048ad5d25b363ba1d19f92dcf29023988524bee6f9d952130b316c5802069cb",
+ "sha256:d3e1f3cf81f1f823e7874ae563457828e940d75573c8fbf0ee66818c8b6a9099",
+ "sha256:d47e9ef1a94cc7a536039e46738e17cce058ac1593b2eccdede8bf72e45f372a",
+ "sha256:da1e0a8caebf17976e2ffd00fa15f258e14749db5e014660f53114b676e68538",
+ "sha256:dc1b9b56f051209be458b87edb6856a449ad3f803315d87b2da4c93b43a6fe72",
+ "sha256:dc2e8fe41f3cac0660197d95216c42910c2b7e9c70d48e6d84e22f577d106fc1",
+ "sha256:dc92d2d2706d2b862ce0568b24987eba51e17e14b79a1abcd2edc39e48e743c8",
+ "sha256:dd64f3a4db121bc161644c9e10a9acdb836853155a108c2446db2f5ae1778c3d",
+ "sha256:e0f0a874231e2839abbf473256efffe577d6ee2e3bfa5b540479e892e47c172d",
+ "sha256:f7e1f9c5d1160d03b93fc4b68a0aeb82fe25563e12fbcdc8507f8434ab6f823c",
+ "sha256:fe82d13461418ca5e5a808a9e40f79c1879351fcaeddbede094028e74d836e86"
+ ],
+ "version": "==0.22.0"
+ },
+ "websockets": {
+ "hashes": [
+ "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b",
+ "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6",
+ "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df",
+ "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b",
+ "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205",
+ "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892",
+ "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53",
+ "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2",
+ "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed",
+ "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c",
+ "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd",
+ "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b",
+ "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931",
+ "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30",
+ "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370",
+ "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be",
+ "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec",
+ "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf",
+ "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62",
+ "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b",
+ "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402",
+ "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f",
+ "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123",
+ "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9",
+ "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603",
+ "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45",
+ "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558",
+ "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4",
+ "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438",
+ "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137",
+ "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480",
+ "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447",
+ "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8",
+ "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04",
+ "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c",
+ "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb",
+ "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967",
+ "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b",
+ "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d",
+ "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def",
+ "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c",
+ "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92",
+ "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2",
+ "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113",
+ "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b",
+ "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28",
+ "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7",
+ "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d",
+ "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f",
+ "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468",
+ "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8",
+ "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae",
+ "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611",
+ "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d",
+ "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9",
+ "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca",
+ "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f",
+ "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2",
+ "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077",
+ "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2",
+ "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6",
+ "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374",
+ "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc",
+ "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e",
+ "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53",
+ "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399",
+ "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547",
+ "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3",
+ "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870",
+ "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5",
+ "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8",
+ "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"
+ ],
+ "version": "==12.0"
+ },
+ "xarray": {
+ "hashes": [
+ "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7",
+ "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==2024.6.0"
+ }
+ },
+ "develop": {}
+}
diff --git a/backend/src/amenities/nature.am b/backend/src/amenities/nature.am
new file mode 100644
index 0000000..dcc4061
--- /dev/null
+++ b/backend/src/amenities/nature.am
@@ -0,0 +1,11 @@
+'leisure'='park'
+geological
+'natural'='geyser'
+'natural'='hot_spring'
+'natural'='arch'
+'natural'='volcano'
+'natural'='stone'
+'tourism'='alpine_hut'
+'tourism'='viewpoint'
+'tourism'='zoo'
+'waterway'='waterfall'
\ No newline at end of file
diff --git a/backend/src/amenities/shopping.am b/backend/src/amenities/shopping.am
new file mode 100644
index 0000000..14504a0
--- /dev/null
+++ b/backend/src/amenities/shopping.am
@@ -0,0 +1,2 @@
+'shop'='department_store'
+'shop'='mall'
\ No newline at end of file
diff --git a/backend/src/amenities/sightseeing.am b/backend/src/amenities/sightseeing.am
new file mode 100644
index 0000000..33bcb1a
--- /dev/null
+++ b/backend/src/amenities/sightseeing.am
@@ -0,0 +1,8 @@
+'tourism'='museum'
+'tourism'='attraction'
+'tourism'='gallery'
+historic
+'amenity'='planetarium'
+'amenity'='place_of_worship'
+'amenity'='fountain'
+'water'='reflecting_pool'
\ No newline at end of file
diff --git a/backend/src/landmarks_manager.py b/backend/src/landmarks_manager.py
new file mode 100644
index 0000000..618e169
--- /dev/null
+++ b/backend/src/landmarks_manager.py
@@ -0,0 +1,365 @@
+import math as m
+import json, os
+
+from typing import List, Tuple, Optional
+from OSMPythonTools.overpass import Overpass, overpassQueryBuilder
+
+from structs.landmarks import Landmark, LandmarkType
+from structs.preferences import Preferences, Preference
+
+
+SIGHTSEEING = LandmarkType(landmark_type='sightseeing')
+NATURE = LandmarkType(landmark_type='nature')
+SHOPPING = LandmarkType(landmark_type='shopping')
+
+
+# Include the json here
+# Create a list of all things to visit given some preferences and a city. Ready for the optimizer
+def generate_landmarks(preferences: Preferences, coordinates: Tuple[float, float]) :
+
+ l_sights, l_nature, l_shop = get_amenities()
+ L = []
+
+ # List for sightseeing
+ if preferences.sightseeing.score != 0 :
+ L1 = get_landmarks(l_sights, SIGHTSEEING, coordinates=coordinates)
+ correct_score(L1, preferences.sightseeing)
+ L += L1
+
+ # List for nature
+ if preferences.nature.score != 0 :
+ L2 = get_landmarks(l_nature, NATURE, coordinates=coordinates)
+ correct_score(L2, preferences.nature)
+ L += L2
+
+ # List for shopping
+ if preferences.shopping.score != 0 :
+ L3 = get_landmarks(l_shop, SHOPPING, coordinates=coordinates)
+ correct_score(L3, preferences.shopping)
+ L += L3
+
+ L = remove_duplicates(L)
+
+ return L, take_most_important(L)
+
+
+"""def generate_landmarks(preferences: Preferences, city_country: str = None, coordinates: Tuple[float, float] = None) -> Tuple[List[Landmark], List[Landmark]] :
+
+ l_sights, l_nature, l_shop = get_amenities()
+ L = []
+
+ # List for sightseeing
+ if preferences.sightseeing.score != 0 :
+ L1 = get_landmarks(l_sights, SIGHTSEEING, city_country=city_country, coordinates=coordinates)
+ correct_score(L1, preferences.sightseeing)
+ L += L1
+
+ # List for nature
+ if preferences.nature.score != 0 :
+ L2 = get_landmarks(l_nature, NATURE, city_country=city_country, coordinates=coordinates)
+ correct_score(L2, preferences.nature)
+ L += L2
+
+ # List for shopping
+ if preferences.shopping.score != 0 :
+ L3 = get_landmarks(l_shop, SHOPPING, city_country=city_country, coordinates=coordinates)
+ correct_score(L3, preferences.shopping)
+ L += L3
+
+ return remove_duplicates(L), take_most_important(L)
+"""
+# Helper function to gather the amenities list
+def get_amenities() -> List[List[str]] :
+
+ # Get the list of amenities from the files
+ sightseeing = get_list('/amenities/sightseeing.am')
+ nature = get_list('/amenities/nature.am')
+ shopping = get_list('/amenities/shopping.am')
+
+ return sightseeing, nature, shopping
+
+
+# Helper function to read a .am file and generate the corresponding list
+def get_list(path: str) -> List[str] :
+
+ with open(os.path.dirname(os.path.abspath(__file__)) + path) as f :
+ content = f.readlines()
+
+ amenities = []
+ for line in content :
+ amenities.append(line.strip('\n'))
+
+ return amenities
+
+
+# Take the most important landmarks from the list
+def take_most_important(L: List[Landmark], N = 0) -> List[Landmark] :
+
+ # Read the parameters from the file
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/landmarks_manager.params', "r") as f :
+ parameters = json.loads(f.read())
+ N_important = parameters['N important']
+
+ L_copy = []
+ L_clean = []
+ scores = [0]*len(L)
+ names = []
+ name_id = {}
+
+ for i, elem in enumerate(L) :
+ if elem.name not in names :
+ names.append(elem.name)
+ name_id[elem.name] = [i]
+ L_copy.append(elem)
+ else :
+ name_id[elem.name] += [i]
+ scores = []
+ for j in name_id[elem.name] :
+ scores.append(L[j].attractiveness)
+ best_id = max(range(len(scores)), key=scores.__getitem__)
+ t = name_id[elem.name][best_id]
+ if t == i :
+ for old in L_copy :
+ if old.name == elem.name :
+ old.attractiveness = L[t].attractiveness
+
+ scores = [0]*len(L_copy)
+ for i, elem in enumerate(L_copy) :
+ scores[i] = elem.attractiveness
+
+ res = sorted(range(len(scores)), key = lambda sub: scores[sub])[-(N_important-N):]
+
+ for i, elem in enumerate(L_copy) :
+ if i in res :
+ L_clean.append(elem)
+
+ return L_clean
+
+
+# Remove duplicate elements and elements with low score
+def remove_duplicates(L: List[Landmark]) -> List[Landmark] :
+ """
+ Removes duplicate landmarks based on their names from the given list.
+
+ Parameters:
+ L (List[Landmark]): A list of Landmark objects.
+
+ Returns:
+ List[Landmark]: A list of unique Landmark objects based on their names.
+ """
+
+ L_clean = []
+ names = []
+
+ for landmark in L :
+ if landmark.name in names:
+ continue
+
+
+ else :
+ names.append(landmark.name)
+ L_clean.append(landmark)
+
+ return L_clean
+
+
+# Correct the score of a list of landmarks by taking into account preference settings
+def correct_score(L: List[Landmark], preference: Preference) :
+
+ if len(L) == 0 :
+ return
+
+ if L[0].type != preference.type :
+ raise TypeError(f"LandmarkType {preference.type} does not match the type of Landmark {L[0].name}")
+
+ for elem in L :
+ elem.attractiveness = int(elem.attractiveness*preference.score/500) # arbitrary computation
+
+
+# Function to count elements within a certain radius of a location
+def count_elements_within_radius(coordinates: Tuple[float, float], radius: int) -> int:
+
+ lat = coordinates[0]
+ lon = coordinates[1]
+
+ alpha = (180*radius)/(6371000*m.pi)
+ bbox = {'latLower':lat-alpha,'lonLower':lon-alpha,'latHigher':lat+alpha,'lonHigher': lon+alpha}
+
+ # Build the query to find elements within the radius
+ radius_query = overpassQueryBuilder(bbox=[bbox['latLower'],bbox['lonLower'],bbox['latHigher'],bbox['lonHigher']],
+ elementType=['node', 'way', 'relation'])
+
+ try :
+ overpass = Overpass()
+ radius_result = overpass.query(radius_query)
+ return radius_result.countElements()
+
+ except :
+ return None
+
+
+# Creates a bounding box around given coordinates
+def create_bbox(coordinates: Tuple[float, float], side_length: int) -> Tuple[float, float, float, float]:
+
+ lat = coordinates[0]
+ lon = coordinates[1]
+
+ # Half the side length in km (since it's a square bbox)
+ half_side_length_km = side_length / 2.0
+
+ # Convert distance to degrees
+ lat_diff = half_side_length_km / 111 # 1 degree latitude is approximately 111 km
+ lon_diff = half_side_length_km / (111 * m.cos(m.radians(lat))) # Adjust for longitude based on latitude
+
+ # Calculate bbox
+ min_lat = lat - lat_diff
+ max_lat = lat + lat_diff
+ min_lon = lon - lon_diff
+ max_lon = lon + lon_diff
+
+ return min_lat, min_lon, max_lat, max_lon
+
+
+def get_landmarks(list_amenity: list, landmarktype: LandmarkType, coordinates: Tuple[float, float]) -> List[Landmark] :
+
+ # Read the parameters from the file
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/landmarks_manager.params', "r") as f :
+ parameters = json.loads(f.read())
+ tag_coeff = parameters['tag coeff']
+ park_coeff = parameters['park coeff']
+ church_coeff = parameters['church coeff']
+ radius = parameters['radius close to']
+ bbox_side = parameters['city bbox side']
+
+ # Create bbox around start location
+ bbox = create_bbox(coordinates, bbox_side)
+
+ # Initialize some variables
+ N = 0
+ L = []
+ overpass = Overpass()
+
+ for amenity in list_amenity :
+ query = overpassQueryBuilder(bbox=bbox, elementType=['way', 'relation'], selector=amenity, includeCenter=True, out='body')
+ result = overpass.query(query)
+ N += result.countElements()
+
+ for elem in result.elements():
+
+ name = elem.tag('name') # Add name
+ location = (elem.centerLat(), elem.centerLon()) # Add coordinates (lat, lon)
+
+ # skip if unprecise location
+ if name is None or location[0] is None:
+ continue
+
+ # skip if unused
+ if 'disused:leisure' in elem.tags().keys():
+ continue
+
+ # skip if part of another building
+ if 'building:part' in elem.tags().keys() and elem.tag('building:part') == 'yes':
+ continue
+
+ else :
+ osm_type = elem.type() # Add type : 'way' or 'relation'
+ osm_id = elem.id() # Add OSM id
+ elem_type = landmarktype # Add the landmark type as 'sightseeing
+ n_tags = len(elem.tags().keys()) # Add number of tags
+
+ # Add score of given landmark based on the number of surrounding elements. Penalty for churches as there are A LOT
+ if amenity == "'amenity'='place_of_worship'" :
+ score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*church_coeff)
+ elif amenity == "'leisure'='park'" :
+ score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*park_coeff)
+ else :
+ score = count_elements_within_radius(location, radius) + n_tags*tag_coeff
+
+ if score is not None :
+ # Generate the landmark and append it to the list
+ landmark = Landmark(name=name, type=elem_type, location=location, osm_type=osm_type, osm_id=osm_id, attractiveness=score, must_do=False, n_tags=n_tags)
+ L.append(landmark)
+
+ return L
+
+
+
+"""def get_landmarks(list_amenity: list, landmarktype: LandmarkType, city_country: str = None, coordinates: Tuple[float, float] = None) -> List[Landmark] :
+
+ if city_country is None and coordinates is None :
+ raise ValueError("Either one of 'city_country' and 'coordinates' arguments must be specified")
+
+ if city_country is not None and coordinates is not None :
+ raise ValueError("Cannot specify both 'city_country' and 'coordinates' at the same time, please choose either one")
+
+ # Read the parameters from the file
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/landmarks_manager.params', "r") as f :
+ parameters = json.loads(f.read())
+ tag_coeff = parameters['tag coeff']
+ park_coeff = parameters['park coeff']
+ church_coeff = parameters['church coeff']
+ radius = parameters['radius close to']
+ bbox_side = parameters['city bbox side']
+
+ # If city_country is specified :
+ if city_country is not None :
+ nominatim = Nominatim()
+ areaId = nominatim.query(city_country).areaId()
+ bbox = None
+
+ # If coordinates are specified :
+ elif coordinates is not None :
+ bbox = create_bbox(coordinates, bbox_side)
+ areaId = None
+
+ else :
+ raise ValueError("Argument number is not corresponding.")
+
+ # Initialize some variables
+ N = 0
+ L = []
+ overpass = Overpass()
+
+ for amenity in list_amenity :
+ query = overpassQueryBuilder(area=areaId, bbox=bbox, elementType=['way', 'relation'], selector=amenity, includeCenter=True, out='body')
+ result = overpass.query(query)
+ N += result.countElements()
+
+ for elem in result.elements():
+
+ name = elem.tag('name') # Add name
+ location = (elem.centerLat(), elem.centerLon()) # Add coordinates (lat, lon)
+
+ # skip if unprecise location
+ if name is None or location[0] is None:
+ continue
+
+ # skip if unused
+ if 'disused:leisure' in elem.tags().keys():
+ continue
+
+ # skip if part of another building
+ if 'building:part' in elem.tags().keys() and elem.tag('building:part') == 'yes':
+ continue
+
+ else :
+ osm_type = elem.type() # Add type : 'way' or 'relation'
+ osm_id = elem.id() # Add OSM id
+ elem_type = landmarktype # Add the landmark type as 'sightseeing
+ n_tags = len(elem.tags().keys()) # Add number of tags
+
+ # Add score of given landmark based on the number of surrounding elements. Penalty for churches as there are A LOT
+ if amenity == "'amenity'='place_of_worship'" :
+ score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*church_coeff)
+ elif amenity == "'leisure'='park'" :
+ score = int((count_elements_within_radius(location, radius) + n_tags*tag_coeff )*park_coeff)
+ else :
+ score = count_elements_within_radius(location, radius) + n_tags*tag_coeff
+
+ if score is not None :
+ # Generate the landmark and append it to the list
+ landmark = Landmark(name=name, type=elem_type, location=location, osm_type=osm_type, osm_id=osm_id, attractiveness=score, must_do=False, n_tags=n_tags)
+ L.append(landmark)
+
+ return L
+"""
\ No newline at end of file
diff --git a/backend/src/main.py b/backend/src/main.py
new file mode 100644
index 0000000..692c7f9
--- /dev/null
+++ b/backend/src/main.py
@@ -0,0 +1,70 @@
+from optimizer import solve_optimization
+from refiner import refine_optimization
+from landmarks_manager import generate_landmarks
+from structs.landmarks import Landmark
+from structs.landmarktype import LandmarkType
+from structs.preferences import Preferences, Preference
+from fastapi import FastAPI, Query, Body
+from typing import List
+
+app = FastAPI()
+
+
+# Assuming frontend is calling like this :
+#"http://127.0.0.1:8000/process?param1={param1}¶m2={param2}"
+@app.post("/optimizer_coords/{start_lat}/{start_lon}/{finish_lat}/{finish_lon}")
+def main1(start_lat: float, start_lon: float, preferences: Preferences = Body(...), finish_lat: float = None, finish_lon: float = None) -> List[Landmark]:
+
+ if preferences is None :
+ raise ValueError("Please provide preferences in the form of a 'Preference' BaseModel class.")
+ if bool(start_lat) ^ bool(start_lon) :
+ raise ValueError("Please provide both latitude and longitude for the starting point")
+ if bool(finish_lat) ^ bool(finish_lon) :
+ raise ValueError("Please provide both latitude and longitude for the finish point")
+
+ start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(start_lat, start_lon), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+
+ if bool(finish_lat) and bool(finish_lon) :
+ finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(finish_lat, finish_lon), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ else :
+ finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(start_lat, start_lon), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+
+
+ start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.8375946, 2.2949904), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.8375946, 2.2949904), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+
+ # Generate the landmarks from the start location
+ landmarks, landmarks_short = generate_landmarks(preferences=preferences, coordinates=start.location)
+
+ # insert start and finish to the landmarks list
+ landmarks_short.insert(0, start)
+ landmarks_short.append(finish)
+
+
+ # TODO use these parameters in another way
+ max_walking_time = 4 # hours
+ detour = 30 # minutes
+
+ # First stage optimization
+ base_tour = solve_optimization(landmarks_short, max_walking_time*60, True)
+
+ # Second stage optimization
+ refined_tour = refine_optimization(landmarks, base_tour, max_walking_time*60+detour, True)
+
+ return refined_tour
+
+
+
+# input city, country in the form of 'Paris, France'
+@app.post("/test2/{city_country}")
+def test2(city_country: str, preferences: Preferences = Body(...)) -> List[Landmark]:
+
+ landmarks = generate_landmarks(city_country, preferences)
+
+ max_steps = 9000000
+
+ visiting_order = solve_optimization(landmarks, max_steps, True)
+
+
+
+
diff --git a/backend/src/main_example.py b/backend/src/main_example.py
new file mode 100644
index 0000000..1a49305
--- /dev/null
+++ b/backend/src/main_example.py
@@ -0,0 +1,23 @@
+import fastapi
+from dataclasses import dataclass
+
+
+@dataclass
+class Destination:
+ name: str
+ location: tuple
+ attractiveness: int
+
+
+
+d = Destination()
+
+
+
+def get_route() -> list[Destination]:
+ return {"route": "Hello World"}
+
+endpoint = ("/get_route", get_route)
+end
+if __name__ == "__main__":
+ fastapi.run()
diff --git a/backend/src/optimizer.py b/backend/src/optimizer.py
new file mode 100644
index 0000000..d45d51b
--- /dev/null
+++ b/backend/src/optimizer.py
@@ -0,0 +1,411 @@
+import numpy as np
+import json, os
+
+from typing import List, Tuple
+from scipy.optimize import linprog
+from math import radians, sin, cos, acos
+from shapely import Polygon
+
+from structs.landmarks import Landmark
+
+
+# Function to print the result
+def print_res(L: List[Landmark], L_tot):
+
+ if len(L) == L_tot:
+ print('\nAll landmarks can be visited within max_steps, the following order is suggested : ')
+ else :
+ print('Could not visit all the landmarks, the following order is suggested : ')
+
+ dist = 0
+ for elem in L :
+ if elem.name != 'start' :
+ print('- ' + elem.name + ', time to reach = ' + str(elem.time_to_reach))
+ dist += elem.time_to_reach
+ else :
+ print('- ' + elem.name)
+
+ print("\nMinutes walked : " + str(dist))
+ print(f"Visited {len(L)-2} out of {L_tot-2} landmarks")
+
+
+# Prevent the use of a particular solution
+def prevent_config(resx, A_ub, b_ub) -> bool:
+
+ for i, elem in enumerate(resx):
+ resx[i] = round(elem)
+
+ N = len(resx) # Number of edges
+ L = int(np.sqrt(N)) # Number of landmarks
+
+ nonzeroind = np.nonzero(resx)[0] # the return is a little funky so I use the [0]
+ nonzero_tup = np.unravel_index(nonzeroind, (L,L))
+
+ ind_a = nonzero_tup[0].tolist()
+ vertices_visited = ind_a
+ vertices_visited.remove(0)
+
+ ones = [1]*L
+ h = [0]*N
+ for i in range(L) :
+ if i in vertices_visited :
+ h[i*L:i*L+L] = ones
+
+ A_ub = np.vstack((A_ub, h))
+ b_ub.append(len(vertices_visited)-1)
+
+ return A_ub, b_ub
+
+
+# Prevent the possibility of a given solution bit
+def break_cricle(circle_vertices: list, L: int, A_ub: list, b_ub: list) -> bool:
+
+ if L-1 in circle_vertices :
+ circle_vertices.remove(L-1)
+
+ h = [0]*L*L
+ for i in range(L) :
+ if i in circle_vertices :
+ h[i*L:i*L+L] = [1]*L
+
+ A_ub = np.vstack((A_ub, h))
+ b_ub.append(len(circle_vertices)-1)
+
+ return A_ub, b_ub
+
+
+# Checks if the path is connected, returns a circle if it finds one and the RESULT
+def is_connected(resx) -> bool:
+
+ # first round the results to have only 0-1 values
+ for i, elem in enumerate(resx):
+ resx[i] = round(elem)
+
+ N = len(resx) # length of res
+ L = int(np.sqrt(N)) # number of landmarks. CAST INTO INT but should not be a problem because N = L**2 by def.
+ n_edges = resx.sum() # number of edges
+
+ nonzeroind = np.nonzero(resx)[0] # the return is a little funny so I use the [0]
+
+ nonzero_tup = np.unravel_index(nonzeroind, (L,L))
+
+ ind_a = nonzero_tup[0].tolist()
+ ind_b = nonzero_tup[1].tolist()
+
+ edges = []
+ edges_visited = []
+ vertices_visited = []
+
+ edge1 = (ind_a[0], ind_b[0])
+ edges_visited.append(edge1)
+ vertices_visited.append(edge1[0])
+
+ for i, a in enumerate(ind_a) :
+ edges.append((a, ind_b[i])) # Create the list of edges
+
+ remaining = edges
+ remaining.remove(edge1)
+
+ break_flag = False
+ while len(remaining) > 0 and not break_flag:
+ for edge2 in remaining :
+ if edge2[0] == edge1[1] :
+ if edge1[1] in vertices_visited :
+ edges_visited.append(edge2)
+ break_flag = True
+ break
+ else :
+ vertices_visited.append(edge1[1])
+ edges_visited.append(edge2)
+ remaining.remove(edge2)
+ edge1 = edge2
+
+ elif edge1[1] == L-1 or edge1[1] in vertices_visited:
+ break_flag = True
+ break
+
+ vertices_visited.append(edge1[1])
+
+
+ if len(vertices_visited) == n_edges +1 :
+ return vertices_visited, []
+ else:
+ return vertices_visited, edges_visited
+
+
+# Function that returns the distance in meters from one location to another
+def get_distance(p1: Tuple[float, float], p2: Tuple[float, float], detour: float, speed: float) :
+
+ # Compute the straight-line distance in km
+ if p1 == p2 :
+ return 0, 0
+ else:
+ dist = 6371.01 * acos(sin(radians(p1[0]))*sin(radians(p2[0])) + cos(radians(p1[0]))*cos(radians(p2[0]))*cos(radians(p1[1]) - radians(p2[1])))
+
+ # Consider the detour factor for average cityto deterline walking distance (in km)
+ walk_dist = dist*detour
+
+ # Time to walk this distance (in minutes)
+ walk_time = walk_dist/speed*60
+
+ if walk_time > 15 :
+ walk_time = 5*round(walk_time/5)
+ else :
+ walk_time = round(walk_time)
+
+
+ return round(walk_dist, 1), walk_time
+
+
+# Initialize A and c. Compute the distances from all landmarks to each other and store attractiveness
+# We want to maximize the sightseeing : max(c) st. A*x < b and A_eq*x = b_eq
+def init_ub_dist(landmarks: List[Landmark], max_steps: int):
+
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f :
+ parameters = json.loads(f.read())
+ detour = parameters['detour factor']
+ speed = parameters['average walking speed']
+
+ # Objective function coefficients. a*x1 + b*x2 + c*x3 + ...
+ c = []
+ # Coefficients of inequality constraints (left-hand side)
+ A_ub = []
+
+ for spot1 in landmarks :
+ dist_table = [0]*len(landmarks)
+ c.append(-spot1.attractiveness)
+ for j, spot2 in enumerate(landmarks) :
+ t = get_distance(spot1.location, spot2.location, detour, speed)[1]
+ dist_table[j] = t
+ A_ub += dist_table
+ c = c*len(landmarks)
+
+ return c, A_ub, [max_steps]
+
+
+# Constraint to respect only one travel per landmark. Also caps the total number of visited landmarks
+def respect_number(L:int, A_ub, b_ub):
+
+ ones = [1]*L
+ zeros = [0]*L
+ for i in range(L) :
+ h = zeros*i + ones + zeros*(L-1-i)
+ A_ub = np.vstack((A_ub, h))
+ b_ub.append(1)
+
+ # Read the parameters from the file
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f :
+ parameters = json.loads(f.read())
+ max_landmarks = parameters['max landmarks']
+
+ A_ub = np.vstack((A_ub, ones*L))
+ b_ub.append(max_landmarks+1)
+
+ return A_ub, b_ub
+
+
+# Constraint to not have d14 and d41 simultaneously. Does not prevent circular symmetry with more elements
+def break_sym(L, A_ub, b_ub):
+ upper_ind = np.triu_indices(L,0,L)
+
+ up_ind_x = upper_ind[0]
+ up_ind_y = upper_ind[1]
+
+ for i, _ in enumerate(up_ind_x) :
+ l = [0]*L*L
+ if up_ind_x[i] != up_ind_y[i] :
+ l[up_ind_x[i]*L + up_ind_y[i]] = 1
+ l[up_ind_y[i]*L + up_ind_x[i]] = 1
+
+ A_ub = np.vstack((A_ub,l))
+ b_ub.append(1)
+
+ return A_ub, b_ub
+
+
+# Constraint to not stay in position. Removes d11, d22, d33, etc.
+def init_eq_not_stay(L: int):
+ l = [0]*L*L
+
+ for i in range(L) :
+ for j in range(L) :
+ if j == i :
+ l[j + i*L] = 1
+
+ l = np.array(np.array(l))
+
+ return [l], [0]
+
+
+# Go through the landmarks and force the optimizer to use landmarks where attractiveness is set to -1
+def respect_user_mustsee(landmarks: List[Landmark], A_eq: list, b_eq: list) :
+ L = len(landmarks)
+
+ for i, elem in enumerate(landmarks) :
+ if elem.must_do is True and elem.name not in ['finish', 'start']:
+ l = [0]*L*L
+ for j in range(L) : # sets the horizontal ones (go from)
+ l[j +i*L] = 1 # sets the vertical ones (go to) double check if good
+
+ for k in range(L-1) :
+ l[k*L+L-1] = 1
+
+ A_eq = np.vstack((A_eq,l))
+ b_eq.append(2)
+
+ return A_eq, b_eq
+
+
+# Constraint to ensure start at start and finish at goal
+def respect_start_finish(L: int, A_eq: list, b_eq: list):
+ ls = [1]*L + [0]*L*(L-1) # sets only horizontal ones for start (go from)
+ ljump = [0]*L*L
+ ljump[L-1] = 1 # Prevent start finish jump
+ lg = [0]*L*L
+ ll = [0]*L*(L-1) + [1]*L
+ for k in range(L-1) : # sets only vertical ones for goal (go to)
+ ll[k*L] = 1
+ if k != 0 : # Prevent the shortcut start -> finish
+ lg[k*L+L-1] = 1
+
+
+ A_eq = np.vstack((A_eq,ls))
+ A_eq = np.vstack((A_eq,ljump))
+ A_eq = np.vstack((A_eq,lg))
+ A_eq = np.vstack((A_eq,ll))
+ b_eq.append(1)
+ b_eq.append(0)
+ b_eq.append(1)
+ b_eq.append(0)
+
+ return A_eq, b_eq
+
+
+# Constraint to tie the problem together. Necessary but not sufficient to avoid circles
+def respect_order(N: int, A_eq, b_eq):
+ for i in range(N-1) : # Prevent stacked ones
+ if i == 0 or i == N-1: # Don't touch start or finish
+ continue
+ else :
+ l = [0]*N
+ l[i] = -1
+ l = l*N
+ for j in range(N) :
+ l[i*N + j] = 1
+
+ A_eq = np.vstack((A_eq,l))
+ b_eq.append(0)
+
+ return A_eq, b_eq
+
+
+# Computes the time to reach from each landmark to the next
+def add_time_to_reach(order: List[int], landmarks: List[Landmark])->List[Landmark] :
+
+ # Read the parameters from the file
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f :
+ parameters = json.loads(f.read())
+ detour_factor = parameters['detour factor']
+ speed = parameters['average walking speed']
+
+ j = 0
+ L = []
+ prev = landmarks[0]
+
+ while(len(L) != len(order)) :
+
+ elem = landmarks[order[j]]
+ if elem != prev :
+ elem.time_to_reach = get_distance(elem.location, prev.location, detour_factor, speed)[1]
+ elem.must_do = True
+ L.append(elem)
+ prev = elem
+ j += 1
+
+ return L
+
+
+def add_time_to_reach_simple(ordered_visit: List[Landmark])-> List[Landmark] :
+
+ # Read the parameters from the file
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f :
+ parameters = json.loads(f.read())
+ detour_factor = parameters['detour factor']
+ speed = parameters['average walking speed']
+
+ L = []
+ prev = ordered_visit[0]
+ L.append(prev)
+ total_dist = 0
+
+ for elem in ordered_visit[1:] :
+ elem.time_to_reach = get_distance(elem.location, prev.location, detour_factor, speed)[1]
+ elem.must_do = True
+ L.append(elem)
+ prev = elem
+ total_dist += get_distance(elem.location, prev.location, detour_factor, speed)[1]
+
+
+ return L, total_dist
+
+
+# Main optimization pipeline
+def solve_optimization (landmarks :List[Landmark], max_steps: int, printing_details: bool) :
+
+ L = len(landmarks)
+
+ # SET CONSTRAINTS FOR INEQUALITY
+ c, A_ub, b_ub = init_ub_dist(landmarks, max_steps) # Add the distances from each landmark to the other
+ A_ub, b_ub = respect_number(L, A_ub, b_ub) # Respect max number of visits (no more possible stops than landmarks).
+ A_ub, b_ub = break_sym(L, A_ub, b_ub) # break the 'zig-zag' symmetry
+
+ # SET CONSTRAINTS FOR EQUALITY
+ A_eq, b_eq = init_eq_not_stay(L) # Force solution not to stay in same place
+ A_eq, b_eq = respect_user_mustsee(landmarks, A_eq, b_eq) # Check if there are user_defined must_see. Also takes care of start/goal
+ A_eq, b_eq = respect_start_finish(L, A_eq, b_eq) # Force start and finish positions
+ A_eq, b_eq = respect_order(L, A_eq, b_eq) # Respect order of visit (only works when max_steps is limiting factor)
+
+ # SET BOUNDS FOR DECISION VARIABLE (x can only be 0 or 1)
+ x_bounds = [(0, 1)]*L*L
+
+ # Solve linear programming problem
+ res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq = b_eq, bounds=x_bounds, method='highs', integrality=3)
+
+ # Raise error if no solution is found
+ if not res.success :
+ raise ArithmeticError("No solution could be found, the problem is overconstrained. Please adapt your must_dos")
+
+ # If there is a solution, we're good to go, just check for connectiveness
+ else :
+ order, circle = is_connected(res.x)
+ i = 0
+ timeout = 80
+ while len(circle) != 0 and i < timeout:
+ A_ub, b_ub = prevent_config(res.x, A_ub, b_ub)
+ A_ub, b_ub = break_cricle(order, len(landmarks), A_ub, b_ub)
+ res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq = b_eq, bounds=x_bounds, method='highs', integrality=3)
+ order, circle = is_connected(res.x)
+ if len(circle) == 0 :
+ break
+ print(i)
+ i += 1
+
+ if i == timeout :
+ raise TimeoutError(f"Optimization took too long. No solution found after {timeout} iterations.")
+
+ # Add the times to reach and stop optimizing
+ L = add_time_to_reach(order, landmarks)
+
+ if printing_details is True :
+ if i != 0 :
+ print(f"Neded to recompute paths {i} times because of unconnected loops...")
+ print_res(L, len(landmarks))
+ print("\nTotal score : " + str(int(-res.fun)))
+
+ return L
+
+
+
+
+
+
diff --git a/backend/src/parameters/landmarks_manager.params b/backend/src/parameters/landmarks_manager.params
new file mode 100644
index 0000000..942c214
--- /dev/null
+++ b/backend/src/parameters/landmarks_manager.params
@@ -0,0 +1,8 @@
+{
+ "city bbox side" : 10,
+ "radius close to" : 27.5,
+ "church coeff" : 0.6,
+ "park coeff" : 1.5,
+ "tag coeff" : 100,
+ "N important" : 40
+}
\ No newline at end of file
diff --git a/backend/src/parameters/optimizer.params b/backend/src/parameters/optimizer.params
new file mode 100644
index 0000000..18ca240
--- /dev/null
+++ b/backend/src/parameters/optimizer.params
@@ -0,0 +1,5 @@
+{
+ "detour factor" : 1.4,
+ "average walking speed" : 4.8,
+ "max landmarks" : 10
+}
\ No newline at end of file
diff --git a/backend/src/refiner.py b/backend/src/refiner.py
new file mode 100644
index 0000000..dec6101
--- /dev/null
+++ b/backend/src/refiner.py
@@ -0,0 +1,293 @@
+from collections import defaultdict
+from heapq import heappop, heappush
+from itertools import permutations
+import os, json
+
+from shapely import buffer, LineString, Point, Polygon, MultiPoint, convex_hull, concave_hull, LinearRing
+from typing import List, Tuple
+from math import pi
+
+from structs.landmarks import Landmark
+from landmarks_manager import take_most_important
+from optimizer import solve_optimization, add_time_to_reach_simple, print_res, get_distance
+
+
+def create_corridor(landmarks: List[Landmark], width: float) :
+
+ corrected_width = (180*width)/(6371000*pi)
+
+ path = create_linestring(landmarks)
+ obj = buffer(path, corrected_width, join_style="mitre", cap_style="square", mitre_limit=2)
+
+ return obj
+
+
+def create_linestring(landmarks: List[Landmark])->List[Point] :
+
+ points = []
+
+ for landmark in landmarks :
+ points.append(Point(landmark.location))
+
+ return LineString(points)
+
+
+def is_in_area(area: Polygon, coordinates) -> bool :
+ point = Point(coordinates)
+ return point.within(area)
+
+
+def is_close_to(location1: Tuple[float], location2: Tuple[float]):
+ """Determine if two locations are close by rounding their coordinates to 3 decimals."""
+ absx = abs(location1[0] - location2[0])
+ absy = abs(location1[1] - location2[1])
+
+ return absx < 0.001 and absy < 0.001
+ #return (round(location1[0], 3), round(location1[1], 3)) == (round(location2[0], 3), round(location2[1], 3))
+
+
+def rearrange(landmarks: List[Landmark]) -> List[Landmark]:
+
+ i = 1
+ while i < len(landmarks):
+ j = i+1
+ while j < len(landmarks):
+ if is_close_to(landmarks[i].location, landmarks[j].location) and landmarks[i].name not in ['start', 'finish'] and landmarks[j].name not in ['start', 'finish']:
+ # If they are not adjacent, move the j-th element to be adjacent to the i-th element
+ if j != i + 1:
+ landmarks.insert(i + 1, landmarks.pop(j))
+ break # Move to the next i-th element after rearrangement
+ j += 1
+ i += 1
+
+ return landmarks
+
+"""
+def find_shortest_path(landmarks: List[Landmark]) -> List[Landmark]:
+
+ # Read from data
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f :
+ parameters = json.loads(f.read())
+ detour = parameters['detour factor']
+ speed = parameters['average walking speed']
+
+ # Step 1: Build the graph
+ graph = defaultdict(list)
+ for i in range(len(landmarks)):
+ for j in range(len(landmarks)):
+ if i != j:
+ distance = get_distance(landmarks[i].location, landmarks[j].location, detour, speed)[1]
+ graph[i].append((distance, j))
+
+ # Step 2: Dijkstra's algorithm to find the shortest path from start to finish
+ start_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'start')
+ finish_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'finish')
+
+ distances = {i: float('inf') for i in range(len(landmarks))}
+ previous_nodes = {i: None for i in range(len(landmarks))}
+ distances[start_idx] = 0
+ priority_queue = [(0, start_idx)]
+
+ while priority_queue:
+ current_distance, current_index = heappop(priority_queue)
+
+ if current_distance > distances[current_index]:
+ continue
+
+ for neighbor_distance, neighbor_index in graph[current_index]:
+ distance = current_distance + neighbor_distance
+
+ if distance < distances[neighbor_index]:
+ distances[neighbor_index] = distance
+ previous_nodes[neighbor_index] = current_index
+ heappush(priority_queue, (distance, neighbor_index))
+
+ # Step 3: Backtrack from finish to start to find the path
+ path = []
+ current_index = finish_idx
+ while current_index is not None:
+ path.append(landmarks[current_index])
+ current_index = previous_nodes[current_index]
+ path.reverse()
+
+ return path
+"""
+"""
+def total_path_distance(path: List[Landmark], detour, speed) -> float:
+ total_distance = 0
+ for i in range(len(path) - 1):
+ total_distance += get_distance(path[i].location, path[i + 1].location, detour, speed)[1]
+ return total_distance
+"""
+
+
+def find_shortest_path_through_all_landmarks(landmarks: List[Landmark]) -> List[Landmark]:
+
+ # Read from data
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f :
+ parameters = json.loads(f.read())
+ detour = parameters['detour factor']
+ speed = parameters['average walking speed']
+
+ # Step 1: Find 'start' and 'finish' landmarks
+ start_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'start')
+ finish_idx = next(i for i, lm in enumerate(landmarks) if lm.name == 'finish')
+
+ start_landmark = landmarks[start_idx]
+ finish_landmark = landmarks[finish_idx]
+
+
+ # Step 2: Create a list of unvisited landmarks excluding 'start' and 'finish'
+ unvisited_landmarks = [lm for i, lm in enumerate(landmarks) if i not in [start_idx, finish_idx]]
+
+ # Step 3: Initialize the path with the 'start' landmark
+ path = [start_landmark]
+ coordinates = [landmarks[start_idx].location]
+
+ current_landmark = start_landmark
+
+ # Step 4: Use nearest neighbor heuristic to visit all landmarks
+ while unvisited_landmarks:
+ nearest_landmark = min(unvisited_landmarks, key=lambda lm: get_distance(current_landmark.location, lm.location, detour, speed)[1])
+ path.append(nearest_landmark)
+ coordinates.append(nearest_landmark.location)
+ current_landmark = nearest_landmark
+ unvisited_landmarks.remove(nearest_landmark)
+
+ # Step 5: Finally add the 'finish' landmark to the path
+ path.append(finish_landmark)
+ coordinates.append(landmarks[finish_idx].location)
+
+ path_poly = Polygon(coordinates)
+
+ return path, path_poly
+
+def get_minor_landmarks(all_landmarks: List[Landmark], visited_landmarks: List[Landmark], width: float) -> List[Landmark] :
+
+ second_order_landmarks = []
+ visited_names = []
+ area = create_corridor(visited_landmarks, width)
+
+ for visited in visited_landmarks :
+ visited_names.append(visited.name)
+
+ for landmark in all_landmarks :
+ if is_in_area(area, landmark.location) and landmark.name not in visited_names:
+ second_order_landmarks.append(landmark)
+
+ return take_most_important(second_order_landmarks, len(visited_landmarks))
+
+
+
+"""def refine_optimization(landmarks: List[Landmark], base_tour: List[Landmark], max_time: int, print_infos: bool) -> List[Landmark] :
+
+ minor_landmarks = get_minor_landmarks(landmarks, base_tour, 200)
+
+ if print_infos : print("There are " + str(len(minor_landmarks)) + " minor landmarks around the predicted path")
+
+ full_set = base_tour[:-1] + minor_landmarks # create full set of possible landmarks (without finish)
+ full_set.append(base_tour[-1]) # add finish back
+
+ new_tour = solve_optimization(full_set, max_time, print_infos)
+
+ return new_tour"""
+
+
+def refine_optimization(landmarks: List[Landmark], base_tour: List[Landmark], max_time: int, print_infos: bool) -> List[Landmark] :
+
+ # Read from the file
+ with open (os.path.dirname(os.path.abspath(__file__)) + '/parameters/optimizer.params', "r") as f :
+ parameters = json.loads(f.read())
+ max_landmarks = parameters['max landmarks']
+
+ if len(base_tour)-2 >= max_landmarks :
+ return base_tour
+
+
+ minor_landmarks = get_minor_landmarks(landmarks, base_tour, 200)
+
+ if print_infos : print("Using " + str(len(minor_landmarks)) + " minor landmarks around the predicted path")
+
+ # full set of visitable landmarks
+ full_set = base_tour[:-1] + minor_landmarks # create full set of possible landmarks (without finish)
+ full_set.append(base_tour[-1]) # add finish back
+
+ # get a new tour
+ new_tour = solve_optimization(full_set, max_time, False)
+ new_tour, new_dist = add_time_to_reach_simple(new_tour)
+
+ """#if base_tour[0].location == base_tour[-1].location :
+ if False :
+ coords = [] # Coordinates of the new tour
+ coords_dict = {} # maps the location of an element to the element itself. Used to access the elements back once we get the geometry
+
+ # Iterate through the new tour without finish
+ for elem in new_tour[:-1] :
+ coords.append(Point(elem.location))
+ coords_dict[elem.location] = elem # if start = goal, only finish remains
+
+ # Create a concave polygon using the coordinates
+ better_tour_poly = concave_hull(MultiPoint(coords)) # Create concave hull with "core" of tour leaving out start and finish
+ xs, ys = better_tour_poly.exterior.xy
+
+ # reverse the xs and ys
+ xs.reverse()
+ ys.reverse()
+
+ better_tour = [] # List of ordered visit
+ name_index = {} # Maps the name of a landmark to its index in the concave polygon
+
+ # Loop through the polygon and generate the better (ordered) tour
+ for i,x in enumerate(xs[:-1]) :
+ better_tour.append(coords_dict[tuple((x,ys[i]))])
+ name_index[coords_dict[tuple((x,ys[i]))].name] = i
+
+
+ # Scroll the list to have start in front again
+ start_index = name_index['start']
+ better_tour = better_tour[start_index:] + better_tour[:start_index]
+
+ # Append the finish back and correct the time to reach
+ better_tour.append(new_tour[-1])
+
+ # Rearrange only if polygon
+ better_tour = rearrange(better_tour)
+
+ # Add the time to reach
+ better_tour = add_time_to_reach_simple(better_tour)
+ """
+
+
+ """
+ if not better_poly.is_simple :
+
+ coords_dict = {}
+ better_tour2 = []
+ for elem in better_tour :
+ coords_dict[elem.location] = elem
+
+ better_poly2 = better_poly.buffer(0)
+ new_coords = better_poly2.exterior.coords[:]
+ start_coords = base_tour[0].location
+ start_index = new_coords.
+
+ #for point in new_coords :
+ """
+
+
+ better_tour, better_poly = find_shortest_path_through_all_landmarks(new_tour)
+ better_tour, better_dist = add_time_to_reach_simple(better_tour)
+
+ if new_dist < better_dist :
+ final_tour = new_tour
+ else :
+ final_tour = better_tour
+
+ if print_infos :
+ print("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n")
+ print("\nRefined tour (result of second stage optimization): ")
+ print_res(final_tour, len(full_set))
+
+
+
+ return final_tour
diff --git a/backend/src/structs/__init__.py b/backend/src/structs/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/backend/src/structs/landmarks.py b/backend/src/structs/landmarks.py
new file mode 100644
index 0000000..94209f3
--- /dev/null
+++ b/backend/src/structs/landmarks.py
@@ -0,0 +1,20 @@
+from typing import Optional
+from pydantic import BaseModel
+
+from .landmarktype import LandmarkType
+
+
+
+# Output to frontend
+class Landmark(BaseModel) :
+ name : str
+ type: LandmarkType # De facto mapping depending on how the query was executed with overpass. Should still EXACTLY correspond to the preferences
+ location : tuple
+ osm_type : str
+ osm_id : int
+ attractiveness : int
+ must_do : bool
+ n_tags : int
+ time_to_reach : Optional[int] = 0
+
+
diff --git a/backend/src/structs/landmarktype.py b/backend/src/structs/landmarktype.py
new file mode 100644
index 0000000..8a63a1b
--- /dev/null
+++ b/backend/src/structs/landmarktype.py
@@ -0,0 +1,4 @@
+from pydantic import BaseModel
+
+class LandmarkType(BaseModel):
+ landmark_type: str
\ No newline at end of file
diff --git a/backend/src/structs/preferences.py b/backend/src/structs/preferences.py
new file mode 100644
index 0000000..500ebec
--- /dev/null
+++ b/backend/src/structs/preferences.py
@@ -0,0 +1,28 @@
+from pydantic import BaseModel
+from .landmarktype import LandmarkType
+
+class Preference(BaseModel) :
+ name: str
+ type: LandmarkType # should match the attributes of the Preferences class
+ score: int # score could be from 1 to 5
+
+# Input for optimization
+class Preferences(BaseModel) :
+ # Sightseeing / History & Culture (Musées, bâtiments historiques, opéras, églises)
+ sightseeing : Preference
+
+ # Nature (parcs, jardins, rivières, plages)
+ nature: Preference
+
+ # Shopping (diriger plutôt vers des zones / rues commerçantes)
+ shopping : Preference
+
+""" # Food (price low or high. Combien on veut dépenser pour manger à midi/soir)
+ food_budget : Preference
+
+ # Tolérance au détour (ce qui détermine (+ ou -) le chemin emprunté)
+ detour_tol : Preference"""
+
+
+
+
diff --git a/backend/src/tester.py b/backend/src/tester.py
new file mode 100644
index 0000000..758e003
--- /dev/null
+++ b/backend/src/tester.py
@@ -0,0 +1,116 @@
+import pandas as pd
+
+from typing import List
+from landmarks_manager import generate_landmarks
+from fastapi.encoders import jsonable_encoder
+
+from optimizer import solve_optimization
+from refiner import refine_optimization
+from structs.landmarks import Landmark
+from structs.landmarktype import LandmarkType
+from structs.preferences import Preferences, Preference
+
+
+# Helper function to create a .txt file with results
+def write_data(L: List[Landmark], file_name: str):
+
+ data = pd.DataFrame()
+ i = 0
+
+ for landmark in L :
+ data[i] = jsonable_encoder(landmark)
+ i += 1
+
+ data.to_json(file_name, indent = 2, force_ascii=False)
+
+def test3(city_country: str) -> List[Landmark]:
+
+
+ preferences = Preferences(
+ sightseeing=Preference(
+ name='sightseeing',
+ type=LandmarkType(landmark_type='sightseeing'),
+ score = 5),
+ nature=Preference(
+ name='nature',
+ type=LandmarkType(landmark_type='nature'),
+ score = 0),
+ shopping=Preference(
+ name='shopping',
+ type=LandmarkType(landmark_type='shopping'),
+ score = 5))
+
+ coordinates = None
+
+ landmarks, landmarks_short = generate_landmarks(preferences=preferences, city_country=city_country, coordinates=coordinates)
+
+ #write_data(landmarks)
+
+ start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.2044576, 16.3870242), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.2044576, 16.3870242), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+
+
+ test = landmarks_short
+
+ test.insert(0, start)
+ test.append(finish)
+
+ max_walking_time = 2 # hours
+
+ visiting_list = solve_optimization(test, max_walking_time*60, True)
+
+
+
+
+
+def test4(coordinates: tuple[float, float]) -> List[Landmark]:
+
+
+ preferences = Preferences(
+ sightseeing=Preference(
+ name='sightseeing',
+ type=LandmarkType(landmark_type='sightseeing'),
+ score = 5),
+ nature=Preference(
+ name='nature',
+ type=LandmarkType(landmark_type='nature'),
+ score = 5),
+ shopping=Preference(
+ name='shopping',
+ type=LandmarkType(landmark_type='shopping'),
+ score = 5))
+
+
+ # Create start and finish
+ start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=coordinates, osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=coordinates, osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ #finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.8777055, 2.3640967), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ #start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.847132, 2.312359), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ #finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.843185, 2.344533), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+ #finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.847132, 2.312359), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
+
+ # Generate the landmarks from the start location
+ landmarks, landmarks_short = generate_landmarks(preferences=preferences, coordinates=start.location)
+ #write_data(landmarks, "landmarks.txt")
+
+ # Insert start and finish to the landmarks list
+ landmarks_short.insert(0, start)
+ landmarks_short.append(finish)
+
+ # TODO use these parameters in another way
+ max_walking_time = 2 # hours
+ detour = 30 # minutes
+
+ # First stage optimization
+ base_tour = solve_optimization(landmarks_short, max_walking_time*60, True)
+
+ # Second stage optimization
+ refined_tour = refine_optimization(landmarks, base_tour, max_walking_time*60+detour, True)
+
+ return refined_tour
+
+
+#test4(tuple((48.8344400, 2.3220540))) # Café Chez César
+#test4(tuple((48.8375946, 2.2949904))) # Point random
+test4(tuple((47.377859, 8.540585))) # Zurich HB
+#test3('Vienna, Austria')
\ No newline at end of file
diff --git a/deployment/kustomization.yaml b/deployment/kustomization.yaml
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000..29a3a50
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,43 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/.metadata b/frontend/.metadata
similarity index 100%
rename from .metadata
rename to frontend/.metadata
diff --git a/analysis_options.yaml b/frontend/analysis_options.yaml
similarity index 100%
rename from analysis_options.yaml
rename to frontend/analysis_options.yaml
diff --git a/android/.gitignore b/frontend/android/.gitignore
similarity index 100%
rename from android/.gitignore
rename to frontend/android/.gitignore
diff --git a/android/app/build.gradle b/frontend/android/app/build.gradle
similarity index 92%
rename from android/app/build.gradle
rename to frontend/android/app/build.gradle
index 21a5169..f6b499e 100644
--- a/android/app/build.gradle
+++ b/frontend/android/app/build.gradle
@@ -45,6 +45,9 @@ android {
applicationId "com.example.fast_network_navigation"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
+ // Minimum Android version for Google Maps SDK
+ // https://developers.google.com/maps/flutter-package/config#android
+ minSdk = 21
minSdkVersion flutter.minSdkVersion
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
diff --git a/android/app/src/debug/AndroidManifest.xml b/frontend/android/app/src/debug/AndroidManifest.xml
similarity index 100%
rename from android/app/src/debug/AndroidManifest.xml
rename to frontend/android/app/src/debug/AndroidManifest.xml
diff --git a/android/app/src/main/AndroidManifest.xml b/frontend/android/app/src/main/AndroidManifest.xml
similarity index 86%
rename from android/app/src/main/AndroidManifest.xml
rename to frontend/android/app/src/main/AndroidManifest.xml
index fc057fe..f144d58 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/frontend/android/app/src/main/AndroidManifest.xml
@@ -28,7 +28,14 @@
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
+ android:value="2"
+ />
+
+
+
+
diff --git a/android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt b/frontend/android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt
similarity index 100%
rename from android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt
rename to frontend/android/app/src/main/kotlin/com/example/fast_network_navigation/MainActivity.kt
diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/frontend/android/app/src/main/res/drawable-v21/launch_background.xml
similarity index 100%
rename from android/app/src/main/res/drawable-v21/launch_background.xml
rename to frontend/android/app/src/main/res/drawable-v21/launch_background.xml
diff --git a/android/app/src/main/res/drawable/launch_background.xml b/frontend/android/app/src/main/res/drawable/launch_background.xml
similarity index 100%
rename from android/app/src/main/res/drawable/launch_background.xml
rename to frontend/android/app/src/main/res/drawable/launch_background.xml
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from android/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from android/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/android/app/src/main/res/values-night/styles.xml b/frontend/android/app/src/main/res/values-night/styles.xml
similarity index 100%
rename from android/app/src/main/res/values-night/styles.xml
rename to frontend/android/app/src/main/res/values-night/styles.xml
diff --git a/android/app/src/main/res/values/styles.xml b/frontend/android/app/src/main/res/values/styles.xml
similarity index 100%
rename from android/app/src/main/res/values/styles.xml
rename to frontend/android/app/src/main/res/values/styles.xml
diff --git a/android/app/src/profile/AndroidManifest.xml b/frontend/android/app/src/profile/AndroidManifest.xml
similarity index 100%
rename from android/app/src/profile/AndroidManifest.xml
rename to frontend/android/app/src/profile/AndroidManifest.xml
diff --git a/android/build.gradle b/frontend/android/build.gradle
similarity index 100%
rename from android/build.gradle
rename to frontend/android/build.gradle
diff --git a/android/gradle.properties b/frontend/android/gradle.properties
similarity index 100%
rename from android/gradle.properties
rename to frontend/android/gradle.properties
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/frontend/android/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from android/gradle/wrapper/gradle-wrapper.properties
rename to frontend/android/gradle/wrapper/gradle-wrapper.properties
diff --git a/android/settings.gradle b/frontend/android/settings.gradle
similarity index 100%
rename from android/settings.gradle
rename to frontend/android/settings.gradle
diff --git a/ios/.gitignore b/frontend/ios/.gitignore
similarity index 100%
rename from ios/.gitignore
rename to frontend/ios/.gitignore
diff --git a/ios/Flutter/AppFrameworkInfo.plist b/frontend/ios/Flutter/AppFrameworkInfo.plist
similarity index 100%
rename from ios/Flutter/AppFrameworkInfo.plist
rename to frontend/ios/Flutter/AppFrameworkInfo.plist
diff --git a/ios/Flutter/Debug.xcconfig b/frontend/ios/Flutter/Debug.xcconfig
similarity index 100%
rename from ios/Flutter/Debug.xcconfig
rename to frontend/ios/Flutter/Debug.xcconfig
diff --git a/ios/Flutter/Release.xcconfig b/frontend/ios/Flutter/Release.xcconfig
similarity index 100%
rename from ios/Flutter/Release.xcconfig
rename to frontend/ios/Flutter/Release.xcconfig
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/frontend/ios/Runner.xcodeproj/project.pbxproj
similarity index 100%
rename from ios/Runner.xcodeproj/project.pbxproj
rename to frontend/ios/Runner.xcodeproj/project.pbxproj
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
rename to frontend/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
similarity index 100%
rename from ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
rename to frontend/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
similarity index 100%
rename from ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
rename to frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/frontend/ios/Runner.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from ios/Runner.xcworkspace/contents.xcworkspacedata
rename to frontend/ios/Runner.xcworkspace/contents.xcworkspacedata
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to frontend/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
similarity index 100%
rename from ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
rename to frontend/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/ios/Runner/AppDelegate.swift b/frontend/ios/Runner/AppDelegate.swift
similarity index 100%
rename from ios/Runner/AppDelegate.swift
rename to frontend/ios/Runner/AppDelegate.swift
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
rename to frontend/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
similarity index 100%
rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
similarity index 100%
rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
similarity index 100%
rename from ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
rename to frontend/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard
similarity index 100%
rename from ios/Runner/Base.lproj/LaunchScreen.storyboard
rename to frontend/ios/Runner/Base.lproj/LaunchScreen.storyboard
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/frontend/ios/Runner/Base.lproj/Main.storyboard
similarity index 100%
rename from ios/Runner/Base.lproj/Main.storyboard
rename to frontend/ios/Runner/Base.lproj/Main.storyboard
diff --git a/ios/Runner/Info.plist b/frontend/ios/Runner/Info.plist
similarity index 100%
rename from ios/Runner/Info.plist
rename to frontend/ios/Runner/Info.plist
diff --git a/ios/Runner/Runner-Bridging-Header.h b/frontend/ios/Runner/Runner-Bridging-Header.h
similarity index 100%
rename from ios/Runner/Runner-Bridging-Header.h
rename to frontend/ios/Runner/Runner-Bridging-Header.h
diff --git a/ios/RunnerTests/RunnerTests.swift b/frontend/ios/RunnerTests/RunnerTests.swift
similarity index 100%
rename from ios/RunnerTests/RunnerTests.swift
rename to frontend/ios/RunnerTests/RunnerTests.swift
diff --git a/lib/modules/scaffold.dart b/frontend/lib/layout.dart
similarity index 92%
rename from lib/modules/scaffold.dart
rename to frontend/lib/layout.dart
index 34c603c..875ccbc 100644
--- a/lib/modules/scaffold.dart
+++ b/frontend/lib/layout.dart
@@ -4,9 +4,10 @@ import 'package:fast_network_navigation/modules/overview.dart';
import 'package:fast_network_navigation/modules/profile.dart';
+// BasePage is the scaffold that holds all other pages
+// A side drawer is used to switch between pages
class BasePage extends StatefulWidget {
const BasePage({super.key, required this.title});
-
final String title;
@override
@@ -22,7 +23,7 @@ class _BasePageState extends State {
});
}
- Widget currentView = MapPage();
+ Widget currentView = NavigationOverview();
@override
Widget build(BuildContext context) {
final ThemeData theme = Theme.of(context);
@@ -51,7 +52,7 @@ class _BasePageState extends State {
// Update the state of the app
_onItemTapped(0);
// Then close the drawer
- currentView = MapPage();
+ currentView = NavigationOverview();
Navigator.pop(context);
},
),
@@ -87,3 +88,4 @@ class _BasePageState extends State {
);
}
}
+
diff --git a/lib/main.dart b/frontend/lib/main.dart
similarity index 86%
rename from lib/main.dart
rename to frontend/lib/main.dart
index 424c0d5..d818628 100644
--- a/lib/main.dart
+++ b/frontend/lib/main.dart
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
-import 'package:fast_network_navigation/modules/scaffold.dart';
+import 'package:fast_network_navigation/layout.dart';
void main() => runApp(const App());
diff --git a/frontend/lib/modules/destination_card.dart b/frontend/lib/modules/destination_card.dart
new file mode 100644
index 0000000..5829c5e
--- /dev/null
+++ b/frontend/lib/modules/destination_card.dart
@@ -0,0 +1,40 @@
+
+
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+
+
+class DestinationCard extends StatefulWidget {
+ final String title;
+ final String description;
+ final String image;
+ bool visited;
+
+ @override
+ _DestinationCardState createState() => _DestinationCardState();
+
+
+ DestinationCard(this.title, this.description, this.image, this.visited);
+
+ Widget build() {
+ return Card(
+ child: ListTile(
+ leading: Icon(Icons.location_on),
+ title: Text(title),
+ subtitle: Text(description),
+ onTap: () {
+ // Navigator.pushNamed(context, '/destination');
+ },
+ ),
+ );
+ }
+
+}
+
+class _DestinationCardState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Card();
+ }
+
+}
\ No newline at end of file
diff --git a/frontend/lib/modules/map.dart b/frontend/lib/modules/map.dart
new file mode 100644
index 0000000..9f7a22d
--- /dev/null
+++ b/frontend/lib/modules/map.dart
@@ -0,0 +1,81 @@
+import 'package:flutter/material.dart';
+
+import 'package:google_maps_flutter/google_maps_flutter.dart';
+
+class MapWidget extends StatefulWidget {
+ @override
+ State createState() => _MapWidgetState();
+}
+
+class _MapWidgetState extends State {
+ late GoogleMapController mapController;
+
+ final LatLng _center = const LatLng(45.521563, -122.677433);
+
+ void _onMapCreated(GoogleMapController controller) {
+ mapController = controller;
+ }
+ void _onCameraIdle() {
+ // print(mapController.getLatLng());
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return GoogleMap(
+ onMapCreated: _onMapCreated,
+ initialCameraPosition: CameraPosition(
+ target: _center,
+ zoom: 11.0,
+ ),
+ onCameraIdle: _onCameraIdle,
+ );
+ }
+}
+
+
+
+ // GeoCode geoCode = GeoCode();
+ // String _currentCityName = "...";
+ // final Debounce _debounce = Debounce(Duration(seconds: 3));
+
+ // final LatLng _center = const LatLng(45.521563, -122.677433);
+ // late GoogleMapController mapController;
+
+ // void _onMapCreated(GoogleMapController controller) {
+ // mapController = controller;
+ // }
+
+ // // void _setCurrentCityName() async {
+ // if (mapController.camera.zoom < 9) {
+ // return; // Don't bother if the view is too wide
+ // }
+ // var currentCoordinates = mapController.camera.center;
+ // String? city;
+
+ // try{
+ // List placemarks = await placemarkFromCoordinates(currentCoordinates.latitude, currentCoordinates.longitude);
+ // city = placemarks[0].locality.toString();
+ // } catch (e) {
+ // debugPrint("Error: $e");
+ // try {
+ // Address address = await geoCode.reverseGeocoding(latitude: currentCoordinates.latitude, longitude: currentCoordinates.longitude);
+
+ // if (address.city == null || address.city.toString().contains("Throttled!")){
+ // throw Exception("Probably rate limited");
+ // }
+ // city = address.city.toString();
+ // } catch (e) {
+ // debugPrint("Error: $e");
+
+ // }
+ // }
+ // if (city != null) {
+ // setState(() {
+ // _currentCityName = city!;
+ // });
+ // } else {
+ // _debounce(() async {_setCurrentCityName();});
+ // }
+ // }
+
+
\ No newline at end of file
diff --git a/frontend/lib/modules/navigation.dart b/frontend/lib/modules/navigation.dart
new file mode 100644
index 0000000..7bd62ac
--- /dev/null
+++ b/frontend/lib/modules/navigation.dart
@@ -0,0 +1,63 @@
+import 'package:fast_network_navigation/modules/destination_card.dart';
+import 'package:flutter/material.dart';
+
+
+List loadDestinations() {
+ List cities = [
+ singleDestination(
+ "New York",
+ "The Big Apple",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/3/34/View_of_New_York_City.jpg/800px-View_of_New_York_City.jpg"
+ ),
+ singleDestination(
+ "Los Angeles",
+ "City of Angels",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Los_Angeles_City_Hall_2013.jpg/800px-Los_Angeles_City_Hall_2013.jpg"
+ ),
+ singleDestination(
+ "Chicago",
+ "The Windy City",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6f/Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg/800px-Chicago_skyline%2C_viewed_from_John_Hancock_Center.jpg"
+ ),
+ singleDestination(
+ "San Francisco",
+ "The Golden City",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/San_Francisco_City_Hall_2013.jpg/800px-San_Francisco_City_Hall_2013.jpg"
+ ),
+ singleDestination(
+ "Miami",
+ "The Magic City",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Miami_collage.jpg/800px-Miami_collage.jpg"
+ ),
+ singleDestination(
+ "Las Vegas",
+ "Sin City",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/Las_Vegas_Strip.jpg/800px-Las_Vegas_Strip.jpg"
+ ),
+ singleDestination(
+ "Seattle",
+ "Emerald City",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Seattle_Kerry_Park_Skyline.jpg/800px-Seattle_Kerry_Park_Skyline.jpg"
+ ),
+ singleDestination(
+ "Boston",
+ "Beantown",
+ "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0f/Boston_skyline_from_Longfellow_Bridge_September_2017_panorama_2.jpg/800px-Boston"
+ )
+ ];
+ cities.shuffle();
+ return cities;
+}
+
+Widget singleDestination(String title, String description, String image) {
+ return Card(
+ child: ListTile(
+ leading: Icon(Icons.location_on),
+ title: Text(title),
+ subtitle: Text(description),
+ onTap: () {
+ // Navigator.pushNamed(context, '/destination');
+ },
+ ),
+ );
+}
\ No newline at end of file
diff --git a/lib/modules/overview.dart b/frontend/lib/modules/overview.dart
similarity index 54%
rename from lib/modules/overview.dart
rename to frontend/lib/modules/overview.dart
index 7d6c0ed..bfcf18f 100644
--- a/lib/modules/overview.dart
+++ b/frontend/lib/modules/overview.dart
@@ -1,14 +1,41 @@
import 'package:flutter/material.dart';
-import 'package:flutter_map/flutter_map.dart';
import 'package:sliding_up_panel/sliding_up_panel.dart';
-import 'package:fast_network_navigation/modules/navigation.dart';
+import 'package:geocode/geocode.dart';
+import 'dart:async';
+import 'package:google_maps_flutter/google_maps_flutter.dart';
-class MapPage extends StatefulWidget {
+import 'package:fast_network_navigation/modules/navigation.dart';
+import 'package:fast_network_navigation/modules/map.dart';
+
+
+
+class NavigationOverview extends StatefulWidget {
@override
- _MapPageState createState() => _MapPageState();
+ State createState() => _NavigationOverviewState();
}
-class _MapPageState extends State {
+
+
+class Debounce {
+ Duration delay;
+ Timer? _timer;
+
+ Debounce(
+ this.delay,
+ );
+
+ call(void Function() callback) {
+ _timer?.cancel();
+ _timer = Timer(delay, callback);
+ }
+
+ dispose() {
+ _timer?.cancel();
+ }
+}
+
+
+class _NavigationOverviewState extends State {
@override
Widget build(BuildContext context) {
@@ -17,14 +44,7 @@ class _MapPageState extends State {
renderPanelSheet: false,
panel: _floatingPanel(theme),
collapsed: _floatingCollapsed(theme),
- body: FlutterMap(
- options: MapOptions(
- initialZoom: 11,
- ),
- children: [
- openStreetMapTileLayer,
- ],
- ),
+ body: MapWidget()
);
}
@@ -59,14 +79,7 @@ class _MapPageState extends State {
children: [
Greeting(theme),
Text("Got a lot to do today! Here is a rundown:"),
- singleDestination(context, "Location 1", "some description", "Further information"),
- singleDestination(context, "Location 2", "some description", "Further information"),
- singleDestination(context, "Location 3", "some description", "Further information"),
- singleDestination(context, "Location 4", "some description", "Further information"),
- singleDestination(context, "Location 5", "some description", "Further information"),
- singleDestination(context, "Location 6", "some description", "Further information"),
- singleDestination(context, "Location 7", "some description", "Further information"),
- singleDestination(context, "Location 8", "some description", "Further information"),
+ ...loadDestinations(),
],
),
),
@@ -78,16 +91,9 @@ class _MapPageState extends State {
Widget Greeting (ThemeData theme) {
return Center(
child: Text(
- "Explore Kview",
+ "Explore #todo",
style: TextStyle(color: theme.primaryColor, fontSize: 24.0, fontWeight: FontWeight.bold),
),
);
}
}
-
-TileLayer get openStreetMapTileLayer => TileLayer(
- urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
- userAgentPackageName: 'flutter_map',
-);
-
-// Add a pin to the map
diff --git a/frontend/lib/modules/profile.dart b/frontend/lib/modules/profile.dart
new file mode 100644
index 0000000..e8beb08
--- /dev/null
+++ b/frontend/lib/modules/profile.dart
@@ -0,0 +1,91 @@
+import 'package:fast_network_navigation/structs/preferences.dart';
+import 'package:flutter/material.dart';
+
+
+
+class ProfilePage extends StatefulWidget {
+ @override
+ _ProfilePageState createState() => _ProfilePageState();
+}
+
+class _ProfilePageState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return ListView(
+ children: [
+ // First a round, centered image
+ Center(
+ child: CircleAvatar(
+ radius: 100,
+ child: Icon(Icons.person, size: 100),
+ )
+ ),
+ Center(
+ child: Text('Curious traveler', style: TextStyle(fontSize: 24))
+ ),
+
+ Padding(
+ padding: EdgeInsets.all(10),
+ ),
+
+ Text('Please rate your preferences for the following activities:'),
+
+ // Now the sliders
+ ImportanceSliders()
+ ]
+ );
+ }
+}
+
+
+
+class ImportanceSliders extends StatefulWidget {
+
+ @override
+ State createState() => _ImportanceSlidersState();
+}
+
+
+class _ImportanceSlidersState extends State {
+
+ UserPreferences _prefs = UserPreferences();
+
+ @override
+ void initState() {
+ super.initState();
+ _prefs.load();
+ }
+
+ List _createSliders() {
+ List sliders = [];
+ for (SinglePreference pref in _prefs.preferences) {
+ sliders.add(Card(
+ child: ListTile(
+ leading: pref.icon,
+ title: Text(pref.name),
+ subtitle: Slider(
+ value: pref.value.toDouble(),
+ min: 0,
+ max: 10,
+ divisions: 10,
+ label: pref.value.toString(),
+ onChanged: (double newValue) {
+ setState(() {
+ pref.value = newValue.toInt();
+ _prefs.save();
+ });
+ },
+ )
+ ),
+ margin: EdgeInsets.only(left: 10, right: 10, top: 10, bottom: 0),
+ shadowColor: Colors.grey,
+ ));
+ }
+ return sliders;
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(children: _createSliders());
+ }
+}
diff --git a/frontend/lib/structs/destination.dart b/frontend/lib/structs/destination.dart
new file mode 100644
index 0000000..c44fbf9
--- /dev/null
+++ b/frontend/lib/structs/destination.dart
@@ -0,0 +1,62 @@
+import "package:flutter/material.dart";
+
+class Destination {
+ final double latitude;
+ final double longitude;
+ final String name;
+ final String description;
+ // final DestinationType type;
+ final Duration duration;
+ final bool visited;
+
+ const Destination({
+ required this.latitude,
+ required this.longitude,
+ required this.name,
+ required this.description,
+ // required this.type,
+ required this.duration,
+ required this.visited,
+ });
+
+ factory Destination.fromJson(Map json) {
+ return switch (json) {
+ {
+ 'lat': double latitude,
+ 'lon': double longitude,
+ 'name': String name,
+ 'description': String description,
+ // 'type': String type,
+ 'duration': int duration,
+ 'visited': bool visited
+
+ } =>
+ Destination(
+ latitude: latitude,
+ longitude: longitude,
+ name: name,
+ description: description,
+ // type: "DestinationType.values.firstWhere((element) => element.name == type)",
+ duration: Duration(minutes: duration),
+ visited: visited
+ ),
+ _ => throw const FormatException('Failed to load destination.'),
+ };
+}
+
+}
+
+
+class DestinationType {
+ final String name;
+ final String description;
+ final Icon icon;
+
+ const DestinationType({
+ required this.name,
+ required this.description,
+ required this.icon,
+ });
+}
+
+
diff --git a/frontend/lib/structs/preferences.dart b/frontend/lib/structs/preferences.dart
new file mode 100644
index 0000000..7746393
--- /dev/null
+++ b/frontend/lib/structs/preferences.dart
@@ -0,0 +1,82 @@
+import 'package:flutter/material.dart';
+import 'package:shared_preferences/shared_preferences.dart';
+
+
+class SinglePreference {
+ String name;
+ String description;
+ int value;
+ Icon icon;
+ String key;
+
+ SinglePreference({
+ required this.name,
+ required this.description,
+ required this.value,
+ required this.icon,
+ required this.key,
+ });
+}
+
+
+class UserPreferences {
+ List preferences = [
+ SinglePreference(
+ name: "Sightseeing",
+ description: "How much do you like sightseeing?",
+ value: 0,
+ icon: Icon(Icons.church),
+ key: "sightseeing",
+ ),
+ SinglePreference(
+ name: "Shopping",
+ description: "How much do you like shopping?",
+ value: 0,
+ icon: Icon(Icons.shopping_bag),
+ key: "shopping",
+ ),
+ SinglePreference(
+ name: "Foods & Drinks",
+ description: "How much do you like eating?",
+ value: 0,
+ icon: Icon(Icons.restaurant),
+ key: "eating",
+ ),
+ SinglePreference(
+ name: "Nightlife",
+ description: "How much do you like nightlife?",
+ value: 0,
+ icon: Icon(Icons.wine_bar),
+ key: "nightlife",
+ ),
+ SinglePreference(
+ name: "Nature",
+ description: "How much do you like nature?",
+ value: 0,
+ icon: Icon(Icons.landscape),
+ key: "nature",
+ ),
+ SinglePreference(
+ name: "Culture",
+ description: "How much do you like culture?",
+ value: 0,
+ icon: Icon(Icons.palette),
+ key: "culture",
+ ),
+ ];
+
+
+ void save() async {
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ for (SinglePreference pref in preferences) {
+ prefs.setInt(pref.key, pref.value);
+ }
+ }
+
+ void load() async {
+ SharedPreferences prefs = await SharedPreferences.getInstance();
+ for (SinglePreference pref in preferences) {
+ pref.value = prefs.getInt(pref.key) ?? 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/frontend/lib/structs/route.dart b/frontend/lib/structs/route.dart
new file mode 100644
index 0000000..8b46787
--- /dev/null
+++ b/frontend/lib/structs/route.dart
@@ -0,0 +1,14 @@
+import "package:fast_network_navigation/structs/destination.dart";
+
+
+class Route {
+ final String name;
+ final Duration duration;
+ final List destinations;
+
+ Route({
+ required this.name,
+ required this.duration,
+ required this.destinations
+ });
+}
\ No newline at end of file
diff --git a/frontend/lib/utils/get_route.dart b/frontend/lib/utils/get_route.dart
new file mode 100644
index 0000000..fccf6ac
--- /dev/null
+++ b/frontend/lib/utils/get_route.dart
@@ -0,0 +1,18 @@
+import "package:fast_network_navigation/structs/destination.dart";
+import 'package:http/http.dart' as http;
+import 'dart:convert';
+
+Future fetchDestination() async {
+ final response = await http
+ .get(Uri.parse('https://nav.kluster.moll.re/v1/destination/1'));
+
+ if (response.statusCode == 200) {
+ // If the server did return a 200 OK response,
+ // then parse the JSON.
+ return Destination.fromJson(jsonDecode(response.body) as Map);
+ } else {
+ // If the server did not return a 200 OK response,
+ // then throw an exception.
+ throw Exception('Failed to load destination');
+ }
+}
\ No newline at end of file
diff --git a/linux/.gitignore b/frontend/linux/.gitignore
similarity index 100%
rename from linux/.gitignore
rename to frontend/linux/.gitignore
diff --git a/linux/CMakeLists.txt b/frontend/linux/CMakeLists.txt
similarity index 100%
rename from linux/CMakeLists.txt
rename to frontend/linux/CMakeLists.txt
diff --git a/linux/flutter/CMakeLists.txt b/frontend/linux/flutter/CMakeLists.txt
similarity index 100%
rename from linux/flutter/CMakeLists.txt
rename to frontend/linux/flutter/CMakeLists.txt
diff --git a/linux/flutter/generated_plugin_registrant.cc b/frontend/linux/flutter/generated_plugin_registrant.cc
similarity index 100%
rename from linux/flutter/generated_plugin_registrant.cc
rename to frontend/linux/flutter/generated_plugin_registrant.cc
diff --git a/linux/flutter/generated_plugin_registrant.h b/frontend/linux/flutter/generated_plugin_registrant.h
similarity index 100%
rename from linux/flutter/generated_plugin_registrant.h
rename to frontend/linux/flutter/generated_plugin_registrant.h
diff --git a/linux/flutter/generated_plugins.cmake b/frontend/linux/flutter/generated_plugins.cmake
similarity index 100%
rename from linux/flutter/generated_plugins.cmake
rename to frontend/linux/flutter/generated_plugins.cmake
diff --git a/linux/main.cc b/frontend/linux/main.cc
similarity index 100%
rename from linux/main.cc
rename to frontend/linux/main.cc
diff --git a/linux/my_application.cc b/frontend/linux/my_application.cc
similarity index 100%
rename from linux/my_application.cc
rename to frontend/linux/my_application.cc
diff --git a/linux/my_application.h b/frontend/linux/my_application.h
similarity index 100%
rename from linux/my_application.h
rename to frontend/linux/my_application.h
diff --git a/macos/.gitignore b/frontend/macos/.gitignore
similarity index 100%
rename from macos/.gitignore
rename to frontend/macos/.gitignore
diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/frontend/macos/Flutter/Flutter-Debug.xcconfig
similarity index 100%
rename from macos/Flutter/Flutter-Debug.xcconfig
rename to frontend/macos/Flutter/Flutter-Debug.xcconfig
diff --git a/macos/Flutter/Flutter-Release.xcconfig b/frontend/macos/Flutter/Flutter-Release.xcconfig
similarity index 100%
rename from macos/Flutter/Flutter-Release.xcconfig
rename to frontend/macos/Flutter/Flutter-Release.xcconfig
diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/frontend/macos/Flutter/GeneratedPluginRegistrant.swift
similarity index 51%
rename from macos/Flutter/GeneratedPluginRegistrant.swift
rename to frontend/macos/Flutter/GeneratedPluginRegistrant.swift
index cccf817..724bb2a 100644
--- a/macos/Flutter/GeneratedPluginRegistrant.swift
+++ b/frontend/macos/Flutter/GeneratedPluginRegistrant.swift
@@ -5,6 +5,8 @@
import FlutterMacOS
import Foundation
+import shared_preferences_foundation
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
+ SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
}
diff --git a/macos/Runner.xcodeproj/project.pbxproj b/frontend/macos/Runner.xcodeproj/project.pbxproj
similarity index 100%
rename from macos/Runner.xcodeproj/project.pbxproj
rename to frontend/macos/Runner.xcodeproj/project.pbxproj
diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to frontend/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
similarity index 100%
rename from macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
rename to frontend/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/frontend/macos/Runner.xcworkspace/contents.xcworkspacedata
similarity index 100%
rename from macos/Runner.xcworkspace/contents.xcworkspacedata
rename to frontend/macos/Runner.xcworkspace/contents.xcworkspacedata
diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
similarity index 100%
rename from macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to frontend/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
diff --git a/macos/Runner/AppDelegate.swift b/frontend/macos/Runner/AppDelegate.swift
similarity index 100%
rename from macos/Runner/AppDelegate.swift
rename to frontend/macos/Runner/AppDelegate.swift
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png
diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
similarity index 100%
rename from macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
rename to frontend/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png
diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/frontend/macos/Runner/Base.lproj/MainMenu.xib
similarity index 100%
rename from macos/Runner/Base.lproj/MainMenu.xib
rename to frontend/macos/Runner/Base.lproj/MainMenu.xib
diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/frontend/macos/Runner/Configs/AppInfo.xcconfig
similarity index 100%
rename from macos/Runner/Configs/AppInfo.xcconfig
rename to frontend/macos/Runner/Configs/AppInfo.xcconfig
diff --git a/macos/Runner/Configs/Debug.xcconfig b/frontend/macos/Runner/Configs/Debug.xcconfig
similarity index 100%
rename from macos/Runner/Configs/Debug.xcconfig
rename to frontend/macos/Runner/Configs/Debug.xcconfig
diff --git a/macos/Runner/Configs/Release.xcconfig b/frontend/macos/Runner/Configs/Release.xcconfig
similarity index 100%
rename from macos/Runner/Configs/Release.xcconfig
rename to frontend/macos/Runner/Configs/Release.xcconfig
diff --git a/macos/Runner/Configs/Warnings.xcconfig b/frontend/macos/Runner/Configs/Warnings.xcconfig
similarity index 100%
rename from macos/Runner/Configs/Warnings.xcconfig
rename to frontend/macos/Runner/Configs/Warnings.xcconfig
diff --git a/macos/Runner/DebugProfile.entitlements b/frontend/macos/Runner/DebugProfile.entitlements
similarity index 100%
rename from macos/Runner/DebugProfile.entitlements
rename to frontend/macos/Runner/DebugProfile.entitlements
diff --git a/macos/Runner/Info.plist b/frontend/macos/Runner/Info.plist
similarity index 100%
rename from macos/Runner/Info.plist
rename to frontend/macos/Runner/Info.plist
diff --git a/macos/Runner/MainFlutterWindow.swift b/frontend/macos/Runner/MainFlutterWindow.swift
similarity index 100%
rename from macos/Runner/MainFlutterWindow.swift
rename to frontend/macos/Runner/MainFlutterWindow.swift
diff --git a/macos/Runner/Release.entitlements b/frontend/macos/Runner/Release.entitlements
similarity index 100%
rename from macos/Runner/Release.entitlements
rename to frontend/macos/Runner/Release.entitlements
diff --git a/macos/RunnerTests/RunnerTests.swift b/frontend/macos/RunnerTests/RunnerTests.swift
similarity index 100%
rename from macos/RunnerTests/RunnerTests.swift
rename to frontend/macos/RunnerTests/RunnerTests.swift
diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock
new file mode 100644
index 0000000..7c2f396
--- /dev/null
+++ b/frontend/pubspec.lock
@@ -0,0 +1,530 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ async:
+ dependency: transitive
+ description:
+ name: async
+ sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.11.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.0"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.18.0"
+ csslib:
+ dependency: transitive
+ description:
+ name: csslib
+ sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
+ cupertino_icons:
+ dependency: "direct main"
+ description:
+ name: cupertino_icons
+ sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.8"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.1"
+ ffi:
+ dependency: transitive
+ description:
+ name: ffi
+ sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ file:
+ dependency: transitive
+ description:
+ name: file
+ sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.0.0"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_lints:
+ dependency: "direct dev"
+ description:
+ name: flutter_lints
+ sha256: "3f41d009ba7172d5ff9be5f6e6e6abb4300e263aab8866d2a0842ed2a70f8f0c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.0"
+ flutter_plugin_android_lifecycle:
+ dependency: transitive
+ description:
+ name: flutter_plugin_android_lifecycle
+ sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.19"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_web_plugins:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ geocode:
+ dependency: "direct main"
+ description:
+ name: geocode
+ sha256: cf9727c369bb3703b97d6e440225962dc27b7f3c686662fe3cdcc91cbfb7074d
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.3"
+ geocoding:
+ dependency: "direct main"
+ description:
+ name: geocoding
+ sha256: d580c801cba9386b4fac5047c4c785a4e19554f46be42f4f5e5b7deacd088a66
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.0"
+ geocoding_android:
+ dependency: transitive
+ description:
+ name: geocoding_android
+ sha256: "1b13eca79b11c497c434678fed109c2be020b158cec7512c848c102bc7232603"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.3.1"
+ geocoding_ios:
+ dependency: transitive
+ description:
+ name: geocoding_ios
+ sha256: "94ddba60387501bd1c11e18dca7c5a9e8c645d6e3da9c38b9762434941870c24"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
+ geocoding_platform_interface:
+ dependency: transitive
+ description:
+ name: geocoding_platform_interface
+ sha256: "8c2c8226e5c276594c2e18bfe88b19110ed770aeb7c1ab50ede570be8b92229b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.2.0"
+ google_maps:
+ dependency: transitive
+ description:
+ name: google_maps
+ sha256: "47eef3836b49bb030d5cb3afc60b8451408bf34cf753e571b645d6529eb4251a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "7.1.0"
+ google_maps_flutter:
+ dependency: "direct main"
+ description:
+ name: google_maps_flutter
+ sha256: c1972cbad779bc5346c49045f26ae45550a0958b1cbca5b524dd3c8954995d28
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.6.1"
+ google_maps_flutter_android:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_android
+ sha256: "0bcadb80eba39afda77dede89a6caafd3b68f2786b90491eceea4a01c3db181c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.8.0"
+ google_maps_flutter_ios:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_ios
+ sha256: e5132d17f051600d90d79d9f574b177c24231da702453a036db2490f9ced4646
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.6.0"
+ google_maps_flutter_platform_interface:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_platform_interface
+ sha256: "167af879da4d004cd58771f1469b91dcc3b9b0a2c5334cc6bf71fd41d4b35403"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.6.0"
+ google_maps_flutter_web:
+ dependency: transitive
+ description:
+ name: google_maps_flutter_web
+ sha256: "0c0d5c723d94b295cf86dd1c45ff91d2ac1fff7c05ddca4f01bef9fa0a014690"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.5.7"
+ html:
+ dependency: transitive
+ description:
+ name: html
+ sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.15.4"
+ http:
+ dependency: "direct main"
+ description:
+ name: http
+ sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.2"
+ js:
+ dependency: transitive
+ description:
+ name: js
+ sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.7"
+ js_wrapping:
+ dependency: transitive
+ description:
+ name: js_wrapping
+ sha256: e385980f7c76a8c1c9a560dfb623b890975841542471eade630b2871d243851c
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.4"
+ leak_tracker:
+ dependency: transitive
+ description:
+ name: leak_tracker
+ sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "10.0.4"
+ leak_tracker_flutter_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_flutter_testing
+ sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.3"
+ leak_tracker_testing:
+ dependency: transitive
+ description:
+ name: leak_tracker_testing
+ sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.1"
+ lints:
+ dependency: transitive
+ description:
+ name: lints
+ sha256: "976c774dd944a42e83e2467f4cc670daef7eed6295b10b36ae8c85bcbf828235"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.0"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.12.16+1"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.8.0"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.12.0"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.0"
+ path_provider_linux:
+ dependency: transitive
+ description:
+ name: path_provider_linux
+ sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.1"
+ path_provider_platform_interface:
+ dependency: transitive
+ description:
+ name: path_provider_platform_interface
+ sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ path_provider_windows:
+ dependency: transitive
+ description:
+ name: path_provider_windows
+ sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.1"
+ platform:
+ dependency: transitive
+ description:
+ name: platform
+ sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.4"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.8"
+ sanitize_html:
+ dependency: transitive
+ description:
+ name: sanitize_html
+ sha256: "12669c4a913688a26555323fb9cec373d8f9fbe091f2d01c40c723b33caa8989"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
+ shared_preferences:
+ dependency: "direct main"
+ description:
+ name: shared_preferences
+ sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.3"
+ shared_preferences_android:
+ dependency: transitive
+ description:
+ name: shared_preferences_android
+ sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.2"
+ shared_preferences_foundation:
+ dependency: transitive
+ description:
+ name: shared_preferences_foundation
+ sha256: "0a8a893bf4fd1152f93fec03a415d11c27c74454d96e2318a7ac38dd18683ab7"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.0"
+ shared_preferences_linux:
+ dependency: transitive
+ description:
+ name: shared_preferences_linux
+ sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.2"
+ shared_preferences_platform_interface:
+ dependency: transitive
+ description:
+ name: shared_preferences_platform_interface
+ sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.2"
+ shared_preferences_web:
+ dependency: transitive
+ description:
+ name: shared_preferences_web
+ sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.0"
+ shared_preferences_windows:
+ dependency: transitive
+ description:
+ name: shared_preferences_windows
+ sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.2"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ sliding_up_panel:
+ dependency: "direct main"
+ description:
+ name: sliding_up_panel
+ sha256: "578e90956a6212d1e406373250b2436a0f3afece29aee3c24c8360094d6cf968"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.0+1"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.10.0"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.11.1"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ stream_transform:
+ dependency: transitive
+ description:
+ name: stream_transform
+ sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.7.0"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.2"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ vm_service:
+ dependency: transitive
+ description:
+ name: vm_service
+ sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec"
+ url: "https://pub.dev"
+ source: hosted
+ version: "14.2.1"
+ web:
+ dependency: transitive
+ description:
+ name: web
+ sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.5.1"
+ win32:
+ dependency: transitive
+ description:
+ name: win32
+ sha256: a79dbe579cb51ecd6d30b17e0cae4e0ea15e2c0e66f69ad4198f22a6789e94f4
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.5.1"
+ xdg_directories:
+ dependency: transitive
+ description:
+ name: xdg_directories
+ sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.4"
+sdks:
+ dart: ">=3.4.0 <4.0.0"
+ flutter: ">=3.19.0"
diff --git a/pubspec.yaml b/frontend/pubspec.yaml
similarity index 94%
rename from pubspec.yaml
rename to frontend/pubspec.yaml
index 507aee5..9f1732c 100644
--- a/pubspec.yaml
+++ b/frontend/pubspec.yaml
@@ -1,5 +1,5 @@
-name: fast_network_navigation
-description: "A new Flutter project."
+name: "fast_network_navigation"
+description: "An interactive city navigator."
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
@@ -35,8 +35,12 @@ dependencies:
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.6
- flutter_map: ^6.1.0
sliding_up_panel: ^2.0.0+1
+ geocoding: ^3.0.0
+ geocode: ^1.0.3
+ google_maps_flutter: ^2.6.1
+ http: ^1.2.1
+ shared_preferences: ^2.2.3
dev_dependencies:
flutter_test:
@@ -47,7 +51,7 @@ dev_dependencies:
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
- flutter_lints: ^3.0.0
+ flutter_lints: ^4.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
diff --git a/test/widget_test.dart b/frontend/test/widget_test.dart
similarity index 83%
rename from test/widget_test.dart
rename to frontend/test/widget_test.dart
index 1eacbc4..143b24f 100644
--- a/test/widget_test.dart
+++ b/frontend/test/widget_test.dart
@@ -9,16 +9,15 @@ import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
// import 'package:fast_network_navigation/main.dart';
-import 'package:fast_network_navigation/modules/scaffold.dart';
+import 'package:fast_network_navigation/layout.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(BasePage(title: "City Nav"));
- // Verify that our counter starts at 0.
- expect(find.text('0'), findsOneWidget);
- expect(find.text('1'), findsNothing);
+ // Verfiy that the title is displayed
+ expect(find.text('City Nav'), findsOneWidget);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
diff --git a/web/favicon.png b/frontend/web/favicon.png
similarity index 100%
rename from web/favicon.png
rename to frontend/web/favicon.png
diff --git a/web/icons/Icon-192.png b/frontend/web/icons/Icon-192.png
similarity index 100%
rename from web/icons/Icon-192.png
rename to frontend/web/icons/Icon-192.png
diff --git a/web/icons/Icon-512.png b/frontend/web/icons/Icon-512.png
similarity index 100%
rename from web/icons/Icon-512.png
rename to frontend/web/icons/Icon-512.png
diff --git a/web/icons/Icon-maskable-192.png b/frontend/web/icons/Icon-maskable-192.png
similarity index 100%
rename from web/icons/Icon-maskable-192.png
rename to frontend/web/icons/Icon-maskable-192.png
diff --git a/web/icons/Icon-maskable-512.png b/frontend/web/icons/Icon-maskable-512.png
similarity index 100%
rename from web/icons/Icon-maskable-512.png
rename to frontend/web/icons/Icon-maskable-512.png
diff --git a/web/index.html b/frontend/web/index.html
similarity index 94%
rename from web/index.html
rename to frontend/web/index.html
index 30e08e2..5cbcc91 100644
--- a/web/index.html
+++ b/frontend/web/index.html
@@ -14,6 +14,7 @@
This is a placeholder for base href that will be replaced by the value of
the `--base-href` argument provided to `flutter build`.
-->
+
diff --git a/web/manifest.json b/frontend/web/manifest.json
similarity index 100%
rename from web/manifest.json
rename to frontend/web/manifest.json
diff --git a/windows/.gitignore b/frontend/windows/.gitignore
similarity index 100%
rename from windows/.gitignore
rename to frontend/windows/.gitignore
diff --git a/windows/CMakeLists.txt b/frontend/windows/CMakeLists.txt
similarity index 100%
rename from windows/CMakeLists.txt
rename to frontend/windows/CMakeLists.txt
diff --git a/windows/flutter/CMakeLists.txt b/frontend/windows/flutter/CMakeLists.txt
similarity index 100%
rename from windows/flutter/CMakeLists.txt
rename to frontend/windows/flutter/CMakeLists.txt
diff --git a/windows/flutter/generated_plugin_registrant.cc b/frontend/windows/flutter/generated_plugin_registrant.cc
similarity index 100%
rename from windows/flutter/generated_plugin_registrant.cc
rename to frontend/windows/flutter/generated_plugin_registrant.cc
diff --git a/windows/flutter/generated_plugin_registrant.h b/frontend/windows/flutter/generated_plugin_registrant.h
similarity index 100%
rename from windows/flutter/generated_plugin_registrant.h
rename to frontend/windows/flutter/generated_plugin_registrant.h
diff --git a/windows/flutter/generated_plugins.cmake b/frontend/windows/flutter/generated_plugins.cmake
similarity index 100%
rename from windows/flutter/generated_plugins.cmake
rename to frontend/windows/flutter/generated_plugins.cmake
diff --git a/windows/runner/CMakeLists.txt b/frontend/windows/runner/CMakeLists.txt
similarity index 100%
rename from windows/runner/CMakeLists.txt
rename to frontend/windows/runner/CMakeLists.txt
diff --git a/windows/runner/Runner.rc b/frontend/windows/runner/Runner.rc
similarity index 100%
rename from windows/runner/Runner.rc
rename to frontend/windows/runner/Runner.rc
diff --git a/windows/runner/flutter_window.cpp b/frontend/windows/runner/flutter_window.cpp
similarity index 100%
rename from windows/runner/flutter_window.cpp
rename to frontend/windows/runner/flutter_window.cpp
diff --git a/windows/runner/flutter_window.h b/frontend/windows/runner/flutter_window.h
similarity index 100%
rename from windows/runner/flutter_window.h
rename to frontend/windows/runner/flutter_window.h
diff --git a/windows/runner/main.cpp b/frontend/windows/runner/main.cpp
similarity index 100%
rename from windows/runner/main.cpp
rename to frontend/windows/runner/main.cpp
diff --git a/windows/runner/resource.h b/frontend/windows/runner/resource.h
similarity index 100%
rename from windows/runner/resource.h
rename to frontend/windows/runner/resource.h
diff --git a/windows/runner/resources/app_icon.ico b/frontend/windows/runner/resources/app_icon.ico
similarity index 100%
rename from windows/runner/resources/app_icon.ico
rename to frontend/windows/runner/resources/app_icon.ico
diff --git a/windows/runner/runner.exe.manifest b/frontend/windows/runner/runner.exe.manifest
similarity index 100%
rename from windows/runner/runner.exe.manifest
rename to frontend/windows/runner/runner.exe.manifest
diff --git a/windows/runner/utils.cpp b/frontend/windows/runner/utils.cpp
similarity index 100%
rename from windows/runner/utils.cpp
rename to frontend/windows/runner/utils.cpp
diff --git a/windows/runner/utils.h b/frontend/windows/runner/utils.h
similarity index 100%
rename from windows/runner/utils.h
rename to frontend/windows/runner/utils.h
diff --git a/windows/runner/win32_window.cpp b/frontend/windows/runner/win32_window.cpp
similarity index 100%
rename from windows/runner/win32_window.cpp
rename to frontend/windows/runner/win32_window.cpp
diff --git a/windows/runner/win32_window.h b/frontend/windows/runner/win32_window.h
similarity index 100%
rename from windows/runner/win32_window.h
rename to frontend/windows/runner/win32_window.h
diff --git a/landmarks.txt b/landmarks.txt
new file mode 100644
index 0000000..7ee474a
--- /dev/null
+++ b/landmarks.txt
@@ -0,0 +1,9730 @@
+{
+ "0":{
+ "name":"Musée du quai Branly - Jacques Chirac",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8609823,
+ 2.2977973
+ ],
+ "osm_type":"way",
+ "osm_id":17954721,
+ "attractiveness":30,
+ "must_do":false,
+ "n_tags":30,
+ "time_to_reach":0
+ },
+ "1":{
+ "name":"Bourse de Commerce — Pinault Collection",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8628167,
+ 2.3428183
+ ],
+ "osm_type":"way",
+ "osm_id":19856722,
+ "attractiveness":32,
+ "must_do":false,
+ "n_tags":32,
+ "time_to_reach":0
+ },
+ "2":{
+ "name":"Galerie de Minéralogie et de Géologie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8418045,
+ 2.3577296
+ ],
+ "osm_type":"way",
+ "osm_id":21999357,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "3":{
+ "name":"Galeries de Paléontologie et d'Anatomie comparée",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8431475,
+ 2.3628815
+ ],
+ "osm_type":"way",
+ "osm_id":21999454,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "4":{
+ "name":"Institut du Monde Arabe",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8489231,
+ 2.3572223
+ ],
+ "osm_type":"way",
+ "osm_id":22870791,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "5":{
+ "name":"Jardin Tino Rossi - Musée de la Sculpture en Plein Air",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8474186,
+ 2.3607371
+ ],
+ "osm_type":"way",
+ "osm_id":23644147,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "6":{
+ "name":"Halle Saint-Pierre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8848435,
+ 2.3445246
+ ],
+ "osm_type":"way",
+ "osm_id":45073393,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "7":{
+ "name":"Jeu de Paume",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8658156,
+ 2.3240828
+ ],
+ "osm_type":"way",
+ "osm_id":54188994,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "8":{
+ "name":"Musée de l'Orangerie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8637655,
+ 2.3226594
+ ],
+ "osm_type":"way",
+ "osm_id":54188996,
+ "attractiveness":24,
+ "must_do":false,
+ "n_tags":24,
+ "time_to_reach":0
+ },
+ "9":{
+ "name":"Atelier Brancusi",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8614029,
+ 2.3519903
+ ],
+ "osm_type":"way",
+ "osm_id":55503399,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "10":{
+ "name":"Lafayette Anticipations",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8590014,
+ 2.354757
+ ],
+ "osm_type":"way",
+ "osm_id":55865819,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "11":{
+ "name":"Grand Palais",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8661514,
+ 2.3122667
+ ],
+ "osm_type":"way",
+ "osm_id":56185523,
+ "attractiveness":22,
+ "must_do":false,
+ "n_tags":22,
+ "time_to_reach":0
+ },
+ "12":{
+ "name":"Pavillon de l'Arsenal",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8505861,
+ 2.3621853
+ ],
+ "osm_type":"way",
+ "osm_id":56186898,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":19,
+ "time_to_reach":0
+ },
+ "13":{
+ "name":"Musée de Cluny",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8506604,
+ 2.3437398
+ ],
+ "osm_type":"way",
+ "osm_id":56640163,
+ "attractiveness":18,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "14":{
+ "name":"Musée d'art et d'histoire du Judaïsme",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8612656,
+ 2.355418
+ ],
+ "osm_type":"way",
+ "osm_id":56687783,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "15":{
+ "name":"Musée national Picasso-Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8598781,
+ 2.3620895
+ ],
+ "osm_type":"way",
+ "osm_id":57745741,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "16":{
+ "name":"Musée Cognacq-Jay",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8581215,
+ 2.3616628
+ ],
+ "osm_type":"way",
+ "osm_id":57781649,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "17":{
+ "name":"Argonaute",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8945348,
+ 2.3895646
+ ],
+ "osm_type":"way",
+ "osm_id":58169110,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "18":{
+ "name":"Orangerie du Sénat",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8483243,
+ 2.3344262
+ ],
+ "osm_type":"way",
+ "osm_id":62848404,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "19":{
+ "name":"Les Réserves du Musée des Arts et Métiers",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9142687,
+ 2.3604902
+ ],
+ "osm_type":"way",
+ "osm_id":63992928,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "20":{
+ "name":"Musée Ernest-Hébert (en travaux)",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8473326,
+ 2.3227159
+ ],
+ "osm_type":"way",
+ "osm_id":64314872,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "21":{
+ "name":"Musée Nissim de Camondo",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8791676,
+ 2.3124361
+ ],
+ "osm_type":"way",
+ "osm_id":68353844,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "22":{
+ "name":"Musée Cernuschi",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8794667,
+ 2.312538
+ ],
+ "osm_type":"way",
+ "osm_id":68353920,
+ "attractiveness":18,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "23":{
+ "name":"Musée Jacquemart-André",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8755169,
+ 2.3105464
+ ],
+ "osm_type":"way",
+ "osm_id":68804399,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "24":{
+ "name":"Pagoda Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8767479,
+ 2.3077454
+ ],
+ "osm_type":"way",
+ "osm_id":68828954,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "25":{
+ "name":"Pavillon de Vendôme",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9047868,
+ 2.3038403
+ ],
+ "osm_type":"way",
+ "osm_id":74468585,
+ "attractiveness":17,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "26":{
+ "name":"Galerie des Gobelins",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8348138,
+ 2.3528
+ ],
+ "osm_type":"way",
+ "osm_id":78407170,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "27":{
+ "name":"Musée Yves Saint Laurent Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8655978,
+ 2.2993165
+ ],
+ "osm_type":"way",
+ "osm_id":79219238,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "28":{
+ "name":"Musée d'Art Moderne de Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8643053,
+ 2.297793
+ ],
+ "osm_type":"way",
+ "osm_id":79219308,
+ "attractiveness":30,
+ "must_do":false,
+ "n_tags":30,
+ "time_to_reach":0
+ },
+ "29":{
+ "name":"Fondation Cartier pour l'art contemporain",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8373189,
+ 2.3319319
+ ],
+ "osm_type":"way",
+ "osm_id":79616736,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "30":{
+ "name":"Centre Tignous d'Art Contemporain",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8567341,
+ 2.4270255
+ ],
+ "osm_type":"way",
+ "osm_id":81767364,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "31":{
+ "name":"Grande Galerie de l'Évolution",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8421181,
+ 2.3562418
+ ],
+ "osm_type":"way",
+ "osm_id":83913793,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "32":{
+ "name":"Musée national Jean-Jacques Henner",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8829326,
+ 2.3076157
+ ],
+ "osm_type":"way",
+ "osm_id":84326105,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "33":{
+ "name":"Musée de la Vie Romantique",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.881203,
+ 2.333519
+ ],
+ "osm_type":"way",
+ "osm_id":84511123,
+ "attractiveness":22,
+ "must_do":false,
+ "n_tags":22,
+ "time_to_reach":0
+ },
+ "34":{
+ "name":"Mémorial de la Shoah",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8548862,
+ 2.3560564
+ ],
+ "osm_type":"way",
+ "osm_id":124052479,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "35":{
+ "name":"Musée Zadkine",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8428133,
+ 2.3337722
+ ],
+ "osm_type":"way",
+ "osm_id":153776401,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "36":{
+ "name":"Musée de Montmartre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8880654,
+ 2.3406347
+ ],
+ "osm_type":"way",
+ "osm_id":154679327,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "37":{
+ "name":"Crypte Archéologique du Parvis Notre-Dame",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8535851,
+ 2.3480846
+ ],
+ "osm_type":"way",
+ "osm_id":159896046,
+ "attractiveness":18,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "38":{
+ "name":"Manufacture des Gobelins",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8344502,
+ 2.3520875
+ ],
+ "osm_type":"way",
+ "osm_id":161119956,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "39":{
+ "name":"Musée du Luxembourg",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8485965,
+ 2.3340156
+ ],
+ "osm_type":"way",
+ "osm_id":170226810,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "40":{
+ "name":"Institut suédois",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.858226,
+ 2.3619639
+ ],
+ "osm_type":"way",
+ "osm_id":243973065,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "41":{
+ "name":"Musée national Eugène Delacroix",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8546662,
+ 2.3353836
+ ],
+ "osm_type":"way",
+ "osm_id":395785603,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "42":{
+ "name":"Géoroom",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8454453,
+ 2.4238848
+ ],
+ "osm_type":"way",
+ "osm_id":541473683,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "43":{
+ "name":"Musée des Moulages",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8721889,
+ 2.3681344
+ ],
+ "osm_type":"way",
+ "osm_id":692817231,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "44":{
+ "name":"Grand palais éphémère",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8531684,
+ 2.3024461
+ ],
+ "osm_type":"way",
+ "osm_id":854459034,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":19,
+ "time_to_reach":0
+ },
+ "45":{
+ "name":"Mémorial de Bobigny",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9095992,
+ 2.4295813
+ ],
+ "osm_type":"way",
+ "osm_id":1236950476,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "46":{
+ "name":"Hôtel de Sully",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.854635,
+ 2.3638126
+ ],
+ "osm_type":"relation",
+ "osm_id":403146,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "47":{
+ "name":"Fondation Henri Cartier-Bresson",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8632278,
+ 2.3598659
+ ],
+ "osm_type":"relation",
+ "osm_id":551459,
+ "attractiveness":22,
+ "must_do":false,
+ "n_tags":22,
+ "time_to_reach":0
+ },
+ "48":{
+ "name":"Hôtel de la Monnaie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.856403,
+ 2.3388625
+ ],
+ "osm_type":"relation",
+ "osm_id":967664,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "49":{
+ "name":"Musée Bourdelle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8432078,
+ 2.3186583
+ ],
+ "osm_type":"relation",
+ "osm_id":1212876,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "50":{
+ "name":"Institut Giacometti",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8362008,
+ 2.3310708
+ ],
+ "osm_type":"relation",
+ "osm_id":1213090,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "51":{
+ "name":"Musée Carnavalet",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8576819,
+ 2.3627147
+ ],
+ "osm_type":"relation",
+ "osm_id":2405955,
+ "attractiveness":25,
+ "must_do":false,
+ "n_tags":25,
+ "time_to_reach":0
+ },
+ "52":{
+ "name":"Petit Palais",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8660437,
+ 2.3149694
+ ],
+ "osm_type":"relation",
+ "osm_id":2778854,
+ "attractiveness":37,
+ "must_do":false,
+ "n_tags":32,
+ "time_to_reach":0
+ },
+ "53":{
+ "name":"Sainte-Chapelle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8553966,
+ 2.3450136
+ ],
+ "osm_type":"relation",
+ "osm_id":3344870,
+ "attractiveness":57,
+ "must_do":false,
+ "n_tags":54,
+ "time_to_reach":0
+ },
+ "54":{
+ "name":"Musée du Louvre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8611474,
+ 2.3358637
+ ],
+ "osm_type":"relation",
+ "osm_id":7515426,
+ "attractiveness":34,
+ "must_do":false,
+ "n_tags":33,
+ "time_to_reach":0
+ },
+ "55":{
+ "name":"Champ de Mars",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.856163,
+ 2.2978311
+ ],
+ "osm_type":"way",
+ "osm_id":4208595,
+ "attractiveness":38,
+ "must_do":false,
+ "n_tags":25,
+ "time_to_reach":0
+ },
+ "56":{
+ "name":"Jardin des Plantes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8440393,
+ 2.3596915
+ ],
+ "osm_type":"way",
+ "osm_id":4221369,
+ "attractiveness":33,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "57":{
+ "name":"Jardin du Palais Royal",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8650062,
+ 2.3378176
+ ],
+ "osm_type":"way",
+ "osm_id":4263203,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "58":{
+ "name":"Panthéon",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8461887,
+ 2.3460786
+ ],
+ "osm_type":"way",
+ "osm_id":16407465,
+ "attractiveness":38,
+ "must_do":false,
+ "n_tags":32,
+ "time_to_reach":0
+ },
+ "59":{
+ "name":"Jardin Atlantique",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8398756,
+ 2.3189805
+ ],
+ "osm_type":"way",
+ "osm_id":16923782,
+ "attractiveness":20,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "60":{
+ "name":"Tour Saint-Jacques",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8579983,
+ 2.3489178
+ ],
+ "osm_type":"way",
+ "osm_id":20326709,
+ "attractiveness":33,
+ "must_do":false,
+ "n_tags":31,
+ "time_to_reach":0
+ },
+ "61":{
+ "name":"Basilique du Sacré-Cœur",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8867961,
+ 2.3430272
+ ],
+ "osm_type":"way",
+ "osm_id":23762981,
+ "attractiveness":42,
+ "must_do":false,
+ "n_tags":40,
+ "time_to_reach":0
+ },
+ "62":{
+ "name":"Collège des Bernardins",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8488289,
+ 2.3520343
+ ],
+ "osm_type":"way",
+ "osm_id":26584053,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "63":{
+ "name":"Ancienne faisanderie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8452279,
+ 2.3593855
+ ],
+ "osm_type":"way",
+ "osm_id":42332649,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "64":{
+ "name":"Reptiles",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8457353,
+ 2.3592527
+ ],
+ "osm_type":"way",
+ "osm_id":42332651,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "65":{
+ "name":"Église Saint-Roch",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8653817,
+ 2.3326659
+ ],
+ "osm_type":"way",
+ "osm_id":42722202,
+ "attractiveness":26,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "66":{
+ "name":"Hôtel Lebrun",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8468374,
+ 2.3526504
+ ],
+ "osm_type":"way",
+ "osm_id":43020667,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "67":{
+ "name":"Pont Neuf",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8565248,
+ 2.3408132
+ ],
+ "osm_type":"way",
+ "osm_id":53574149,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "68":{
+ "name":"Pont Neuf",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8578047,
+ 2.3419414
+ ],
+ "osm_type":"way",
+ "osm_id":53574164,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "69":{
+ "name":"Comédie Française",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8635374,
+ 2.336193
+ ],
+ "osm_type":"way",
+ "osm_id":54053052,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "70":{
+ "name":"Fontaine Molière",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8654941,
+ 2.336613
+ ],
+ "osm_type":"way",
+ "osm_id":54097804,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "71":{
+ "name":"Place Vendôme",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8674726,
+ 2.3294385
+ ],
+ "osm_type":"way",
+ "osm_id":54175774,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "72":{
+ "name":"Église de la Madeleine",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8700303,
+ 2.3244833
+ ],
+ "osm_type":"way",
+ "osm_id":54180046,
+ "attractiveness":33,
+ "must_do":false,
+ "n_tags":33,
+ "time_to_reach":0
+ },
+ "73":{
+ "name":"Opéra Garnier",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8720294,
+ 2.3317281
+ ],
+ "osm_type":"way",
+ "osm_id":54667456,
+ "attractiveness":26,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "74":{
+ "name":"Hôtel de Lauzun",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.851565,
+ 2.3589627
+ ],
+ "osm_type":"way",
+ "osm_id":55292128,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "75":{
+ "name":"Presbytère",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8463617,
+ 2.3488355
+ ],
+ "osm_type":"way",
+ "osm_id":55341527,
+ "attractiveness":17,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "76":{
+ "name":"Centre Georges Pompidou",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8605235,
+ 2.3524395
+ ],
+ "osm_type":"way",
+ "osm_id":55503397,
+ "attractiveness":43,
+ "must_do":false,
+ "n_tags":43,
+ "time_to_reach":0
+ },
+ "77":{
+ "name":"Immeuble Henri Sauvage",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8436578,
+ 2.3298104
+ ],
+ "osm_type":"way",
+ "osm_id":63711049,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "78":{
+ "name":"Rotonde de la Villette",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8834633,
+ 2.3695457
+ ],
+ "osm_type":"way",
+ "osm_id":63971487,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "79":{
+ "name":"Cathédrale Saint-Louis des Invalides",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8556038,
+ 2.3125832
+ ],
+ "osm_type":"way",
+ "osm_id":64955027,
+ "attractiveness":18,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "80":{
+ "name":"Paris Story",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8723873,
+ 2.3305146
+ ],
+ "osm_type":"way",
+ "osm_id":69226411,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "81":{
+ "name":"Maison de Tristan Tzara",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8880392,
+ 2.3356771
+ ],
+ "osm_type":"way",
+ "osm_id":77780351,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":19,
+ "time_to_reach":0
+ },
+ "82":{
+ "name":"Moulin de la Galette",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8876533,
+ 2.336297
+ ],
+ "osm_type":"way",
+ "osm_id":77780940,
+ "attractiveness":17,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "83":{
+ "name":"Vigne du Clos Montmartre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8882459,
+ 2.3402042
+ ],
+ "osm_type":"way",
+ "osm_id":77784652,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "84":{
+ "name":"Piscine des Amiraux",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8943494,
+ 2.3510361
+ ],
+ "osm_type":"way",
+ "osm_id":78020880,
+ "attractiveness":20,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "85":{
+ "name":"Les Docks - Cité de la Mode et du Design",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8408136,
+ 2.3699923
+ ],
+ "osm_type":"way",
+ "osm_id":78535563,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "86":{
+ "name":"Grande Volière",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8447239,
+ 2.3589567
+ ],
+ "osm_type":"way",
+ "osm_id":83976054,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "87":{
+ "name":"École Militaire",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8518517,
+ 2.3048526
+ ],
+ "osm_type":"way",
+ "osm_id":106312008,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "88":{
+ "name":"Église du Dôme",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8550021,
+ 2.3125391
+ ],
+ "osm_type":"way",
+ "osm_id":112452790,
+ "attractiveness":25,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "89":{
+ "name":"Grande cascade",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8796564,
+ 2.3837284
+ ],
+ "osm_type":"way",
+ "osm_id":125420674,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "90":{
+ "name":"Jardin du Luxembourg",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8467137,
+ 2.3363649
+ ],
+ "osm_type":"way",
+ "osm_id":128206209,
+ "attractiveness":35,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "91":{
+ "name":"Jardin Catherine Labouré",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8510562,
+ 2.320532
+ ],
+ "osm_type":"way",
+ "osm_id":148481812,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "92":{
+ "name":"École nationale supérieure des beaux-arts",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8571292,
+ 2.3338015
+ ],
+ "osm_type":"way",
+ "osm_id":148485612,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "93":{
+ "name":"Carrousel de Montmartre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8846882,
+ 2.3432257
+ ],
+ "osm_type":"way",
+ "osm_id":163689495,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "94":{
+ "name":"Assemblée nationale",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8617532,
+ 2.317959
+ ],
+ "osm_type":"way",
+ "osm_id":175448742,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "95":{
+ "name":"Bateaux-Mouches",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.863978,
+ 2.3058261
+ ],
+ "osm_type":"way",
+ "osm_id":182821008,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "96":{
+ "name":"Cathédrale Notre-Dame de Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8529372,
+ 2.3498701
+ ],
+ "osm_type":"way",
+ "osm_id":201611261,
+ "attractiveness":55,
+ "must_do":false,
+ "n_tags":54,
+ "time_to_reach":0
+ },
+ "97":{
+ "name":"Arc de Triomphe du Carrousel",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8617276,
+ 2.3329082
+ ],
+ "osm_type":"way",
+ "osm_id":227483542,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "98":{
+ "name":"Théâtre équestre Zingaro",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9126799,
+ 2.4030614
+ ],
+ "osm_type":"way",
+ "osm_id":244847783,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "99":{
+ "name":"Rue du Mont Cenis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8878142,
+ 2.3416721
+ ],
+ "osm_type":"way",
+ "osm_id":246993053,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "100":{
+ "name":"Cavae des Arènes de Lutèce",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8450776,
+ 2.352912
+ ],
+ "osm_type":"way",
+ "osm_id":406229046,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "101":{
+ "name":"Méridienne de l'Observatoire de Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8365027,
+ 2.336524
+ ],
+ "osm_type":"way",
+ "osm_id":515068430,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "102":{
+ "name":"Passerelle Mornay",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8492111,
+ 2.3671376
+ ],
+ "osm_type":"way",
+ "osm_id":568554914,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "103":{
+ "name":"Rue du Mont Cenis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8879175,
+ 2.3417144
+ ],
+ "osm_type":"way",
+ "osm_id":897673778,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "104":{
+ "name":"Labyrinthe",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8353618,
+ 2.3817702
+ ],
+ "osm_type":"way",
+ "osm_id":1087988490,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "105":{
+ "name":"Maison à l'enseigne du Faucheur",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8558553,
+ 2.3568266
+ ],
+ "osm_type":"way",
+ "osm_id":1123456865,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "106":{
+ "name":"Maison à l'enseigne du Mouton",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8558431,
+ 2.3568914
+ ],
+ "osm_type":"way",
+ "osm_id":1123456866,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "107":{
+ "name":"Batman Escape",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8966537,
+ 2.3889026
+ ],
+ "osm_type":"way",
+ "osm_id":1242464921,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "108":{
+ "name":"Shuffled",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8964051,
+ 2.3885577
+ ],
+ "osm_type":"way",
+ "osm_id":1242464922,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "109":{
+ "name":"Quiz Room",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8960863,
+ 2.3889322
+ ],
+ "osm_type":"way",
+ "osm_id":1242464924,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "110":{
+ "name":"Les Grandes Serres du Jardin des Plantes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.84301,
+ 2.3567734
+ ],
+ "osm_type":"way",
+ "osm_id":1288442711,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "111":{
+ "name":"Palais de Justice de Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8556537,
+ 2.3446072
+ ],
+ "osm_type":"relation",
+ "osm_id":536982,
+ "attractiveness":24,
+ "must_do":false,
+ "n_tags":24,
+ "time_to_reach":0
+ },
+ "112":{
+ "name":"Palais de l'Élysée",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8703766,
+ 2.3166056
+ ],
+ "osm_type":"relation",
+ "osm_id":1060803,
+ "attractiveness":32,
+ "must_do":false,
+ "n_tags":32,
+ "time_to_reach":0
+ },
+ "113":{
+ "name":"Hôtel de la Marine",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8669318,
+ 2.323065
+ ],
+ "osm_type":"relation",
+ "osm_id":1060822,
+ "attractiveness":18,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "114":{
+ "name":"Hôtel des Invalides",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8559525,
+ 2.3125541
+ ],
+ "osm_type":"relation",
+ "osm_id":1463538,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "115":{
+ "name":"Rotonde de Chartres",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8802542,
+ 2.3090835
+ ],
+ "osm_type":"relation",
+ "osm_id":3066029,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "116":{
+ "name":"La Samaritaine",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8592672,
+ 2.3424349
+ ],
+ "osm_type":"relation",
+ "osm_id":3075632,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "117":{
+ "name":"Palais du Louvre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8614768,
+ 2.3351677
+ ],
+ "osm_type":"relation",
+ "osm_id":3262297,
+ "attractiveness":32,
+ "must_do":false,
+ "n_tags":32,
+ "time_to_reach":0
+ },
+ "118":{
+ "name":"Hôtel de Soubise",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8603506,
+ 2.3576045
+ ],
+ "osm_type":"relation",
+ "osm_id":3371164,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "119":{
+ "name":"Mémorial des Martyrs de la Déportation",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8517365,
+ 2.3524734
+ ],
+ "osm_type":"relation",
+ "osm_id":9396191,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "120":{
+ "name":"Galerie J. Kugel",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8616442,
+ 2.3214268
+ ],
+ "osm_type":"way",
+ "osm_id":63564054,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "121":{
+ "name":"Galerie Montmartre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8862806,
+ 2.3406794
+ ],
+ "osm_type":"way",
+ "osm_id":70716925,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "122":{
+ "name":"Cinémathèque Française",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.837002,
+ 2.3826461
+ ],
+ "osm_type":"way",
+ "osm_id":78271385,
+ "attractiveness":26,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "123":{
+ "name":"Espace Louise Michel",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8717602,
+ 2.3914301
+ ],
+ "osm_type":"way",
+ "osm_id":389174690,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "124":{
+ "name":"Galerie Jeanne Bucher",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8548334,
+ 2.3372317
+ ],
+ "osm_type":"way",
+ "osm_id":563066953,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "125":{
+ "name":"Galerie Lara Vincy",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8551889,
+ 2.3371175
+ ],
+ "osm_type":"relation",
+ "osm_id":1401754,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "126":{
+ "name":"Pont Alexandre III",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8636423,
+ 2.3135438
+ ],
+ "osm_type":"way",
+ "osm_id":17067006,
+ "attractiveness":20,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "127":{
+ "name":"Passage Brady",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8716134,
+ 2.3537153
+ ],
+ "osm_type":"way",
+ "osm_id":29709952,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "128":{
+ "name":"Fort de Romainville",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8858276,
+ 2.4235273
+ ],
+ "osm_type":"way",
+ "osm_id":38767074,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "129":{
+ "name":"Cabinet d'Histoire (Hôtel de Magny)",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8438711,
+ 2.3567387
+ ],
+ "osm_type":"way",
+ "osm_id":42332581,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "130":{
+ "name":"Fontaine des Innocents",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8606368,
+ 2.3480233
+ ],
+ "osm_type":"way",
+ "osm_id":52469222,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "131":{
+ "name":"Ministère de la Justice",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8677422,
+ 2.3283905
+ ],
+ "osm_type":"way",
+ "osm_id":54175265,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "132":{
+ "name":"Hôtel Saint-Florentin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8667066,
+ 2.3240813
+ ],
+ "osm_type":"way",
+ "osm_id":54177935,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "133":{
+ "name":"Palais Brongniart",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8691399,
+ 2.3413669
+ ],
+ "osm_type":"way",
+ "osm_id":54657155,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":19,
+ "time_to_reach":0
+ },
+ "134":{
+ "name":"Théâtre Daunou",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8692654,
+ 2.3318641
+ ],
+ "osm_type":"way",
+ "osm_id":54730662,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "135":{
+ "name":"Hôtel de Sens",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8535257,
+ 2.3588733
+ ],
+ "osm_type":"way",
+ "osm_id":55541122,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "136":{
+ "name":"Hôtel d'Ourscamp",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8555465,
+ 2.3571206
+ ],
+ "osm_type":"way",
+ "osm_id":55620201,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "137":{
+ "name":"Pavillon Curie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8442282,
+ 2.3447813
+ ],
+ "osm_type":"way",
+ "osm_id":56066139,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "138":{
+ "name":"Gustave Flaubert",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8461321,
+ 2.3392722
+ ],
+ "osm_type":"way",
+ "osm_id":62874967,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "139":{
+ "name":"Charles Baudelaire",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8445903,
+ 2.3347138
+ ],
+ "osm_type":"way",
+ "osm_id":62874970,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "140":{
+ "name":"Regard des Maussins",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8775024,
+ 2.4070003
+ ],
+ "osm_type":"way",
+ "osm_id":63224543,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "141":{
+ "name":"Temple de la Sybille",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8810739,
+ 2.3830756
+ ],
+ "osm_type":"way",
+ "osm_id":63224946,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "142":{
+ "name":"Hôtel de Beauharnais",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8609496,
+ 2.3223731
+ ],
+ "osm_type":"way",
+ "osm_id":63564160,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "143":{
+ "name":"Hôtel de Seignelay",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8611599,
+ 2.3218256
+ ],
+ "osm_type":"way",
+ "osm_id":63564188,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "144":{
+ "name":"Statue du Maréchal Ney",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8400358,
+ 2.3363445
+ ],
+ "osm_type":"way",
+ "osm_id":63844704,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "145":{
+ "name":"Statue de Gribeauval",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8567922,
+ 2.3117336
+ ],
+ "osm_type":"way",
+ "osm_id":64955010,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "146":{
+ "name":"Restaurant Inter-administratif de La Tour-Maubourg",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8569213,
+ 2.3106008
+ ],
+ "osm_type":"way",
+ "osm_id":64955021,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "147":{
+ "name":"Hôtel de Broglie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8594578,
+ 2.3186134
+ ],
+ "osm_type":"way",
+ "osm_id":65090089,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "148":{
+ "name":"Hôtel de Choiseul-Praslin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8478008,
+ 2.3203873
+ ],
+ "osm_type":"way",
+ "osm_id":65756922,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "149":{
+ "name":"Hôtel Perrinet de Jars",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8689989,
+ 2.3198424
+ ],
+ "osm_type":"way",
+ "osm_id":67106925,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "150":{
+ "name":"Hôtel de Coislin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8671412,
+ 2.3219906
+ ],
+ "osm_type":"way",
+ "osm_id":67109756,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "151":{
+ "name":"Hôtel de Marigny",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8706645,
+ 2.3152357
+ ],
+ "osm_type":"way",
+ "osm_id":67356259,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "152":{
+ "name":"Statue équestre de Jeanne D'Arc",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8754445,
+ 2.3194466
+ ],
+ "osm_type":"way",
+ "osm_id":67501479,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "153":{
+ "name":"Chapelle expiatoire",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.873695,
+ 2.3227605
+ ],
+ "osm_type":"way",
+ "osm_id":67557301,
+ "attractiveness":27,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "154":{
+ "name":"Ambroise Thomas",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8793316,
+ 2.3098167
+ ],
+ "osm_type":"way",
+ "osm_id":68335779,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "155":{
+ "name":"Charles Gounod",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8790161,
+ 2.3096819
+ ],
+ "osm_type":"way",
+ "osm_id":68335800,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "156":{
+ "name":"Statue de Jules Simon",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8765636,
+ 2.3181311
+ ],
+ "osm_type":"way",
+ "osm_id":68507719,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "157":{
+ "name":"Hôtel Biron",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8553042,
+ 2.3158567
+ ],
+ "osm_type":"way",
+ "osm_id":68568682,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "158":{
+ "name":"Hôtel de Boisgelin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8542063,
+ 2.3220164
+ ],
+ "osm_type":"way",
+ "osm_id":68571250,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "159":{
+ "name":"Hôtel de Cassini",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8519819,
+ 2.3209847
+ ],
+ "osm_type":"way",
+ "osm_id":68571376,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "160":{
+ "name":"Monument aux morts de la guerre de 1870",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8508444,
+ 2.3060662
+ ],
+ "osm_type":"way",
+ "osm_id":68906600,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "161":{
+ "name":"Lucien Guitry",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8575685,
+ 2.2987061
+ ],
+ "osm_type":"way",
+ "osm_id":69034522,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "162":{
+ "name":"foyer de l'Union chrétienne des Jeunes Gens de Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8735161,
+ 2.3455333
+ ],
+ "osm_type":"way",
+ "osm_id":69220148,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "163":{
+ "name":"Jules Ferry",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8637034,
+ 2.3311345
+ ],
+ "osm_type":"way",
+ "osm_id":69289019,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "164":{
+ "name":"Monument de la reconnaissance de la Belgique à la France",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8649226,
+ 2.3029298
+ ],
+ "osm_type":"way",
+ "osm_id":69325365,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "165":{
+ "name":"Synagogue Buffault",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8761054,
+ 2.3425466
+ ],
+ "osm_type":"way",
+ "osm_id":69417432,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "166":{
+ "name":"Regard Saint-Martin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8714699,
+ 2.3914759
+ ],
+ "osm_type":"way",
+ "osm_id":70001651,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "167":{
+ "name":"Regard de la Prise des Eaux du Pré Saint-Gervais",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8830678,
+ 2.4035516
+ ],
+ "osm_type":"way",
+ "osm_id":73248961,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "168":{
+ "name":"Monument aux Morts",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8824789,
+ 2.4117533
+ ],
+ "osm_type":"way",
+ "osm_id":73429126,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "169":{
+ "name":"Château de Saint-Ouen",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9165342,
+ 2.3295132
+ ],
+ "osm_type":"way",
+ "osm_id":73835424,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "170":{
+ "name":"Maison du Peuple",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9013075,
+ 2.3146603
+ ],
+ "osm_type":"way",
+ "osm_id":74472720,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "171":{
+ "name":"Église Saint-Michel des Batignolles",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8890756,
+ 2.3246346
+ ],
+ "osm_type":"way",
+ "osm_id":75748771,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "172":{
+ "name":"Buste de Frédérick Lemaître",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8689148,
+ 2.3671974
+ ],
+ "osm_type":"way",
+ "osm_id":76910105,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "173":{
+ "name":"Barrière du Trône - Philippe Auguste",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8479768,
+ 2.3984297
+ ],
+ "osm_type":"way",
+ "osm_id":77385192,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "174":{
+ "name":"Lafayette",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8644688,
+ 2.3118747
+ ],
+ "osm_type":"way",
+ "osm_id":77441324,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "175":{
+ "name":"Sir Winston Churchill",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8652836,
+ 2.313998
+ ],
+ "osm_type":"way",
+ "osm_id":77441386,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "176":{
+ "name":"Chapelle Saint-Louis de la Salpêtrière",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8389393,
+ 2.3641414
+ ],
+ "osm_type":"way",
+ "osm_id":78535716,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "177":{
+ "name":"Buste de Johann Strauss",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8685147,
+ 2.359769
+ ],
+ "osm_type":"way",
+ "osm_id":78548940,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "178":{
+ "name":"Buste du Baron Taylor",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8684152,
+ 2.3602387
+ ],
+ "osm_type":"way",
+ "osm_id":78548956,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "179":{
+ "name":"Maison du Fontainier",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8371365,
+ 2.3361474
+ ],
+ "osm_type":"way",
+ "osm_id":79611339,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "180":{
+ "name":"Laboratoire de Marie Curie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8445397,
+ 2.3557684
+ ],
+ "osm_type":"way",
+ "osm_id":83976060,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "181":{
+ "name":"Théophile Roussel",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8381304,
+ 2.336329
+ ],
+ "osm_type":"way",
+ "osm_id":87334030,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "182":{
+ "name":"Albert Ier de Belgique",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8646042,
+ 2.3182703
+ ],
+ "osm_type":"way",
+ "osm_id":92316083,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "183":{
+ "name":"Hommage à Komitas et aux victimes du Génocide arménien",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8644161,
+ 2.3098206
+ ],
+ "osm_type":"way",
+ "osm_id":92316090,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "184":{
+ "name":"Monument à Barye",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8500715,
+ 2.3596846
+ ],
+ "osm_type":"way",
+ "osm_id":92316091,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "185":{
+ "name":"Flamme de la Liberté",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8641848,
+ 2.3008761
+ ],
+ "osm_type":"way",
+ "osm_id":92316094,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "186":{
+ "name":"Enceinte de Philippe Auguste",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8457554,
+ 2.3498529
+ ],
+ "osm_type":"way",
+ "osm_id":92316120,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "187":{
+ "name":"Statue de Frémiet",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8435606,
+ 2.3640026
+ ],
+ "osm_type":"way",
+ "osm_id":95475832,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "188":{
+ "name":"Jeanne d'Arc",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8638791,
+ 2.332187
+ ],
+ "osm_type":"way",
+ "osm_id":96156233,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "189":{
+ "name":"Passage Brady",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8708984,
+ 2.3564843
+ ],
+ "osm_type":"way",
+ "osm_id":111652423,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "190":{
+ "name":"Passage Brady",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8714268,
+ 2.3544455
+ ],
+ "osm_type":"way",
+ "osm_id":111652425,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "191":{
+ "name":"Passage Brady",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.871183,
+ 2.3553029
+ ],
+ "osm_type":"way",
+ "osm_id":111652428,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "192":{
+ "name":"Le Triomphe de la République",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8483868,
+ 2.3959148
+ ],
+ "osm_type":"way",
+ "osm_id":114877477,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "193":{
+ "name":"Alfred de Musset - Le Rêve du Poète",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8652022,
+ 2.3106561
+ ],
+ "osm_type":"way",
+ "osm_id":115310616,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "194":{
+ "name":"Le Jardin des Souvenirs",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8392848,
+ 2.3243192
+ ],
+ "osm_type":"way",
+ "osm_id":116797447,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "195":{
+ "name":"Hôtel de Bourvallais",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.868132,
+ 2.3278504
+ ],
+ "osm_type":"way",
+ "osm_id":148573267,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "196":{
+ "name":"Couvent des Cordelières",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8346857,
+ 2.3474291
+ ],
+ "osm_type":"way",
+ "osm_id":154161345,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "197":{
+ "name":"Enceinte de Charles V",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8496798,
+ 2.3669734
+ ],
+ "osm_type":"way",
+ "osm_id":159220788,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "198":{
+ "name":"La Naissance des formes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8394586,
+ 2.3300121
+ ],
+ "osm_type":"way",
+ "osm_id":169987897,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "199":{
+ "name":"Hôtel de Lassay",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8621594,
+ 2.317297
+ ],
+ "osm_type":"way",
+ "osm_id":175448743,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "200":{
+ "name":"Pelletier et Caventou",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8440542,
+ 2.3391841
+ ],
+ "osm_type":"way",
+ "osm_id":182697269,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "201":{
+ "name":"Monument à Eugène Flachat",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8869533,
+ 2.3007728
+ ],
+ "osm_type":"way",
+ "osm_id":208763266,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "202":{
+ "name":"Chapelle Notre-Dame-des-Anges",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8462836,
+ 2.3235558
+ ],
+ "osm_type":"way",
+ "osm_id":219378497,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "203":{
+ "name":"Fontaine du Palmier",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8575005,
+ 2.3472864
+ ],
+ "osm_type":"way",
+ "osm_id":261092850,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "204":{
+ "name":"Élisabeth Alexandrovna Stroganoff",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8595742,
+ 2.3949387
+ ],
+ "osm_type":"way",
+ "osm_id":267099784,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "205":{
+ "name":"Félix de Beaujour",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8631336,
+ 2.3933669
+ ],
+ "osm_type":"way",
+ "osm_id":312059802,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "206":{
+ "name":"Héloïse et Abélard",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8591931,
+ 2.391914
+ ],
+ "osm_type":"way",
+ "osm_id":313811735,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "207":{
+ "name":"René Panhard",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8583882,
+ 2.3956719
+ ],
+ "osm_type":"way",
+ "osm_id":314136876,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "208":{
+ "name":"Gradins",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8452977,
+ 2.3525509
+ ],
+ "osm_type":"way",
+ "osm_id":406229048,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "209":{
+ "name":"Gradins",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8448391,
+ 2.352799
+ ],
+ "osm_type":"way",
+ "osm_id":406229049,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "210":{
+ "name":"Monument commémoratif de la campagne de Tunisie 1942-1943",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8626695,
+ 2.3065038
+ ],
+ "osm_type":"way",
+ "osm_id":427592604,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "211":{
+ "name":"Hôtel du ministre des Affaires étrangères",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8622524,
+ 2.3161364
+ ],
+ "osm_type":"way",
+ "osm_id":448794899,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "212":{
+ "name":"Aqueduc de la Dhuis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8823637,
+ 2.4664022
+ ],
+ "osm_type":"way",
+ "osm_id":511817523,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "213":{
+ "name":"Aqueduc Médicis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8330712,
+ 2.3347603
+ ],
+ "osm_type":"way",
+ "osm_id":755054078,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "214":{
+ "name":"Eugène Carrière",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8894615,
+ 2.3372122
+ ],
+ "osm_type":"way",
+ "osm_id":868154414,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "215":{
+ "name":"Folie Janvier N8",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8904535,
+ 2.392291
+ ],
+ "osm_type":"way",
+ "osm_id":869111628,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "216":{
+ "name":"Folie douce N7",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8913598,
+ 2.3913515
+ ],
+ "osm_type":"way",
+ "osm_id":869111631,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "217":{
+ "name":"Colonne Médicis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8625255,
+ 2.3429926
+ ],
+ "osm_type":"way",
+ "osm_id":942543401,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "218":{
+ "name":"Casimir Périer",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8600309,
+ 2.3936438
+ ],
+ "osm_type":"way",
+ "osm_id":948640834,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "219":{
+ "name":"Tour Montgomery",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8540767,
+ 2.3607517
+ ],
+ "osm_type":"way",
+ "osm_id":1029627185,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "220":{
+ "name":"Monument bombardement",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9128785,
+ 2.3392332
+ ],
+ "osm_type":"way",
+ "osm_id":1087597077,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "221":{
+ "name":"Passage Brady",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8710466,
+ 2.3559617
+ ],
+ "osm_type":"way",
+ "osm_id":1194238628,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "222":{
+ "name":"Famille Boucicaut",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8396133,
+ 2.3274421
+ ],
+ "osm_type":"way",
+ "osm_id":1197780546,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "223":{
+ "name":"Famille Gautier",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8391596,
+ 2.3267588
+ ],
+ "osm_type":"way",
+ "osm_id":1197815660,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "224":{
+ "name":"Famille Levrat",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8389995,
+ 2.3266301
+ ],
+ "osm_type":"way",
+ "osm_id":1197815662,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "225":{
+ "name":"Honore Champion",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8388004,
+ 2.3263708
+ ],
+ "osm_type":"way",
+ "osm_id":1197824735,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "226":{
+ "name":"Famille Raspail",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8386871,
+ 2.3267555
+ ],
+ "osm_type":"way",
+ "osm_id":1197824736,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "227":{
+ "name":"leon Cinain 1826-1898",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8386236,
+ 2.3268642
+ ],
+ "osm_type":"way",
+ "osm_id":1197824741,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "228":{
+ "name":"Famille Valentin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8383689,
+ 2.3269937
+ ],
+ "osm_type":"way",
+ "osm_id":1197824742,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "229":{
+ "name":"Alex Berdal",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8379043,
+ 2.3267576
+ ],
+ "osm_type":"way",
+ "osm_id":1197824743,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "230":{
+ "name":"François Gérard",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8378264,
+ 2.3266232
+ ],
+ "osm_type":"way",
+ "osm_id":1197824744,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "231":{
+ "name":"Alexandre Duval",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8376084,
+ 2.3255649
+ ],
+ "osm_type":"way",
+ "osm_id":1197824749,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "232":{
+ "name":"Famille Lormand",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8377157,
+ 2.3245734
+ ],
+ "osm_type":"way",
+ "osm_id":1197824751,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "233":{
+ "name":"Famille Cohen Jonathan",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8372213,
+ 2.325048
+ ],
+ "osm_type":"way",
+ "osm_id":1197824752,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "234":{
+ "name":"Famille Reville",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8391171,
+ 2.3267211
+ ],
+ "osm_type":"way",
+ "osm_id":1197824760,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "235":{
+ "name":"Henri Langlois",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.839361,
+ 2.3268349
+ ],
+ "osm_type":"way",
+ "osm_id":1197824761,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "236":{
+ "name":"ROITEL ROSSIGNOL CHAVONNET",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8633785,
+ 2.3910919
+ ],
+ "osm_type":"way",
+ "osm_id":1210561856,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "237":{
+ "name":"Miłosz Magin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8596959,
+ 2.3928033
+ ],
+ "osm_type":"way",
+ "osm_id":1210797361,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "238":{
+ "name":"Hyacinthe Loyson",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8607659,
+ 2.3942863
+ ],
+ "osm_type":"way",
+ "osm_id":1210797368,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "239":{
+ "name":"Louis Joseph Gay-Lussac",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8606664,
+ 2.3946804
+ ],
+ "osm_type":"way",
+ "osm_id":1210797381,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "240":{
+ "name":"Alphonse Daudet",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8601739,
+ 2.3953057
+ ],
+ "osm_type":"way",
+ "osm_id":1210797385,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "241":{
+ "name":"Gaspard Monge",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8603102,
+ 2.3936584
+ ],
+ "osm_type":"way",
+ "osm_id":1211895435,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "242":{
+ "name":"Famille Mure",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.85862,
+ 2.3933043
+ ],
+ "osm_type":"way",
+ "osm_id":1211901758,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "243":{
+ "name":"Famille Chalier",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8621379,
+ 2.3894202
+ ],
+ "osm_type":"way",
+ "osm_id":1212094025,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "244":{
+ "name":"Mémorial de l'ancienne Gare de Déportation de Bobigny",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9105038,
+ 2.429875
+ ],
+ "osm_type":"way",
+ "osm_id":1236950477,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "245":{
+ "name":"Hôtel de Gillier",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8518195,
+ 2.3583351
+ ],
+ "osm_type":"relation",
+ "osm_id":554046,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "246":{
+ "name":"Hôtel Lambert",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8509959,
+ 2.359633
+ ],
+ "osm_type":"relation",
+ "osm_id":554060,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "247":{
+ "name":"Noviciat des Dominicains",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8561352,
+ 2.3284496
+ ],
+ "osm_type":"relation",
+ "osm_id":1002118,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "248":{
+ "name":"Hôtel de Crillon",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8676142,
+ 2.3213457
+ ],
+ "osm_type":"relation",
+ "osm_id":1060804,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":19,
+ "time_to_reach":0
+ },
+ "249":{
+ "name":"Hôtel de Plessis-Bellière",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8673773,
+ 2.3216352
+ ],
+ "osm_type":"relation",
+ "osm_id":1060806,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "250":{
+ "name":"Hôtel de Matignon",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8544393,
+ 2.320661
+ ],
+ "osm_type":"relation",
+ "osm_id":1076880,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "251":{
+ "name":"Hôtel de la Païva",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8691584,
+ 2.3075317
+ ],
+ "osm_type":"relation",
+ "osm_id":1086118,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "252":{
+ "name":"Hôtel Gaillard",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8817972,
+ 2.3105214
+ ],
+ "osm_type":"relation",
+ "osm_id":1261334,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "253":{
+ "name":"Ligne de Petite Ceinture",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8597838,
+ 2.3341775
+ ],
+ "osm_type":"relation",
+ "osm_id":1536589,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "254":{
+ "name":"Châtelet du Château de Vincennes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8426709,
+ 2.4347268
+ ],
+ "osm_type":"relation",
+ "osm_id":1559341,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "255":{
+ "name":"Aqueduc de la Dhuis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9609906,
+ 2.9839389
+ ],
+ "osm_type":"relation",
+ "osm_id":1599153,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "256":{
+ "name":"Porte Saint-Denis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8697934,
+ 2.3526868
+ ],
+ "osm_type":"relation",
+ "osm_id":3170072,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":19,
+ "time_to_reach":0
+ },
+ "257":{
+ "name":"Hôpital Saint-Louis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8733451,
+ 2.3678812
+ ],
+ "osm_type":"relation",
+ "osm_id":10714750,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "258":{
+ "name":"Voie Romaine Paris -Dreux",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.7963521,
+ 1.8559602
+ ],
+ "osm_type":"relation",
+ "osm_id":15488534,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "259":{
+ "name":"Église Saint-Séverin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8520913,
+ 2.3457237
+ ],
+ "osm_type":"way",
+ "osm_id":19740659,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":25,
+ "time_to_reach":0
+ },
+ "260":{
+ "name":"Église Saint-Pierre de Montmartre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8867199,
+ 2.3420645
+ ],
+ "osm_type":"way",
+ "osm_id":23884336,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "261":{
+ "name":"Église Notre-Dame de l'Arche d'Alliance",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8366689,
+ 2.3085491
+ ],
+ "osm_type":"way",
+ "osm_id":24303512,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "262":{
+ "name":"Église Notre-Dame-de-Lorette",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8764338,
+ 2.3389235
+ ],
+ "osm_type":"way",
+ "osm_id":25688622,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "263":{
+ "name":"Église Notre-Dame de Clignancourt",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.89314,
+ 2.3450441
+ ],
+ "osm_type":"way",
+ "osm_id":36855293,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "264":{
+ "name":"Synagogue de la rue Sainte-Isaure",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8936801,
+ 2.3438876
+ ],
+ "osm_type":"way",
+ "osm_id":41506069,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "265":{
+ "name":"Synagogue Chivté Israël",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8433943,
+ 2.3866038
+ ],
+ "osm_type":"way",
+ "osm_id":42311107,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "266":{
+ "name":"Église Sainte-Hélène",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8965278,
+ 2.342435
+ ],
+ "osm_type":"way",
+ "osm_id":48974965,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "267":{
+ "name":"Église de la Sainte-Trinité",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8773025,
+ 2.3313881
+ ],
+ "osm_type":"way",
+ "osm_id":49872150,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":19,
+ "time_to_reach":0
+ },
+ "268":{
+ "name":"Église Saint-Leu - Saint-Gilles",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8628813,
+ 2.3500683
+ ],
+ "osm_type":"way",
+ "osm_id":53933240,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "269":{
+ "name":"Basilique Notre-Dame-des-Victoires",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8667853,
+ 2.3409551
+ ],
+ "osm_type":"way",
+ "osm_id":54661742,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":24,
+ "time_to_reach":0
+ },
+ "270":{
+ "name":"Église Notre-Dame-de-Bonne-Nouvelle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8695324,
+ 2.3500407
+ ],
+ "osm_type":"way",
+ "osm_id":55178129,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":22,
+ "time_to_reach":0
+ },
+ "271":{
+ "name":"Église Saint-Louis-en-l'Île",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8512802,
+ 2.3575796
+ ],
+ "osm_type":"way",
+ "osm_id":55314295,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "272":{
+ "name":"Église Saint-Étienne-du-Mont",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8465485,
+ 2.3480584
+ ],
+ "osm_type":"way",
+ "osm_id":55343672,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "273":{
+ "name":"Église Orthodoxe Roumaine des Saints Archanges",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.849488,
+ 2.3471975
+ ],
+ "osm_type":"way",
+ "osm_id":55366403,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "274":{
+ "name":"Église Saint-Merri",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8590777,
+ 2.3508448
+ ],
+ "osm_type":"way",
+ "osm_id":55742120,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "275":{
+ "name":"Temple du Marais",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8533048,
+ 2.3662365
+ ],
+ "osm_type":"way",
+ "osm_id":56206112,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "276":{
+ "name":"Église Sainte-Elisabeth",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8661005,
+ 2.3605378
+ ],
+ "osm_type":"way",
+ "osm_id":56457505,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "277":{
+ "name":"Synagogue Vauquelin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8410205,
+ 2.3476178
+ ],
+ "osm_type":"way",
+ "osm_id":56693739,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "278":{
+ "name":"Chapelle de la congrégation du Saint-Esprit",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8428826,
+ 2.34671
+ ],
+ "osm_type":"way",
+ "osm_id":56771095,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "279":{
+ "name":"Maison Fraternelle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8422143,
+ 2.3484675
+ ],
+ "osm_type":"way",
+ "osm_id":57380517,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "280":{
+ "name":"Église du Val-de-Grâce",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8405269,
+ 2.3419263
+ ],
+ "osm_type":"way",
+ "osm_id":59846865,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "281":{
+ "name":"Église Notre-Dame-des-Vertus",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9145379,
+ 2.3826684
+ ],
+ "osm_type":"way",
+ "osm_id":61981374,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "282":{
+ "name":"Église Saint-Ouen",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9189423,
+ 2.3315386
+ ],
+ "osm_type":"way",
+ "osm_id":62003063,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "283":{
+ "name":"Église Saint-Germain des Prés",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8539667,
+ 2.334463
+ ],
+ "osm_type":"way",
+ "osm_id":62287173,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "284":{
+ "name":"Chapelle Notre-Dame de la Sagesse",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8356931,
+ 2.3735362
+ ],
+ "osm_type":"way",
+ "osm_id":62379741,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "285":{
+ "name":"Église Evangélique Baptiste",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8588762,
+ 2.3292649
+ ],
+ "osm_type":"way",
+ "osm_id":63149138,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "286":{
+ "name":"Église Saint-Laurent",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.874774,
+ 2.3583086
+ ],
+ "osm_type":"way",
+ "osm_id":63200612,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "287":{
+ "name":"Chapelle de l'hôpital Saint-Louis",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8740835,
+ 2.3661993
+ ],
+ "osm_type":"way",
+ "osm_id":63200644,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "288":{
+ "name":"Église Saint-Joseph-Artisan",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8813655,
+ 2.3677357
+ ],
+ "osm_type":"way",
+ "osm_id":63203063,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "289":{
+ "name":"Église Saint-Jean-Baptiste de Belleville",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8756563,
+ 2.3893068
+ ],
+ "osm_type":"way",
+ "osm_id":63212231,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "290":{
+ "name":"Synagogue Michkenot Israël",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8825966,
+ 2.3733068
+ ],
+ "osm_type":"way",
+ "osm_id":63212274,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "291":{
+ "name":"Église Notre-Dame-de-l'Assomption des Buttes-Chaumont",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8840257,
+ 2.3785052
+ ],
+ "osm_type":"way",
+ "osm_id":63213611,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "292":{
+ "name":"Église Sainte-Claire d'Assise",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8888017,
+ 2.3950208
+ ],
+ "osm_type":"way",
+ "osm_id":63234079,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "293":{
+ "name":"Temple Antoiniste",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.878948,
+ 2.3975957
+ ],
+ "osm_type":"way",
+ "osm_id":63234870,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "294":{
+ "name":"Église Saint-Serge",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8833592,
+ 2.3837675
+ ],
+ "osm_type":"way",
+ "osm_id":63237639,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "295":{
+ "name":"Église Saint-Joseph des Carmes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8485199,
+ 2.3302805
+ ],
+ "osm_type":"way",
+ "osm_id":63370983,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "296":{
+ "name":"Mosquée Omar bn El Khattab",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8679659,
+ 2.3772772
+ ],
+ "osm_type":"way",
+ "osm_id":63638391,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "297":{
+ "name":"Église Réformée du Luxembourg",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8474963,
+ 2.3314096
+ ],
+ "osm_type":"way",
+ "osm_id":63681841,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "298":{
+ "name":"Église Saint-Jean-des-Grésillons",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9189774,
+ 2.3003288
+ ],
+ "osm_type":"way",
+ "osm_id":63957950,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "299":{
+ "name":"Église Sainte-Geneviève",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9082792,
+ 2.3574826
+ ],
+ "osm_type":"way",
+ "osm_id":63982213,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "300":{
+ "name":"Église Saint-Jacques Saint-Christophe",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8892855,
+ 2.3797641
+ ],
+ "osm_type":"way",
+ "osm_id":64037954,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "301":{
+ "name":"Église Notre-Dame des Foyers",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8869224,
+ 2.3699944
+ ],
+ "osm_type":"way",
+ "osm_id":64038747,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "302":{
+ "name":"Église Notre-Dame des Champs",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8434561,
+ 2.3271121
+ ],
+ "osm_type":"way",
+ "osm_id":64121803,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "303":{
+ "name":"Centre Quaker International",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8458964,
+ 2.3216199
+ ],
+ "osm_type":"way",
+ "osm_id":64315031,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "304":{
+ "name":"Basilique Sainte-Clotilde",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.858317,
+ 2.3192039
+ ],
+ "osm_type":"way",
+ "osm_id":64952290,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "305":{
+ "name":"Église Saint-Yves-des-Quatre-Routes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9195187,
+ 2.4123168
+ ],
+ "osm_type":"way",
+ "osm_id":67181873,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "306":{
+ "name":"Église anglicane Saint-Michael",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8700841,
+ 2.3190066
+ ],
+ "osm_type":"way",
+ "osm_id":67233894,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "307":{
+ "name":"Église protestante unie du Saint-Esprit",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.873222,
+ 2.3198533
+ ],
+ "osm_type":"way",
+ "osm_id":67350058,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "308":{
+ "name":"Église Saint-Augustin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8761942,
+ 2.3188756
+ ],
+ "osm_type":"way",
+ "osm_id":67501490,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "309":{
+ "name":"Église Saint-André de l'Europe",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8815247,
+ 2.3258345
+ ],
+ "osm_type":"way",
+ "osm_id":68256672,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "310":{
+ "name":"Chapelle Baltard",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8735777,
+ 2.3103416
+ ],
+ "osm_type":"way",
+ "osm_id":68831265,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "311":{
+ "name":"Chapelle Notre-Dame de l'Annonciation",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8760259,
+ 2.3039392
+ ],
+ "osm_type":"way",
+ "osm_id":68991281,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "312":{
+ "name":"Synagogue Rashi",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8744883,
+ 2.3475592
+ ],
+ "osm_type":"way",
+ "osm_id":69221039,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "313":{
+ "name":"Consistoire",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8757851,
+ 2.3369238
+ ],
+ "osm_type":"way",
+ "osm_id":69363791,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "314":{
+ "name":"Église Luthérienne Saint-Jean",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8574433,
+ 2.3080496
+ ],
+ "osm_type":"way",
+ "osm_id":69884208,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "315":{
+ "name":"Église Protestante Unie de Paris-Belleville",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8726445,
+ 2.3819387
+ ],
+ "osm_type":"way",
+ "osm_id":69999948,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "316":{
+ "name":"Église Notre-Dame-des-Otages",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8741661,
+ 2.4028427
+ ],
+ "osm_type":"way",
+ "osm_id":70001758,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "317":{
+ "name":"Église Notre-Dame-de-la-Croix",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8686123,
+ 2.3874809
+ ],
+ "osm_type":"way",
+ "osm_id":70001850,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "318":{
+ "name":"Église protestante évangélique de Télégraphe",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8731202,
+ 2.4012087
+ ],
+ "osm_type":"way",
+ "osm_id":70002610,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "319":{
+ "name":"Église Saint-Gabriel",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8486664,
+ 2.4060717
+ ],
+ "osm_type":"way",
+ "osm_id":70147593,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "320":{
+ "name":"Église Protestante Danoise",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8734257,
+ 2.2991491
+ ],
+ "osm_type":"way",
+ "osm_id":70187665,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "321":{
+ "name":"Cathédrale Saint-Alexandre-Nevsky",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.877618,
+ 2.3019923
+ ],
+ "osm_type":"way",
+ "osm_id":70192893,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":22,
+ "time_to_reach":0
+ },
+ "322":{
+ "name":"Temple protestant",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9144278,
+ 2.3805593
+ ],
+ "osm_type":"way",
+ "osm_id":72998330,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "323":{
+ "name":"Église Saint-Paul-du-Montfort",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9170219,
+ 2.4001222
+ ],
+ "osm_type":"way",
+ "osm_id":73007918,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "324":{
+ "name":"Église Saint-Germain",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8928543,
+ 2.4132525
+ ],
+ "osm_type":"way",
+ "osm_id":73113040,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "325":{
+ "name":"Assoc Ligue amicale des cultures et de recherche scientifique",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9039706,
+ 2.3950487
+ ],
+ "osm_type":"way",
+ "osm_id":73114961,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "326":{
+ "name":"Église Sainte-Marthe",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9057121,
+ 2.3951559
+ ],
+ "osm_type":"way",
+ "osm_id":73119238,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "327":{
+ "name":"Oratoire de Padre Pio",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9033824,
+ 2.3946926
+ ],
+ "osm_type":"way",
+ "osm_id":73121140,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "328":{
+ "name":"Église de la Sainte-Famille",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8859818,
+ 2.4028045
+ ],
+ "osm_type":"way",
+ "osm_id":73249060,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "329":{
+ "name":"Église Notre-Dame-du-Rosaire",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8798767,
+ 2.4146163
+ ],
+ "osm_type":"way",
+ "osm_id":73433670,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "330":{
+ "name":"Église de Jésus-Christ des saints des derniers jours",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9094149,
+ 2.3302012
+ ],
+ "osm_type":"way",
+ "osm_id":73835465,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "331":{
+ "name":"Église Notre-Dame-Auxiliatrice",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9011609,
+ 2.3139807
+ ],
+ "osm_type":"way",
+ "osm_id":74470553,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "332":{
+ "name":"Chapelle Saint-Pierre - Saint-Paul",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.899563,
+ 2.3657971
+ ],
+ "osm_type":"way",
+ "osm_id":75220961,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "333":{
+ "name":"Église Saint-Joseph des Épinettes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8935748,
+ 2.3205585
+ ],
+ "osm_type":"way",
+ "osm_id":75747135,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "334":{
+ "name":"Église de l'Immaculée Conception",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8459791,
+ 2.4034956
+ ],
+ "osm_type":"way",
+ "osm_id":77385186,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "335":{
+ "name":"Église Sainte-Geneviève des Grandes-Carrières",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.894851,
+ 2.3340131
+ ],
+ "osm_type":"way",
+ "osm_id":77670243,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "336":{
+ "name":"Chapelle Orthodoxe",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8468946,
+ 2.3041669
+ ],
+ "osm_type":"way",
+ "osm_id":77739478,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "337":{
+ "name":"Église Saint-Jean de Montmartre",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.884243,
+ 2.3378793
+ ],
+ "osm_type":"way",
+ "osm_id":77807770,
+ "attractiveness":17,
+ "must_do":false,
+ "n_tags":27,
+ "time_to_reach":0
+ },
+ "338":{
+ "name":"Église Saint-Bernard-de-La-Chapelle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8860532,
+ 2.3549746
+ ],
+ "osm_type":"way",
+ "osm_id":78005074,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "339":{
+ "name":"Église Notre-Dame du Bon Conseil",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.895063,
+ 2.3500907
+ ],
+ "osm_type":"way",
+ "osm_id":78020496,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "340":{
+ "name":"Église Notre-Dame de Bercy",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8363209,
+ 2.3872317
+ ],
+ "osm_type":"way",
+ "osm_id":78271179,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "341":{
+ "name":"Église réformée Port-Royal Quartier Latin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8363739,
+ 2.3491795
+ ],
+ "osm_type":"way",
+ "osm_id":78406890,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "342":{
+ "name":"Église Saint-Marcel",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8374878,
+ 2.3592366
+ ],
+ "osm_type":"way",
+ "osm_id":78534351,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "343":{
+ "name":"Cathédrale Saint-Étienne",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8665953,
+ 2.2984346
+ ],
+ "osm_type":"way",
+ "osm_id":79232285,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "344":{
+ "name":"Chapelle Saint-Jean",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.835168,
+ 2.325842
+ ],
+ "osm_type":"way",
+ "osm_id":79633343,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "345":{
+ "name":"Église Notre-Dame-du-Travail",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8359369,
+ 2.3170768
+ ],
+ "osm_type":"way",
+ "osm_id":79687825,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "346":{
+ "name":"Paroisse de Plaisance",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.834375,
+ 2.3166882
+ ],
+ "osm_type":"way",
+ "osm_id":79688125,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "347":{
+ "name":"Église Orthodoxe Saint-Séraphin de Sarov",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8426176,
+ 2.3045363
+ ],
+ "osm_type":"way",
+ "osm_id":80237345,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "348":{
+ "name":"Église Saint-Jean-Baptiste-de-La-Salle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.841228,
+ 2.3124626
+ ],
+ "osm_type":"way",
+ "osm_id":80266257,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "349":{
+ "name":"Église de Tous-les-Saints",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9116813,
+ 2.4165316
+ ],
+ "osm_type":"way",
+ "osm_id":81279191,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "350":{
+ "name":"Chapelle Notre-Dame-de-l'Étoile",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.913236,
+ 2.428905
+ ],
+ "osm_type":"way",
+ "osm_id":81287493,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "351":{
+ "name":"Église Saint-Leu-Saint-Gilles",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8703087,
+ 2.4206749
+ ],
+ "osm_type":"way",
+ "osm_id":81617177,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "352":{
+ "name":"Chapelle des Saints-Apôtres",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8716935,
+ 2.4193345
+ ],
+ "osm_type":"way",
+ "osm_id":81618230,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "353":{
+ "name":"Église Saint-André",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8538772,
+ 2.4228563
+ ],
+ "osm_type":"way",
+ "osm_id":81831259,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "354":{
+ "name":"Église Saint-Denys de la Chapelle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.891341,
+ 2.3603495
+ ],
+ "osm_type":"way",
+ "osm_id":84153309,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "355":{
+ "name":"Église Saint-François-de-Sales (ancienne église)",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8844851,
+ 2.3048254
+ ],
+ "osm_type":"way",
+ "osm_id":84317434,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "356":{
+ "name":"Église Luthérienne de l'Ascension",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8855199,
+ 2.3157231
+ ],
+ "osm_type":"way",
+ "osm_id":84320043,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "357":{
+ "name":"Foyer Culturel Myriam Zana",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8816083,
+ 2.3033735
+ ],
+ "osm_type":"way",
+ "osm_id":84322557,
+ "attractiveness":2,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "358":{
+ "name":"Église Saint-Charles-de-Monceau",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.882705,
+ 2.3127685
+ ],
+ "osm_type":"way",
+ "osm_id":84324974,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "359":{
+ "name":"Église Saint-François-de-Sales (nouvelle église)",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8848939,
+ 2.3050098
+ ],
+ "osm_type":"way",
+ "osm_id":84326196,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "360":{
+ "name":"Mosquée de Drancy",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9199821,
+ 2.4253046
+ ],
+ "osm_type":"way",
+ "osm_id":84455398,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "361":{
+ "name":"Chapelle de la Visitation",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8385454,
+ 2.335793
+ ],
+ "osm_type":"way",
+ "osm_id":93664894,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "362":{
+ "name":"Chapelle Laennec",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8499446,
+ 2.3217861
+ ],
+ "osm_type":"way",
+ "osm_id":105220265,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "363":{
+ "name":"Basilique Sainte-Jeanne-d’Arc",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8915499,
+ 2.360526
+ ],
+ "osm_type":"way",
+ "osm_id":112358505,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "364":{
+ "name":"Église Notre-Dame-de-Lourdes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.870752,
+ 2.3995332
+ ],
+ "osm_type":"way",
+ "osm_id":112461793,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "365":{
+ "name":"Église Sainte-Marguerite",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8529554,
+ 2.3813914
+ ],
+ "osm_type":"way",
+ "osm_id":115804138,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "366":{
+ "name":"Église du Saint-Esprit",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8381748,
+ 2.3976366
+ ],
+ "osm_type":"way",
+ "osm_id":130906379,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "367":{
+ "name":"Église Saint-Vincent-de-Paul",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9038936,
+ 2.3036986
+ ],
+ "osm_type":"way",
+ "osm_id":133428900,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "368":{
+ "name":"Église Notre-Dame-de-Pontmain",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8601441,
+ 2.4200508
+ ],
+ "osm_type":"way",
+ "osm_id":133610564,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "369":{
+ "name":"Prieuré Saint-Benoît",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8875038,
+ 2.3421102
+ ],
+ "osm_type":"way",
+ "osm_id":137884617,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "370":{
+ "name":"Église Protestante Suédoise",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8807628,
+ 2.3031693
+ ],
+ "osm_type":"way",
+ "osm_id":137884622,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "371":{
+ "name":"Église luthérienne Saint-Paul",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8908265,
+ 2.3499846
+ ],
+ "osm_type":"way",
+ "osm_id":148524233,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "372":{
+ "name":"Église Saint-Luc",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8938055,
+ 2.3754218
+ ],
+ "osm_type":"way",
+ "osm_id":259039017,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "373":{
+ "name":"Église Saint-Paul de la Plaine",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9152153,
+ 2.3632191
+ ],
+ "osm_type":"way",
+ "osm_id":284196003,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "374":{
+ "name":"Synagogue Kedouchat Levy",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.888419,
+ 2.3509459
+ ],
+ "osm_type":"way",
+ "osm_id":329896847,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "375":{
+ "name":"Ass Culturelle Fraternité De Pantin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9032414,
+ 2.3950124
+ ],
+ "osm_type":"way",
+ "osm_id":400021698,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "376":{
+ "name":"Chapelle Saint-Bernard",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8409341,
+ 2.3211613
+ ],
+ "osm_type":"way",
+ "osm_id":410503747,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "377":{
+ "name":"Mosquée du foyer",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9002722,
+ 2.3938434
+ ],
+ "osm_type":"way",
+ "osm_id":427207483,
+ "attractiveness":2,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "378":{
+ "name":"Cathédrale de la Sainte-Trinité",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8618757,
+ 2.3010168
+ ],
+ "osm_type":"way",
+ "osm_id":449077939,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":17,
+ "time_to_reach":0
+ },
+ "379":{
+ "name":"JW - Salle du Royaume",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8776705,
+ 2.4239713
+ ],
+ "osm_type":"way",
+ "osm_id":460236839,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "380":{
+ "name":"Grande Mosquée de Saint-Ouen Al Hashimi",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.907291,
+ 2.3257897
+ ],
+ "osm_type":"way",
+ "osm_id":616809276,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "381":{
+ "name":"Église Notre-Dame-du-Rosaire",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9067198,
+ 2.3327266
+ ],
+ "osm_type":"way",
+ "osm_id":774960953,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "382":{
+ "name":"Mosquée Islah",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.9117605,
+ 2.415003
+ ],
+ "osm_type":"way",
+ "osm_id":866064131,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "383":{
+ "name":"Grande Mosquée de Gennevilliers",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.919566,
+ 2.3033097
+ ],
+ "osm_type":"way",
+ "osm_id":952413288,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "384":{
+ "name":"Église Orthodoxe Notre-Dame-Joie-des-Affligés-et-Sainte-Geneviève",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.848068,
+ 2.3516065
+ ],
+ "osm_type":"way",
+ "osm_id":1056837934,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "385":{
+ "name":"Association Culturelle Islamique Kurdes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.874251,
+ 2.3562294
+ ],
+ "osm_type":"relation",
+ "osm_id":983065,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "386":{
+ "name":"ACIP Vincennes",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8477171,
+ 2.4197605
+ ],
+ "osm_type":"relation",
+ "osm_id":12023085,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "387":{
+ "name":"Fontaine des quatre évêques",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.85087,
+ 2.3332776
+ ],
+ "osm_type":"way",
+ "osm_id":40068036,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "388":{
+ "name":"Vivier sud",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8620408,
+ 2.3297809
+ ],
+ "osm_type":"way",
+ "osm_id":54201242,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "389":{
+ "name":"Monument d'Eugène Delacroix",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.84824,
+ 2.3355377
+ ],
+ "osm_type":"way",
+ "osm_id":62848407,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "390":{
+ "name":"Fontaine aux Lions",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8895664,
+ 2.3922773
+ ],
+ "osm_type":"way",
+ "osm_id":81752247,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "391":{
+ "name":"Miroir d'Eau",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8678713,
+ 2.363198
+ ],
+ "osm_type":"way",
+ "osm_id":313420244,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "392":{
+ "name":"La fontaine de la Vierge",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8525605,
+ 2.3513841
+ ],
+ "osm_type":"way",
+ "osm_id":948654101,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "393":{
+ "name":"Fontaine de Diane",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8659253,
+ 2.3169593
+ ],
+ "osm_type":"way",
+ "osm_id":1136105125,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "394":{
+ "name":"Fontaine Saussure",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8885895,
+ 2.3075212
+ ],
+ "osm_type":"way",
+ "osm_id":1255942976,
+ "attractiveness":2,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "395":{
+ "name":"Square Jean Chérioux",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8401918,
+ 2.3006179
+ ],
+ "osm_type":"way",
+ "osm_id":14334838,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "396":{
+ "name":"Jardin Bargue-Platon",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8374487,
+ 2.3105347
+ ],
+ "osm_type":"way",
+ "osm_id":14349803,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "397":{
+ "name":"Jardin d'Alleray",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8360274,
+ 2.3050768
+ ],
+ "osm_type":"way",
+ "osm_id":14646518,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "398":{
+ "name":"Square de la Tour Saint-Jacques",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.857913,
+ 2.3487608
+ ],
+ "osm_type":"way",
+ "osm_id":15895172,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "399":{
+ "name":"Square des Missions Étrangères",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.852336,
+ 2.3243813
+ ],
+ "osm_type":"way",
+ "osm_id":16190318,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "400":{
+ "name":"Jardin Villemin - Mahsa Jîna Amini",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8751484,
+ 2.3618265
+ ],
+ "osm_type":"way",
+ "osm_id":16405088,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "401":{
+ "name":"Square Jean XXIII",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8523775,
+ 2.3503406
+ ],
+ "osm_type":"way",
+ "osm_id":20444455,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "402":{
+ "name":"Square René Le Gall",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8330074,
+ 2.3494626
+ ],
+ "osm_type":"way",
+ "osm_id":22054912,
+ "attractiveness":35,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "403":{
+ "name":"Jardin des Grands-Explorateurs Marco Polo et Robert Cavelier-de-la-Salle",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8416569,
+ 2.3368712
+ ],
+ "osm_type":"way",
+ "osm_id":22732250,
+ "attractiveness":20,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "404":{
+ "name":"Square Robert Montagne",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8422649,
+ 2.3540627
+ ],
+ "osm_type":"way",
+ "osm_id":22946834,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "405":{
+ "name":"Square d'Estienne d'Orves",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8767521,
+ 2.3316112
+ ],
+ "osm_type":"way",
+ "osm_id":23272397,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "406":{
+ "name":"Square Roger-Stéphane",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.852784,
+ 2.3280405
+ ],
+ "osm_type":"way",
+ "osm_id":23736351,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "407":{
+ "name":"Square Sarah Bernhardt",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.849403,
+ 2.403903
+ ],
+ "osm_type":"way",
+ "osm_id":23757948,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "408":{
+ "name":"Square Émile Chautemps",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8671737,
+ 2.3538184
+ ],
+ "osm_type":"way",
+ "osm_id":23981951,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "409":{
+ "name":"Square d'Alleray Labrouste-Saint-Amand",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8358496,
+ 2.3084018
+ ],
+ "osm_type":"way",
+ "osm_id":24303537,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "410":{
+ "name":"Parc Abel-Mézières",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9160265,
+ 2.3299291
+ ],
+ "osm_type":"way",
+ "osm_id":24604305,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "411":{
+ "name":"Parc François Mitterrand",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9029374,
+ 2.324142
+ ],
+ "osm_type":"way",
+ "osm_id":24606663,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "412":{
+ "name":"Jardin Henri-Sauvage",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.894058,
+ 2.352202
+ ],
+ "osm_type":"way",
+ "osm_id":25092574,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "413":{
+ "name":"Square des Epinettes",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.894366,
+ 2.3265728
+ ],
+ "osm_type":"way",
+ "osm_id":25765947,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "414":{
+ "name":"Square Claude Nicolas Ledoux",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8343019,
+ 2.3315563
+ ],
+ "osm_type":"way",
+ "osm_id":25861852,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "415":{
+ "name":"Square Laurent Prache",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8542571,
+ 2.333953
+ ],
+ "osm_type":"way",
+ "osm_id":26583593,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "416":{
+ "name":"Square Eugène Varlin",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.878076,
+ 2.3658886
+ ],
+ "osm_type":"way",
+ "osm_id":26954399,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "417":{
+ "name":"Square Henri Christiné",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8779611,
+ 2.3661926
+ ],
+ "osm_type":"way",
+ "osm_id":26954406,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "418":{
+ "name":"Jardin Claire Motte",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8917722,
+ 2.3046556
+ ],
+ "osm_type":"way",
+ "osm_id":27618948,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "419":{
+ "name":"Square de Clignancourt",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8930338,
+ 2.3465149
+ ],
+ "osm_type":"way",
+ "osm_id":28804468,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "420":{
+ "name":"Parc municipal Lucie-Aubrac",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.878186,
+ 2.4172315
+ ],
+ "osm_type":"way",
+ "osm_id":28887274,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "421":{
+ "name":"Square Aristide Cavaillé-Coll",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8783688,
+ 2.3517697
+ ],
+ "osm_type":"way",
+ "osm_id":29700227,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "422":{
+ "name":"Place Salvador Allende",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8973902,
+ 2.400923
+ ],
+ "osm_type":"way",
+ "osm_id":30066116,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "423":{
+ "name":"Jardin Rachmaninov",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8953201,
+ 2.3642267
+ ],
+ "osm_type":"way",
+ "osm_id":30091005,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "424":{
+ "name":"Square Serge Reggiani",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8889585,
+ 2.3791325
+ ],
+ "osm_type":"way",
+ "osm_id":30097285,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "425":{
+ "name":"Square Emmanuel Fleury",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8705546,
+ 2.411767
+ ],
+ "osm_type":"way",
+ "osm_id":31150070,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "426":{
+ "name":"Square Charles Hermite",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8999857,
+ 2.3668797
+ ],
+ "osm_type":"way",
+ "osm_id":31153132,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "427":{
+ "name":"Jardin Anaïs Nin",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8993002,
+ 2.3707214
+ ],
+ "osm_type":"way",
+ "osm_id":31153158,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "428":{
+ "name":"Square de Stalingrad",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9114634,
+ 2.3835834
+ ],
+ "osm_type":"way",
+ "osm_id":31159294,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "429":{
+ "name":"Parc Eli Lotar",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9180651,
+ 2.3716982
+ ],
+ "osm_type":"way",
+ "osm_id":31297128,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "430":{
+ "name":"Parc Diderot",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9068122,
+ 2.3974827
+ ],
+ "osm_type":"way",
+ "osm_id":31353320,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "431":{
+ "name":"Espaces Verts des Courtillères",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9127656,
+ 2.4115218
+ ],
+ "osm_type":"way",
+ "osm_id":31353371,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "432":{
+ "name":"Square Edmond Pépin",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8837465,
+ 2.4028979
+ ],
+ "osm_type":"way",
+ "osm_id":31353825,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "433":{
+ "name":"Square d'Anvers - Jean-Claude-Carrière",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8821787,
+ 2.3443692
+ ],
+ "osm_type":"way",
+ "osm_id":34675527,
+ "attractiveness":17,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "434":{
+ "name":"Square Marcel Sembat",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8987453,
+ 2.338316
+ ],
+ "osm_type":"way",
+ "osm_id":35194283,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "435":{
+ "name":"Square Léon-Frapié",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8728678,
+ 2.4118129
+ ],
+ "osm_type":"way",
+ "osm_id":35537824,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "436":{
+ "name":"Square de la Marseillaise",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8871768,
+ 2.3975596
+ ],
+ "osm_type":"way",
+ "osm_id":35631119,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "437":{
+ "name":"Square Léon-Serpollet",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8921879,
+ 2.3384235
+ ],
+ "osm_type":"way",
+ "osm_id":36855294,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "438":{
+ "name":"Parc Roger Salengro",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.904745,
+ 2.311665
+ ],
+ "osm_type":"way",
+ "osm_id":36894633,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "439":{
+ "name":"Jardin des Buttes",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8663875,
+ 2.4223022
+ ],
+ "osm_type":"way",
+ "osm_id":36911930,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "440":{
+ "name":"Parc des Sports",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9236649,
+ 2.3024406
+ ],
+ "osm_type":"way",
+ "osm_id":39838933,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "441":{
+ "name":"Parc Chenard et Walcker",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9204775,
+ 2.3001107
+ ],
+ "osm_type":"way",
+ "osm_id":39839715,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "442":{
+ "name":"Allées Missak-Manouchian",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9197655,
+ 2.3009839
+ ],
+ "osm_type":"way",
+ "osm_id":39923800,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "443":{
+ "name":"Jardin Ilan-Halimi",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8360513,
+ 2.401527
+ ],
+ "osm_type":"way",
+ "osm_id":41917771,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "444":{
+ "name":"square Jules Ferry",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8593802,
+ 2.4175069
+ ],
+ "osm_type":"way",
+ "osm_id":43103577,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "445":{
+ "name":"Parc Robinson",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9088537,
+ 2.2949154
+ ],
+ "osm_type":"way",
+ "osm_id":43447638,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "446":{
+ "name":"Square Denise Buisson",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8570277,
+ 2.4271928
+ ],
+ "osm_type":"way",
+ "osm_id":43476880,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "447":{
+ "name":"Square Louise Michel",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8853618,
+ 2.3438234
+ ],
+ "osm_type":"way",
+ "osm_id":45189726,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "448":{
+ "name":"Square Helbronner",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9106744,
+ 2.3414253
+ ],
+ "osm_type":"way",
+ "osm_id":49860508,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "449":{
+ "name":"Square Ozanam",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8433483,
+ 2.3274308
+ ],
+ "osm_type":"way",
+ "osm_id":50385010,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "450":{
+ "name":"Parc Aimé Césaire",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9101774,
+ 2.3760838
+ ],
+ "osm_type":"way",
+ "osm_id":50828902,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "451":{
+ "name":"Square des Acrobates",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9167975,
+ 2.3537291
+ ],
+ "osm_type":"way",
+ "osm_id":52982345,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "452":{
+ "name":"Jardinet place du lieutenant Henri-Karcher",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8632971,
+ 2.3399434
+ ],
+ "osm_type":"way",
+ "osm_id":53826866,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "453":{
+ "name":"Parc Théodore Monod",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9103645,
+ 2.309488
+ ],
+ "osm_type":"way",
+ "osm_id":54380826,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "454":{
+ "name":"Square Jacques Bidault",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8698572,
+ 2.3499616
+ ],
+ "osm_type":"way",
+ "osm_id":55263339,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "455":{
+ "name":"Square Charles Victor Langlois",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8586993,
+ 2.3580083
+ ],
+ "osm_type":"way",
+ "osm_id":55848929,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "456":{
+ "name":"Jardin Serge Gainsbourg",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8786669,
+ 2.4080907
+ ],
+ "osm_type":"way",
+ "osm_id":61320151,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "457":{
+ "name":"Square Alban Satragne",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8755522,
+ 2.3552823
+ ],
+ "osm_type":"way",
+ "osm_id":61406614,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "458":{
+ "name":"Square Félix Desruelles",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8536974,
+ 2.3345069
+ ],
+ "osm_type":"way",
+ "osm_id":62287123,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "459":{
+ "name":"Square Marcel Pagnol",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8759354,
+ 2.3203969
+ ],
+ "osm_type":"way",
+ "osm_id":67725863,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "460":{
+ "name":"Place du Guatémala",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8765224,
+ 2.3182782
+ ],
+ "osm_type":"way",
+ "osm_id":68507724,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "461":{
+ "name":"Jardin de l’Hôtel Salomon de Rothschild",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8753193,
+ 2.3027355
+ ],
+ "osm_type":"way",
+ "osm_id":68995097,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "462":{
+ "name":"Square de la rue Hélène",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8864786,
+ 2.324743
+ ],
+ "osm_type":"way",
+ "osm_id":75750052,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "463":{
+ "name":"Square des Recollets",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8737963,
+ 2.363602
+ ],
+ "osm_type":"way",
+ "osm_id":76910069,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "464":{
+ "name":"Square Alain Bashung",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.885345,
+ 2.3561989
+ ],
+ "osm_type":"way",
+ "osm_id":78009019,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "465":{
+ "name":"Jardin Hector Malot",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8471031,
+ 2.3769063
+ ],
+ "osm_type":"way",
+ "osm_id":78146247,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "466":{
+ "name":"Les Jardins du Ruisseau",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8974781,
+ 2.342714
+ ],
+ "osm_type":"way",
+ "osm_id":86602632,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "467":{
+ "name":"Jardin public de l'Observatoire de Paris",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8351004,
+ 2.3367387
+ ],
+ "osm_type":"way",
+ "osm_id":87334036,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "468":{
+ "name":"Jardin de l'Église Saint-Éloi",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.844863,
+ 2.3888016
+ ],
+ "osm_type":"way",
+ "osm_id":93903779,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "469":{
+ "name":"Cour Pasteur",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8412766,
+ 2.3446263
+ ],
+ "osm_type":"way",
+ "osm_id":95092958,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "470":{
+ "name":"Cour aux Ernest",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8418993,
+ 2.3448331
+ ],
+ "osm_type":"way",
+ "osm_id":95195271,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "471":{
+ "name":"Square Auguste Mariette-Pacha",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8491483,
+ 2.345955
+ ],
+ "osm_type":"way",
+ "osm_id":97602191,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "472":{
+ "name":"Square Michel Foucault",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8493381,
+ 2.3452413
+ ],
+ "osm_type":"way",
+ "osm_id":97602192,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "473":{
+ "name":"Square Yves Coppens",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8489867,
+ 2.346343
+ ],
+ "osm_type":"way",
+ "osm_id":97602197,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "474":{
+ "name":"Square de l'Abbé Esquerré",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8503173,
+ 2.3136601
+ ],
+ "osm_type":"way",
+ "osm_id":103344111,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "475":{
+ "name":"Square des Deux Nèthes",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8856573,
+ 2.3274074
+ ],
+ "osm_type":"way",
+ "osm_id":106587163,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "476":{
+ "name":"Square Alex Biscarre",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8785098,
+ 2.33667
+ ],
+ "osm_type":"way",
+ "osm_id":107257915,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "477":{
+ "name":"Square Hector Berlioz",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8831619,
+ 2.3298581
+ ],
+ "osm_type":"way",
+ "osm_id":107351766,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "478":{
+ "name":"Point vert de la place Roosevelt, Schaeffer, Noyers",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9173593,
+ 2.3798109
+ ],
+ "osm_type":"way",
+ "osm_id":114705404,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "479":{
+ "name":"Jardin de l'Intendant",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8544737,
+ 2.3109127
+ ],
+ "osm_type":"way",
+ "osm_id":115022783,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "480":{
+ "name":"Square Raoul Nordling",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8526519,
+ 2.3815603
+ ],
+ "osm_type":"way",
+ "osm_id":115804160,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "481":{
+ "name":"Square Trousseau",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8504057,
+ 2.3771319
+ ],
+ "osm_type":"way",
+ "osm_id":118878250,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "482":{
+ "name":"Espace Édouard Vaillant",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9019175,
+ 2.3333031
+ ],
+ "osm_type":"way",
+ "osm_id":119637302,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "483":{
+ "name":"Square Courteline",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8449581,
+ 2.4022524
+ ],
+ "osm_type":"way",
+ "osm_id":129890096,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "484":{
+ "name":"Square Van Vollenhoven",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8345779,
+ 2.4067941
+ ],
+ "osm_type":"way",
+ "osm_id":131549198,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "485":{
+ "name":"Jardinières angles des rues Daumesnil - Charenton",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8423892,
+ 2.3858724
+ ],
+ "osm_type":"way",
+ "osm_id":133881479,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "486":{
+ "name":"Bois de Vincennes",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8315046,
+ 2.4347158
+ ],
+ "osm_type":"way",
+ "osm_id":142107768,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "487":{
+ "name":"Square Monseigneur Maillet",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8769508,
+ 2.3933291
+ ],
+ "osm_type":"way",
+ "osm_id":149743025,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "488":{
+ "name":"Square Sainte-Hélène",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8962254,
+ 2.3430597
+ ],
+ "osm_type":"way",
+ "osm_id":155119480,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "489":{
+ "name":"Jardin Nelson Mandela",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8626235,
+ 2.344487
+ ],
+ "osm_type":"way",
+ "osm_id":159103475,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "490":{
+ "name":"Square Les Z'Arts",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.905328,
+ 2.3396687
+ ],
+ "osm_type":"way",
+ "osm_id":161687382,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "491":{
+ "name":"Jardin René Binet",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8997243,
+ 2.338398
+ ],
+ "osm_type":"way",
+ "osm_id":163131785,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "492":{
+ "name":"Square Montgolfier",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8933447,
+ 2.4031291
+ ],
+ "osm_type":"way",
+ "osm_id":167647007,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "493":{
+ "name":"Square de la Madone",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8926884,
+ 2.3614964
+ ],
+ "osm_type":"way",
+ "osm_id":180355685,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "494":{
+ "name":"Square Ernest-Chausson",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8873875,
+ 2.3250098
+ ],
+ "osm_type":"way",
+ "osm_id":180688616,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "495":{
+ "name":"Square Curial",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8956419,
+ 2.374963
+ ],
+ "osm_type":"way",
+ "osm_id":183821262,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "496":{
+ "name":"Square Dampierre-Rouvet",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8939967,
+ 2.384231
+ ],
+ "osm_type":"way",
+ "osm_id":183821348,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "497":{
+ "name":"Square de Montjoie",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9116384,
+ 2.3594605
+ ],
+ "osm_type":"way",
+ "osm_id":193160754,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "498":{
+ "name":"Square Diderot",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9079727,
+ 2.3617019
+ ],
+ "osm_type":"way",
+ "osm_id":196098232,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "499":{
+ "name":"Square Petit",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8850845,
+ 2.3820568
+ ],
+ "osm_type":"way",
+ "osm_id":198055405,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "500":{
+ "name":"Square Françoise-Hélène Jourda",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8865799,
+ 2.3622552
+ ],
+ "osm_type":"way",
+ "osm_id":216269238,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "501":{
+ "name":"Square Marc-Seguin",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8919489,
+ 2.3611955
+ ],
+ "osm_type":"way",
+ "osm_id":216269243,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "502":{
+ "name":"Square de l'Évangile",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8924402,
+ 2.3618463
+ ],
+ "osm_type":"way",
+ "osm_id":218118748,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "503":{
+ "name":"Square de la Cristallerie",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9133226,
+ 2.3622312
+ ],
+ "osm_type":"way",
+ "osm_id":224495131,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "504":{
+ "name":"Jardin Pédagogique Debain",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9027795,
+ 2.3491875
+ ],
+ "osm_type":"way",
+ "osm_id":227286835,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "505":{
+ "name":"Square Carpeaux",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8916885,
+ 2.3316484
+ ],
+ "osm_type":"way",
+ "osm_id":232871805,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "506":{
+ "name":"Square René Dewerpe",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9160939,
+ 2.4313941
+ ],
+ "osm_type":"way",
+ "osm_id":235877322,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "507":{
+ "name":"Square Madeleine Tribolati",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8771593,
+ 2.3643554
+ ],
+ "osm_type":"way",
+ "osm_id":241898171,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "508":{
+ "name":"Grand Parc des Docks de Saint-Ouen",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9156406,
+ 2.3273831
+ ],
+ "osm_type":"way",
+ "osm_id":241970652,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "509":{
+ "name":"Square Sainte Marguerite",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9019871,
+ 2.392207
+ ],
+ "osm_type":"way",
+ "osm_id":245210084,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "510":{
+ "name":"Square Raymond-Queneau",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.895822,
+ 2.3610383
+ ],
+ "osm_type":"way",
+ "osm_id":245462496,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "511":{
+ "name":"Square grand Auger",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.891099,
+ 2.4005743
+ ],
+ "osm_type":"way",
+ "osm_id":245948822,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "512":{
+ "name":"Square Élisa Borey",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8665355,
+ 2.3904461
+ ],
+ "osm_type":"way",
+ "osm_id":256437620,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "513":{
+ "name":"Square de la rue des Mûriers",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8647232,
+ 2.3907489
+ ],
+ "osm_type":"way",
+ "osm_id":256969688,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "514":{
+ "name":"Jardin Jane Vialle",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8951778,
+ 2.3536558
+ ],
+ "osm_type":"way",
+ "osm_id":257564771,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "515":{
+ "name":"Jardin de la Justice",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8682927,
+ 2.4085101
+ ],
+ "osm_type":"way",
+ "osm_id":268400319,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "516":{
+ "name":"Jardin Frida Kahlo",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8722619,
+ 2.4129546
+ ],
+ "osm_type":"way",
+ "osm_id":270368321,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "517":{
+ "name":"La Petite Ceinture du 20e",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8695565,
+ 2.3888451
+ ],
+ "osm_type":"way",
+ "osm_id":272547170,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "518":{
+ "name":"Square Jean Leclaire",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8960028,
+ 2.3256518
+ ],
+ "osm_type":"way",
+ "osm_id":281320579,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "519":{
+ "name":"Jardin des Petites Rigoles",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8711431,
+ 2.3915288
+ ],
+ "osm_type":"way",
+ "osm_id":286449809,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "520":{
+ "name":"Jardin de la rue du Chalet",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8740042,
+ 2.3732939
+ ],
+ "osm_type":"way",
+ "osm_id":290586931,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "521":{
+ "name":"Square Georges Valbon",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.879081,
+ 2.4159816
+ ],
+ "osm_type":"way",
+ "osm_id":293462525,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "522":{
+ "name":"Square Henri Sellier",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8835696,
+ 2.4095194
+ ],
+ "osm_type":"way",
+ "osm_id":302430135,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "523":{
+ "name":"Square Georges Gay",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.88301,
+ 2.4180549
+ ],
+ "osm_type":"way",
+ "osm_id":311824309,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "524":{
+ "name":"Square Alexandre-Luquet",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8712709,
+ 2.3866251
+ ],
+ "osm_type":"way",
+ "osm_id":342601519,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "525":{
+ "name":"Square Joël Le Tac",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8892411,
+ 2.338154
+ ],
+ "osm_type":"way",
+ "osm_id":347398395,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "526":{
+ "name":"Square éphémère Le Point Virgule",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9024155,
+ 2.397356
+ ],
+ "osm_type":"way",
+ "osm_id":349887549,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "527":{
+ "name":"Square Roland Dorgelès",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8884891,
+ 2.3395705
+ ],
+ "osm_type":"way",
+ "osm_id":349925623,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "528":{
+ "name":"Parc Marcel Bich",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8970032,
+ 2.3047018
+ ],
+ "osm_type":"way",
+ "osm_id":358375852,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "529":{
+ "name":"Jardin des Rosiers – Joseph-Migneret",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8572946,
+ 2.3602516
+ ],
+ "osm_type":"way",
+ "osm_id":365878540,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "530":{
+ "name":"Jardin Léon Zyguel",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8744297,
+ 2.3953666
+ ],
+ "osm_type":"way",
+ "osm_id":366942718,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "531":{
+ "name":"Parc Le Temps des Cerises",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9200575,
+ 2.3537459
+ ],
+ "osm_type":"way",
+ "osm_id":374922654,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "532":{
+ "name":"Jardin Marcel Joseph-François",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.881282,
+ 2.4222704
+ ],
+ "osm_type":"way",
+ "osm_id":394930550,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "533":{
+ "name":"Square Anne Franck",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9010357,
+ 2.391558
+ ],
+ "osm_type":"way",
+ "osm_id":400470877,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "534":{
+ "name":"Square du Landy",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9149267,
+ 2.3428987
+ ],
+ "osm_type":"way",
+ "osm_id":429314402,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "535":{
+ "name":"Square Faidherbe",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8842518,
+ 2.4111958
+ ],
+ "osm_type":"way",
+ "osm_id":437067246,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "536":{
+ "name":"Square Saint-Médard",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8397407,
+ 2.3505403
+ ],
+ "osm_type":"way",
+ "osm_id":475591498,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "537":{
+ "name":"Coulée verte",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8403625,
+ 2.4051868
+ ],
+ "osm_type":"way",
+ "osm_id":479550070,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "538":{
+ "name":"Square Adrien Agnès",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9158677,
+ 2.3710641
+ ],
+ "osm_type":"way",
+ "osm_id":495199253,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "539":{
+ "name":"Parc Simone Veil",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.877103,
+ 2.412911
+ ],
+ "osm_type":"way",
+ "osm_id":537779921,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "540":{
+ "name":"Forêt linéaire Nord",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9008618,
+ 2.3786064
+ ],
+ "osm_type":"way",
+ "osm_id":547059083,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "541":{
+ "name":"Square Maria Vérone",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8969236,
+ 2.3358878
+ ],
+ "osm_type":"way",
+ "osm_id":550244201,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "542":{
+ "name":"Square Émilienne Moreau Evrard",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9163056,
+ 2.3788177
+ ],
+ "osm_type":"way",
+ "osm_id":566130890,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "543":{
+ "name":"jardin Louise-Weber-dite-La-Goulue",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8864089,
+ 2.3368967
+ ],
+ "osm_type":"way",
+ "osm_id":570236762,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "544":{
+ "name":"Square Nadar",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8859366,
+ 2.3418689
+ ],
+ "osm_type":"way",
+ "osm_id":570270071,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "545":{
+ "name":"Square des 31000 et des 45000",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9138493,
+ 2.3324482
+ ],
+ "osm_type":"way",
+ "osm_id":579604099,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "546":{
+ "name":"Jardin du Père-Armand-David",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8478674,
+ 2.3220972
+ ],
+ "osm_type":"way",
+ "osm_id":588324415,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "547":{
+ "name":"Jardin Hans et Sophie Scholl",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9000696,
+ 2.320645
+ ],
+ "osm_type":"way",
+ "osm_id":600611810,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "548":{
+ "name":"Square Carnot - Jardin du Roy",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8415458,
+ 2.4333305
+ ],
+ "osm_type":"way",
+ "osm_id":623935833,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "549":{
+ "name":"Parc Marguerite Yourcenar",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9184843,
+ 2.3163862
+ ],
+ "osm_type":"way",
+ "osm_id":627992411,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "550":{
+ "name":"Jardins et Vignes",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8900176,
+ 2.3298673
+ ],
+ "osm_type":"way",
+ "osm_id":669147415,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "551":{
+ "name":"Terrain de boules Boulevard de Reims",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8887271,
+ 2.2971561
+ ],
+ "osm_type":"way",
+ "osm_id":671211475,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "552":{
+ "name":"Jardin Monica Vitti",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.85383,
+ 2.3587057
+ ],
+ "osm_type":"way",
+ "osm_id":680335218,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "553":{
+ "name":"Square Jean Jaurès",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9215624,
+ 2.4075786
+ ],
+ "osm_type":"way",
+ "osm_id":712722293,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "554":{
+ "name":"Le Moulin de la Palette",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8870941,
+ 2.3607265
+ ],
+ "osm_type":"way",
+ "osm_id":740494267,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "555":{
+ "name":"Square du 8 mai 1945",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8909854,
+ 2.4102454
+ ],
+ "osm_type":"way",
+ "osm_id":776697805,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "556":{
+ "name":"Square partagé Langevin",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8894476,
+ 2.4147245
+ ],
+ "osm_type":"way",
+ "osm_id":777256200,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "557":{
+ "name":"Square Vaucanson",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8896788,
+ 2.4043481
+ ],
+ "osm_type":"way",
+ "osm_id":777334888,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "558":{
+ "name":"Mail Pierre Desproges",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8949999,
+ 2.4066759
+ ],
+ "osm_type":"way",
+ "osm_id":777477474,
+ "attractiveness":17,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "559":{
+ "name":"Jardin des Abbesses",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8852479,
+ 2.3385536
+ ],
+ "osm_type":"way",
+ "osm_id":778261293,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "560":{
+ "name":"Square Claude Goislot",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9179735,
+ 2.3927614
+ ],
+ "osm_type":"way",
+ "osm_id":838326052,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "561":{
+ "name":"Square de la Villette",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9030736,
+ 2.3865783
+ ],
+ "osm_type":"way",
+ "osm_id":838332060,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "562":{
+ "name":"Square Saganta",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.911422,
+ 2.3810887
+ ],
+ "osm_type":"way",
+ "osm_id":838357749,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "563":{
+ "name":"Square Georges Leblanc",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.914215,
+ 2.4002443
+ ],
+ "osm_type":"way",
+ "osm_id":838360557,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "564":{
+ "name":"Terrains multisports",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9043937,
+ 2.3864104
+ ],
+ "osm_type":"way",
+ "osm_id":839298413,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "565":{
+ "name":"Place Bernard Amiot et Bernard Legrand",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9188164,
+ 2.3036664
+ ],
+ "osm_type":"way",
+ "osm_id":842441696,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "566":{
+ "name":"Parc du rucher d'Aubervilliers",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9091256,
+ 2.3871926
+ ],
+ "osm_type":"way",
+ "osm_id":845481131,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "567":{
+ "name":"La Petite Ceinture du 19ème",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8958777,
+ 2.3789437
+ ],
+ "osm_type":"way",
+ "osm_id":845793683,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "568":{
+ "name":"Square Guy Môquet",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9240135,
+ 2.4134346
+ ],
+ "osm_type":"way",
+ "osm_id":883901370,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "569":{
+ "name":"Jardin Jean Mercier",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9084547,
+ 2.3029795
+ ],
+ "osm_type":"way",
+ "osm_id":887023481,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "570":{
+ "name":"Square Marcel Paul",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9026035,
+ 2.3256264
+ ],
+ "osm_type":"way",
+ "osm_id":947255079,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "571":{
+ "name":"Jardin Nusch Éluard",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8925863,
+ 2.3593458
+ ],
+ "osm_type":"way",
+ "osm_id":958322551,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "572":{
+ "name":"Parc Morel (skateboard)",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9004194,
+ 2.3193783
+ ],
+ "osm_type":"way",
+ "osm_id":968156415,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "573":{
+ "name":"Promenade Jean-Jacques Sempé",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8495883,
+ 2.3329384
+ ],
+ "osm_type":"way",
+ "osm_id":968787390,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "574":{
+ "name":"Square Gisèle Halimi",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9171514,
+ 2.4089031
+ ],
+ "osm_type":"way",
+ "osm_id":985529205,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "575":{
+ "name":"Parc Foucault",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9006799,
+ 2.3109703
+ ],
+ "osm_type":"way",
+ "osm_id":1022523481,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "576":{
+ "name":"Jardin éphémère",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9030392,
+ 2.3374987
+ ],
+ "osm_type":"way",
+ "osm_id":1074618792,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "577":{
+ "name":"Square Jacques Manavian",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.899006,
+ 2.3245959
+ ],
+ "osm_type":"way",
+ "osm_id":1104894585,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "578":{
+ "name":"Square Henri Sellier",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9027174,
+ 2.3173947
+ ],
+ "osm_type":"way",
+ "osm_id":1157423264,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "579":{
+ "name":"Jardins du Grand Échiquier",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9175228,
+ 2.3126717
+ ],
+ "osm_type":"way",
+ "osm_id":1184461730,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "580":{
+ "name":"Parvis de l'Abbé Pierre",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9091508,
+ 2.4276158
+ ],
+ "osm_type":"way",
+ "osm_id":1236950475,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "581":{
+ "name":"Jardin du Carré Rouge",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9103226,
+ 2.4259501
+ ],
+ "osm_type":"way",
+ "osm_id":1236950495,
+ "attractiveness":3,
+ "must_do":false,
+ "n_tags":2,
+ "time_to_reach":0
+ },
+ "582":{
+ "name":"Square Henri Galli",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8513526,
+ 2.3618576
+ ],
+ "osm_type":"relation",
+ "osm_id":2080074,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "583":{
+ "name":"Square de l’église Notre-Dame-de-la-Croix",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8687336,
+ 2.3881113
+ ],
+ "osm_type":"relation",
+ "osm_id":2100826,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "584":{
+ "name":"Coulée verte du sud parisien",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.7855092,
+ 2.2944127
+ ],
+ "osm_type":"relation",
+ "osm_id":2646085,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "585":{
+ "name":"Parc Monceau",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8793706,
+ 2.3088907
+ ],
+ "osm_type":"relation",
+ "osm_id":2826933,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "586":{
+ "name":"Parc départemental Jean-Moulin - Les Guilands",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8630132,
+ 2.424942
+ ],
+ "osm_type":"relation",
+ "osm_id":6530383,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "587":{
+ "name":"Parc de la Villette",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.89352,
+ 2.3893334
+ ],
+ "osm_type":"relation",
+ "osm_id":7574623,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "588":{
+ "name":"Les Jardins d'Éole",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8876495,
+ 2.3662081
+ ],
+ "osm_type":"relation",
+ "osm_id":11717983,
+ "attractiveness":9,
+ "must_do":false,
+ "n_tags":6,
+ "time_to_reach":0
+ },
+ "589":{
+ "name":"Jardin Alexandra David-Néel",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8454726,
+ 2.4228422
+ ],
+ "osm_type":"relation",
+ "osm_id":11989941,
+ "attractiveness":6,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "590":{
+ "name":"Parc Clichy-Batignolles Martin Luther King",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8911906,
+ 2.313643
+ ],
+ "osm_type":"relation",
+ "osm_id":12273749,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":10,
+ "time_to_reach":0
+ },
+ "591":{
+ "name":"Square de la Porte de la Villette",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8998347,
+ 2.3901654
+ ],
+ "osm_type":"relation",
+ "osm_id":13014387,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "592":{
+ "name":"Square Rose Guérin\/Heidenheim",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.9075996,
+ 2.300795
+ ],
+ "osm_type":"relation",
+ "osm_id":13725453,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":3,
+ "time_to_reach":0
+ },
+ "593":{
+ "name":"Parc zoologique de Paris",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8318246,
+ 2.4172936
+ ],
+ "osm_type":"way",
+ "osm_id":26008116,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "594":{
+ "name":"Galerie Lafayette Maison \/ Gourmet",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.8730326,
+ 2.3306871
+ ],
+ "osm_type":"way",
+ "osm_id":69224027,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "595":{
+ "name":"Printemps",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.8738744,
+ 2.3290548
+ ],
+ "osm_type":"way",
+ "osm_id":69224137,
+ "attractiveness":20,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "596":{
+ "name":"Marché Saint-Honoré",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.8670006,
+ 2.3317785
+ ],
+ "osm_type":"way",
+ "osm_id":54155008,
+ "attractiveness":7,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "597":{
+ "name":"Passage du Grand-Cerf",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.8648328,
+ 2.3493274
+ ],
+ "osm_type":"way",
+ "osm_id":54970437,
+ "attractiveness":8,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "598":{
+ "name":"Centre Commercial Émile Dubois",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.9152909,
+ 2.4027961
+ ],
+ "osm_type":"way",
+ "osm_id":73004279,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "599":{
+ "name":"Bistrot des rosiers",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.902197,
+ 2.3421451
+ ],
+ "osm_type":"way",
+ "osm_id":73835282,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "600":{
+ "name":"Marché Dauphine",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.9018063,
+ 2.341632
+ ],
+ "osm_type":"way",
+ "osm_id":73836239,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "601":{
+ "name":"Marché Malassis",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.9016795,
+ 2.3421091
+ ],
+ "osm_type":"way",
+ "osm_id":73838196,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ },
+ "602":{
+ "name":"Marché Malik",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.901541,
+ 2.3400264
+ ],
+ "osm_type":"way",
+ "osm_id":73839906,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "603":{
+ "name":"Centre Commercial de la Grande Porte",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.855103,
+ 2.4162425
+ ],
+ "osm_type":"way",
+ "osm_id":81767599,
+ "attractiveness":4,
+ "must_do":false,
+ "n_tags":4,
+ "time_to_reach":0
+ },
+ "604":{
+ "name":"Avenir",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.9197328,
+ 2.4219237
+ ],
+ "osm_type":"way",
+ "osm_id":84437363,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "605":{
+ "name":"Marques Avenue",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.9225096,
+ 2.3303125
+ ],
+ "osm_type":"way",
+ "osm_id":434347031,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "606":{
+ "name":"Qwartz",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.92563,
+ 2.3290174
+ ],
+ "osm_type":"way",
+ "osm_id":843953196,
+ "attractiveness":18,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "607":{
+ "name":"Galerie Hoche",
+ "type":{
+ "landmark_type":"shopping"
+ },
+ "location":[
+ 48.8908975,
+ 2.4039477
+ ],
+ "osm_type":"relation",
+ "osm_id":1132674,
+ "attractiveness":5,
+ "must_do":false,
+ "n_tags":5,
+ "time_to_reach":0
+ }
+}
\ No newline at end of file
diff --git a/lib/modules/navigation.dart b/lib/modules/navigation.dart
deleted file mode 100644
index f7fcbcf..0000000
--- a/lib/modules/navigation.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-import 'package:flutter/material.dart';
-
-Widget singleDestination(BuildContext context, String title, String description, String image) {
- return Card(
- child: ListTile(
- leading: Icon(Icons.location_on),
- title: Text(title),
- subtitle: Text(description),
- onTap: () {
- Navigator.pushNamed(context, '/destination');
- },
- ),
- );
-}
\ No newline at end of file
diff --git a/lib/modules/profile.dart b/lib/modules/profile.dart
deleted file mode 100644
index 69bfba4..0000000
--- a/lib/modules/profile.dart
+++ /dev/null
@@ -1,55 +0,0 @@
-import 'package:flutter/material.dart';
-
-
-
-class ProfilePage extends StatefulWidget {
- @override
- _ProfilePageState createState() => _ProfilePageState();
-}
-
-class _ProfilePageState extends State {
-
- double value = 0.0;
- void onChanged(double newValue) {
- setState(() {
- value = newValue;
- });
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- appBar: AppBar(
- title: Text('Profile'),
- ),
- body: Padding(
- padding: EdgeInsets.all(8.0),
- child: Column(
- children: [
- Card(
- child: ListTile(
- leading: Icon(Icons.notifications_sharp),
- title: Text('Notification 1'),
- subtitle: Text('This is a first notification'),
- ),
- ),
- Card(
- child: ListTile(
- leading: Icon(Icons.notifications_sharp),
- title: Text('Notification 2'),
- subtitle: Text('This is a notification'),
- ),
- ),
- Card(
- child: ListTile(
- leading: Icon(Icons.outdoor_grill),
- title: Text("Eating preference"),
- subtitle: Slider.adaptive(value: value, onChanged: onChanged, min: 0, max: 5, divisions: 5, label: value.toInt().toString(),)
-
- )
- )
- ],
- ),
- )
- );
- }
-}
diff --git a/minor_landmarks.txt b/minor_landmarks.txt
new file mode 100644
index 0000000..8c3f4ab
--- /dev/null
+++ b/minor_landmarks.txt
@@ -0,0 +1,482 @@
+{
+ "0":{
+ "name":"Atelier Brancusi",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8614029,
+ 2.3519903
+ ],
+ "osm_type":"way",
+ "osm_id":55503399,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "1":{
+ "name":"Musée de Cluny",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8506604,
+ 2.3437398
+ ],
+ "osm_type":"way",
+ "osm_id":56640163,
+ "attractiveness":18,
+ "must_do":false,
+ "n_tags":18,
+ "time_to_reach":0
+ },
+ "2":{
+ "name":"Musée du Luxembourg",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8485965,
+ 2.3340156
+ ],
+ "osm_type":"way",
+ "osm_id":170226810,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "3":{
+ "name":"Musée national Eugène Delacroix",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8546662,
+ 2.3353836
+ ],
+ "osm_type":"way",
+ "osm_id":395785603,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "4":{
+ "name":"Hôtel de Sully",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.854635,
+ 2.3638126
+ ],
+ "osm_type":"relation",
+ "osm_id":403146,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":13,
+ "time_to_reach":0
+ },
+ "5":{
+ "name":"Hôtel de la Monnaie",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.856403,
+ 2.3388625
+ ],
+ "osm_type":"relation",
+ "osm_id":967664,
+ "attractiveness":11,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "6":{
+ "name":"Musée Bourdelle",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8432078,
+ 2.3186583
+ ],
+ "osm_type":"relation",
+ "osm_id":1212876,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "7":{
+ "name":"Musée Carnavalet",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8576819,
+ 2.3627147
+ ],
+ "osm_type":"relation",
+ "osm_id":2405955,
+ "attractiveness":25,
+ "must_do":false,
+ "n_tags":25,
+ "time_to_reach":0
+ },
+ "8":{
+ "name":"Pont Neuf",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8565248,
+ 2.3408132
+ ],
+ "osm_type":"way",
+ "osm_id":53574149,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "9":{
+ "name":"Jardin du Luxembourg",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8467137,
+ 2.3363649
+ ],
+ "osm_type":"way",
+ "osm_id":128206209,
+ "attractiveness":35,
+ "must_do":false,
+ "n_tags":23,
+ "time_to_reach":0
+ },
+ "10":{
+ "name":"Cathédrale Notre-Dame de Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8529372,
+ 2.3498701
+ ],
+ "osm_type":"way",
+ "osm_id":201611261,
+ "attractiveness":55,
+ "must_do":false,
+ "n_tags":54,
+ "time_to_reach":0
+ },
+ "11":{
+ "name":"Maison à l'enseigne du Faucheur",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8558553,
+ 2.3568266
+ ],
+ "osm_type":"way",
+ "osm_id":1123456865,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "12":{
+ "name":"Maison à l'enseigne du Mouton",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8558431,
+ 2.3568914
+ ],
+ "osm_type":"way",
+ "osm_id":1123456866,
+ "attractiveness":13,
+ "must_do":false,
+ "n_tags":11,
+ "time_to_reach":0
+ },
+ "13":{
+ "name":"Palais de Justice de Paris",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8556537,
+ 2.3446072
+ ],
+ "osm_type":"relation",
+ "osm_id":536982,
+ "attractiveness":24,
+ "must_do":false,
+ "n_tags":24,
+ "time_to_reach":0
+ },
+ "14":{
+ "name":"Mémorial des Martyrs de la Déportation",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8517365,
+ 2.3524734
+ ],
+ "osm_type":"relation",
+ "osm_id":9396191,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "15":{
+ "name":"Fontaine des Innocents",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8606368,
+ 2.3480233
+ ],
+ "osm_type":"way",
+ "osm_id":52469222,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "16":{
+ "name":"Hôtel de Sens",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8535257,
+ 2.3588733
+ ],
+ "osm_type":"way",
+ "osm_id":55541122,
+ "attractiveness":21,
+ "must_do":false,
+ "n_tags":20,
+ "time_to_reach":0
+ },
+ "17":{
+ "name":"Hôtel d'Ourscamp",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8555465,
+ 2.3571206
+ ],
+ "osm_type":"way",
+ "osm_id":55620201,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":9,
+ "time_to_reach":0
+ },
+ "18":{
+ "name":"Hôtel de Choiseul-Praslin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8478008,
+ 2.3203873
+ ],
+ "osm_type":"way",
+ "osm_id":65756922,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "19":{
+ "name":"Chapelle Notre-Dame-des-Anges",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8462836,
+ 2.3235558
+ ],
+ "osm_type":"way",
+ "osm_id":219378497,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "20":{
+ "name":"Fontaine du Palmier",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8575005,
+ 2.3472864
+ ],
+ "osm_type":"way",
+ "osm_id":261092850,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":14,
+ "time_to_reach":0
+ },
+ "21":{
+ "name":"Église Saint-Séverin",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8520913,
+ 2.3457237
+ ],
+ "osm_type":"way",
+ "osm_id":19740659,
+ "attractiveness":15,
+ "must_do":false,
+ "n_tags":25,
+ "time_to_reach":0
+ },
+ "22":{
+ "name":"Église Orthodoxe Roumaine des Saints Archanges",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.849488,
+ 2.3471975
+ ],
+ "osm_type":"way",
+ "osm_id":55366403,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":16,
+ "time_to_reach":0
+ },
+ "23":{
+ "name":"Église Saint-Merri",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8590777,
+ 2.3508448
+ ],
+ "osm_type":"way",
+ "osm_id":55742120,
+ "attractiveness":16,
+ "must_do":false,
+ "n_tags":26,
+ "time_to_reach":0
+ },
+ "24":{
+ "name":"Église Saint-Germain des Prés",
+ "type":{
+ "landmark_type":"sightseeing"
+ },
+ "location":[
+ 48.8539667,
+ 2.334463
+ ],
+ "osm_type":"way",
+ "osm_id":62287173,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":21,
+ "time_to_reach":0
+ },
+ "25":{
+ "name":"Square de la Tour Saint-Jacques",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.857913,
+ 2.3487608
+ ],
+ "osm_type":"way",
+ "osm_id":15895172,
+ "attractiveness":19,
+ "must_do":false,
+ "n_tags":12,
+ "time_to_reach":0
+ },
+ "26":{
+ "name":"Square Jean XXIII",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8523775,
+ 2.3503406
+ ],
+ "osm_type":"way",
+ "osm_id":20444455,
+ "attractiveness":23,
+ "must_do":false,
+ "n_tags":15,
+ "time_to_reach":0
+ },
+ "27":{
+ "name":"Square Félix Desruelles",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8536974,
+ 2.3345069
+ ],
+ "osm_type":"way",
+ "osm_id":62287123,
+ "attractiveness":12,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ },
+ "28":{
+ "name":"Jardin des Rosiers – Joseph-Migneret",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8572946,
+ 2.3602516
+ ],
+ "osm_type":"way",
+ "osm_id":365878540,
+ "attractiveness":14,
+ "must_do":false,
+ "n_tags":8,
+ "time_to_reach":0
+ },
+ "29":{
+ "name":"Jardin du Père-Armand-David",
+ "type":{
+ "landmark_type":"nature"
+ },
+ "location":[
+ 48.8478674,
+ 2.3220972
+ ],
+ "osm_type":"way",
+ "osm_id":588324415,
+ "attractiveness":10,
+ "must_do":false,
+ "n_tags":7,
+ "time_to_reach":0
+ }
+}
\ No newline at end of file
diff --git a/pubspec.lock b/pubspec.lock
deleted file mode 100644
index e8a2cb6..0000000
--- a/pubspec.lock
+++ /dev/null
@@ -1,333 +0,0 @@
-# Generated by pub
-# See https://dart.dev/tools/pub/glossary#lockfile
-packages:
- async:
- dependency: transitive
- description:
- name: async
- sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
- url: "https://pub.dev"
- source: hosted
- version: "2.11.0"
- boolean_selector:
- dependency: transitive
- description:
- name: boolean_selector
- sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.1"
- characters:
- dependency: transitive
- description:
- name: characters
- sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
- url: "https://pub.dev"
- source: hosted
- version: "1.3.0"
- clock:
- dependency: transitive
- description:
- name: clock
- sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
- url: "https://pub.dev"
- source: hosted
- version: "1.1.1"
- collection:
- dependency: transitive
- description:
- name: collection
- sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
- url: "https://pub.dev"
- source: hosted
- version: "1.18.0"
- cupertino_icons:
- dependency: "direct main"
- description:
- name: cupertino_icons
- sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
- url: "https://pub.dev"
- source: hosted
- version: "1.0.8"
- fake_async:
- dependency: transitive
- description:
- name: fake_async
- sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
- url: "https://pub.dev"
- source: hosted
- version: "1.3.1"
- flutter:
- dependency: "direct main"
- description: flutter
- source: sdk
- version: "0.0.0"
- flutter_lints:
- dependency: "direct dev"
- description:
- name: flutter_lints
- sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
- url: "https://pub.dev"
- source: hosted
- version: "3.0.2"
- flutter_map:
- dependency: "direct main"
- description:
- name: flutter_map
- sha256: cda8d72135b697f519287258b5294a57ce2f2a5ebf234f0e406aad4dc14c9399
- url: "https://pub.dev"
- source: hosted
- version: "6.1.0"
- flutter_test:
- dependency: "direct dev"
- description: flutter
- source: sdk
- version: "0.0.0"
- http:
- dependency: transitive
- description:
- name: http
- sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
- url: "https://pub.dev"
- source: hosted
- version: "1.2.1"
- http_parser:
- dependency: transitive
- description:
- name: http_parser
- sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
- url: "https://pub.dev"
- source: hosted
- version: "4.0.2"
- intl:
- dependency: transitive
- description:
- name: intl
- sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf
- url: "https://pub.dev"
- source: hosted
- version: "0.19.0"
- latlong2:
- dependency: transitive
- description:
- name: latlong2
- sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe"
- url: "https://pub.dev"
- source: hosted
- version: "0.9.1"
- leak_tracker:
- dependency: transitive
- description:
- name: leak_tracker
- sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa"
- url: "https://pub.dev"
- source: hosted
- version: "10.0.0"
- leak_tracker_flutter_testing:
- dependency: transitive
- description:
- name: leak_tracker_flutter_testing
- sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0
- url: "https://pub.dev"
- source: hosted
- version: "2.0.1"
- leak_tracker_testing:
- dependency: transitive
- description:
- name: leak_tracker_testing
- sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47
- url: "https://pub.dev"
- source: hosted
- version: "2.0.1"
- lints:
- dependency: transitive
- description:
- name: lints
- sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
- url: "https://pub.dev"
- source: hosted
- version: "3.0.0"
- lists:
- dependency: transitive
- description:
- name: lists
- sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27"
- url: "https://pub.dev"
- source: hosted
- version: "1.0.1"
- logger:
- dependency: transitive
- description:
- name: logger
- sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04"
- url: "https://pub.dev"
- source: hosted
- version: "2.2.0"
- matcher:
- dependency: transitive
- description:
- name: matcher
- sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
- url: "https://pub.dev"
- source: hosted
- version: "0.12.16+1"
- material_color_utilities:
- dependency: transitive
- description:
- name: material_color_utilities
- sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
- url: "https://pub.dev"
- source: hosted
- version: "0.8.0"
- meta:
- dependency: transitive
- description:
- name: meta
- sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
- url: "https://pub.dev"
- source: hosted
- version: "1.11.0"
- mgrs_dart:
- dependency: transitive
- description:
- name: mgrs_dart
- sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7
- url: "https://pub.dev"
- source: hosted
- version: "2.0.0"
- path:
- dependency: transitive
- description:
- name: path
- sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
- url: "https://pub.dev"
- source: hosted
- version: "1.9.0"
- polylabel:
- dependency: transitive
- description:
- name: polylabel
- sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b"
- url: "https://pub.dev"
- source: hosted
- version: "1.0.1"
- proj4dart:
- dependency: transitive
- description:
- name: proj4dart
- sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e
- url: "https://pub.dev"
- source: hosted
- version: "2.1.0"
- sky_engine:
- dependency: transitive
- description: flutter
- source: sdk
- version: "0.0.99"
- sliding_up_panel:
- dependency: "direct main"
- description:
- name: sliding_up_panel
- sha256: "578e90956a6212d1e406373250b2436a0f3afece29aee3c24c8360094d6cf968"
- url: "https://pub.dev"
- source: hosted
- version: "2.0.0+1"
- source_span:
- dependency: transitive
- description:
- name: source_span
- sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
- url: "https://pub.dev"
- source: hosted
- version: "1.10.0"
- stack_trace:
- dependency: transitive
- description:
- name: stack_trace
- sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
- url: "https://pub.dev"
- source: hosted
- version: "1.11.1"
- stream_channel:
- dependency: transitive
- description:
- name: stream_channel
- sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
- url: "https://pub.dev"
- source: hosted
- version: "2.1.2"
- string_scanner:
- dependency: transitive
- description:
- name: string_scanner
- sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
- url: "https://pub.dev"
- source: hosted
- version: "1.2.0"
- term_glyph:
- dependency: transitive
- description:
- name: term_glyph
- sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
- url: "https://pub.dev"
- source: hosted
- version: "1.2.1"
- test_api:
- dependency: transitive
- description:
- name: test_api
- sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
- url: "https://pub.dev"
- source: hosted
- version: "0.6.1"
- typed_data:
- dependency: transitive
- description:
- name: typed_data
- sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
- url: "https://pub.dev"
- source: hosted
- version: "1.3.2"
- unicode:
- dependency: transitive
- description:
- name: unicode
- sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1"
- url: "https://pub.dev"
- source: hosted
- version: "0.3.1"
- vector_math:
- dependency: transitive
- description:
- name: vector_math
- sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
- url: "https://pub.dev"
- source: hosted
- version: "2.1.4"
- vm_service:
- dependency: transitive
- description:
- name: vm_service
- sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957
- url: "https://pub.dev"
- source: hosted
- version: "13.0.0"
- web:
- dependency: transitive
- description:
- name: web
- sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
- url: "https://pub.dev"
- source: hosted
- version: "0.5.1"
- wkt_parser:
- dependency: transitive
- description:
- name: wkt_parser
- sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13"
- url: "https://pub.dev"
- source: hosted
- version: "2.0.0"
-sdks:
- dart: ">=3.3.4 <4.0.0"
- flutter: ">=3.10.0"