Compare commits

...

108 Commits

Author SHA1 Message Date
nobohan 0cc04eae61 update README 2024-01-30 11:06:33 +01:00
Julien Minet d26aebd6f6 update submodule for #44 2024-01-23 11:22:13 +01:00
Julien Minet 86a77bb488 Update vendor for Geonature for #44 (dashboard) 2024-01-18 10:46:06 +01:00
Julien Minet 2cc6c185c7 update vendor for #44 2024-01-15 19:30:29 +01:00
Julien Minet 8b33a050ed FIXED compilation of Dockerfile for Taxhub #54 2024-01-08 16:27:10 +01:00
nobohan ea699549ac upd vendor: merge branch issue51 2023-12-01 14:43:48 +01:00
nobohan da1b8d8253 #43 add confiance badge + update submodules 2023-10-03 20:36:36 +02:00
nobohan 69749c2539 #44 add demo graphs in QGIS project 2023-08-28 15:23:54 +02:00
nobohan 2f87bcfc48 update vendor submodule with fixes for user evaluation 2023-08-18 10:30:31 +02:00
nobohan f3ad29d29f #42 update vendor submodule 2023-08-17 08:22:58 +02:00
nobohan 948f43b444 #43 add expert status to user: update vendor submodule 2023-08-16 11:16:30 +02:00
nobohan 044a4c0a68 FEATURE: send email to admins when a new user subscribe #41 2023-08-16 10:46:32 +02:00
nobohan d5a55aa4c3 #47 update map layers 2023-08-14 16:27:55 +02:00
nobohan 8df8ecc4df update app #40: update vendor submodule 2023-07-19 09:41:56 +02:00
nobohan d81aeb1f7f #40 fix pip dependency issue with fiona and utils-flask-sqla-geo using python3.8 2023-07-17 12:32:48 +02:00
nobohan 277fd3fe82 update app #40 add missing conf file 2023-07-17 11:40:55 +02:00
nobohan 864ebb2c57 delete obsolet README 2023-07-14 09:39:08 +02:00
nobohan 43e480daab update app #40: add missing media folder in Dockerfile-back 2023-07-13 17:49:19 +02:00
nobohan 78efb59f9f update app: use custom requirements and other docker-compose adaptations 2023-07-13 12:29:50 +02:00
nobohan 7036420059 update app: geo_api not used anymore (fix patch) 2023-07-13 12:28:04 +02:00
nobohan 7473e16907 update app: new parameters needed in config.toml 2023-07-13 11:29:04 +02:00
nobohan 1b6983cdc3 add post-installation instructions 2023-07-12 09:52:48 +02:00
nobohan af3310baff better installation instructions + fix missing volume in docker-compose 2023-07-12 09:39:40 +02:00
nobohan f02ad64ac1 correct typo in app.config.ts 2022-11-23 13:45:17 +01:00
nobohan 81c196a36c update teaser in app.config.dist.ts 2022-11-23 10:40:51 +01:00
nobohan c5b862fd63 update app.config.dist.ts from the one from liveche 2022-11-23 10:40:00 +01:00
nobohan 2243cff08d update teaser in app.config.ts 2022-11-23 10:36:03 +01:00
nobohan 5f32bddf03 upd README 2022-10-05 17:46:35 +02:00
nobohan 85761d83b8 upd vendor 2022-10-05 17:45:49 +02:00
nobohan 2abe54d974 update doc 2022-09-28 10:25:59 +02:00
nobohan 1f96860bac update vendor 2022-09-19 18:13:10 +02:00
nobohan 976657c2eb #36 add a new WMS layer in map config 2022-09-19 15:04:57 +02:00
nobohan b5eb59980a upd README 2022-09-13 10:02:44 +02:00
nobohan b1b941e048 update vendor Geonature-citizen 2022-09-12 14:19:40 +02:00
nobohan 42498f68e9 update geonature-citizen submodule 2022-07-20 14:50:08 +02:00
nobohan 9f0e5d21c9 update vendors 2022-07-11 16:34:51 +02:00
nobohan 66f818e54f #35 use gunicorn for running the backend in production 2022-07-11 16:32:41 +02:00
nobohan 7d5d821bae improve FROM in default email settings (#33) 2022-07-11 12:20:55 +02:00
nobohan 2a2f8a0874 get debug mode from env variables when starting wsgi server 2022-05-30 14:37:35 +02:00
nobohan 2e0c7e897e fix issues #20 and #29: init the db after registering all the routes 2022-04-14 15:50:49 +02:00
nobohan 44c937275a add missing libffi-dev dep in Dockerfile 2022-04-01 14:52:37 +02:00
nobohan 99fdc574ce update vendor submodule 2021-10-27 14:05:47 +02:00
nobohan 0f8b734d25 documentation 2021-10-27 14:05:29 +02:00
nobohan e51b1ccfa1 dashboard data: biomasse 2021-10-25 15:40:18 +02:00
nobohan f80abd8e32 doc 2021-10-21 18:07:12 +02:00
nobohan 4cecd3cd14 fix pandoc compilation problem 2021-10-21 17:56:42 +02:00
nobohan 6ed52886c3 init documentation 2021-10-21 17:21:23 +02:00
nobohan 66893bb39d add qgis demo project 2021-10-21 09:19:39 +02:00
nobohan 90fd599768 typo in README 2021-10-21 09:19:22 +02:00
nobohan b47b2fb36a add new images in assets 2021-10-18 11:45:31 +02:00
nobohan c69947c811 correction README 2021-10-12 14:21:15 +02:00
nobohan f13f350391 update submodule 2021-10-01 16:03:41 +02:00
nobohan a3967b3c17 dashboard: print 2021-09-30 12:16:14 +02:00
nobohan b28af2d1e6 add icon for dashboard 2021-09-28 21:59:36 +02:00
nobohan 426311aaaa dashboard: add data in config 2021-09-28 09:04:37 +02:00
nobohan dc42f4e5d5 #16 dashboard data object 2021-09-23 09:41:55 +02:00
nobohan 45211bf4ce #16 add dashboard config objet in the patches 2021-09-22 10:58:17 +02:00
nobohan 9520ee73b5 upd utils README 2021-09-22 10:37:06 +02:00
nobohan 6f20bb18a3 geojson2sql: refine name of properties 2021-09-21 17:01:50 +02:00
nobohan 0e4dca5f9e upd vendor Geonature dep on branch champs-libres-dev 2021-09-15 12:01:59 +02:00
nobohan bc21b86823 #17 upd README 2021-09-15 11:58:34 +02:00
nobohan 177a54a444 #17 Add possibility to import ARHEM haies remarquables 2021-09-15 11:46:55 +02:00
nobohan 3ed4872b60 import external data and qualification (#17): improvements 2021-09-15 10:57:31 +02:00
nobohan c7f7931af6 correction formulaire pour les espèces 2021-09-15 10:17:05 +02:00
nobohan 459aa056d6 add script for importing data 2021-09-13 16:38:41 +02:00
nobohan cbd4d1f174 new forms for lines and polygons 2021-09-06 13:05:59 +02:00
nobohan 1fe6c20bdb upd README 2021-09-06 09:09:29 +02:00
nobohan a1c589f7a1 POC of polygon drawing with Leaflet 2021-09-01 15:14:04 +02:00
nobohan 07e76fa6a8 #14 add line edition in leaflet in sandbox 2021-08-25 10:15:16 +02:00
nobohan cdf6e4ac45 upd app.config for the GnC dev branch 2021-08-24 13:50:53 +02:00
nobohan 4876da0087 upd README about compile front 2021-08-24 13:50:17 +02:00
nobohan 665cde961d update the app on branch dev from GnC 2021-08-24 11:21:01 +02:00
nobohan 598b76e1eb share volume for backend (for dev) 2021-08-24 10:29:49 +02:00
nobohan b484ef7904 Add info for connecting the db in README 2021-08-24 09:52:59 +02:00
nobohan 207bc2bf34 add node_modules in gitingore for speeding the docker images builds 2021-08-23 21:55:34 +02:00
nobohan 6d0cf3e27a Enable developping the frontend code interactively with ng serve 2021-08-23 12:39:26 +02:00
nobohan 3c11212676 allow images up to 12M (fix #9) 2021-07-05 11:40:13 +02:00
nobohan 4c9fa86318 fix footer css 2021-07-03 10:40:15 +02:00
nobohan 5dbe767d0f Merge branch 'smartphone_adaptation' into main
merge into main
2021-07-03 10:07:28 +02:00
nobohan 95e86b0e6c upd geonature submodule 2021-07-02 18:30:12 +02:00
nobohan e0260b8d1a modify footer for small screen 2021-07-02 17:56:38 +02:00
Marc Ducobu dedc229078 Removing useless lines 2021-07-01 15:58:54 +02:00
Marc Ducobu 3b7bc6810a Compil JS de taxhub dans dockerfile 2021-07-01 15:58:28 +02:00
Marc Ducobu 0ddfe09ab8 Fix #6 using nginx 2021-07-01 14:47:23 +02:00
nobohan 777464d788 small correction form arbres 2021-06-24 16:10:18 +02:00
nobohan e7dca3bd97 fix proper way of build the front container with custom patch files 2021-06-23 21:15:46 +02:00
nobohan 2e8fd03ada upd form arbres 2021-06-23 15:00:06 +02:00
nobohan 6a711dbd99 update content + add custom files in patch #7 2021-06-23 12:18:45 +02:00
nobohan b7a682d538 customisation for Wasseiges 2021-06-23 08:45:35 +02:00
nobohan dd41cf139b upd README about deploiement 2021-06-15 11:27:33 +02:00
nobohan 6f1dc178e9 add more map layers - correction 2021-06-14 22:58:03 +02:00
nobohan 90920d5870 add more map layers 2021-06-14 22:33:21 +02:00
nobohan 0d2c86b52c add WMS layers 2021-06-14 14:51:27 +02:00
nobohan 57e91bf9e0 remove obsolet layers 2021-06-14 12:48:56 +02:00
nobohan 8d7b70dd2b add FORETANC layer 2021-06-14 10:34:32 +02:00
nobohan f05e04229d upd readme 2021-06-02 15:11:46 +02:00
nobohan 2888d105d9 upd readme 2021-06-02 14:33:06 +02:00
nobohan 8526d35f2a upd vendor git submodule 2021-06-02 11:48:01 +02:00
nobohan 113533c2db upd README 2021-06-02 11:45:30 +02:00
Marc Ducobu d85681d2dc Images from patch -> container media 2021-06-02 11:30:32 +02:00
Marc Ducobu a5078f692d Fix small pbm + ajout containeur media 2021-06-02 10:59:25 +02:00
Marc Ducobu 3ff309daa1 Fix pbm with template files 2021-06-01 15:11:36 +02:00
Marc Ducobu 3b75880e81 Add node_modules in gitignore 2021-05-31 23:05:39 +02:00
Marc Ducobu c84d0cdfd6 Fix install for front 2021-05-31 23:04:52 +02:00
Marc Ducobu ef3766ae1c Using apache as foward (not serving files) 2021-05-31 22:12:38 +02:00
Marc Ducobu c501700bc4 Citizen-front run with JulienM patches 2021-05-31 16:15:29 +02:00
Marc Ducobu 54f0239cbb Fix error during rebase 2021-05-31 15:58:46 +02:00
Marc Ducobu 53ae96e0a9 Split into docker containers 2021-05-31 15:47:23 +02:00
141 changed files with 53240 additions and 99 deletions

2
.dockerignore Normal file
View File

@ -0,0 +1,2 @@
vendor/GeoNature-citizen/frontend/node_modules
node_modules/

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
dist/
db/data/
node_modules/

3
.gitmodules vendored
View File

@ -1,3 +1,6 @@
[submodule "vendor/GeoNature-citizen"]
path = vendor/GeoNature-citizen
url = https://github.com/Champs-Libres/GeoNature-citizen.git
[submodule "vendor/TaxHub"]
path = vendor/TaxHub
url = https://github.com/PnX-SI/TaxHub

48
Dockerfile-back Normal file
View File

@ -0,0 +1,48 @@
FROM python:3.8-slim-buster
## install dependencies
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y sudo vim nano locales unzip && \
apt-get install -y python-dev python-pip libpq-dev libgeos-dev python3 python3-pip unzip && \
apt-get install -y python3-venv git npm wget postgresql-client && \
localedef -i fr_FR -c -f UTF-8 -A /usr/share/locale/locale.alias fr_FR.UTF-8 && \
apt-get clean
## set envs
ENV LANG fr_FR.utf8
ENV TERM xterm
RUN adduser --uid 1000 --gecos "" --disabled-password appuser
RUN usermod -aG sudo appuser
RUN echo "appuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
COPY vendor/GeoNature-citizen/ /home/appuser/citizen/
# patches
COPY patches/back/default_config.toml /home/appuser/citizen/config/config.toml
COPY patches/settings.ini /home/appuser/citizen/config/settings.ini
COPY patches/back/wsgi.py /home/appuser/citizen/backend/wsgi.py
COPY patches/back/server.py /home/appuser/citizen/backend/server.py
RUN chown -R appuser:appuser /home/appuser
USER appuser
WORKDIR /home/appuser/citizen/backend/
RUN mkdir /home/appuser/citizen/media/
ENV VIRTUAL_ENV=/home/appuser/citizen/backend/venv2/
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
# RUN /bin/bash create_sys_dir.sh
# Install dependencies:
RUN pip install -r requirements.txt
EXPOSE 5002
CMD ["python", "server.py ", "runserver"]

29
Dockerfile-front Normal file
View File

@ -0,0 +1,29 @@
from node:14
COPY vendor/GeoNature-citizen/ /home/appuser/citizen/
# todo avoir copy vendor/GeoNature-citizen/backend
WORKDIR /home/appuser/citizen/
ADD https://github.com/PnX-SI/TaxHub/archive/refs/tags/1.7.3.zip /home/appuser/citizen/taxhub.zip
RUN unzip taxhub.zip
RUN mv TaxHub-1.7.3 taxhub
# PATCHES
COPY patches/settings.ini /home/appuser/citizen/config/settings.ini
COPY patches/frontend/src/conf /home/appuser/citizen/frontend/src/conf
COPY patches/frontend/src/assets /home/appuser/citizen/frontend/src/assets
COPY patches/frontend/server.ts /home/appuser/citizen/frontend/server.ts
COPY patches/frontend/src/custom /home/appuser/citizen/frontend/src/custom
WORKDIR /home/appuser/citizen/frontend
# aoir google response
ENV NG_CLI_ANALYTICS=false
RUN npm install
RUN npm run build:i18n-ssr
EXPOSE 4000
# npm run serve:ssr -> sur port 4000

50
Dockerfile-taxhub Normal file
View File

@ -0,0 +1,50 @@
FROM debian:buster-slim
## install dependencies
RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y sudo vim nano locales unzip && \
apt-get install -y python-dev python-pip libpq-dev libgeos-dev python3 python3-pip unzip libffi-dev && \
apt-get install -y python3-venv git npm wget postgresql-client && \
localedef -i fr_FR -c -f UTF-8 -A /usr/share/locale/locale.alias fr_FR.UTF-8 && \
apt-get clean
## set envs
ENV LANG fr_FR.utf8
ENV TERM xterm
RUN adduser --uid 1000 --gecos "" --disabled-password appuser
RUN usermod -aG sudo appuser
RUN echo "appuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
COPY vendor/TaxHub/ /home/appuser/taxhub/
#patches
COPY patches/taxhub/config.py /home/appuser/taxhub/config.py
COPY patches/taxhub/server.py /home/appuser/taxhub/server.py
COPY patches/taxhub/install_db.sh /home/appuser/taxhub/install_db.sh
COPY patches/taxhub/settings.ini /home/appuser/taxhub/settings.ini
RUN chown -R appuser:appuser /home/appuser
USER appuser
WORKDIR /home/appuser/taxhub/
ENV VIRTUAL_ENV=/home/appuser/taxhub/venv/
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN /bin/bash create_sys_dir.sh
# Install dependencies:
RUN pip install --upgrade pip setuptools wheel
RUN pip install -r requirements.txt
RUN cp static/app/constants.js.sample static/app/constants.js
RUN cd static && npm install
EXPOSE 5000
CMD ["python", "server.py ", "runserver"]

165
README.md
View File

@ -1,7 +1,161 @@
# gl-geonature
Geonature - Biommap
===================
L'instance Geonature-Citizen de Champs-Libres.
# Multi-container instructions
## Installation
Clone this repo
```
$ git clone git@gitea.champs-libres.be:champs-libres/biommap.git
```
Get the code (using git-submodule) for : citizen & taxhub.
```
$ git submodule update --init --recursive
```
### DB init
Creation of the table `referentielsdb` that will be used for storing data.
```
$ docker-compose up -d db
$ docker-compose exec db createdb -U postgres referentielsdb
$ docker-compose exec db psql -U postgres -d referentielsdb -c "CREATE SCHEMA taxonomie"
$ docker-compose exec db psql -d -U postgres -d referentielsdb -c "CREATE EXTENSION postgis"
```
### Build the other containers
```
$ docker-compose up
```
At this stage, you still have to install Taxhub and compile the front to see the app running!
### Compile the front
```
$ docker-compose run --rm citizen-front npm install
$ docker-compose run --rm citizen-front npm run build:i18n-ssr
```
### Taxhub installation
```
$ docker-compose run taxhub bash install_db.sh
$ docker-compose up -d taxhub
```
### nginx
Redirige de 8080 vers autres services :
- 4000 (citizen-front)
- 5002 (citizen-back)
- 5000 (taxon)
### Starting
For starting the application again, you may start the db container first
```
$ docker-compose up -d db
$ docker-compose up
```
### Post-installation
1) Create a user account through the application and/or in the admin
2) Create a project, a "zone géographique", a form, a "type de site", a program (see https://gitea.champs-libres.be/champs-libres/biommap/wiki/Gestion-des-programmes)
## Development
### Inspect db
There is a pgweb container that allows to inspect the db, at <http://localhost:8081/>. Use the following credentials to connect:
* host: db
* un: postgres
* pw: postgres
* dbname: referentielsdb
* port: 5432
* SSL mode: disable
### Front-end development
In order to interactively edit the js code, the frontend folder is mounted into the frontend container. To interactively develop the frontend code and watch the results, enter the running frontend container and launch `ng serve` with the following arguments (see <http://imaginativethinking.ca/heck-get-connection-reset-peer-containerizing-angular-4-application/> for why the host argument is required):
```bash
docker-compose exec citizen-front bash
root@9c0fea7720a0:/home/appuser/citizen/frontend# npm run ng serve -- --host 0.0.0.0 --port 4200 --configuration=fr --poll 2000 --sourceMap=false
```
The app must be looked at **http://localhost:4200/**.
But note that for persistently-built frontend files, you must run:
```bash
docker-compose exec citizen-front bash
root@9c0fea7720a0:/home/appuser/citizen/frontend# npm run build:i18n-ssr
```
or `npm run build:fr` for speeding up.
### Back-end development
When developing the app and serving it with `docker-compose up`, the changes should be automatically loaded (meaning, the app is watching the changes) (Note that this is not the case anymore). However, it is more practical to change the command of the backend container from `command: bash start_gunicorn.sh` to `command: python wsgi.py` in order to have some logs.
You can access a flask shell terminal with the following:
```bash
docker-compose exec citizen-back bash
appuser@5d4fc6b169b2:~/citizen/backend$ flask shell
```
## Deploiement sur un serveur distant
### 0) Si on change le fichier app.config.ts
```bash
scp patches/frontend/src/conf/app.config.ts.dist user@domain.org:/path/to/app.config.ts
```
### 1) Reconstruire l'image front en local
```bash
docker-compose build citizen-front
docker login registry.gitlab.com
docker push registry.gitlab.com/champs-libres/geonature-citizen/front
```
Il est peut-être aussi nécessaire de faire de même pour l'image `media`.
```bash
docker-compose build media
docker login registry.gitlab.com
docker push registry.gitlab.com/champs-libres/geonature-citizen/media
```
### 2) Sur le serveur distant
```bash
docker pull registry.gitlab.com/champs-libres/geonature-citizen/front
# Rebuild of the front
docker-compose run --rm citizen-front npm run build:i18n-ssr
# Restart the containers
docker-compose up -d db
docker-compose up -d
```
### Troubleshooting
Attention, lorsqu'on envoie des images sur le serveur (avec `docker push`), celles-ci peuvent être très volumineuses! Il faut vérifier la capacité du serveur (avec `df`), inspecter les images existantes (`docker image ls`) et supprimer les anciennes images (`docker rmi ...`).
# Single-container instructions (deprecated)
## Installation
$ git submodule update --init --recursive
@ -26,10 +180,15 @@ $ git submodule foreach git pull git@github.com:Champs-Libres/GeoNature-citizen.
$ make doc
### Builder le front (pour production)
### Builder le front (pour production) (avant de pouvoir faire le docker up)
```
$ docker-compose exec citizen bash
$ docker-compose run --rm citizen-front npm install
$ docker-compose run --rm citizen-front npm run build:i18n-ssr
$ docker-compose up -d citizen-front
```
$ docker-compose exec citizen-front bash
appuser@ab136184159a:~/citizen/$ cd frontend
appuser@ab136184159a:~/citizen/frontend$ npm run ng build -- --configuration=fr --prod
```

View File

@ -1,11 +1,94 @@
version: '3.3'
services:
citizen:
tty: true
db:
image: postgis/postgis:12-3.1-alpine
ports:
- "5434:5432"
volumes:
- "pg-data:/var/lib/postgresql/data"
environment:
- "POSTGRES_PASSWORD=postgres"
citizen-front:
build:
dockerfile: ./Dockerfile-front
context: .
image: registry.gitlab.com/champs-libres/geonature-citizen/front
volumes:
- ./vendor/GeoNature-citizen/frontend:/home/appuser/citizen/frontend
- ./vendor/GeoNature-citizen/backend:/home/appuser/citizen/backend
- ./restart.sh:/home/appuser/citizen/install/restart.sh
- ./patches/settings.ini:/home/appuser/citizen/config/settings.ini
- ./patches/frontend/src/conf:/home/appuser/citizen/frontend/src/conf
- ./patches/frontend/src/assets:/home/appuser/citizen/frontend/src/assets
- ./patches/frontend/src/custom:/home/appuser/citizen/frontend/src/custom
- ./patches/frontend/server.ts:/home/appuser/citizen/frontend/server.ts
- ./dist:/home/appuser/citizen/frontend/dist
# re files installed by npm install
- ./node_modules:/home/appuser/citizen/frontend/node_modules
ports:
- "4000:4000"
- "4200:4200"
command: npm run serve:ssr
environment:
# avoid goodle analytics question
- "NG_CLI_ANALYTICS=false"
citizen-back:
build:
dockerfile: ./Dockerfile-back
context: .
image: registry.gitlab.com/champs-libres/geonature-citizen/back
volumes:
- ./vendor/GeoNature-citizen/backend/gncitizen/:/home/appuser/citizen/backend/gncitizen/
- ./vendor/GeoNature-citizen/backend/var/log/:/home/appuser/citizen/backend/var/log/
- ./patches/settings.ini:/home/appuser/citizen/config/settings.ini
- ./patches/settings.ini:/home/appuser/citizen/backend/config/settings.ini
- ./patches/back/default_config.toml:/home/appuser/citizen/config/config.toml
- ./patches/back/start_gunicorn.sh:/home/appuser/citizen/backend/start_gunicorn.sh
- ./patches/back/wsgi.py:/home/appuser/citizen/backend/wsgi.py
- ./patches/back/server.py:/home/appuser/citizen/backend/server.py
ports:
- "5002:5002"
#command: bash start_gunicorn.sh
command: python wsgi.py
taxhub:
build:
dockerfile: ./Dockerfile-taxhub
context: .
image: registry.gitlab.com/champs-libres/geonature-citizen/taxhub
ports:
- "5000:5000"
volumes:
- ./patches/taxhub/config.py:/home/appuser/taxhub/config.py
- ./patches/taxhub/server.py:/home/appuser/taxhub/server.py
- ./patches/taxhub/install_db.sh:/home/appuser/taxhub/install_db.sh
- ./patches/taxhub/settings.ini:/home/appuser/taxhub/settings.ini
- ./patches/taxhub/gunicorn_start.sh:/home/appuser/taxhub/gunicorn_start.sh
- ./vendor/TaxHub/var/log/:/home/appuser/taxhub/var/log/
command: bash gunicorn_start.sh
media:
build:
context: .
dockerfile: ./media/Dockerfile
image: registry.gitlab.com/champs-libres/geonature-citizen/media
ports:
- "8082:80"
nginx:
build:
context: ./nginx
dockerfile: ./Dockerfile
image: registry.gitlab.com/champs-libres/geonature-citizen/nginx
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- "media"
- "citizen-front"
- "citizen-back"
- "taxhub"
ports:
- "8080:80"
pgweb:
image: sosedoff/pgweb
ports:
- 8081:8081
volumes:
pg-data:

View File

@ -3,4 +3,4 @@ services:
citizen:
build: .
ports:
- "8080:80"
- "8888:80"

26
documentation/README.md Normal file
View File

@ -0,0 +1,26 @@
# Documentation de l'application
## Contenu
Le contenu de la documentation vit dans le wiki: https://gitea.champs-libres.be/champs-libres/biommap/wiki/_pages. Éditer ce contenu en ligne ou en utilisant le dépôt du wiki.
## Build
Pour faire un beau pdf de cette documentation, on utilise pandoc avec un template. Pour lancer la commande:
```bash
documentation$ sudo sh build.sh
```
Note: pour utiliser le filtre lua sur les images, je dois faire cette commande avec sudo.
J'ai utilisé pandoc 2.14.2.
Pour que pandoc trouve les fichiers, il faut leur indiquer un chemin valide. Ici, on présuppose que les dépots de ce projet de du wiki sont tels que:
├── repo
│   └── biommap-multi
├── wiki
│   └── biommap.wiki
Sinon, changer les chemins relatifs dans le fichier `build.sh`.

22
documentation/build.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/bash
cd $(dirname "${0}")
pandoc --from markdown \
--number-sections \
--pdf-engine=xelatex \
--template=template.tex \
--lua-filter=image-path.lua \
-o documentation-biommap.pdf \
src/001-cover.md \
src/002-toc.md \
../../../wiki/biommap.wiki/Gestion-des-utilisateurs.md \
../../../wiki/biommap.wiki/Gestion-des-programmes.md \
../../../wiki/biommap.wiki/Tableau-de-bord.md \
../../../wiki/biommap.wiki/Editer-le-contenu-statique.md \
../../../wiki/biommap.wiki/Image-programme.md \
../../../wiki/biommap.wiki/Configurer-le-serveur-SMTP.md \
../../../wiki/biommap.wiki/Import-requalification.md \
../../../wiki/biommap.wiki/Utilisation-API.md \
../../../wiki/biommap.wiki/Access-a-la-base-de-donnees.md \
../../../wiki/biommap.wiki/Interaction-QGIS-BD.md \

Binary file not shown.

View File

@ -0,0 +1,10 @@
function fix_path (path)
return '../../../wiki/biommap.wiki/' .. path
end
function Image (element)
element.src = fix_path(element.src)
return element
end

View File

@ -0,0 +1,6 @@
\includepdf{./src/cover.pdf}
\newpage

View File

@ -0,0 +1,18 @@
```{=latex}
\begingroup
\hypersetup{linkcolor=linkcolortoc}
\tableofcontents
\listoffigures
\listoftables
\endgroup
```

BIN
documentation/src/cover.pdf Normal file

Binary file not shown.

904
documentation/src/cover.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 95 KiB

438
documentation/template.tex Normal file
View File

@ -0,0 +1,438 @@
%!TEX TS-program = xelatex
\documentclass[french, 10pt]{scrartcl}
% The declaration of the document class:
% The second line here, i.e.
% \documentclass[12pt]{scrartcl}
% is a standard LaTeX document class declaration:
% we say what kind of document we are making in curly brackets,
% and specify any options in square brackets.
% (The previous line is a pseudo-comment, declaring that we will
% use the special XeTeX machinery for its more extensive font list
% and its use of unicode;
% in general, LaTeX 'comments' like this one
% begin with % and end with a linebreak.)
% Note that there we have nothing in the nature of a template;
% it's just a standard bit of LaTeX pandoc will copy unaltered into the
% LaTeX file it is writing. But suppose you wrote something
% more akin to the corresponding line in Pandoc's default
% latex.template file, say:
% \documentclass$if(fontsize)$[$fontsize$]$endif${scrartcl}
% then you would have invented a 'variable', fontsize,
% and could write things like
% `markdown2pdf my.txt --xetex --variable=fontsize:12pt -o my.pdf` or
% `pandoc -r markdown -w html my.txt -s --xetex --variable=fontsize:24pt -o my.tex`.
% If we specified --variable-fontsize:12, then template substitution
% would yield a LaTeX document beginning
% \documentclass[12pt]{scrarcl}
% which is just what we said anyway.
% But we could also specify a different fontsize.
% I don't use this `--variable=....`functionality myself;
% I have a couple of basic templates I call with
% `--template=whatever.template` which I can also
% easily inspect to adjust things like font size as I please.
% While we are discussing the declaration of the document class...
% here's an alternative command for two column landscape,
% not bad for some purposes. (If you strike the word 'landscape'
% you will have two narrow newspaperlike
% columns; scientists like that, because irrationality must
% show itself somewhere):
%\documentclass[12pt,twocolumn,landscape]{scrartcl}
% Columns are too close together in LaTeX so we add this
% `columnsep` command:
%\setlength{\columnsep}{.5in}
% I use the special 'komascript' article class "scrartcl"
% reasons I can't entirely remember; I'm not sure it's that great.
% One reason is the unimportant one that, like many classes,
% it allows very big fonts which are convenient for booklet printing
% in the idiotic American way by shrinking letterpaper pages.
% the standard minimal LaTeX 'article' class declaration would be something like:
% \documentclass[12pt]{article}
% or for big type:
% \documentclass[24pt]{extarticle}
% but these restrict you to old-fashioned LaTeX materials.
% Note that Kieran Healy uses the swank 'Memoir' class,
% \documentclass[11pt,article,oneside]{memoir}
% which might be worth a look.
% Enough about the document class.
% -- We are in swanky unicode, XeTeX land, and must now import these packages:
\usepackage{fontspec,xltxtra,xunicode}
% fontspec means we can specify pretty much any font.
% Because we are using XeTeX material,
% this template needs to be called with the `--xetex` flag.
% Symbols:
% Pandoc imports the extensive `amsmath` collection of symbols
% for typesetting ordinary math.
\usepackage{amsmath}
% if you use exotic symbols you need to import specific packages, eg. for
% electrical engineering diagrams, musical notation, exotic currency symbols,
% the unspeakable rites of freemasonry etc.
\usepackage{amssymb}
\usepackage{eurosym}
\usepackage{rotating}
\usepackage[%
all,
defaultlines=3 % nombre minimum de lignes
]{nowidow}
% `babel`:
% The `babel` package, among other things, lets you determine what
% language you are using in a given stretch of text, so that typesetting
% will go well. Here we specify that mostly, we are speaking English:
% \usepackage[francais]{babel}
%%% \usepackage[francais]{babel}
\usepackage{babel}
% Margins, etc:
% the `geometry` package makes for convenient adjusting of margins, which is what
% you asked about. Of course it can do much more, even make coffee for you:
\usepackage{geometry}
\geometry{verbose,a4paper,tmargin=3cm,bmargin=5cm,lmargin=3cm,rmargin=5cm}
% so if you just keep a copy of this template in the directory you are working in, you
% can adjust the margins by going into this file and messing with the margins.
% the syntax is very unforgiving, but permits 3cm and 2.5in and some other things.
% Font:
% Here I set my main font, which is an Apple Corporation Exclusive, golly.
% \setmainfont{Hoefler Text}
% \setromanfont[Mapping=tex-text,Contextuals={NoWordInitial,NoWordFinal,NoLineInitial,NoLineFinal},Ligatures={NoCommon}]{Hoefler Text}
% Hoefler Text is okay, but note the long discussion of 'contextuals' which is necessary to cools off
% some of its show-offy properties. (You can make your essay look like the
% Declaration of Independence by specifying e.g. Ligatures={Rare} )
% If you have a copy you might try it; as it is
% I will comment it out and supply something more certain to be around:
\setmainfont{Open Sans}
% Properly one should specify a sanserif font and a monospace font
% see e.g. the example of Kieran Healy:
% \setromanfont[Mapping=tex-text,Numbers=OldStyle]{Minion Pro}
% \setsansfont[Mapping=tex-text]{Minion Pro}
% \setmonofont[Mapping=tex-text,Scale=0.8]{Pragmata}
% But I hate sanserif fonts, and anyway there are defaults.
% Heading styles:
% These commands keep the koma system from making stupid sans serif section headings
\setkomafont{title}{\rmfamily\mdseries\upshape\normalsize\color{clgreencolor}}
\setkomafont{sectioning}{\rmfamily\mdseries\upshape\normalsize\color{clgreencolor}}
\setkomafont{descriptionlabel}{\rmfamily\mdseries\upshape\normalsize\color{clgreencolor}}
% Add some numbering to headings and a new line until heading level 6
%\usepackage{titlesec}
%\setcounter{secnumdepth}{6}
%\titleformat{\paragraph}{\normalfont\normalsize\color{clgreencolor}}{\theparagraph}{1em}{}
%\titlespacing*{\paragraph}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
%\titleformat{\subparagraph}{\normalfont\normalsize\color{clgreencolor}}{\thesubparagraph}{1em}{}
%\titlespacing*{\subparagraph}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex}
% Hyphenation
% We played with the tolerance to increase the hyphenation
\tolerance=1000
% list of words which need hyphenation
\hyphenation{a-gen-da cha-que u-sa-ger}
% I'm puzzled why I have this foonote speciality,
% I wonder if it's part of my problem I've been having, but wont look
% into it now.
\usepackage[flushmargin]{footmisc}
% \usepackage[hang,flushmargin]{footmisc}
% So much for my personal template.
% Everything that follows is copied from the pandoc default template:
% I will interpolate a few comments, the comments that are in
% the default template will be marked % --
% Paragraph format:
% Pandoc prefers unindented paragraphs in the European style:
\setlength{\parindent}{0pt}
% ... with paragraph breaks marked by a slight lengthening of
% the space between paragraphs:
\setlength{\parskip}{6pt plus 2pt minus 1pt}
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
% Page format:
% \pagestyle{plain}
% The default `plain` pagestyle just numbers the pages,
% whereas
\pagestyle{empty}
% would give you no numbering.
% After one-million man-years of macro-composition,
% there are also fancy pagestyles with much wilder options
% for headers and footers, of course.
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\rfoot{\color{clgraycolor}\thepage}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}
% Footnotes
% if you have code in your footnotes, the million macro march
% kind of bumps into itself.
% Pandoc, having just rendered your text into LaTeX,
% knows whether the 'variable' `verbatim-in-note` is True, and
% If it is, it asks for a LaTeX package that solves the dilemma:
$if(verbatim-in-note)$
\usepackage{fancyvrb}
$endif$
% Lists formatting:
% note sure what 'fancy enums' are; something to do with lists,
% as the further comment suggests:
$if(fancy-enums)$
% -- Redefine labelwidth for lists; otherwise, the enumerate package will cause
% -- markers to extend beyond the left margin.
\makeatletter\AtBeginDocument{%
\renewcommand{\@listi}
{\setlength{\labelwidth}{4em}}
}\makeatother
\usepackage{enumerate}
$endif$
% Table formatting:
% What if you make a table? -- Pandoc knows, of course, and
% then declares that its variable `table` is True and
% imports a table package suitable to its pleasantly simple tables.
% Needless to say infinitely complicated tables are possible in
% LaTeX with suitable packages. We are spared the temptation:
$if(tables)$
\usepackage{array}
% Continuing on the topic of tables ... (we havent reached `endif`).
% The commented out line below is in the default pandoc latex.template.
% Some unpleasantness with table formatting must be corrected.
% -- This is needed because raggedright in table elements redefines \\:
\newcommand{\PreserveBackslash}[1]{\let\temp=\\#1\let\\=\temp}
\let\PBS=\PreserveBackslash
$endif$
% Subscripts:
% Pandoc remembers whether you used subscripts, assigning True to
% its `subscript` variable
% It then needs to adopt a default with an incantation like this:
$if(subscript)$
\newcommand{\textsubscr}[1]{\ensuremath{_{\scriptsize\textrm{#1}}}}
$endif$
% Web-style links:
% markdown inclines us to use links, since our texts can be made into html.
% Why not have clickable blue links even in
% learned, scientific, religious, juridical, poetical and other suchlike texts?
% Never mind that they have been proven to destroy the nervous system!
% First, what about the fact that links like http://example.com are
% technically code and thus must not be broken across lines?
% [breaklinks=true] to the rescue!
% Nowadays LaTeX can handle all of this with another half million macros:
\usepackage[dvipsnames]{xcolor}
\definecolor{linkcolor}{RGB}{0, 136, 170}
\definecolor{linkcolortoc}{RGB}{51,51,51} % same as text color
\definecolor{clgreencolor}{RGB}{136,170,0}
\definecolor{clgraycolor}{RGB}{51,51,51}
\definecolor{cctpcolor}{RGB}{0,136,170}
\usepackage[breaklinks=true]{hyperref}
\hypersetup{colorlinks,%
citecolor=linkcolor%
filecolor=linkcolor,%
linkcolor=linkcolor,
urlcolor=linkcolor}
$if(url)$
\usepackage{url}
$endif$
% Images.
% In ye olde LaTeX one could only import a limited range of image
% types, e.g. the forgotten .eps files. Or else one simply drew the image with suitable
% commands and drawing packages. Today we want to import .jpg files we make with
% our smart phones or whatever:
\usepackage{lscape}
\usepackage{graphicx}
\usepackage{pdfpages}
%$if(graphics)$
%\usepackage{graphicx}
% -- We will generate all images so they have a width \maxwidth. This means
% -- that they will get their normal width if they fit onto the page, but
% -- are scaled down if they would overflow the margins.
%\makeatletter
%\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth
%\else\Gin@nat@width\fi}
%\makeatother
%\let\Oldincludegraphics\includegraphics
%\renewcommand{\includegraphics}[1]{\Oldincludegraphics[width=\maxwidth]{#1}}
%$endif$
\makeatletter
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
\makeatother
% Scale images if necessary, so that they will not overflow the page
% margins by default, and it is still possible to overwrite the defaults
% using explicit options in \includegraphics[width, height, ...]{}
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
$if(csl-refs)$
\newlength{\cslhangindent}
\setlength{\cslhangindent}{1.5em}
\newenvironment{cslreferences}%
{$if(csl-hanging-indent)$\setlength{\parindent}{0pt}%
\everypar{\setlength{\hangindent}{\cslhangindent}}\ignorespaces$endif$}%
{\par}
$endif$
% Section numbering.
% Here again is a variable you can specify on the commandline
% `markdown2pdf my.txt --number-sections --xetex --template=/wherever/this/is -o my.pdf`
$if(numbersections)$
$else$
\setcounter{secnumdepth}{0}
$endif$
% Footnotes:
% Wait, didn't we already discuss the crisis of code in footnotes?
% Evidently the order of unfolding of macros required that
% we import a package to deal with them earlier
% and issue a command it defines now. (Or maybe that's not the reason;
% very often the order does matter as the insane system of macro expansion
% must take place by stages.)
$if(verbatim-in-note)$
\VerbatimFootnotes % -- allows verbatim text in footnotes
$endif$
% Other stuff you specify on the command line:
% You can include stuff for the header from a file specified on the command line;
% I've never done this, but that stuff will go here:
$for(header-includes)$
$header-includes$
$endfor$
% Title, authors, date.
% If you specified title authors and date at the start of
% your pandoc-markdown file, pandoc knows the 'values' of the
% variables: title authors date and fills them in.
$if(title)$
\title{$title$}
$endif$
\author{$for(author)$$author$$sep$\\$endfor$}
$if(date)$
\date{$date$}
$endif$
% Package tcolorbox for making nice boxes around some texts
\usepackage{tcolorbox}
% Eviter l'erreur "Environment Shaded undefined"
$if(highlighting-macros)$
$highlighting-macros$
$endif$
% missing environment longtable
\usepackage{booktabs}
\usepackage{longtable}
% At last:
% The document itself!:
% After filling in all these blanks above, or erasing them
% where they are not needed, Pandoc has finished writing the
% famous LaTeX *preamble* for your document.
% Now comes the all-important command \begin{document}
% which as you can see, will be paired with an \end{document} at the end.
% Pandoc knows whether you have a title, and has already
% specified what it is; if so, it demands that the title be rendered.
% Pandoc knows whether you want a table of contents, you
% specify this on the command line.
% Then, after fiddling with alignments, there comes the real
% business: pandoc slaps its rendering of your text in the place of
% the variable `body`
% It then concludes the document it has been writing.
\color{clgraycolor}
\errorcontextlines 10000
\begin{document}
$if(title)$
\maketitle
$endif$
%\begingroup
%\hypersetup{linkcolor=linkcolortoc}
%\tableofcontents
%\listoffigures
%\listoftables
%\endgroup
$if(alignment)$
\begin{$alignment$}
$endif$
$body$
%$if(alignment)$
\end{$alignment$}
$endif$
\end{document}

View File

@ -6,34 +6,39 @@
"properties": {
"environnement": {
"title": "Environnement Immédiat",
"description": "Quel est le type de milieu représentant le mieux (milieu dominant) loccupation du sol sur la parcelle où se situe l'arbre'",
"description": "Quel est le type de milieu représentant le mieux (milieu dominant) loccupation du sol sur la parcelle où se situe l'arbre",
"type": "string"
},
"hauteur": {
"title": "Hauteur",
"description": "Vous pouvez lestimer ...",
"title": "Hauteur (en m)",
"description": "Vous pouvez lestimer avec une méthode simple expliquée dans un tutoriel (voir section « à propos »)",
"type": "integer"
},
"circonference": {
"title": "Circonférence",
"description": "A mesurer à hauteur de poitrine",
"title": "Circonférence (en cm)",
"description": "À mesurer à hauteur de poitrine",
"type": "integer"
},
"etatsanitaire": {
"title": "État sanitaire",
"description": "Dans la partie tuto, on vous explique comment reconnaitre un arbre/arbuste malade.",
"type": "string"
},
"espece": {
"title": "Espèce",
"description": "Nom de l'espèce d'arbre",
"type": "integer"
},
"description": "Nom de l'espèce d'arbre. À déterminer avec une appli tierce (PlantNet) ou en consultant le tuto dans la section « à propos »",
"type": "string"
},
"remarques": {
"title": "Remarques",
"description": "Vous pouvez renseigner ici le nom complet des espèces que vous avez identifié. C'est également ici que vous pouvez indiquer si des animaux autres que ceux proposés dans la liste étaient présents.",
"description": "Autres observations à propos du site visité, nom complet des espèces identifiées.",
"type": "string"
}
}
},
"steps": [
{
"title": "Environnement de l'arbre'",
"title": "Environnement de l'arbre",
"description": "",
"layout": [
{ "key": "environnement",
@ -41,12 +46,12 @@
"titleMap": [
{ "name": "inconnu", "value": null },
{ "name": "Prairie", "value": "Prairie" },
{ "name": "Champs cultivé", "value": "Champs cultivé" },
{ "name": "Champ cultivé", "value": "Champ cultivé" },
{ "name": "Bois de feuillus", "value": "Bois de feuillus" },
{ "name": "Bois de résineux", "value": "Bois de résineux" },
{ "name": "Friche / lande", "value": "Friche / lande" },
{ "name": "Zone humide", "value": "Zone humide" },
{ "name": "Zone urbanisé", "value": "Zone urbanisé" },
{ "name": "Zone urbanisée", "value": "Zone urbanisée" },
{ "name": "Parc de loisirs / jardin", "value": "Parc de loisirs / jardin" }
]
}
@ -64,6 +69,21 @@
}
]
},
{
"title": "État sanitaire",
"description": "",
"layout": [
{
"key": "etatsanitaire",
"titleMap": [
{ "name": "indéterminé", "value": null },
{ "name": "bon", "value" : "bon" },
{ "name": "moyen", "value" : "moyen" },
{ "name": "mauvais", "value" : "mauvais" }
]
}
]
},
{
"title": "Type d'arbre",
"description": "",
@ -72,10 +92,25 @@
"key": "espece",
"titleMap": [
{ "name": "inconnu", "value": null },
{ "name": "Tilleul", "value" : "tilleul" },
{ "name": "Frêne", "value" : "frene" },
{ "name": "Hêtre", "value" : "hetre" },
{ "name": "Chêne pédonculé", "value" : "chene_pedoncule" }
{ "name": "Aulne", "value": "Aulne" },
{ "name": "Bouleau", "value": "Bouleau" },
{ "name": "Cerisier", "value": "Cerisier" },
{ "name": "Charme", "value": "Charme" },
{ "name": "Châtaignier", "value": "Châtaignier" },
{ "name": "Chêne", "value": "Chêne" },
{ "name": "Conifère", "value": "Conifère" },
{ "name": "Erable", "value": "Erable" },
{ "name": "Frêne", "value": "Frêne" },
{ "name": "Hêtre", "value": "Hêtre" },
{ "name": "Marronnier", "value": "Marronnier" },
{ "name": "Merisier", "value": "Merisier" },
{ "name": "Orme", "value": "Orme" },
{ "name": "Peuplier", "value": "Peuplier" },
{ "name": "Platane", "value": "Platane" },
{ "name": "Robinier Faux-acacia", "value": "Robinier Faux-acacia" },
{ "name": "Saule", "value": "Saule" },
{ "name": "Tilleul", "value": "Tilleul" },
{ "name": "Autre", "value": "Autre" }
]
}
]

202
fixtures/forms/haies.json Normal file
View File

@ -0,0 +1,202 @@
{
"schema": {
"title": "Haies",
"description": "Données associées à une haie",
"type": "object",
"properties": {
"environnement": {
"title": "Environnement immédiat",
"description": "Quel est le type de milieu représentant le mieux (milieu dominant) loccupation du sol sur la parcelle où se situe la haie",
"type": "string"
},
"longueur": {
"title": "Longueur (en m)",
"description": "À exprimer en mètres. Vous pouvez lestimer en comptant le nombre de pas. Un pas allongé par rapport à la foulée normale équivaut à 1 mètre. La longueur sera aussi calculée automatiquement sur base de votre dessin",
"type": "integer"
},
"largeur": {
"title": "Largeur (en m)",
"description": "À exprimer en mètre",
"type": "integer"
},
"hauteur": {
"title": "Hauteur (en m)",
"description": "Vous pouvez lestimer avec une méthode simple expliquée dans un tutoriel (voir section « à propos »)",
"type": "integer"
},
"nombre_rangs": {
"title": "Nombre de rangs",
"description": "",
"type": "integer"
},
"etat_entretien": {
"title": "État / entretien",
"description": "Dans la partie tuto, on vous explique comment reconnaitre si une haie est entretenue ou pas.",
"type": "string"
},
"espece_1": {
"title": "Espèce principale 1",
"description": "À déterminer avec une appli tierce (PlantNet) ou en consultant le tuto dans la section « à propos »",
"type": "string"
},
"espece_2": {
"title": "Espèce principale 2",
"description": "À déterminer avec une appli tierce (PlantNet) ou en consultant le tuto dans la section « à propos »",
"type": "string"
},
"espece_3": {
"title": "Espèce principale 3",
"description": "À déterminer avec une appli tierce (PlantNet) ou en consultant le tuto dans la section « à propos »",
"type": "string"
},
"autres_especes": {
"title": "Autres espèces",
"description": "",
"type": "string"
},
"remarques": {
"title": "Remarques",
"description": "Autres observations à propos du site visité, nom complet des espèces identifiées.",
"type": "string"
}
}
},
"steps": [
{
"title": "Environnement de la haie",
"description": "",
"layout": [
{ "key": "environnement",
"type": "select",
"titleMap": [
{ "name": "inconnu", "value": null },
{ "name": "Prairie", "value": "Prairie" },
{ "name": "Champ cultivé", "value": "Champ cultivé" },
{ "name": "Bois de feuillus", "value": "Bois de feuillus" },
{ "name": "Bois de résineux", "value": "Bois de résineux" },
{ "name": "Friche / lande", "value": "Friche / lande" },
{ "name": "Zone humide", "value": "Zone humide" },
{ "name": "Zone urbanisée", "value": "Zone urbanisée" },
{ "name": "Parc de loisirs / jardin", "value": "Parc de loisirs / jardin" }
]
}
]
},
{
"title": "Caractéristiques physiques de la haie",
"description": "",
"layout": [
{
"key": "longueur"
},
{
"key": "largeur"
},
{
"key": "hauteur"
},
{
"key": "nombre_rangs"
}
]
},
{
"title": "État entretien",
"description": "",
"layout": [
{
"key": "etat_entretien",
"titleMap": [
{ "name": "indéterminé", "value": null },
{ "name": "régulier", "value" : "regulier" },
{ "name": "occasionnel", "value" : "occasionnel" },
{ "name": "pas entretenu", "value" : "pas entretenu" }
]
}
]
},
{
"title": "Espèces présentes",
"description": "",
"layout": [
{
"key": "espece_1",
"titleMap": [
{ "name": "inconnu", "value": null },
{ "name": "Aubépine", "value": "Aubépine" },
{ "name": "Cassissier", "value": "Cassissier" },
{ "name": "Charme", "value": "Charme" },
{ "name": "Cognassier", "value": "Cognassier" },
{ "name": "Cornouiller", "value": "Cornouiller" },
{ "name": "Églantier", "value": "Églantier" },
{ "name": "Framboisier", "value": "Framboisier" },
{ "name": "Fusain", "value": "Fusain" },
{ "name": "Groseillier", "value": "Groseillier" },
{ "name": "Houx", "value": "Houx" },
{ "name": "Merisier", "value": "Merisier" },
{ "name": "Néflier", "value": "Néflier" },
{ "name": "Sureau", "value": "Sureau" },
{ "name": "Viorne", "value": "Viorne" },
{ "name": "Autre", "value": "Autre" }
]
},
{
"key": "espece_2",
"titleMap": [
{ "name": "inconnu", "value": null },
{ "name": "Aubépine", "value": "Aubépine" },
{ "name": "Cassissier", "value": "Cassissier" },
{ "name": "Charme", "value": "Charme" },
{ "name": "Cognassier", "value": "Cognassier" },
{ "name": "Cornouiller", "value": "Cornouiller" },
{ "name": "Églantier", "value": "Églantier" },
{ "name": "Framboisier", "value": "Framboisier" },
{ "name": "Fusain", "value": "Fusain" },
{ "name": "Groseillier", "value": "Groseillier" },
{ "name": "Houx", "value": "Houx" },
{ "name": "Merisier", "value": "Merisier" },
{ "name": "Néflier", "value": "Néflier" },
{ "name": "Sureau", "value": "Sureau" },
{ "name": "Viorne", "value": "Viorne" },
{ "name": "Autre", "value": "Autre" }
]
},
{
"key": "espece_3",
"titleMap": [
{ "name": "inconnu", "value": null },
{ "name": "Aubépine", "value": "Aubépine" },
{ "name": "Cassissier", "value": "Cassissier" },
{ "name": "Charme", "value": "Charme" },
{ "name": "Cognassier", "value": "Cognassier" },
{ "name": "Cornouiller", "value": "Cornouiller" },
{ "name": "Églantier", "value": "Églantier" },
{ "name": "Framboisier", "value": "Framboisier" },
{ "name": "Fusain", "value": "Fusain" },
{ "name": "Groseillier", "value": "Groseillier" },
{ "name": "Houx", "value": "Houx" },
{ "name": "Merisier", "value": "Merisier" },
{ "name": "Néflier", "value": "Néflier" },
{ "name": "Sureau", "value": "Sureau" },
{ "name": "Viorne", "value": "Viorne" },
{ "name": "Autre", "value": "Autre" }
]
},
{
"key": "autres_especes"
}
]
},
{
"title": "Remarques",
"description": "",
"layout": [
{
"key": "remarques",
"type": "textarea",
"notitle": true
}
]
}
]
}

View File

@ -0,0 +1,239 @@
{
"schema": {
"title": "Bosquets, buissons, friches, lisières",
"description": "Données associées à des zones naturelles",
"type": "object",
"properties": {
"environnement": {
"title": "Environnement immédiat",
"description": "Quel est le type de milieu représentant le mieux (milieu dominant) loccupation du sol sur la parcelle où se situe la zone naturelle",
"type": "string"
},
"longueur": {
"title": "Longueur (en m)",
"description": "À exprimer en mètres. Vous pouvez lestimer en comptant le nombre de pas. Un pas allongé par rapport à la foulée normale équivaut à 1 mètre.",
"type": "integer"
},
"largeur": {
"title": "Largeur (en m)",
"description": "À exprimer en mètres. Vous pouvez lestimer en comptant le nombre de pas. Un pas allongé par rapport à la foulée normale équivaut à 1 mètre.",
"type": "integer"
},
"hauteur": {
"title": "Hauteur (en m)",
"description": "Vous pouvez lestimer avec une méthode simple expliquée dans un tutoriel (voir section « à propos »)",
"type": "integer"
},
"etat_entretien": {
"title": "État / entretien",
"description": "Dans la partie tuto, on vous explique comment reconnaitre si une zone naturelle est entretenue ou pas.",
"type": "string"
},
"espece_1": {
"title": "Espèce principale 1",
"description": "À déterminer avec une appli tierce (PlantNet) ou en consultant le tuto dans la section « à propos »",
"type": "string"
},
"espece_2": {
"title": "Espèce principale 2",
"description": "À déterminer avec une appli tierce (PlantNet) ou en consultant le tuto dans la section « à propos »",
"type": "string"
},
"espece_3": {
"title": "Espèce principale 3",
"description": "À déterminer avec une appli tierce (PlantNet) ou en consultant le tuto dans la section « à propos »",
"type": "string"
},
"autres_especes": {
"title": "Autres espèces",
"description": "",
"type": "string"
},
"remarques": {
"title": "Remarques",
"description": "Autres observations à propos du site visité, nom complet des espèces identifiées.",
"type": "string"
}
}
},
"steps": [
{
"title": "Environnement de la zone naturelle",
"description": "",
"layout": [
{ "key": "environnement",
"type": "select",
"titleMap": [
{ "name": "inconnu", "value": null },
{ "name": "Prairie", "value": "Prairie" },
{ "name": "Champ cultivé", "value": "Champ cultivé" },
{ "name": "Bois de feuillus", "value": "Bois de feuillus" },
{ "name": "Bois de résineux", "value": "Bois de résineux" },
{ "name": "Friche / lande", "value": "Friche / lande" },
{ "name": "Zone humide", "value": "Zone humide" },
{ "name": "Zone urbanisée", "value": "Zone urbanisée" },
{ "name": "Parc de loisirs / jardin", "value": "Parc de loisirs / jardin" }
]
}
]
},
{
"title": "Caractéristiques physiques de la zone naturelle",
"description": "",
"layout": [
{
"key": "longueur"
},
{
"key": "largeur"
},
{
"key": "hauteur"
}
]
},
{
"title": "État entretien",
"description": "",
"layout": [
{
"key": "etat_entretien",
"titleMap": [
{ "name": "indéterminé", "value": null },
{ "name": "régulier", "value" : "regulier" },
{ "name": "occasionnel", "value" : "occasionnel" },
{ "name": "pas entretenu", "value" : "pas entretenu" }
]
}
]
},
{
"title": "Espèces présentes",
"description": "",
"layout": [
{
"key": "espece_1",
"titleMap": [
{ "name": "Inconnu", "value": "Inconnu" },
{ "name": "Aubépine", "value": "Aubépine" },
{ "name": "Aulne", "value": "Aulne" },
{ "name": "Bouleau", "value": "Bouleau" },
{ "name": "Bourdaine", "value": "Bourdaine" },
{ "name": "Camérisier", "value": "Camérisier" },
{ "name": "Cerisier", "value": "Cerisier" },
{ "name": "Charme", "value": "Charme" },
{ "name": "Châtaignier", "value": "Châtaignier" },
{ "name": "Chêne", "value": "Chêne" },
{ "name": "Conifère", "value": "Conifère" },
{ "name": "Erable", "value": "Erable" },
{ "name": "Frêne", "value": "Frêne" },
{ "name": "Fusain", "value": "Fusain" },
{ "name": "Hêtre", "value": "Hêtre" },
{ "name": "Houx", "value": "Houx" },
{ "name": "If", "value": "If" },
{ "name": "Marronnier", "value": "Marronnier" },
{ "name": "Merisier", "value": "Merisier" },
{ "name": "Noisetier", "value": "Noisetier" },
{ "name": "Orme", "value": "Orme" },
{ "name": "Peuplier", "value": "Peuplier" },
{ "name": "Platane", "value": "Platane" },
{ "name": "Robinier Faux-acacia", "value": "Robinier Faux-acacia" },
{ "name": "Saule", "value": "Saule" },
{ "name": "Saule", "value": "Saule" },
{ "name": "Sorbier (des oiseleurs)", "value": "Sorbier (des oiseleurs)" },
{ "name": "Sureau noir", "value": "Sureau noir" },
{ "name": "Tilleul", "value": "Tilleul" },
{ "name": "Viorne", "value": "Viorne" },
{ "name": "Autre", "value": "Autre" }
]
},
{
"key": "espece_2",
"titleMap": [
{ "name": "Inconnu", "value": "Inconnu" },
{ "name": "Aubépine", "value": "Aubépine" },
{ "name": "Aulne", "value": "Aulne" },
{ "name": "Bouleau", "value": "Bouleau" },
{ "name": "Bourdaine", "value": "Bourdaine" },
{ "name": "Camérisier", "value": "Camérisier" },
{ "name": "Cerisier", "value": "Cerisier" },
{ "name": "Charme", "value": "Charme" },
{ "name": "Châtaignier", "value": "Châtaignier" },
{ "name": "Chêne", "value": "Chêne" },
{ "name": "Conifère", "value": "Conifère" },
{ "name": "Erable", "value": "Erable" },
{ "name": "Frêne", "value": "Frêne" },
{ "name": "Fusain", "value": "Fusain" },
{ "name": "Hêtre", "value": "Hêtre" },
{ "name": "Houx", "value": "Houx" },
{ "name": "If", "value": "If" },
{ "name": "Marronnier", "value": "Marronnier" },
{ "name": "Merisier", "value": "Merisier" },
{ "name": "Noisetier", "value": "Noisetier" },
{ "name": "Orme", "value": "Orme" },
{ "name": "Peuplier", "value": "Peuplier" },
{ "name": "Platane", "value": "Platane" },
{ "name": "Robinier Faux-acacia", "value": "Robinier Faux-acacia" },
{ "name": "Saule", "value": "Saule" },
{ "name": "Saule", "value": "Saule" },
{ "name": "Sorbier (des oiseleurs)", "value": "Sorbier (des oiseleurs)" },
{ "name": "Sureau noir", "value": "Sureau noir" },
{ "name": "Tilleul", "value": "Tilleul" },
{ "name": "Viorne", "value": "Viorne" },
{ "name": "Autre", "value": "Autre" }
]
},
{
"key": "espece_3",
"titleMap": [
{ "name": "Inconnu", "value": "Inconnu" },
{ "name": "Aubépine", "value": "Aubépine" },
{ "name": "Aulne", "value": "Aulne" },
{ "name": "Bouleau", "value": "Bouleau" },
{ "name": "Bourdaine", "value": "Bourdaine" },
{ "name": "Camérisier", "value": "Camérisier" },
{ "name": "Cerisier", "value": "Cerisier" },
{ "name": "Charme", "value": "Charme" },
{ "name": "Châtaignier", "value": "Châtaignier" },
{ "name": "Chêne", "value": "Chêne" },
{ "name": "Conifère", "value": "Conifère" },
{ "name": "Erable", "value": "Erable" },
{ "name": "Frêne", "value": "Frêne" },
{ "name": "Fusain", "value": "Fusain" },
{ "name": "Hêtre", "value": "Hêtre" },
{ "name": "Houx", "value": "Houx" },
{ "name": "If", "value": "If" },
{ "name": "Marronnier", "value": "Marronnier" },
{ "name": "Merisier", "value": "Merisier" },
{ "name": "Noisetier", "value": "Noisetier" },
{ "name": "Orme", "value": "Orme" },
{ "name": "Peuplier", "value": "Peuplier" },
{ "name": "Platane", "value": "Platane" },
{ "name": "Robinier Faux-acacia", "value": "Robinier Faux-acacia" },
{ "name": "Saule", "value": "Saule" },
{ "name": "Saule", "value": "Saule" },
{ "name": "Sorbier (des oiseleurs)", "value": "Sorbier (des oiseleurs)" },
{ "name": "Sureau noir", "value": "Sureau noir" },
{ "name": "Tilleul", "value": "Tilleul" },
{ "name": "Viorne", "value": "Viorne" },
{ "name": "Autre", "value": "Autre" }
]
},
{
"key": "autres_especes"
}
]
},
{
"title": "Remarques",
"description": "",
"layout": [
{
"key": "remarques",
"type": "textarea",
"notitle": true
}
]
}
]
}

6
media/Dockerfile Normal file
View File

@ -0,0 +1,6 @@
FROM httpd:2.4
# COPY media/httpd.conf /usr/local/apache2/conf/httpd.conf
COPY vendor/GeoNature-citizen/frontend/src/assets/* /usr/local/apache2/htdocs/
COPY patches/frontend/src/assets/* /usr/local/apache2/htdocs/
EXPOSE 80

550
media/httpd.conf Normal file
View File

@ -0,0 +1,550 @@
#
# This is the main Apache HTTP server configuration file. It contains the
# configuration directives that give the server its instructions.
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
# In particular, see
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
# for a discussion of each configuration directive.
#
# Do NOT simply read the instructions in here without understanding
# what they do. They're here only as hints or reminders. If you are unsure
# consult the online docs. You have been warned.
#
# Configuration and logfile names: If the filenames you specify for many
# of the server's control files begin with "/" (or "drive:/" for Win32), the
# server will use that explicit path. If the filenames do *not* begin
# with "/", the value of ServerRoot is prepended -- so "logs/access_log"
# with ServerRoot set to "/usr/local/apache2" will be interpreted by the
# server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log"
# will be interpreted as '/logs/access_log'.
#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# Do not add a slash at the end of the directory path. If you point
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# Mutex directive, if file-based mutexes are used. If you wish to share the
# same ServerRoot for multiple httpd daemons, you will need to change at
# least PidFile.
#
ServerRoot "/usr/local/apache2"
#
# Mutex: Allows you to set the mutex mechanism and mutex file directory
# for individual mutexes, or change the global defaults
#
# Uncomment and change the directory if mutexes are file-based and the default
# mutex file directory is not on a local disk or is not appropriate for some
# other reason.
#
# Mutex default:logs
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule authn_socache_module modules/mod_authn_socache.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_owner_module modules/mod_authz_owner.so
#LoadModule authz_dbd_module modules/mod_authz_dbd.so
LoadModule authz_core_module modules/mod_authz_core.so
#LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_form_module modules/mod_auth_form.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule allowmethods_module modules/mod_allowmethods.so
#LoadModule isapi_module modules/mod_isapi.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule cache_disk_module modules/mod_cache_disk.so
#LoadModule cache_socache_module modules/mod_cache_socache.so
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule socache_dbm_module modules/mod_socache_dbm.so
#LoadModule socache_memcache_module modules/mod_socache_memcache.so
#LoadModule socache_redis_module modules/mod_socache_redis.so
#LoadModule watchdog_module modules/mod_watchdog.so
#LoadModule macro_module modules/mod_macro.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule bucketeer_module modules/mod_bucketeer.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule echo_module modules/mod_echo.so
#LoadModule example_hooks_module modules/mod_example_hooks.so
#LoadModule case_filter_module modules/mod_case_filter.so
#LoadModule case_filter_in_module modules/mod_case_filter_in.so
#LoadModule example_ipc_module modules/mod_example_ipc.so
#LoadModule buffer_module modules/mod_buffer.so
#LoadModule data_module modules/mod_data.so
#LoadModule ratelimit_module modules/mod_ratelimit.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
#LoadModule ext_filter_module modules/mod_ext_filter.so
#LoadModule request_module modules/mod_request.so
#LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
#LoadModule reflector_module modules/mod_reflector.so
#LoadModule substitute_module modules/mod_substitute.so
#LoadModule sed_module modules/mod_sed.so
#LoadModule charset_lite_module modules/mod_charset_lite.so
#LoadModule deflate_module modules/mod_deflate.so
#LoadModule xml2enc_module modules/mod_xml2enc.so
#LoadModule proxy_html_module modules/mod_proxy_html.so
#LoadModule brotli_module modules/mod_brotli.so
LoadModule mime_module modules/mod_mime.so
#LoadModule ldap_module modules/mod_ldap.so
LoadModule log_config_module modules/mod_log_config.so
#LoadModule log_debug_module modules/mod_log_debug.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule logio_module modules/mod_logio.so
#LoadModule lua_module modules/mod_lua.so
LoadModule env_module modules/mod_env.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
#LoadModule ident_module modules/mod_ident.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
#LoadModule remoteip_module modules/mod_remoteip.so
# LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
#LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
#LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_express_module modules/mod_proxy_express.so
#LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
#LoadModule session_module modules/mod_session.so
#LoadModule session_cookie_module modules/mod_session_cookie.so
#LoadModule session_crypto_module modules/mod_session_crypto.so
#LoadModule session_dbd_module modules/mod_session_dbd.so
#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
#LoadModule ssl_module modules/mod_ssl.so
#LoadModule optional_hook_export_module modules/mod_optional_hook_export.so
#LoadModule optional_hook_import_module modules/mod_optional_hook_import.so
#LoadModule optional_fn_import_module modules/mod_optional_fn_import.so
#LoadModule optional_fn_export_module modules/mod_optional_fn_export.so
#LoadModule dialup_module modules/mod_dialup.so
#LoadModule http2_module modules/mod_http2.so
#LoadModule proxy_http2_module modules/mod_proxy_http2.so
#LoadModule md_module modules/mod_md.so
#LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
#LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
#LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
#LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule unixd_module modules/mod_unixd.so
#LoadModule heartbeat_module modules/mod_heartbeat.so
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
#LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule info_module modules/mod_info.so
#LoadModule suexec_module modules/mod_suexec.so
<IfModule !mpm_prefork_module>
#LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
#LoadModule cgi_module modules/mod_cgi.so
</IfModule>
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule dav_lock_module modules/mod_dav_lock.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule imagemap_module modules/mod_imagemap.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
#LoadModule rewrite_module modules/mod_rewrite.so
<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User daemon
Group daemon
</IfModule>
# 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition. These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
#
#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed. This address appears on some server-generated pages, such
# as error documents. e.g. admin@your-domain.com
#
ServerAdmin you@example.com
#
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName www.example.com:80
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
AllowOverride none
Require all denied
</Directory>
#
# Note that from this point forward you must specifically allow
# particular features to be enabled - so if something's not working as
# you might expect, make sure that you have specifically enabled it
# below.
#
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
#
# DirectoryIndex: sets the file that Apache will serve if a directory
# is requested.
#
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ".ht*">
Require all denied
</Files>
#
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog /proc/self/fd/2
#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
<IfModule log_config_module>
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
# You need to enable mod_logio.c to use %I and %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
CustomLog /proc/self/fd/1 common
#
# If you prefer a logfile with access, agent, and referer information
# (Combined Logfile Format) you can use the following directive.
#
#CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
#
# Redirect: Allows you to tell clients about documents that used to
# exist in your server's namespace, but do not anymore. The client
# will make a new request for the document at its new location.
# Example:
# Redirect permanent /foo http://www.example.com/bar
#
# Alias: Maps web paths into filesystem paths and is used to
# access content that does not live under the DocumentRoot.
# Example:
# Alias /webpath /full/filesystem/path
#
# If you include a trailing / on /webpath then the server will
# require it to be present in the URL. You will also likely
# need to provide a <Directory> section to allow access to
# the filesystem path.
#
# ScriptAlias: This controls which directories contain server scripts.
# ScriptAliases are essentially the same as Aliases, except that
# documents in the target directory are treated as applications and
# run by the server when requested rather than as documents sent to the
# client. The same rules about trailing "/" apply to ScriptAlias
# directives as to Alias.
#
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>
<IfModule cgid_module>
#
# ScriptSock: On threaded servers, designate the path to the UNIX
# socket used to communicate with the CGI daemon of mod_cgid.
#
#Scriptsock cgisock
</IfModule>
#
# "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
#
# Avoid passing HTTP_PROXY environment to CGI's on this or any proxied
# backend servers which have lingering "httpoxy" defects.
# 'Proxy' request header is undefined by the IETF, not listed by IANA
#
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
#
# TypesConfig points to the file containing the list of mappings from
# filename extension to MIME-type.
#
TypesConfig conf/mime.types
#
# AddType allows you to add to or override the MIME configuration
# file specified in TypesConfig for specific file types.
#
#AddType application/x-gzip .tgz
#
# AddEncoding allows you to have certain browsers uncompress
# information on the fly. Note: Not all browsers support this.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
#
# AddHandler allows you to map certain file extensions to "handlers":
# actions unrelated to filetype. These can be either built into the server
# or added with the Action directive (see below)
#
# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi
# For type maps (negotiated resources):
#AddHandler type-map var
#
# Filters allow you to process content before it is sent to the client.
#
# To parse .shtml files for server-side includes (SSI):
# (You will also need to add "Includes" to the "Options" directive.)
#
#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml
</IfModule>
#
# The mod_mime_magic module allows the server to use various hints from the
# contents of the file itself to determine its type. The MIMEMagicFile
# directive tells the module where the hint definitions are located.
#
#MIMEMagicFile conf/magic
#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#
#
# MaxRanges: Maximum number of Ranges in a request before
# returning the entire resource, or one of the special
# values 'default', 'none' or 'unlimited'.
# Default setting is to accept 200 Ranges.
#MaxRanges unlimited
#
# EnableMMAP and EnableSendfile: On systems that support it,
# memory-mapping or the sendfile syscall may be used to deliver
# files. This usually improves server performance, but must
# be turned off when serving from networked-mounted
# filesystems or if support for these functions is otherwise
# broken on your system.
# Defaults: EnableMMAP On, EnableSendfile Off
#
#EnableMMAP off
#EnableSendfile on
# Supplemental configuration
#
# The configuration files in the conf/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server, or you may simply copy their contents here and change as
# necessary.
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf
# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf
# Language settings
#Include conf/extra/httpd-languages.conf
# User home directories
#Include conf/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf
# Various default settings
#Include conf/extra/httpd-default.conf
# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
# Secure (SSL/TLS) connections
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
# starting without SSL on platforms with no /dev/random equivalent
# but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

2
nginx/Dockerfile Normal file
View File

@ -0,0 +1,2 @@
FROM nginx
COPY ./default.conf /etc/nginx/conf.d/default.conf

40
nginx/default.conf Normal file
View File

@ -0,0 +1,40 @@
server {
listen 80;
listen [::]:80;
server_name localhost;
client_max_body_size 12M;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://citizen-front:4000/;
}
location /api/ {
proxy_pass http://citizen-back:5002/api/;
}
location /api/media/ {
proxy_pass http://citizen-back:5002/api/media/;
proxy_intercept_errors on;
error_page 404 = @media1;
}
location /api/media1/ {
proxy_pass http://media/;
}
location @media1 {
rewrite ^/api/media/(.*)$ /api/media1/$1;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

View File

@ -0,0 +1,75 @@
# Database
SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://postgres:postgres@db:5432/referentielsdb"
SQLALCHEMY_TRACK_MODIFICATIONS = false
# JWT Auth
JWT_SECRET_KEY = 'jwt-secret-string'
JWT_BLACKLIST_ENABLED = true
JWT_BLACKLIST_TOKEN_CHECKS = ['access', 'refresh']
# Application
appName = 'GeoNature-citizen' # Application name in the home page
DEFAULT_LANGUAGE = 'fr'
FLASK_ADMIN_FLUID_LAYOUT = true
# Debug
DEBUG = false
SQLALCHEMY_DEBUG_LEVEL = 'WARNING'
# URL_APPLICATION = "http://mydomain.org" # Replace mydomain.org by your domain
URL_APPLICATION = "https://localhost:8080/"
API_TAXHUB = "http://taxhub:5000/api/"
# API_TAXHUB = "http://mytaxhub.org/api/" # Replace mytaxhub.org by your TaxHub url
SECRET_KEY = 'MyS3cr3tK3y'
CONFIRM_MAIL_SALT = 'your-secret-salt' # secret salt for corfirm mail token
MEDIA_FOLDER = 'media'
# Rewards
REWARDS_ENABLED = false
[RESET_PASSWD]
SUBJECT = "Link"
FROM = '"Biommap" <contact@geonature-citizen.fr>'
TEXT_TEMPLATE = '''
Bonjour,\r\nVoici votre nouveau mot de passe :\r\n{passwd}\r\n"{app_url}
'''
HTML_TEMPLATE = '''
Bonjour,<br /><br />Voici votre nouveau mot de passe :<br />
{passwd}
<br /><br />"
<a href="{app_url}">Connexion</a>'
'''
[CONFIRM_EMAIL]
USE_CONFIRM_EMAIL = true
SUBJECT = "Activez votre compte"
FROM = '"Biommap" <contact@geonature-citizen.fr>'
HTML_TEMPLATE = '''<p> Bonjour,</p><br /><p>Nous vous confirmons que votre compte Biommap a bien été créé.</p>
<p> Afin d'activer votre compte veuillez <a href="{activate_url}">cliquer ici.</a>
<p>Nous vous souhaitons la bienvenue sur notre site.</p><br />
<p>Bien à vous.</p>
'''
NO_VALIDATION_HTML_TEMPLATE = '''<p> Bonjour,</p><br /><p>Nous vous confirmons que votre compte a bien été créé.</p>
<p>Nous vous souhaitons la bienvenue sur notre site.</p><br />
<p>Bien à vous.</p>
'''
[MAIL]
MAIL_USE_SSL = false
MAIL_STARTTLS = true
MAIL_HOST = 'mail.easter-eggs.com'
MAIL_PORT = 587 # mandatory SSL port
MAIL_AUTH_LOGIN = 'julien.minet@champs-libres.coop'
MAIL_AUTH_PASSWD = 'Bomel2164'
ADMIN_MESSAGE = '''<p>Bonjour administrateur,</p><br />
<p>Un nouvel utilisateur de Biommap avec le nom d'utilisateur "{newuser_username}" a été créé!</p>
<p>Vous pouvez gérer cet utilisateur dans l'espace d'administration.</p><br />
<p>Bonne journée</p>
'''
# API flasgger main config

140
patches/back/server.py Normal file
View File

@ -0,0 +1,140 @@
import sys
import os
import logging
from flask import Flask, current_app
from flask_cors import CORS
from gncitizen.utils.env import (
db,
list_and_import_gnc_modules,
jwt,
swagger,
admin,
ckeditor,
)
from gncitizen.utils.init_data import create_schemas, populate_modules
from gncitizen import __version__
basedir = os.path.abspath(os.path.dirname(__file__))
class ReverseProxied(object):
def __init__(self, app, script_name=None, scheme=None, server=None):
self.app = app
self.script_name = script_name
self.scheme = scheme
self.server = server
def __call__(self, environ, start_response):
script_name = environ.get("HTTP_X_SCRIPT_NAME", "") or self.script_name
if script_name:
environ["SCRIPT_NAME"] = script_name
path_info = environ["PATH_INFO"]
if path_info.startswith(script_name):
environ["PATH_INFO"] = path_info[len(script_name) :]
scheme = environ.get("HTTP_X_SCHEME", "") or self.scheme
if scheme:
environ["wsgi.url_scheme"] = scheme
server = environ.get("HTTP_X_FORWARDED_SERVER", "") or self.server
if server:
environ["HTTP_HOST"] = server
return self.app(environ, start_response)
def get_app(config, _app=None, with_external_mods=True, url_prefix="/api"):
# Make sure app is a singleton
if _app is not None:
return _app
app = Flask(__name__)
app.config.update(config)
if app.config["DEBUG"]:
from flask.logging import default_handler
import coloredlogs
app.config["SQLALCHEMY_ECHO"] = True
logger = logging.getLogger("werkzeug")
coloredlogs.install(
level=logging.DEBUG,
fmt="%(asctime)s %(hostname)s %(name)s[%(process)d] [in %(pathname)s:%(lineno)d] %(levelname)s %(message)s",
)
logger.removeHandler(default_handler)
# for l in logging.Logger.manager.loggerDict.values():
# if hasattr(l, "handlers"):
# l.handlers = [handler]
# else:
# logging.basicConfig()
# logger = logging.getLogger()
# logger.setLevel(logging.INFO)
logging.getLogger("sqlalchemy.engine").setLevel(
getattr(sys.modules["logging"], app.config["SQLALCHEMY_DEBUG_LEVEL"])
)
CORS(app, supports_credentials=True)
# app.config['PROPAGATE_EXCEPTIONS'] = False
# ... brings back those cors headers on error response in debug mode
# to trace client-side error handling
# but drops the embedded debugger ¯\_(ツ)_/¯
# https://github.com/corydolphin/flask-cors/issues/67
# https://stackoverflow.com/questions/29825235/getting-cors-headers-in-a-flask-500-error
# Bind app to DB
db.init_app(app)
# JWT Auth
jwt.init_app(app)
swagger.init_app(app)
admin.init_app(app)
ckeditor.init_app(app)
with app.app_context():
from gncitizen.core.users.routes import users_api
from gncitizen.core.commons.routes import commons_api
from gncitizen.core.observations.routes import obstax_api
#from gncitizen.core.ref_geo.routes import geo_api
from gncitizen.core.badges.routes import badges_api
from gncitizen.core.taxonomy.routes import taxo_api
from gncitizen.core.sites.routes import sites_api
app.register_blueprint(users_api, url_prefix=url_prefix)
app.register_blueprint(commons_api, url_prefix=url_prefix)
app.register_blueprint(obstax_api, url_prefix=url_prefix)
#app.register_blueprint(geo_api, url_prefix=url_prefix)
app.register_blueprint(badges_api, url_prefix=url_prefix)
app.register_blueprint(taxo_api, url_prefix=url_prefix)
app.register_blueprint(sites_api, url_prefix=url_prefix + "/sites")
CORS(app, supports_credentials=True)
# Chargement des mosdules tiers
if with_external_mods:
for conf, manifest, module in list_and_import_gnc_modules(app):
try:
prefix = url_prefix + conf["api_url"]
except Exception as e:
current_app.logger.debug(e)
prefix = url_prefix
app.register_blueprint(
module.backend.blueprint.blueprint, url_prefix=prefix
)
try:
module.backend.models.create_schema(db)
except Exception as e:
current_app.logger.debug(e)
# chargement de la configuration
# du module dans le blueprint.config
module.backend.blueprint.blueprint.config = conf
app.config[manifest["module_name"]] = conf
# _app = app
create_schemas(db)
db.create_all()
populate_modules(db)
return app

30
patches/back/start_gunicorn.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/bash
echo "------------------------------------------------"
echo "GeoNature-citizen backend server is starting ..."
echo "------------------------------------------------"
FLASKDIR=$(readlink -e "${0%/*}")
APP_DIR="$(dirname "$FLASKDIR")"
. $APP_DIR/config/settings.ini
echo "info: Starting $app_name"
echo "info: FLASKDIR: $FLASKDIR"
echo "info: APP_DIR: $APP_DIR"
# Start your gunicorn
LOG_DIR="$APP_DIR/var/log"
echo "LOG_DIR: $LOG_DIR"
if [[ ! -e $LOG_DIR ]]; then
mkdir -p $LOG_DIR
elif [[ ! -d $LOG_DIR ]]; then
echo "LOG_DIR already exists but is not a directory" 1>&2
fi
export PYTHONPATH=`pwd`/${venv_dir}
#echo $PYTHONPATH
echo "info: Starting gunicorn"
echo "--"
exec gunicorn -w ${gun_num_workers:-2} --error-log $APP_DIR/var/log/gunicorn_gncitizen_errors.log --pid="${app_name:-"gncitizen"}.pid" -b ${gun_host:-"0.0.0.0"}:${gun_port:-5002} --timeout=${gun_timeout:-30} --reload -n "geonature-citizen" wsgi:app

17
patches/back/wsgi.py Normal file
View File

@ -0,0 +1,17 @@
"""
Give a unique entry point for gunicorn
"""
from gncitizen.utils.env import load_config
from server import get_app
# get the app config file
config = load_config()
# give the app context from server.py in a app object
app = get_app(config)
port = app.config["API_PORT"] if app.config.get("API_PORT", False) else 5002
if __name__ == "__main__":
app.debug = app.config.get("DEBUG", False)
app.run(host="0.0.0.0", port=port)

101
patches/frontend/server.ts Normal file
View File

@ -0,0 +1,101 @@
import 'zone.js/dist/zone-node';
import { enableProdMode } from '@angular/core';
// Express Engine
import { ngExpressEngine } from '@nguniversal/express-engine';
// Import module map for lazy loading
import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader';
import * as express from 'express';
import { join } from 'path';
import { readFileSync } from 'fs';
// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();
// Express server
const app = express();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist/browser');
const supportedLocales = ['en', 'fr'];
const DEFAULT_LOCALE = 'fr';
const MockBrowser = require('mock-browser').mocks.MockBrowser;
const mock = new MockBrowser();
const domino = require('domino');
const template = readFileSync(
join(DIST_FOLDER, DEFAULT_LOCALE, 'index.html')
).toString();
const win = domino.createWindow(template);
win.Object = Object;
win.Math = Math;
win.screen = { deviceXDPI: 1 };
global['window'] = win;
global['document'] = win.document;
global['navigator'] = mock.getNavigator();
global['branch'] = null;
global['object'] = win.object;
global['HTMLElement'] = win.HTMLElement;
global['HTMLAnchorElement'] = win.HTMLAnchorElement;
global['DOMTokenList'] = win.DOMTokenList;
global['Node'] = win.Node;
global['Text'] = win.Text;
global['localStorage'] = win.localStorage = mock.getLocalStorage();
global['L'] = require('leaflet');
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const {
AppServerModuleNgFactory,
LAZY_MODULE_MAP,
} = require('./dist/server/main');
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine(
'html',
ngExpressEngine({
bootstrap: AppServerModuleNgFactory,
providers: [provideModuleMap(LAZY_MODULE_MAP)],
})
);
app.set('view engine', 'html');
app.set('views', DIST_FOLDER);
// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Serve static files from /browser
app.get(
'*.*',
express.static(DIST_FOLDER, {
maxAge: '1y',
})
);
// All regular routes use the Universal engine
app.get('*', (req, res) => {
const matches = req.url.match(/^\/([a-z]{2}(?:-[A-Z]{2})?)\//);
// check if the requested url has a correct format '/locale' and matches any of the supportedLocales
const locale =
matches && supportedLocales.indexOf(matches[1]) !== -1
? matches[1]
: DEFAULT_LOCALE;
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
if (ip.substr(0, 7) === '::ffff:') {
ip = ip.substr(7);
}
// res.render("index", { req });
res.render(`${locale}/index`, {
req: req,
url: req.url.replace(`/${locale}/`, '/'),
providers: [
{ provide: 'language', useFactory: () => locale, deps: [] },
{ provide: 'ip', useFactory: () => ip, deps: [] },
],
});
});
// Start up the Node server
app.listen(PORT, '0.0.0.0', () => {
console.log(`BLOP Node Express server listening on http://localhost:${PORT}`);
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 162 KiB

View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="800px"
height="800px"
viewBox="0 0 24 24"
fill="none"
version="1.1"
id="svg4"
sodipodi:docname="check-circle-svgrepo-com-green.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2506"
inkscape:window-height="1403"
id="namedview6"
showgrid="false"
inkscape:zoom="0.834386"
inkscape:cx="448.21459"
inkscape:cy="381.26471"
inkscape:window-x="54"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12ZM16.0303 8.96967C16.3232 9.26256 16.3232 9.73744 16.0303 10.0303L11.0303 15.0303C10.7374 15.3232 10.2626 15.3232 9.96967 15.0303L7.96967 13.0303C7.67678 12.7374 7.67678 12.2626 7.96967 11.9697C8.26256 11.6768 8.73744 11.6768 9.03033 11.9697L10.5 13.4393L12.7348 11.2045L14.9697 8.96967C15.2626 8.67678 15.7374 8.67678 16.0303 8.96967Z"
fill="#1C274C"
id="path2"
style="fill:#60b15c" />
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Calque_1"
x="0px"
y="0px"
viewBox="0 0 15.2 19.8"
style="enable-background:new 0 0 15.2 19.8;"
xml:space="preserve"
sodipodi:docname="pointer-orange.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
id="metadata19"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>pointer-green</dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs17" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1866"
inkscape:window-height="983"
id="namedview15"
showgrid="false"
inkscape:zoom="16.856284"
inkscape:cx="10.460673"
inkscape:cy="11.423541"
inkscape:window-x="54"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="Calque_1" />
<style
type="text/css"
id="style2">
.st0{fill:#FFFFFF;}
.st1{fill:#60B15C;}
</style>
<path
class="st0"
d="M7.4,19.7C-0.3,13.8,0,7.8,0,7.6C0,3.4,3.4,0,7.6,0s7.6,3.4,7.6,7.6c0.2,7.1-7.4,12.1-7.5,12.1l-0.2,0.1 L7.4,19.7z"
id="path4" />
<title
id="title6">pointer-green</title>
<path
class="st1"
d="M11.5,7.7L11.5,7.7c-0.6-0.6-1.6-0.6-2.2,0C9.2,7.9,9.1,8.1,9,8.3c0,0.1-0.1,0.3-0.1,0.4c0,0.9,0.7,1.5,1.6,1.5 c0.3,0,0.7-0.1,0.9-0.3c0.7-0.5,0.8-1.5,0.3-2.1c0,0,0,0,0,0l0,0L11.5,7.7z"
id="path8"
style="fill:#ff6600" />
<path
class="st1"
d="M4.8,7.2c-0.8,0-1.5,0.7-1.5,1.5c0,0,0,0,0,0l0,0c-0.1,0.8,0.6,1.6,1.4,1.6C5.5,10.4,6.2,9.8,6.3,9 c0-0.1,0-0.2,0-0.2c0-0.1,0-0.3-0.1-0.4C6,7.6,5.5,7.2,4.8,7.2z"
id="path10"
style="fill:#ff6600" />
<path
class="st1"
d="M7.6,0.3c-4,0-7.3,3.3-7.3,7.3c0,0,0,0,0,0c0,0-0.4,6,7.3,11.9c0,0,7.5-4.8,7.3-11.9C14.9,3.5,11.6,0.3,7.6,0.3 z M10.6,10.9c-1.2,0.1-2.4-0.8-2.5-2c0,0,0,0,0,0l0,0V8.7c0-0.2,0-0.3,0-0.5c0-0.1,0-0.2,0.1-0.3C8.2,7.8,8,7.7,7.9,7.6 c-0.4-0.2-0.8,0-1,0.3C6.9,8,7,8.1,7,8.2c0,0.2,0,0.3,0,0.5c0,0.1,0,0.1,0,0.2C7,9.3,6.9,9.6,6.7,10c-0.7,1-2.1,1.3-3.2,0.6 S2.2,8.4,2.9,7.4l0.8-1.5c0.2-0.3,0.4-0.5,0.7-0.6c0.1-0.4,0.4-0.7,0.8-0.8c0.7-0.3,1.6,0,1.9,0.8c0,0,0,0,0,0l0,0 c0.3-0.1,0.6-0.1,0.9,0c0.1-0.4,0.4-0.6,0.8-0.8c0.7-0.3,1.6,0,1.9,0.8c0,0,0,0,0,0l0,0c0.3,0.1,0.6,0.4,0.8,0.7l1,1.9l0,0 c0.1,0.2,0.1,0.4,0.1,0.6C12.9,9.7,11.9,10.8,10.6,10.9L10.6,10.9z"
id="path12"
style="fill:#ff6600" />
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View File

@ -1,7 +1,7 @@
export const AppConfig = {
appName: "GeoNature-citizen",
appName: "BiomMap la biodiversité à Wasseiges",
API_ENDPOINT:"http://localhost:8080/api",
API_TAXHUB:"http://localhost/taxhub/api/",
API_TAXHUB:"http://localhost:8080/taxhub/api/",
FRONTEND:{
PROD_MOD:true,
MULTILINGUAL:false,
@ -22,15 +22,15 @@ export const AppConfig = {
fr: "assets/cgu.pdf",
en: "assets/termsOfUse.pdf"
},
signup:true,
signup: "optional", // never|optional|always
email_contact:false,
platform_intro: {
fr: "Bienvenue<br /> à BiomMap Wasseiges",
en: "Welcome<br /> on GeoNature Citizen"
fr: "Atlas du maillage écologique",
en: "Atlas of the ecological network"
},
platform_teaser: {
fr: "Cartographie participative de notre environnement",
en: "Hae duae provinciae bello quondam piratico catervis mixtae praedonum a Servilio pro consule missae sub iugum factae sunt vectigales. et hae quidem regiones velut in prominenti terrarum lingua positae ob orbe eoo monte Amano disparantur."
fr: "Contribuez à mieux connaitre arbres, arbustes, haies, alignements darbres, bosquets,… de votre commune en partageant ici vos observations. Débutant ou expérimenté, tout le monde peut participer !",
en: "Contribute to the knowledge of trees, shrubs, hedges, tree lines, copses,... of your municipality by sharing your observations here. Beginner or experienced, everyone can participate!"
},
platform_participate: {
fr: "PARTICIPER AU PROGRAMME",

View File

@ -0,0 +1,72 @@
export const AppConfig = {
appName: "BiomMap la biodiversité à Wasseiges",
API_ENDPOINT:"https://biomap.champs-libres.be/api",
API_TAXHUB:"https://biomap.champs-libres.be/taxhub/api/",
FRONTEND:{
PROD_MOD:true,
MULTILINGUAL:false,
DISPLAY_FOOTER: true,
DISPLAY_TOPBAR: true,
DISPLAY_SIDEBAR: true,
DISPLAY_STATS: true,
DISPLAY_BADGES: true,
NEW_OBS_FORM_MODAL_VERSION: true
},
META: {
keywords: 'biodiversite enquetes participatif observations',
},
about: true,
URL_APPLICATION:"http://localhost:8080/",
REWARDS: true,
termsOfUse: {
fr: "assets/cgu.pdf",
en: "assets/termsOfUse.pdf"
},
signup: "optional", // never|optional|always
email_contact:false,
platform_intro: {
fr: "Atlas du maillage écologique",
en: "Atlas of the ecological network"
},
platform_teaser: {
fr: "Contribuez à mieux connaitre arbres, arbustes, haies, alignement darbres, bosquets,… de votre commune en partageant ici vos observations. Débutant ou expérimenté, tout le monde peut participer !",
en: "Contribute to the knowledge of trees, shrubs, hedges, tree lines, copses,... of your municipality by sharing your observations here. Beginner or experienced, everyone can participate!"
},
platform_participate: {
fr: "PARTICIPER AU PROGRAMME",
en: "PARTICIPATE"
},
programs_label: {
fr: "Programmes",
en: "Surveys"
},
program_label: {
fr: "Le programme",
en: "Survey"
},
program_share_an_observation: {
fr: "PARTAGER UNE OBSERVATION",
en: "SHARE AN OBSERVATION"
},
program_add_an_observation: {
fr: "AJOUTER UNE OBSERVATION",
en: "CONTRIBUTE AN OBSERVATION"
},
program_allow_email_contact: {
fr: "J'accepte que mon adresse e-mail puisse être utilisée pour recontacter à propos de mon observation",
en : "I agree that my e-mail address can be used to recontact about my observation"
},
taxonSelectInputThreshold: 7,
taxonAutocompleteInputThreshold: 12,
taxonAutocompleteFields: [
"nom_complet",
"nom_vern",
"nom_vern_eng",
"cd_nom"
],
taxonDisplaySciName: true,
program_list_observers_names: true,
program_list_sort: "-timestamp_create",
details_espece_url: "<url_inpn_or_atlas>/cd_nom/", // !! gardez bien le cd_nom/ dans l'url
registration_message : "Vous inscrire vous permet de gérer vos observations"
}

View File

@ -0,0 +1,91 @@
export const dashboardData = {
base: {
name: 'Wasseiges',
area: 24.48,
population: 2996,
lat: 50.6173,
lon: 5.0206,
},
landuse: [
{
name: 'Terres arables',
area: 1694,
},
{
name: 'Prairies',
area: 376,
},
{
name: 'Bois',
area: 25,
},
{
name: 'Surfaces bâties',
area: 167
},
{
name: 'Autres',
area: 186
}
],
production: [
{
name: 'Froment',
area: 768.94,
},
{
name: 'Orge',
area: 61.78,
},
{
name: 'Betteraves',
area: 313.28,
},
{
name: 'Pommes de terre',
area: 274.12,
},
{
name: 'Cultures fourragères (maïs, prairies temporaires, ...)',
area: 108.70,
},
{
name: 'Vergers',
area: 33.06,
}
],
biomasse : {
agri_area: 2070,
forest_area: 25
}
};
interface landuse {
name: string,
area: number,
}
interface production {
name: string,
area: number
}
interface biomasse {
agri_area: number,
forest_area: number
}
export type dashboardDataType = {
base: {
name: string,
area: number,
population: number,
lat: number,
lon: number,
},
landuse: landuse[],
production: production[],
biomasse: biomasse
// landuse: Record<string, landuse>
}

View File

@ -0,0 +1,109 @@
import { AppConfig } from './app.config';
import { MAP_CONFIG as MapConfig } from './map.config';
export const DefaulConfig = {
// Default MainConfig
appName: 'GeoNature-citizen',
API_ENDPOINT: 'http://localhost:5002/api',
API_TAXHUB: 'http://localhost:5000/api',
API_CITY: 'https://nominatim.openstreetmap.org/reverse',
HCAPTCHA_SITE_KEY: null,
FRONTEND: {
PROD_MOD: true,
MULTILINGUAL: false,
DISPLAY_FOOTER: true,
DISPLAY_TOPBAR: true,
DISPLAY_SIDEBAR: true,
DISPLAY_STATS: true,
DISPLAY_BADGES: true,
NEW_OBS_FORM_MODAL_VERSION: true,
},
META: {
keywords: 'biodiversite enquetes participatif observations',
},
about: true,
URL_APPLICATION: 'http://127.0.0.1:4200',
REWARDS: true,
termsOfUse: {
fr: 'assets/cgu.pdf',
en: 'assets/termsOfUse.pdf',
},
signup: 'optional', // never|optional|always
email_contact: false,
platform_intro: {
fr: 'Bienvenue<br /> sur GeoNature Citizen',
en: 'Welcome<br /> on GeoNature Citizen',
},
platform_teaser: {
fr: 'Hae duae provinciae bello quondam piratico catervis mixtae praedonum a Servilio pro consule missae sub iugum factae sunt vectigales. et hae quidem regiones velut in prominenti terrarum lingua positae ob orbe eoo monte Amano disparantur.',
en: 'Hae duae provinciae bello quondam piratico catervis mixtae praedonum a Servilio pro consule missae sub iugum factae sunt vectigales. et hae quidem regiones velut in prominenti terrarum lingua positae ob orbe eoo monte Amano disparantur.',
},
platform_participate: {
fr: 'PARTICIPER AU PROGRAMME',
en: 'PARTICIPATE',
},
programs_label: {
fr: 'Programmes',
en: 'Surveys',
},
program_label: {
fr: 'Le programme',
en: 'Survey',
},
program_share_an_observation: {
fr: 'PARTAGER UNE OBSERVATION',
en: 'SHARE AN OBSERVATION',
},
program_add_an_observation: {
fr: 'AJOUTER UNE OBSERVATION',
en: 'CONTRIBUTE AN OBSERVATION',
},
program_allow_email_contact: {
fr: "J'accepte que mon adresse e-mail puisse être utilisée pour recontacter à propos de mon observation",
en: 'I agree that my e-mail address can be used to recontact about my observation',
},
taxonDisplayImageWhenUnique: true,
taxonSelectInputThreshold: 7,
taxonAutocompleteInputThreshold: 12,
taxonAutocompleteFields: [
'nom_complet',
'nom_vern',
'nom_vern_eng',
'cd_nom',
],
taxonDisplaySciName: true,
program_list_observers_names: true,
program_list_sort: '-timestamp_create',
details_espece_url: '<url_inpn_or_atlas>/cd_nom/', // !! gardez bien le cd_nom/ dans l'url
registration_message: 'Vous inscrire vous permet de gérer vos observations',
imageUpload: {
maxHeight: 1440,
maxWidth: 1440,
quality: 0.9,
},
// Default MapConfig
DEFAULT_PROVIDER: 'OpenStreetMapOrg',
BASEMAPS: [
{
name: 'OpenStreetMapOrg',
maxZoom: 19,
layer: '//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
subdomains: 'abc',
attribution:
'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Tiles style by <a href="https://www.hotosm.org/" target="_blank">Humanitarian OpenStreetMap Team</a> hosted by <a href="https://openstreetmap.fr/" target="_blank">OpenStreetMap France</a>',
},
],
CENTER: [46.52863469527167, 2.43896484375],
ZOOM_LEVEL: 6,
ZOOM_LEVEL_RELEVE: 15,
NEW_OBS_POINTER: 'assets/pointer-blue2.png',
OBS_POINTER: 'assets/pointer-green.png',
LOCATE_CONTROL_TITLE: {
fr: 'Me localiser',
en: 'Show me where i am',
},
};
export const MainConfig = { ...DefaulConfig, ...AppConfig, ...MapConfig };
export default MainConfig;

View File

@ -9,54 +9,6 @@ export const MAP_CONFIG = {
attribution:
'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Tiles style by <a href="https://www.hotosm.org/" target="_blank">Humanitarian OpenStreetMap Team</a> hosted by <a href="https://openstreetmap.fr/" target="_blank">OpenStreetMap France</a>'
},
// {
// name: "OpenStreetMapFRHot",
// maxZoom: 19,
// layer: "//{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",
// subdomains: "abc",
// attribution:
// '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Tiles style by <a href="https://www.hotosm.org/" target="_blank">Humanitarian OpenStreetMap Team</a> hosted by <a href="https://openstreetmap.fr/" target="_blank">OpenStreetMap France</a>'
// },
// {
// name: "OpenStreetMapCH",
// maxZoom: 18,
// layer: "//tile.osm.ch/switzerland/{z}/{x}/{y}.png",
// subdomains: "abc",
// attribution:
// '&copy; <a href="&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
// bounds: [[45, 5], [48, 11]]
// },
// {
// name: "OpenStreetMapDE",
// maxZoom: 18,
// layer: "//{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png",
// subdomains: "abc",
// attribution:
// '&copy; <a href="&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
// },
// {
// name: "OpenStreetMapBZH",
// maxZoom: 18,
// layer: "//tile.openstreetmap.bzh/br/{z}/{x}/{y}.png",
// subdomains: "",
// attribution:
// '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, Tiles courtesy of <a href="http://www.openstreetmap.bzh/" target="_blank">Breton OpenStreetMap Team</a>',
// bounds: [[46.2, -5.5], [50, 0.7]]
// },
{
name: "OpenTopoMap",
maxZoom: 19,
layer: "//{s}.opentopomap.org/{z}/{x}/{y}.png",
subdomains: "abc",
attribution: "© OpenTopoMap"
},
{
name: "Cyclosm - Belgique",
maxZoom: 19,
layer: "//{s}.tiles.champs-libres.be/cyclosm/{z}/{x}/{y}.png",
subdomains: "abc",
attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors. Map style by Cyclosm. Tiles by Champs-Libres.'
},
{
name: "Imagerie aérienne Wallonie",
maxZoom: 20,
@ -65,6 +17,145 @@ export const MAP_CONFIG = {
wms: true,
attribution: '&copy; SPW'
},
{
name: "Hydrographie",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/EAU/RHW_SIMPLE/MapServer/WMSServer?",
layers: ['1', '2', '3', '4', '5','6'],
wms: true,
attribution: '&copy; SPW'
},
{
name: "MNT (relief)",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "MNS (hauteur de la végétation)",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNS_2013_2014_HILLSHADE/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Pentes (relief)",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNP_2013_2014__CLASSES/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Carte des principaux types de sols",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/SOL_SOUS_SOL/CNSW__PRINC_TYPES_SOLS/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Carte des sols",
minZoom: 8,
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/SOL_SOUS_SOL/CNSW/MapServer/WMSServer?",
layers: '1',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Carte d'occupation du sol",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/SOL_SOUS_SOL/WALOUS_OCCUPATION_SOL/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Carte d'utilisation du sol",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/SOL_SOUS_SOL/WALOUS_UTILISATION_SOL/MapServer/WMSServer?",
layers: ['1', '3', '4', '5', '6', '7', '8', '9'],
wms: true,
attribution: '&copy; SPW'
},
{
name: "Parcellaire agricole anonyme 2020",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/AGRICULTURE/SIGEC_PARC_AGRI_ANON__2020/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Natura 2000",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/FAUNE_FLORE/NATURA2000/MapServer/WMSServer?",
layers: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
wms: true,
attribution: '&copy; SPW'
},
{
name: "Masque forestier",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/FORET/FORET/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Ancienneté des forêts actuelles",
minZoom: 13,
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/FORET/FORETANC/MapServer/WMSServer?",
layers: '1',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Couverture forestière approximative au 18ème siècle",
minZoom: 13,
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/FORET/FORETANC/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Carte Ferraris (1770-1778)",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/CARTES_ANCIENNES/FERRARIS/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Carte Vandermaelen (1846-1854)",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/CARTES_ANCIENNES/VDML/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "Carte du dépôt de la guerre (1865 - 1880)",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/CARTES_ANCIENNES/DEPOT_GUERRE_1865_1880/MapServer/WMSServer?",
layers: '0',
wms: true,
attribution: '&copy; SPW'
},
{
name: "PICC (topographie)",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/TOPOGRAPHIE/PICC_VDIFF/MapServer/WMSServer?",
layers: ['1', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29'],
wms: true,
attribution: '&copy; SPW'
},
{
name: "Plan de secteur",
minZoom: 12,
@ -74,13 +165,32 @@ export const MAP_CONFIG = {
wms: true,
attribution: '&copy; SPW'
},
{
name: "Parcellaire cadastral",
minZoom: 12,
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/PLAN_REGLEMENT/CADMAP_2021_PARCELLES/MapServer/WMSServer?",
layers: ['0', '1'],
wms: true,
attribution: '&copy; SPW'
},
{
name: "Limites administratives",
maxZoom: 20,
layer: "//ccff02.minfin.fgov.be/geoservices/arcgis/services/WMS/Cadastral_Layers/MapServer/WMSServer?",
layers: ['Region', 'Province', 'Municipality'],
wms: true,
attribution: '&copy; CadGIS'
},
],
CENTER: [46.52863469527167, 2.43896484375],
ZOOM_LEVEL: 6,
ZOOM_LEVEL_RELEVE: 15,
NEW_OBS_POINTER: "assets/pointer-blue2.png",
OBS_POINTER: "assets/pointer-green.png",
LOCATE_CONTROL_TITLE: {
WHITE_POINTER: "assets/pointer-white.png",
ORANGE_POINTER: "assets/pointer-orange.png",
LOCATE_CONTROL_TITLE: {
'fr':'Me localiser',
'en':'Show me where i am'
}

View File

@ -0,0 +1,11 @@
<h1>BiomMap</h1>
<p>BiomMap est un projet collaboratif qui a pour objectif de rassembler un maximum de connaissances à propos du maillage écologique dun territoire. Lensemble des informations collectées permettra notamment de mettre en avant des enjeux de protection et de valorisation de la biodiversité locale afin de permettre une meilleure intégration de ce sujet dans les politiques communales d'aménagements du territoire.</p>
<p>Il sagit dun prototype porté par la Commune de Wasseiges et le GAL Meuse@Campagnes et soutenu financièrement par La Wallonie, Digital Wallonia et lUnion Européenne via des fonds FEADER (mesure LEADER).</p>
<p>Pour en savoir plus, consultez <a target='_blank' href='https://www.biommap.be/'>www.biommap.be</a>.</p>
<h2>Le maillage écologique cest quoi ?</h2>
<p>Le maillage écologique constitue linfrastructure écologique fine dun territoire local. Les éléments du maillage sont les petits éléments du paysage, linéaires ou ponctuels, les biotopes de faible surface ou à structure linéaire. Il sagit, par exemple, des arbres isolés, haies, bandes boisées, bosquets, cours deau, mares, talus, bords de routes, bords de terres cultivées, etc.
Ces éléments du maillage constituent les couloirs de liaison entre les zones de grand intérêt biologique (sanctuaires, zones centrales, zones de développement). Cest leur densité, leur qualité et leur continuité qui déterminent leur intérêt pour jouer efficacement un rôle dans les liaisons écologiques.
La reconnaissance du maillage écologique est importante car il sagit de la présence de la nature dans lensemble de lespace ; cest la « nature ordinaire ».</p>
<p>(Daprès : E. Melin 1997 La problématique du réseau écologique Bases théoriques et perspectives dune stratégie écologique doccupation et de gestion de lespace)</p>
<h2>Comment utiliser BiomMap ?</h2>
<p>La création d'un compte n'est pas obligatoire pour pouvoir partager ses observations mais celle-ci est vivement recommandée. En effet, il est important pour nous de pouvoir associer une donnée à un observateur et de pouvoir le contacter si besoin pour vérifier, analyser et ainsi valoriser sa donnée.</p>

View File

@ -0,0 +1,29 @@
/*************************************
* Global css style overlay *
* Uncomment and adapt or add styles *
*************************************/
/* COLORS */
:root {
--default-font-color: #5d6970;
--primary: #00a99d;
--dark-primary: #0a998f;
--secondary: #60b15c;
--secondary-gradient: #57a154;
--ternary: #45765c;
--list-toggler-width: 21px;
--list-obs-offset: 170px;
--router-outlet-offset: 113px;
--modal-header-bg-moz: moz-linear-gradient(top, var(--secondary) 0%, var(--secondary) 50%, var(--secondary-gradient) 51%, var(--secondary-gradient) 100%);
--modal-header-bg-webkit: moz-linear-gradient(top, var(--secondary) 0%, var(--secondary) 50%, var(--secondary-gradient) 51%, var(--secondary-gradient) 100%);
--modal-header-bg-linear: linear-gradient(to bottom, var(--secondary) 0%, var(--secondary) 50%, var(--secondary-gradient) 51%, var(--secondary-gradient) 100%);
}
/* for printing the dashboard */
@media print {
div.leaflet-control-container {
display: none!important;
}
}

View File

@ -0,0 +1,48 @@
footer {
margin-top: 20px;
padding: 20px 0px;
text-align: center;
background: rgb(226, 226, 226);
}
footer p, footer div{
margin: 0 auto;
max-width: 80%;
}
footer div {
margin-bottom: 20px;
}
footer div a {
text-decoration: none;
color: var(--secondary) !important;
}
footer div a:hover {
border-bottom: solid 1px black;
}
footer div.logo {
display: flex;
justify-content: space-evenly;
}
footer div.logo img {
height: 90px;
margin: 3px;
}
@media screen and (max-width: 900px) {
footer div.logo {
flex-direction: column;
}
footer div.logo img {
height: 60px;
}
}
@media print {
footer > div:first-child {
display: none!important;
}
}

View File

@ -0,0 +1,15 @@
<footer>
<div>
<a [routerLink]="[ '/home']">Accueil</a> | <a href="https://github.com/PnX-SI/GeoNature-citizen">GeoNature-citizen</a> | <a [routerLink]="[ '/about']" >A propos</a>
</div>
<div class='logo'>
<a target='_blank' href='https://www.wallonie.be'><img alt='logo' src='assets/logo_wallonie.png'></a>
<a target='_blank' href='https://www.digitalwallonia.be'><img alt='logo' src='assets/logo_dw.png'></a>
<a target='_blank' href='https://enrd.ec.europa.eu/leader-clld_fr'><img alt='logo' src='assets/logo_leader.png'></a>
<a target='_blank' href='https://www.wasseiges.be'><img alt='logo' src='assets/logo-commune-wasseiges.jpg'></a>
<a target='_blank' href='https://www.meusecampagnes.be'><img alt='logo' src='assets/logo_gal.png'></a>
</div>
</footer>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -1,5 +1,5 @@
# Langue du serveur
# valeur possible : fr_FR.UTF-8, en_US.utf8
# valeur possible : fr_FR.UTF-8, en_US.utf8
# locale -a pour voir la liste des locales disponible
my_local=fr_FR.UTF-8
@ -9,7 +9,7 @@ my_url=http://localhost:8080/
url_application=http://localhost:8080/ # Url For the frontend
api_endpoint=http://localhost:8080/api # Url for the geonature api don't forget /api
api_port=5002
api_taxhub=http://localhost/taxhub/api/ # Url for the taxhub api
api_taxhub=http://localhost:8080/taxhub/api/ # Url for the taxhub api
install_taxhub=1
taxhub_version=1.7.3
@ -25,17 +25,17 @@ admin_password=MotDePasseAChanger
################################
# Localisation du server PostgreSQL.
# Localisation du server PostgreSQL.
# Les scripts d'installation automatique ne fonctionnent que si votre BDD est sur le même serveur (localhost)
pg_host=localhost
pg_host=db
# Port sur lequel PostgreSQL ecoute
pg_port=5432
#Base de donnée Geonature
pg_dbname=dbname
pg_dbname=postgres
# Nom de l'utilisateur propriétaire des bases UsersHub, GeoNature, TaxHub
user_pg=dbuser
user_pg=postgres
# Pass de l'utilisateur propriétaire des bases UsersHub, GeoNature, TaxHub
user_pg_pass=dbpwd
user_pg_pass=postgres
#########################
### Gunicorn settings ###
@ -43,6 +43,6 @@ user_pg_pass=dbpwd
app_name=gncitizen
gun_num_workers=2
gun_host=localhost
gun_host=0.0.0.0
gun_port=5002
gun_timeout=30

29
patches/taxhub/config.py Normal file
View File

@ -0,0 +1,29 @@
'''
TaxHub global settings file
'''
# Database settings
SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@db/referentielsdb"
SQLALCHEMY_TRACK_MODIFICATIONS = False
DEBUG=True
SESSION_TYPE = 'filesystem'
SECRET_KEY = 'super secret key'
COOKIE_EXPIRATION = 3600
COOKIE_AUTORENEW = True
# File
import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
UPLOAD_FOLDER = 'static/medias'
# Authentification crypting method (hash or md5)
PASS_METHOD='hash'
# ID APPLICATION TaxHub
# User in the authentification submodule to avoid token conflict between app on the same server
ID_APP = 2

View File

@ -0,0 +1,20 @@
#!/bin/bash
FLASKDIR=$(readlink -e "${0%/*}")
APP_DIR="$(dirname "$FLASKDIR")"
echo "Starting $app_name"
echo "$FLASKDIR"
echo "$APP_DIR"
. "$APP_DIR"/settings.ini
# # activate the virtualenv
# cd $FLASKDIR/$venv_dir
# source bin/activate
# export PYTHONPATH=$FLASKDIR:$PYTHONPATH
# Start your unicorn
exec gunicorn server:app --access-logfile $APP_DIR/var/log/taxhub-access.log --pid="${app_name}.pid" --error-log $APP_DIR/var/log/taxhub-errors.log -w "${gun_num_workers}" -b "${gun_host}:${gun_port}" -n "${app_name}"

View File

@ -0,0 +1,144 @@
#!/bin/bash
# Make sure only root can run our script
if [ "$(id -u)" == 0 ]; then
echo "This script must not be run as root" 1>&2
exit 1
fi
#Création des répertoires systèmes
. create_sys_dir.sh
create_sys_dir
if [ ! -f settings.ini ]; then
cp settings.ini.sample settings.ini
fi
# nano settings.ini
#include user config = settings.ini
. settings.ini
#get app path
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
LOG_DIR=$DIR/var/log
function database_exists () {
# /!\ Will return false if psql can't list database. Edit your pg_hba.conf
# as appropriate.
if [ -z $1 ]
then
# Argument is null
return 0
else
# Grep db name in the list of database
sudo -u postgres -s -- psql -tAl | grep -q "^$1|"
return $?
fi
}
if database_exists $db_name
then
if $drop_apps_db
then
echo "Suppression de la base..."
sudo -u postgres -s dropdb $db_name
else
echo "La base de données existe et le fichier de settings indique de ne pas la supprimer."
fi
fi
if ! database_exists $db_name
then
echo "Création de la base..."
sudo -u postgres -s createdb -O $user_pg $db_name
sudo -n -u postgres -s psql -d $db_name -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" &> $LOG_DIR/installdb/install_db.log
sudo -n -u postgres -s psql -d $db_name -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";' &>> $LOG_DIR/installdb/install_db.log
sudo -n -u postgres -s psql -d $db_name -c 'CREATE EXTENSION IF NOT EXISTS "pg_trgm";' &>> $LOG_DIR/installdb/install_db.log
# Mise en place de la structure de la base et des données permettant son fonctionnement avec l'application
echo "Création de la structure de la base..."
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdb.sql &> $LOG_DIR/installdb/install_db.log
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/generic_drop_and_restore_deps_views.sql &> $LOG_DIR/installdb/install_db.log
echo "Décompression des fichiers du taxref..."
array=( TAXREF_INPN_v13.zip ESPECES_REGLEMENTEES_v11.zip LR_FRANCE_20160000.zip BDC_STATUTS_13.zip)
for i in "${array[@]}"
do
if [ ! -f '/tmp/taxhub/'$i ]
then
wget http://geonature.fr/data/inpn/taxonomie/$i -P /tmp/taxhub
unzip /tmp/taxhub/$i -d /tmp/taxhub
else
echo $i exists
fi
done
echo "Insertion des données taxonomiques de l'inpn... (cette opération peut être longue)"
cd $DIR
sudo -u postgres -s psql -d $db_name -f data/inpn/data_inpn_taxhub.sql &>> $LOG_DIR/installdb/install_db.log
echo "Création de la vue représentant la hierarchie taxonomique..."
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/materialized_views.sql &>> $LOG_DIR/installdb/install_db.log
echo "Insertion de données de base"
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata.sql &>> $LOG_DIR/installdb/install_db.log
echo "Insertion de fonctions génériques de détection de vues dépendantes"
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/generic_drop_and_restore_deps_views.sql &>> $LOG_DIR/installdb/install_db.log
if $insert_geonatureatlas_data
then
echo "Insertion de données nécessaires à GeoNature-atlas"
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata_atlas.sql &>> $LOG_DIR/installdb/install_db.log
fi
if $insert_attribut_example
then
echo "Insertion d'un exemple d'attribut"
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata_example.sql &>> $LOG_DIR/installdb/install_db.log
fi
if $insert_taxons_example
then
echo "Insertion de 8 taxons exemple"
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/taxhubdata_taxons_example.sql &>> $LOG_DIR/installdb/install_db.log
fi
if [ $users_schema = "local" ]
then
echo "Création du schéma Utilisateur..."
wget https://raw.githubusercontent.com/PnX-SI/UsersHub/$usershub_release/data/usershub.sql -P /tmp
wget https://raw.githubusercontent.com/PnX-SI/UsersHub/$usershub_release/data/usershub-data.sql -P /tmp
wget https://raw.githubusercontent.com/PnX-SI/UsersHub/$usershub_release/data/usershub-dataset.sql -P /tmp
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f /tmp/usershub.sql &>> $LOG_DIR/installdb/install_db.log
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f /tmp/usershub-data.sql &>> $LOG_DIR/installdb/install_db.log
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f /tmp/usershub-dataset.sql &>> $LOG_DIR/installdb/install_db.log
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -f data/adds_for_usershub.sql &>> $LOG_DIR/installdb/install_db.log
else
echo "Connexion à la base Utilisateur..."
cp data/create_fdw_utilisateurs.sql /tmp/taxhub/create_fdw_utilisateurs.sql
cp data/grant.sql /tmp/taxhub/grant.sql
sed -i "s#\$user_pg#$user_pg#g" /tmp/taxhub/create_fdw_utilisateurs.sql
sed -i "s#\$usershub_host#$usershub_host#g" /tmp/taxhub/create_fdw_utilisateurs.sql
sed -i "s#\$usershub_db#$usershub_db#g" /tmp/taxhub/create_fdw_utilisateurs.sql
sed -i "s#\$usershub_port#$usershub_port#g" /tmp/taxhub/create_fdw_utilisateurs.sql
sed -i "s#\$usershub_user#$usershub_user#g" /tmp/taxhub/create_fdw_utilisateurs.sql
sed -i "s#\$usershub_pass#$usershub_pass#g" /tmp/taxhub/create_fdw_utilisateurs.sql
sed -i "s#\$usershub_user#$usershub_user#g" /tmp/taxhub/grant.sql
sudo -u postgres -s psql -d $db_name -f /tmp/taxhub/create_fdw_utilisateurs.sql &>> $LOG_DIR/installdb/install_db.log
sudo -u postgres -s psql -d $db_name -f /tmp/taxhub/grant.sql &>> $LOG_DIR/installdb/install_db.log
fi
# Vaccum database
echo "Vaccum database ... (cette opération peut être longue)"
export PGPASSWORD=$user_pg_pass;psql -h $db_host -U $user_pg -d $db_name -c "VACUUM FULL VERBOSE;" &>> $LOG_DIR/installdb/install_db.log
fi

65
patches/taxhub/server.py Normal file
View File

@ -0,0 +1,65 @@
# coding: utf8
from flask import Flask
from flask_cors import CORS
from apptax.database import db
db = db
app_globals = {}
def init_app():
if app_globals.get('app', False):
app = app_globals['app']
else:
app = Flask(__name__)
with app.app_context():
app.config.from_pyfile('config.py')
db.init_app(app)
db.app = app
app.config['DB'] = db
@app.teardown_request
def _manage_transaction(exception):
if exception:
db.session.rollback()
else:
db.session.commit()
db.session.remove()
from pypnusershub import routes
app.register_blueprint(routes.routes, url_prefix='/api/auth')
from apptax.index import routes
app.register_blueprint(routes, url_prefix='/')
from apptax.taxonomie.routesbibnoms import adresses
app.register_blueprint(adresses, url_prefix='/api/bibnoms')
from apptax.taxonomie.routestaxref import adresses
app.register_blueprint(adresses, url_prefix='/api/taxref')
from apptax.taxonomie.routesbibattributs import adresses
app.register_blueprint(adresses, url_prefix='/api/bibattributs')
from apptax.taxonomie.routesbiblistes import adresses
app.register_blueprint(adresses, url_prefix='/api/biblistes')
from apptax.taxonomie.routestmedias import adresses
app.register_blueprint(adresses, url_prefix='/api/tmedias')
from apptax.taxonomie.routesbibtypesmedia import adresses
app.register_blueprint(adresses, url_prefix='/api/bibtypesmedia')
from apptax.utils.routesconfig import adresses
app.register_blueprint(adresses, url_prefix='/api/config')
return app
app = init_app()
CORS(app, supports_credentials=True)
if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True)

View File

@ -0,0 +1,74 @@
##########################################
###### TAXHUB installation settings ######
##########################################
app_name=taxhub
#######################
### Python settings ###
#######################
venv_dir=venv
python_path=/usr/bin/python3
###########################
### PostgreSQL settings ###
###########################
# Drop eventual existing database during installation
drop_apps_db=false
# DB host
db_host=db
# PostgreSQL port
db_port=5432
# Database name
db_name=referentielsdb
# Database owner username
user_pg=postgres
# Database owner password
user_pg_pass=postgres
### Users schema localisation
# Possible values : 'local' or 'foreign'
# 'local' means that the 'utilisateurs' schema has to be installed in TaxHub database.
# 'foreign' means that the 'utilisateurs' schema is in another database. An FDW schema will be created on it.
# Nota : foreign requires UsersHub to be already installed
usershub_release=2.1.1
users_schema=local
### UsersHub relation settings - Required if users_schema=foreign
usershub_host=db
usershub_db=referentielsdb
usershub_port=5432
usershub_user=postgres
usershub_pass=postgres
###############
### Options ###
###############
# Insert GeoNature-atlas data (theme & attributs)
insert_geonatureatlas_data=true
# Insert an example of attribute (Migrateur)
insert_attribut_example=false
# Insert 8 examples of taxons and add it to the Occtax list
insert_taxons_example=true
#########################
### Gunicorn settings ###
#########################
gun_num_workers=4
gun_host=0.0.0.0
gun_port=5000

2215
qgis/access-api.qgs~ Normal file

File diff suppressed because it is too large Load Diff

590
qgis/gestion-biommap.qgs Normal file
View File

@ -0,0 +1,590 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis projectname="" saveUser="julien" saveDateTime="2021-10-21T09:10:22" version="3.16.4-Hannover" saveUserFull="julien">
<homePath path=""/>
<title></title>
<autotransaction active="0"/>
<evaluateDefaultValues active="0"/>
<trust active="0"/>
<projectCrs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</projectCrs>
<layer-tree-group>
<customproperties/>
<layer-tree-layer providerKey="wms" legend_exp="" patch_size="-1,-1" expanded="1" id="ORTHO_2021_ae5204e1_745a_4a09_93a2_e7291d28b03d" legend_split_behavior="0" name="ORTHO_2021" source="contextualWMSLegend=0&amp;crs=EPSG:3857&amp;dpiMode=7&amp;featureCount=10&amp;format=image/jpeg&amp;layers=0&amp;styles&amp;url=https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2021/MapServer/WMSServer" checked="Qt::Checked">
<customproperties/>
</layer-tree-layer>
<layer-tree-layer providerKey="wms" legend_exp="" patch_size="-1,-1" expanded="1" id="OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315" legend_split_behavior="0" name="OpenStreetMap" source="type=xyz&amp;url=https://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&amp;zmax=19&amp;zmin=0" checked="Qt::Checked">
<customproperties/>
</layer-tree-layer>
<custom-order enabled="0">
<item>OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315</item>
<item>ORTHO_2021_ae5204e1_745a_4a09_93a2_e7291d28b03d</item>
</custom-order>
</layer-tree-group>
<snapping-settings self-snapping="0" enabled="0" mode="2" intersection-snapping="0" tolerance="12" scaleDependencyMode="0" minScale="0" unit="1" maxScale="0" type="1">
<individual-layer-settings/>
</snapping-settings>
<relations/>
<mapcanvas annotationsVisible="1" name="theMapCanvas">
<units>meters</units>
<extent>
<xmin>-19960441.00300928577780724</xmin>
<ymin>-43668959.47562752664089203</ymin>
<xmax>19960441.00300927087664604</xmax>
<ymax>43668959.47563116252422333</ymax>
</extent>
<rotation>0</rotation>
<destinationsrs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</destinationsrs>
<rendermaptile>0</rendermaptile>
<expressionContextScope/>
</mapcanvas>
<DataPlotly>
<Option type="Map">
<Option name="dynamic_properties" type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
<Option name="plot_layout" type="Map">
<Option value="" name="additional_info_expression" type="QString"/>
<Option value="group" name="bar_mode" type="QString"/>
<Option value="0" name="bargaps" type="double"/>
<Option value="false" name="bins_check" type="bool"/>
<Option value="true" name="legend" type="bool"/>
<Option value="v" name="legend_orientation" type="QString"/>
<Option name="legend_title" type="invalid"/>
<Option name="polar" type="Map">
<Option name="angularaxis" type="Map">
<Option value="clockwise" name="direction" type="QString"/>
</Option>
</Option>
<Option name="range_slider" type="Map">
<Option value="1" name="borderwidth" type="int"/>
<Option value="false" name="visible" type="bool"/>
</Option>
<Option value="" name="title" type="QString"/>
<Option name="x_inv" type="invalid"/>
<Option name="x_max" type="invalid"/>
<Option name="x_min" type="invalid"/>
<Option value="" name="x_title" type="QString"/>
<Option value="linear" name="x_type" type="QString"/>
<Option name="xaxis" type="invalid"/>
<Option name="y_inv" type="invalid"/>
<Option name="y_max" type="invalid"/>
<Option name="y_min" type="invalid"/>
<Option value="" name="y_title" type="QString"/>
<Option value="linear" name="y_type" type="QString"/>
<Option value="" name="z_title" type="QString"/>
</Option>
<Option name="plot_properties" type="Map">
<Option name="additional_hover_text" type="invalid"/>
<Option value="10" name="bins" type="int"/>
<Option value="v" name="box_orientation" type="QString"/>
<Option value="false" name="box_outliers" type="bool"/>
<Option value="false" name="box_stat" type="bool"/>
<Option value="Greys" name="color_scale" type="QString"/>
<Option value="false" name="color_scale_data_defined_in_check" type="bool"/>
<Option value="false" name="color_scale_data_defined_in_invert_check" type="bool"/>
<Option value="fill" name="cont_type" type="QString"/>
<Option value="Fill" name="contour_type_combo" type="QString"/>
<Option value="false" name="cumulative" type="bool"/>
<Option name="custom" type="List">
<Option value="" type="QString"/>
</Option>
<Option value="auto" name="hover_label_position" type="QString"/>
<Option name="hover_label_text" type="invalid"/>
<Option value="all" name="hover_text" type="QString"/>
<Option value="#8ebad9" name="in_color" type="QString"/>
<Option value="false" name="invert_color_scale" type="bool"/>
<Option value="increasing" name="invert_hist" type="QString"/>
<Option value="Solid Line" name="line_combo" type="QString"/>
<Option value="solid" name="line_dash" type="QString"/>
<Option value="markers" name="marker" type="QString"/>
<Option value="10" name="marker_size" type="double"/>
<Option value="0" name="marker_symbol" type="int"/>
<Option value="Points" name="marker_type_combo" type="QString"/>
<Option value="1" name="marker_width" type="double"/>
<Option value="" name="name" type="QString"/>
<Option value="" name="normalization" type="QString"/>
<Option value="1" name="opacity" type="double"/>
<Option value="#1f77b4" name="out_color" type="QString"/>
<Option value="" name="point_combo" type="QString"/>
<Option value="false" name="selected_features_only" type="bool"/>
<Option value="false" name="show_colorscale_legend" type="bool"/>
<Option value="true" name="show_lines" type="bool"/>
<Option value="true" name="show_lines_check" type="bool"/>
<Option value="true" name="show_mean_line" type="bool"/>
<Option value="true" name="violin_box" type="bool"/>
<Option value="both" name="violin_side" type="QString"/>
<Option value="false" name="visible_features_only" type="bool"/>
<Option value="" name="x_name" type="QString"/>
<Option value="" name="y_name" type="QString"/>
<Option value="" name="z_name" type="QString"/>
</Option>
<Option value="scatter" name="plot_type" type="QString"/>
<Option name="source_layer_id" type="invalid"/>
</Option>
</DataPlotly>
<projectModels/>
<legend updateDrawingOrder="true">
<legendlayer showFeatureCount="0" open="true" drawingOrder="-1" name="ORTHO_2021" checked="Qt::Checked">
<filegroup open="true" hidden="false">
<legendlayerfile visible="1" layerid="ORTHO_2021_ae5204e1_745a_4a09_93a2_e7291d28b03d" isInOverview="0"/>
</filegroup>
</legendlayer>
<legendlayer showFeatureCount="0" open="true" drawingOrder="-1" name="OpenStreetMap" checked="Qt::Checked">
<filegroup open="true" hidden="false">
<legendlayerfile visible="1" layerid="OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315" isInOverview="0"/>
</filegroup>
</legendlayer>
</legend>
<mapViewDocks/>
<mapViewDocks3D/>
<mapcanvas annotationsVisible="1" name="mAreaCanvas">
<units>degrees</units>
<extent>
<xmin>0</xmin>
<ymin>0</ymin>
<xmax>0</xmax>
<ymax>0</ymax>
</extent>
<rotation>0</rotation>
<destinationsrs>
<spatialrefsys>
<wkt>GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</destinationsrs>
<rendermaptile>0</rendermaptile>
<expressionContextScope/>
</mapcanvas>
<mapcanvas annotationsVisible="1" name="mAreaCanvas">
<units>degrees</units>
<extent>
<xmin>0</xmin>
<ymin>0</ymin>
<xmax>0</xmax>
<ymax>0</ymax>
</extent>
<rotation>0</rotation>
<destinationsrs>
<spatialrefsys>
<wkt>GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</destinationsrs>
<rendermaptile>0</rendermaptile>
<expressionContextScope/>
</mapcanvas>
<mapcanvas annotationsVisible="1" name="mAreaCanvas">
<units>degrees</units>
<extent>
<xmin>0</xmin>
<ymin>0</ymin>
<xmax>0</xmax>
<ymax>0</ymax>
</extent>
<rotation>0</rotation>
<destinationsrs>
<spatialrefsys>
<wkt>GEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,2],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],USAGE[SCOPE["Horizontal component of 3D system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",4326]]</wkt>
<proj4>+proj=longlat +datum=WGS84 +no_defs</proj4>
<srsid>3452</srsid>
<srid>4326</srid>
<authid>EPSG:4326</authid>
<description>WGS 84</description>
<projectionacronym>longlat</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</destinationsrs>
<rendermaptile>0</rendermaptile>
<expressionContextScope/>
</mapcanvas>
<main-annotation-layer autoRefreshEnabled="0" refreshOnNotifyMessage="" refreshOnNotifyEnabled="0" type="annotation" autoRefreshTime="0">
<id>Annotations_58249151_7565_4174_821b_dcfdd29aefda</id>
<datasource></datasource>
<keywordList>
<value></value>
</keywordList>
<layername>Annotations</layername>
<srs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</resourceMetadata>
<items/>
<layerOpacity>1</layerOpacity>
</main-annotation-layer>
<projectlayers>
<maplayer autoRefreshEnabled="0" refreshOnNotifyMessage="" styleCategories="AllStyleCategories" minScale="1e+08" hasScaleBasedVisibilityFlag="0" maxScale="0" refreshOnNotifyEnabled="0" type="raster" autoRefreshTime="0">
<extent>
<xmin>315726.9638730000006035</xmin>
<ymin>6355634.75045599974691868</ymin>
<xmax>716952.71791600005235523</xmax>
<ymax>6589971.62795300036668777</ymax>
</extent>
<id>ORTHO_2021_ae5204e1_745a_4a09_93a2_e7291d28b03d</id>
<datasource>contextualWMSLegend=0&amp;crs=EPSG:3857&amp;dpiMode=7&amp;featureCount=10&amp;format=image/jpeg&amp;layers=0&amp;styles&amp;url=https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2021/MapServer/WMSServer</datasource>
<keywordList>
<value></value>
</keywordList>
<layername>ORTHO_2021</layername>
<srs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</resourceMetadata>
<provider>wms</provider>
<noData>
<noDataList useSrcNoData="0" bandNo="1"/>
</noData>
<map-layer-style-manager current="default">
<map-layer-style name="default"/>
</map-layer-style-manager>
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
</flags>
<temporal enabled="0" mode="0" fetchMode="0">
<fixedRange>
<start></start>
<end></end>
</fixedRange>
</temporal>
<customproperties>
<property key="identify/format" value="Html"/>
</customproperties>
<pipe>
<provider>
<resampling enabled="false" zoomedInResamplingMethod="nearestNeighbour" zoomedOutResamplingMethod="nearestNeighbour" maxOversampling="2"/>
</provider>
<rasterrenderer opacity="1" nodataColor="" alphaBand="-1" band="1" type="singlebandcolordata">
<rasterTransparency/>
<minMaxOrigin>
<limits>None</limits>
<extent>WholeRaster</extent>
<statAccuracy>Estimated</statAccuracy>
<cumulativeCutLower>0.02</cumulativeCutLower>
<cumulativeCutUpper>0.98</cumulativeCutUpper>
<stdDevFactor>2</stdDevFactor>
</minMaxOrigin>
</rasterrenderer>
<brightnesscontrast brightness="0" contrast="0" gamma="1"/>
<huesaturation colorizeOn="0" colorizeGreen="128" saturation="0" colorizeRed="255" colorizeBlue="128" colorizeStrength="100" grayscaleMode="0"/>
<rasterresampler maxOversampling="2"/>
<resamplingStage>resamplingFilter</resamplingStage>
</pipe>
<blendMode>0</blendMode>
</maplayer>
<maplayer autoRefreshEnabled="0" refreshOnNotifyMessage="" styleCategories="AllStyleCategories" minScale="1e+08" hasScaleBasedVisibilityFlag="0" maxScale="0" refreshOnNotifyEnabled="0" type="raster" autoRefreshTime="0">
<extent>
<xmin>-20037508.34278924390673637</xmin>
<ymin>-20037508.34278925508260727</ymin>
<xmax>20037508.34278924390673637</xmax>
<ymax>20037508.34278924390673637</ymax>
</extent>
<id>OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315</id>
<datasource>type=xyz&amp;url=https://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&amp;zmax=19&amp;zmin=0</datasource>
<keywordList>
<value></value>
</keywordList>
<layername>OpenStreetMap</layername>
<srs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier>OpenStreetMap tiles</identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title>OpenStreetMap tiles</title>
<abstract>OpenStreetMap is built by a community of mappers that contribute and maintain data about roads, trails, cafés, railway stations, and much more, all over the world.</abstract>
<links>
<link url="https://www.openstreetmap.org/" format="" name="Source" type="WWW:LINK" mimeType="" description="" size=""/>
</links>
<fees></fees>
<rights>Base map and data from OpenStreetMap and OpenStreetMap Foundation (CC-BY-SA). © https://www.openstreetmap.org and contributors.</rights>
<license>Open Data Commons Open Database License (ODbL)</license>
<license>Creative Commons Attribution-ShareAlike (CC-BY-SA)</license>
<encoding></encoding>
<crs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minz="0" miny="-85.05112877980660357" maxx="180" maxz="0" crs="EPSG:4326" minx="-180" maxy="85.05112877980660357" dimensions="2"/>
</extent>
</resourceMetadata>
<provider>wms</provider>
<noData>
<noDataList useSrcNoData="0" bandNo="1"/>
</noData>
<map-layer-style-manager current="default">
<map-layer-style name="default"/>
</map-layer-style-manager>
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
</flags>
<temporal enabled="0" mode="0" fetchMode="0">
<fixedRange>
<start></start>
<end></end>
</fixedRange>
</temporal>
<customproperties>
<property key="identify/format" value="Undefined"/>
</customproperties>
<pipe>
<provider>
<resampling enabled="false" zoomedInResamplingMethod="nearestNeighbour" zoomedOutResamplingMethod="nearestNeighbour" maxOversampling="2"/>
</provider>
<rasterrenderer opacity="1" nodataColor="" alphaBand="-1" band="1" type="singlebandcolordata">
<rasterTransparency/>
<minMaxOrigin>
<limits>None</limits>
<extent>WholeRaster</extent>
<statAccuracy>Estimated</statAccuracy>
<cumulativeCutLower>0.02</cumulativeCutLower>
<cumulativeCutUpper>0.98</cumulativeCutUpper>
<stdDevFactor>2</stdDevFactor>
</minMaxOrigin>
</rasterrenderer>
<brightnesscontrast brightness="0" contrast="0" gamma="1"/>
<huesaturation colorizeOn="0" colorizeGreen="128" saturation="0" colorizeRed="255" colorizeBlue="128" colorizeStrength="100" grayscaleMode="0"/>
<rasterresampler maxOversampling="2"/>
<resamplingStage>resamplingFilter</resamplingStage>
</pipe>
<blendMode>0</blendMode>
</maplayer>
</projectlayers>
<layerorder>
<layer id="OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315"/>
<layer id="ORTHO_2021_ae5204e1_745a_4a09_93a2_e7291d28b03d"/>
</layerorder>
<properties>
<Digitizing>
<AvoidIntersectionsMode type="int">0</AvoidIntersectionsMode>
</Digitizing>
<Gui>
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
<CanvasColorRedPart type="int">255</CanvasColorRedPart>
<SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
<SelectionColorBluePart type="int">0</SelectionColorBluePart>
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
</Gui>
<Legend>
<filterByMap type="bool">false</filterByMap>
</Legend>
<Measure>
<Ellipsoid type="QString">EPSG:7030</Ellipsoid>
</Measure>
<Measurement>
<AreaUnits type="QString">m2</AreaUnits>
<DistanceUnits type="QString">meters</DistanceUnits>
</Measurement>
<PAL>
<CandidatesLinePerCM type="double">5</CandidatesLinePerCM>
<CandidatesPolygonPerCM type="double">2.5</CandidatesPolygonPerCM>
<DrawRectOnly type="bool">false</DrawRectOnly>
<DrawUnplaced type="bool">false</DrawUnplaced>
<PlacementEngineVersion type="int">1</PlacementEngineVersion>
<SearchMethod type="int">0</SearchMethod>
<ShowingAllLabels type="bool">false</ShowingAllLabels>
<ShowingCandidates type="bool">false</ShowingCandidates>
<ShowingPartialsLabels type="bool">true</ShowingPartialsLabels>
<TextFormat type="int">0</TextFormat>
<UnplacedColor type="QString">255,0,0,255</UnplacedColor>
</PAL>
<Paths>
<Absolute type="bool">false</Absolute>
</Paths>
<PositionPrecision>
<Automatic type="bool">true</Automatic>
<DecimalPlaces type="int">2</DecimalPlaces>
</PositionPrecision>
<SpatialRefSys>
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
</SpatialRefSys>
</properties>
<dataDefinedServerProperties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</dataDefinedServerProperties>
<visibility-presets/>
<transformContext/>
<projectMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<author>julien</author>
<creation>2021-10-21T09:09:36</creation>
</projectMetadata>
<Annotations/>
<Layouts/>
<Bookmarks/>
<ProjectViewSettings UseProjectScales="0">
<Scales/>
<DefaultViewExtent ymin="-43668959.47562752664089203" xmin="-69790116.63613784313201904" xmax="69790116.63613782823085785" ymax="43668959.47563116252422333">
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</DefaultViewExtent>
</ProjectViewSettings>
<ProjectTimeSettings cumulativeTemporalRange="0" timeStepUnit="h" timeStep="1" frameRate="1"/>
<ProjectDisplaySettings>
<BearingFormat id="bearing">
<Option type="Map">
<Option value="" name="decimal_separator" type="QChar"/>
<Option value="6" name="decimals" type="int"/>
<Option value="0" name="direction_format" type="int"/>
<Option value="0" name="rounding_type" type="int"/>
<Option value="false" name="show_plus" type="bool"/>
<Option value="true" name="show_thousand_separator" type="bool"/>
<Option value="false" name="show_trailing_zeros" type="bool"/>
<Option value="" name="thousand_separator" type="QChar"/>
</Option>
</BearingFormat>
</ProjectDisplaySettings>
</qgis>

398
qgis/gestion-biommap.qgs~ Normal file
View File

@ -0,0 +1,398 @@
<!DOCTYPE qgis PUBLIC 'http://mrcc.com/qgis.dtd' 'SYSTEM'>
<qgis projectname="" saveUser="julien" saveDateTime="2021-10-21T09:10:08" version="3.16.4-Hannover" saveUserFull="julien">
<homePath path=""/>
<title></title>
<autotransaction active="0"/>
<evaluateDefaultValues active="0"/>
<trust active="0"/>
<projectCrs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</projectCrs>
<layer-tree-group>
<customproperties/>
<layer-tree-layer providerKey="wms" legend_exp="" patch_size="-1,-1" expanded="1" id="OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315" legend_split_behavior="0" name="OpenStreetMap" source="type=xyz&amp;url=https://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&amp;zmax=19&amp;zmin=0" checked="Qt::Checked">
<customproperties/>
</layer-tree-layer>
<custom-order enabled="0">
<item>OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315</item>
</custom-order>
</layer-tree-group>
<snapping-settings self-snapping="0" enabled="0" mode="2" intersection-snapping="0" tolerance="12" scaleDependencyMode="0" minScale="0" unit="1" maxScale="0" type="1">
<individual-layer-settings/>
</snapping-settings>
<relations/>
<mapcanvas annotationsVisible="1" name="theMapCanvas">
<units>meters</units>
<extent>
<xmin>-19960441.00300928577780724</xmin>
<ymin>-43668959.47562752664089203</ymin>
<xmax>19960441.00300927087664604</xmax>
<ymax>43668959.47563116252422333</ymax>
</extent>
<rotation>0</rotation>
<destinationsrs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</destinationsrs>
<rendermaptile>0</rendermaptile>
<expressionContextScope/>
</mapcanvas>
<DataPlotly>
<Option type="Map">
<Option name="dynamic_properties" type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
<Option name="plot_layout" type="Map">
<Option value="" name="additional_info_expression" type="QString"/>
<Option value="group" name="bar_mode" type="QString"/>
<Option value="0" name="bargaps" type="double"/>
<Option value="false" name="bins_check" type="bool"/>
<Option value="true" name="legend" type="bool"/>
<Option value="v" name="legend_orientation" type="QString"/>
<Option name="legend_title" type="invalid"/>
<Option name="polar" type="Map">
<Option name="angularaxis" type="Map">
<Option value="clockwise" name="direction" type="QString"/>
</Option>
</Option>
<Option name="range_slider" type="Map">
<Option value="1" name="borderwidth" type="int"/>
<Option value="false" name="visible" type="bool"/>
</Option>
<Option value="" name="title" type="QString"/>
<Option name="x_inv" type="invalid"/>
<Option name="x_max" type="invalid"/>
<Option name="x_min" type="invalid"/>
<Option value="" name="x_title" type="QString"/>
<Option value="linear" name="x_type" type="QString"/>
<Option name="xaxis" type="invalid"/>
<Option name="y_inv" type="invalid"/>
<Option name="y_max" type="invalid"/>
<Option name="y_min" type="invalid"/>
<Option value="" name="y_title" type="QString"/>
<Option value="linear" name="y_type" type="QString"/>
<Option value="" name="z_title" type="QString"/>
</Option>
<Option name="plot_properties" type="Map">
<Option name="additional_hover_text" type="invalid"/>
<Option value="10" name="bins" type="int"/>
<Option value="v" name="box_orientation" type="QString"/>
<Option value="false" name="box_outliers" type="bool"/>
<Option value="false" name="box_stat" type="bool"/>
<Option value="Greys" name="color_scale" type="QString"/>
<Option value="false" name="color_scale_data_defined_in_check" type="bool"/>
<Option value="false" name="color_scale_data_defined_in_invert_check" type="bool"/>
<Option value="fill" name="cont_type" type="QString"/>
<Option value="Fill" name="contour_type_combo" type="QString"/>
<Option value="false" name="cumulative" type="bool"/>
<Option name="custom" type="List">
<Option value="" type="QString"/>
</Option>
<Option value="auto" name="hover_label_position" type="QString"/>
<Option name="hover_label_text" type="invalid"/>
<Option value="all" name="hover_text" type="QString"/>
<Option value="#8ebad9" name="in_color" type="QString"/>
<Option value="false" name="invert_color_scale" type="bool"/>
<Option value="increasing" name="invert_hist" type="QString"/>
<Option value="Solid Line" name="line_combo" type="QString"/>
<Option value="solid" name="line_dash" type="QString"/>
<Option value="markers" name="marker" type="QString"/>
<Option value="10" name="marker_size" type="double"/>
<Option value="0" name="marker_symbol" type="int"/>
<Option value="Points" name="marker_type_combo" type="QString"/>
<Option value="1" name="marker_width" type="double"/>
<Option value="" name="name" type="QString"/>
<Option value="" name="normalization" type="QString"/>
<Option value="1" name="opacity" type="double"/>
<Option value="#1f77b4" name="out_color" type="QString"/>
<Option value="" name="point_combo" type="QString"/>
<Option value="false" name="selected_features_only" type="bool"/>
<Option value="false" name="show_colorscale_legend" type="bool"/>
<Option value="true" name="show_lines" type="bool"/>
<Option value="true" name="show_lines_check" type="bool"/>
<Option value="true" name="show_mean_line" type="bool"/>
<Option value="true" name="violin_box" type="bool"/>
<Option value="both" name="violin_side" type="QString"/>
<Option value="false" name="visible_features_only" type="bool"/>
<Option value="" name="x_name" type="QString"/>
<Option value="" name="y_name" type="QString"/>
<Option value="" name="z_name" type="QString"/>
</Option>
<Option value="scatter" name="plot_type" type="QString"/>
<Option name="source_layer_id" type="invalid"/>
</Option>
</DataPlotly>
<projectModels/>
<legend updateDrawingOrder="true">
<legendlayer showFeatureCount="0" open="true" drawingOrder="-1" name="OpenStreetMap" checked="Qt::Checked">
<filegroup open="true" hidden="false">
<legendlayerfile visible="1" layerid="OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315" isInOverview="0"/>
</filegroup>
</legendlayer>
</legend>
<mapViewDocks/>
<mapViewDocks3D/>
<main-annotation-layer autoRefreshEnabled="0" refreshOnNotifyMessage="" refreshOnNotifyEnabled="0" type="annotation" autoRefreshTime="0">
<id>Annotations_58249151_7565_4174_821b_dcfdd29aefda</id>
<datasource></datasource>
<keywordList>
<value></value>
</keywordList>
<layername>Annotations</layername>
<srs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<fees></fees>
<encoding></encoding>
<crs>
<spatialrefsys>
<wkt></wkt>
<proj4></proj4>
<srsid>0</srsid>
<srid>0</srid>
<authid></authid>
<description></description>
<projectionacronym></projectionacronym>
<ellipsoidacronym></ellipsoidacronym>
<geographicflag>true</geographicflag>
</spatialrefsys>
</crs>
<extent/>
</resourceMetadata>
<items/>
<layerOpacity>1</layerOpacity>
</main-annotation-layer>
<projectlayers>
<maplayer autoRefreshEnabled="0" refreshOnNotifyMessage="" styleCategories="AllStyleCategories" minScale="1e+08" hasScaleBasedVisibilityFlag="0" maxScale="0" refreshOnNotifyEnabled="0" type="raster" autoRefreshTime="0">
<extent>
<xmin>-20037508.34278924390673637</xmin>
<ymin>-20037508.34278925508260727</ymin>
<xmax>20037508.34278924390673637</xmax>
<ymax>20037508.34278924390673637</ymax>
</extent>
<id>OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315</id>
<datasource>type=xyz&amp;url=https://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&amp;zmax=19&amp;zmin=0</datasource>
<keywordList>
<value></value>
</keywordList>
<layername>OpenStreetMap</layername>
<srs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</srs>
<resourceMetadata>
<identifier>OpenStreetMap tiles</identifier>
<parentidentifier></parentidentifier>
<language></language>
<type>dataset</type>
<title>OpenStreetMap tiles</title>
<abstract>OpenStreetMap is built by a community of mappers that contribute and maintain data about roads, trails, cafés, railway stations, and much more, all over the world.</abstract>
<links>
<link url="https://www.openstreetmap.org/" format="" name="Source" type="WWW:LINK" mimeType="" description="" size=""/>
</links>
<fees></fees>
<rights>Base map and data from OpenStreetMap and OpenStreetMap Foundation (CC-BY-SA). © https://www.openstreetmap.org and contributors.</rights>
<license>Open Data Commons Open Database License (ODbL)</license>
<license>Creative Commons Attribution-ShareAlike (CC-BY-SA)</license>
<encoding></encoding>
<crs>
<spatialrefsys>
<wkt>PROJCRS["WGS 84 / Pseudo-Mercator",BASEGEOGCRS["WGS 84",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4326]],CONVERSION["Popular Visualisation Pseudo-Mercator",METHOD["Popular Visualisation Pseudo Mercator",ID["EPSG",1024]],PARAMETER["Latitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8801]],PARAMETER["Longitude of natural origin",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8802]],PARAMETER["False easting",0,LENGTHUNIT["metre",1],ID["EPSG",8806]],PARAMETER["False northing",0,LENGTHUNIT["metre",1],ID["EPSG",8807]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],LENGTHUNIT["metre",1]],AXIS["northing (Y)",north,ORDER[2],LENGTHUNIT["metre",1]],USAGE[SCOPE["Web mapping and visualisation."],AREA["World between 85.06°S and 85.06°N."],BBOX[-85.06,-180,85.06,180]],ID["EPSG",3857]]</wkt>
<proj4>+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +nadgrids=@null +wktext +no_defs</proj4>
<srsid>3857</srsid>
<srid>3857</srid>
<authid>EPSG:3857</authid>
<description>WGS 84 / Pseudo-Mercator</description>
<projectionacronym>merc</projectionacronym>
<ellipsoidacronym>EPSG:7030</ellipsoidacronym>
<geographicflag>false</geographicflag>
</spatialrefsys>
</crs>
<extent>
<spatial minz="0" miny="-85.05112877980660357" maxx="180" maxz="0" crs="EPSG:4326" minx="-180" maxy="85.05112877980660357" dimensions="2"/>
</extent>
</resourceMetadata>
<provider>wms</provider>
<noData>
<noDataList useSrcNoData="0" bandNo="1"/>
</noData>
<map-layer-style-manager current="default">
<map-layer-style name="default"/>
</map-layer-style-manager>
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
</flags>
<temporal enabled="0" mode="0" fetchMode="0">
<fixedRange>
<start></start>
<end></end>
</fixedRange>
</temporal>
<customproperties>
<property key="identify/format" value="Undefined"/>
</customproperties>
<pipe>
<provider>
<resampling enabled="false" zoomedInResamplingMethod="nearestNeighbour" zoomedOutResamplingMethod="nearestNeighbour" maxOversampling="2"/>
</provider>
<rasterrenderer opacity="1" nodataColor="" alphaBand="-1" band="1" type="singlebandcolordata">
<rasterTransparency/>
<minMaxOrigin>
<limits>None</limits>
<extent>WholeRaster</extent>
<statAccuracy>Estimated</statAccuracy>
<cumulativeCutLower>0.02</cumulativeCutLower>
<cumulativeCutUpper>0.98</cumulativeCutUpper>
<stdDevFactor>2</stdDevFactor>
</minMaxOrigin>
</rasterrenderer>
<brightnesscontrast brightness="0" contrast="0" gamma="1"/>
<huesaturation colorizeOn="0" colorizeGreen="128" saturation="0" colorizeRed="255" colorizeBlue="128" colorizeStrength="100" grayscaleMode="0"/>
<rasterresampler maxOversampling="2"/>
<resamplingStage>resamplingFilter</resamplingStage>
</pipe>
<blendMode>0</blendMode>
</maplayer>
</projectlayers>
<layerorder>
<layer id="OpenStreetMap_ec6e4612_9dbd_4642_a5e1_846bc5e3d315"/>
</layerorder>
<properties>
<Digitizing>
<AvoidIntersectionsMode type="int">0</AvoidIntersectionsMode>
</Digitizing>
<Gui>
<CanvasColorBluePart type="int">255</CanvasColorBluePart>
<CanvasColorGreenPart type="int">255</CanvasColorGreenPart>
<CanvasColorRedPart type="int">255</CanvasColorRedPart>
<SelectionColorAlphaPart type="int">255</SelectionColorAlphaPart>
<SelectionColorBluePart type="int">0</SelectionColorBluePart>
<SelectionColorGreenPart type="int">255</SelectionColorGreenPart>
<SelectionColorRedPart type="int">255</SelectionColorRedPart>
</Gui>
<Legend>
<filterByMap type="bool">false</filterByMap>
</Legend>
<Measure>
<Ellipsoid type="QString">EPSG:7030</Ellipsoid>
</Measure>
<Measurement>
<AreaUnits type="QString">m2</AreaUnits>
<DistanceUnits type="QString">meters</DistanceUnits>
</Measurement>
<PAL>
<CandidatesLinePerCM type="double">5</CandidatesLinePerCM>
<CandidatesPolygonPerCM type="double">2.5</CandidatesPolygonPerCM>
<DrawRectOnly type="bool">false</DrawRectOnly>
<DrawUnplaced type="bool">false</DrawUnplaced>
<PlacementEngineVersion type="int">1</PlacementEngineVersion>
<SearchMethod type="int">0</SearchMethod>
<ShowingAllLabels type="bool">false</ShowingAllLabels>
<ShowingCandidates type="bool">false</ShowingCandidates>
<ShowingPartialsLabels type="bool">true</ShowingPartialsLabels>
<TextFormat type="int">0</TextFormat>
<UnplacedColor type="QString">255,0,0,255</UnplacedColor>
</PAL>
<Paths>
<Absolute type="bool">false</Absolute>
</Paths>
<PositionPrecision>
<Automatic type="bool">true</Automatic>
<DecimalPlaces type="int">2</DecimalPlaces>
</PositionPrecision>
<SpatialRefSys>
<ProjectionsEnabled type="int">1</ProjectionsEnabled>
</SpatialRefSys>
</properties>
<dataDefinedServerProperties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</dataDefinedServerProperties>
<visibility-presets/>
<transformContext/>
<projectMetadata>
<identifier></identifier>
<parentidentifier></parentidentifier>
<language></language>
<type></type>
<title></title>
<abstract></abstract>
<links/>
<author>julien</author>
<creation>2021-10-21T09:09:36</creation>
</projectMetadata>
<Annotations/>
<Layouts/>
<Bookmarks/>
<ProjectViewSettings UseProjectScales="0">
<Scales/>
</ProjectViewSettings>
<ProjectTimeSettings cumulativeTemporalRange="0" timeStepUnit="h" timeStep="1" frameRate="1"/>
<ProjectDisplaySettings>
<BearingFormat id="bearing">
<Option type="Map">
<Option value="" name="decimal_separator" type="QChar"/>
<Option value="6" name="decimals" type="int"/>
<Option value="0" name="direction_format" type="int"/>
<Option value="0" name="rounding_type" type="int"/>
<Option value="false" name="show_plus" type="bool"/>
<Option value="true" name="show_thousand_separator" type="bool"/>
<Option value="false" name="show_trailing_zeros" type="bool"/>
<Option value="" name="thousand_separator" type="QChar"/>
</Option>
</BearingFormat>
</ProjectDisplaySettings>
</qgis>

5306
qgis/lecture-biommap.qgs Normal file

File diff suppressed because it is too large Load Diff

5200
qgis/lecture-biommap.qgs~ Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,3 @@
How to draw lines and polygons in Leaflet: sandbox for testing
=================================

View File

@ -0,0 +1,122 @@
<!DOCTYPE html>
<html style="height:100%;margin:0;padding:0;">
<head>
<title>Tests edit line - polygon</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<script src="./leaflet/leaflet-hash.js"></script>
<style type="text/css">
.leaflet-tile-container { pointer-events: auto; }
</style>
</head>
<body style="height:100%;margin:0;padding:0;">
<div id="map" style="height:100%"></div>
<script>
const map = L.map('map').setView([50.5, 5.57], 10);
const cyclosm = L.tileLayer('https://{s}.tiles.champs-libres.be/cyclosm/{z}/{x}/{y}.png', {
subdomains: "abc",
attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
maxZoom: 20
});
map.addLayer(cyclosm);
const hash = L.hash(map);
let geometryType = 'POLYGON'; //'POINT' | 'LINESTRING' | 'POLYGON'
let myMarker = null;
let polyline = null;
let previousPolyline = null;
let previousLayerPoint = null;
let polygon = null;
let firstPolygonPoint = null;
const lineDraw = L.polyline([], {color: '#11aa9e', dashArray: '6', lineCap: 'butt'}).addTo(map);
const pointDistance = (pointA, pointB) => {
const SNAP_DISTANCE = 6;
let distancePixel = Math.sqrt(Math.abs((pointB.x - pointA.x)**2 - (pointB.y - pointA.y)**2));
return distancePixel < SNAP_DISTANCE;
};
const arePointsSnapped = (previousPoint, currentPoint) =>
(previousPoint && currentPoint) ? pointDistance(previousPoint, currentPoint) : false;
switch(geometryType){
case 'LINESTRING':
map.on('mousemove', (e) => {
if(polyline){
let lastDrawPoint = polyline.getLatLngs()[polyline.getLatLngs().length - 1];
lineDraw.setLatLngs([lastDrawPoint, e.latlng]);
}
});
break;
case 'POLYGON':
map.on('mousemove', (e) => {
if(polygon){
let lastDrawPoint = polygon.getLatLngs()[0][polygon.getLatLngs()[0].length - 1];
let firstDrawPoint = polygon.getLatLngs()[0][0];
lineDraw.setLatLngs([firstDrawPoint, e.latlng, lastDrawPoint]);
}
});
break;
}
map.on('click', (e) => {
console.log(e);
switch(geometryType){
case 'POINT':
default:
if (myMarker !== null) {
map.removeLayer(myMarker);
}
myMarker = L.marker(e.latlng).addTo(map);
break;
case 'LINESTRING':
lineDraw.setLatLngs([]);
if (polyline === null){
console.log(previousPolyline)
if (previousPolyline !== null){
map.removeLayer(previousPolyline);
}
polyline = L.polyline([e.latlng], {color: '#11aa9e'}).addTo(map);
} else {
if (arePointsSnapped(previousLayerPoint, e.layerPoint)) {
console.log('reset line')
previousPolyline = polyline;
polyline.setStyle({color: '#60b15c'});
polyline = null;
} else {
polyline.addLatLng(e.latlng);
previousLayerPoint = e.layerPoint;
}
}
break;
case 'POLYGON':
lineDraw.setLatLngs([]);
if (polygon === null){
polygon = L.polygon([e.latlng], {color: '#11aa9e'}).addTo(map);
firstPolygonPoint = e.layerPoint;
} else {
if (arePointsSnapped(firstPolygonPoint, e.layerPoint)) {
console.log('close the polygon')
polygon.setStyle({color: '#60b15c'});
polygon = null;
} else {
polygon.addLatLng(e.latlng);
}
}
break;
}
});
</script>
</body>
</html>

View File

@ -0,0 +1,2 @@
node_modules
.lvimrc

View File

@ -0,0 +1,55 @@
{
/*
* ENVIRONMENTS
* =================
*/
// Define globals exposed by modern browsers.
"browser": true,
// Define globals exposed by jQuery.
"jquery": true,
"globals": {"L": false, "proj4": false},
/*
* ENFORCING OPTIONS
* =================
*/
// Force all variable names to use either camelCase style or UPPER_CASE
// with underscores.
"camelcase": true,
// Prohibit use of == and != in favor of === and !==.
"eqeqeq": true,
// Suppress warnings about == null comparisons.
"eqnull": true,
// Enforce tab width of 2 spaces.
"indent": 2,
"smarttabs": true,
// Prohibit use of a variable before it is defined.
"latedef": true,
// Require capitalized names for constructor functions.
"newcap": true,
// Enforce use of single quotation marks for strings.
"quotmark": "single",
// Prohibit trailing whitespace.
"trailing": true,
// Prohibit use of explicitly undeclared variables.
"undef": true,
// Warn when variables are defined but never used.
"unused": true,
// All loops and conditionals should have braces.
"curly": true
}

View File

@ -0,0 +1,3 @@
language: node_js
node_js:
- "6.9"

View File

@ -0,0 +1,22 @@
Copyright (c) 2012, Kartena AB
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -0,0 +1,162 @@
# Proj4Leaflet [![NPM version](https://badge.fury.io/js/proj4leaflet.png)](http://badge.fury.io/js/proj4leaflet) [![Build Status](https://travis-ci.org/kartena/Proj4Leaflet.svg?branch=master)](https://travis-ci.org/kartena/Proj4Leaflet)
This [Leaflet](http://leafletjs.com) plugin adds support for using projections supported by
[Proj4js](https://github.com/proj4js/proj4js).
_Proj4Leaflet uses Leaflet 1.0.3, for compatibility with Leaflet 0.7.x use the [0.7.2](https://github.com/kartena/Proj4Leaflet/releases/tag/0.7.2) release._
Leaflet comes with built in support for tiles in [Spherical Mercator](http://wiki.openstreetmap.org/wiki/EPSG:3857) and [a few other projections](http://leafletjs.com/reference-1.0.0.html#crs-l-crs-epsg3395).
If you need support for tile layers in other projections, the Proj4Leaflet plugin lets you use tiles in any projection
supported by Proj4js, which means support for just about any projection commonly used.
Proj4Leaflet also adds support for GeoJSON in any projection, while Leaflet by itself assumes GeoJSON to always
use WGS84 as its projection.
Image overlays with bounds set from projected coordinates rather than `LatLng`s are also supported by Proj4Leaflet plugin.
For more details, see this blog post on [tiling and projections](http://blog.kartena.se/local-projections-in-a-world-of-spherical-mercator/).
## Usage
Common use means making a new CRS instance for the projection you want to use.
```javascript
// RT90 with map's pixel origin at RT90 coordinate (0, 0)
var crs = new L.Proj.CRS('EPSG:2400',
'+lon_0=15.808277777799999 +lat_0=0.0 +k=1.0 +x_0=1500000.0 ' +
'+y_0=0.0 +proj=tmerc +ellps=bessel +units=m ' +
'+towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +no_defs',
{
resolutions: [8192, 4096, 2048] // 3 example zoom level resolutions
}
);
var map = L.map('map', {
crs: crs,
continuousWorld: true,
worldCopyJump: false
});
L.tileLayer('http://tile.example.com/example/{z}/{x}/{y}.png').addTo(map);
```
Using options when constructing the CRS, you can set the tile set's origin.
```javascript
// SWEREF 99 TM with map's pixel origin at (218128.7031, 6126002.9379)
var crs = new L.Proj.CRS('EPSG:3006',
'+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',
{
origin: [218128.7031, 6126002.9379],
resolutions: [8192, 4096, 2048] // 3 example zoom level resolutions
}
);
```
## Proj4js compatibility notice
Proj4js has breaking changes introduced after version 1.1.0. The current version of Proj4Leaflet
uses Proj4js 2.3.14 or later. If you for some reason need Proj4js version 1.1.0 compatibility, you can
still use Proj4Leaflet [version 0.5](https://github.com/kartena/Proj4Leaflet/tree/0.5).
## API
The plugin extends Leaflet with a few classes that helps integrating Proj4's projections into
Leaflet's [CRS](http://leafletjs.com/reference-1.0.0.html#crs) abstract class.
### L.Proj.CRS
A CRS implementation that uses a Proj4 definition for the projection.
This is likely to be the only class you need to work with in Proj4Leaflet.
#### Usage example
```javascript
var map = L.map('map', {
center: [57.74, 11.94],
zoom: 13,
crs: L.Proj.CRS('EPSG:2400',
'+lon_0=15.808277777799999 +lat_0=0.0 +k=1.0 +x_0=1500000.0 ' +
'+y_0=0.0 +proj=tmerc +ellps=bessel +units=m ' +
'+towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +no_defs',
{
resolutions: [8192, 4096, 2048] // 3 example zoom level resolutions
}
),
continuousWorld: true,
worldCopyJump: false
});
```
#### Constructor
```javascript
L.Proj.CRS(code, proj4def, options)
```
* `code` is the projection's SRS code (only used internally by the Proj4js library)
* `proj4def` is the Proj4 definition string for the projection to use
* `options` is an options object with these possible parameters:
* `origin` - the projected coordinate to use as the map's pixel origin; overrides the `transformation` option if set
* `transformation` - an [L.Transformation](http://leafletjs.com/reference-1.0.0.html#transformation) that is used
to transform the projected coordinates to pixel coordinates; default is `L.Transformation(1, 0, -1, 0)`
* `scales` - an array of scales (pixels per projected coordinate unit) for each corresponding zoom level;
default is to use Leaflet's native scales. You should use `scales` _or_ `resolutions`, not both.
* `resolutions` - an array of resolutions (projected coordinate units per pixel) for each corresponding zoom level;
default is to use Leaflet's native resolutions. You should use `scales` _or_ `resolutions`, not both.
* `bounds` - an [L.Bounds](http://leafletjs.com/reference-1.0.0.html#bounds) providing the bounds of CRS in projected
coordinates. If defined, Proj4Leaflet will use this in the `getSize` method, otherwise reverting to Leaflet's
default size for Spherical Mercator.
### L.Proj.GeoJSON
Extends [L.GeoJSON](http://leafletjs.com/reference-1.0.0.html#geojson) to add CRS support. Unlike the TileLayer extension, the
CRS is derived from the `name` property of a `crs` defined directly on the GeoJSON object per [the spec](http://www.geojson.org/geojson-spec.html#named-crs).
Linked CRSs are not supported.
**Note:** The relevant Proj4 definition should be defined directly via `proj4.defs` before loading the GeoJSON object.
If it is not, Proj4leaflet will throw an error.
Also, note that future versions of the GeoJSON spec may not include explicit CRS support. See https://github.com/GeoJSONWG/draft-geojson/pull/6 for more information.
#### Usage Example
```javascript
proj4.defs("urn:ogc:def:crs:EPSG::26915", "+proj=utm +zone=15 +ellps=GRS80 +datum=NAD83 +units=m +no_defs");
var geojson = {
type: "Feature",
geometry: {
type: "Point",
coordinates: [481650, 4980105]
},
crs: {
type: "name",
properties: {
name: "urn:ogc:def:crs:EPSG::26915"
}
}
};
var map = L.map('map');
L.Proj.geoJson(geojson).addTo(map);
```
### L.Proj.ImageOverlay
Works like [L.ImageOverlay](http://leafletjs.com/reference-1.0.0.html#imageoverlay), but accepts bounds in the map's
projected coordinate system instead of latitudes and longitudes. This is useful when the projected coordinate systems
axis do not align with the latitudes and longitudes, which results in distortion with the default image overlay in Leaflet.
#### Usage Example
```javascript
// Coordinate system is EPSG:28992 / Amersfoort / RD New
var imageBounds = L.bounds(
[145323.20011251318, 475418.56045463786],
[175428.80013969325, 499072.9604685671]
);
L.Proj.imageOverlay('http://geo.flevoland.nl/arcgis/rest/services/Groen_Natuur/Agrarische_Natuur/MapServer/export?' +
'format=png24&transparent=true&f=image&bboxSR=28992&imageSR=28992&layers=show%3A0' +
'&bbox=145323.20011251318%2C475418.56045463786%2C175428.80013969325%2C499072.9604685671&size=560%2C440',
imageBounds);
```

View File

@ -0,0 +1,53 @@
{
"name": "Proj4Leaflet",
"version": "1.0.1",
"homepage": "https://github.com/kartena/Proj4Leaflet",
"authors": [
"Per Liedman <per.liedman@kartena.se> (https://github.com/perliedman/)",
"Peter Thorin (https://github.com/pthorin/)",
"Semone Kallin Thander (https://github.com/semone/)",
"S. Andrew Sheppard (https://github.com/sheppard)",
"Leigh Hunt (https://github.com/leighghunt/)",
"Andris Nolendorfs (https://github.com/theashyster)",
"Vladimir Agafonkin (https://github.com/mourner)",
"Juuso Lehtinen (https://github.com/jleh)",
"Mattias Bengtsson (https://github.com/moonlite/)",
"Denis Rykov (http://github.com/drnextgis) ",
"Jose manuel Vivó Arnal (Chema) (http://github.com/jmvivo) ",
"Daniel Garcia (http://github.com/keyjote) ",
"Mathieu Leplatre (https://github.com/leplatrem)",
"Benny Lichtner (http://github.com/bennlich) ",
"Christopher Fredén (https://github.com/icetan/)",
"dpzaba (http://github.com/dpzaba) ",
"Edward Mac Gillavry (http://github.com/emacgillavry) ",
"Emil Goude (http://github.com/Stockholmsnovis) ",
"Simon Legner (http://github.com/simon04) ",
"Tom Blackmore (http://github.com/tablackmore) ",
"Fabien NICOLLET (https://github.com/fnicollet)"
],
"description": "Smooth Proj4js integration with Leaflet",
"moduleType": [
"amd",
"node"
],
"main": [
"src/proj4leaflet.js"
],
"keywords": [
"Leaflet",
"Project4"
],
"license": "BSD-2-Clause",
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test",
"lib",
"examples",
"tests"
],
"dependencies": {
"proj4": "^2.3.14"
}
}

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="../../lib/leaflet/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="../../lib/leaflet/leaflet.js"></script>
<script src="../../lib/proj4-compressed.js"></script>
<script src="../../src/proj4leaflet.js"></script>
<script src="script.js"></script>
</body>
</html>

View File

@ -0,0 +1,41 @@
var map = L.map('map').setView([44.97,-93.24], 11);
// MapQuest OSM Tiles
// Attribution (https://gist.github.com/mourner/1804938)
var osmAttr = 'Map data &copy; <a href="https://openstreetmap.org">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
mqTilesAttr = 'Tiles &copy; <a href="https://www.mapquest.com/"" target="_blank">MapQuest</a> <img src="https://developer.mapquest.com/content/osm/mq_logo.png" />';
L.tileLayer(
'https://otile{s}.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.png',
{
attribution: 'Data by <a href="https://openstreetmap.org">OpenStreetMap contributors</a>'
}
)
.addTo(map);
// GeoJSON layer (UTM15)
proj4.defs('EPSG:26915', '+proj=utm +zone=15 +ellps=GRS80 +datum=NAD83 +units=m +no_defs');
var geojson = {
'type': 'Feature',
'geometry': {
'type': 'Point',
'coordinates': [481650, 4980105],
},
'properties': {
'name': 'University of Minnesota'
},
'crs': {
'type': 'name',
'properties': {
'name': 'urn:ogc:def:crs:EPSG::26915'
}
}
};
L.Proj.geoJson(geojson, {
'pointToLayer': function(feature, latlng) {
return L.marker(latlng).bindPopup(feature.properties.name);
}
}).addTo(map);

View File

@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="../../lib/leaflet/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="../../lib/leaflet/leaflet.js"></script>
<script src="../../lib/proj4-compressed.js"></script>
<script src="../../src/proj4leaflet.js"></script>
<script src="script.js"></script>
</body>
</html>

View File

@ -0,0 +1,20 @@
var crs = new L.Proj.CRS('EPSG:25833', '+proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs', {
resolutions: [21674.7100160867, 10837.35500804335, 5418.677504021675, 2709.3387520108377, 1354.6693760054188, 677.3346880027094,
338.6673440013547, 169.33367200067735, 84.66683600033868, 42.33341800016934, 21.16670900008467, 10.583354500042335,
5.291677250021167, 2.6458386250105836, 1.3229193125052918, 0.6614596562526459, 0.33072982812632296, 0.16536491406316148],
origin: [-2500000, 9045984]
}
);
var map = L.map('map', {
crs: crs,
center: [60, 10],
zoom: 14
});
L.tileLayer('https://services.geodataonline.no/arcgis/rest/services/Geocache_UTM33_EUREF89/GeocacheBasis/MapServer/tile/{z}/{y}/{x}').addTo(map);
L.Proj.imageOverlay('https://services.geodataonline.no/arcgis/rest/services/Geocache_UTM33_EUREF89/GeocacheGraatone/MapServer/export' +
'?bbox=220461.84450009145,6661489.40861154,222115.49415195954,6662415.4521056535' +
'&size=1250,700&dpi=96&format=png24&transparent=true&bboxSR=25833&imageSR=25833&f=image',
L.bounds([220461.84450009145, 6661489.40861154], [222115.49415195954, 6662415.4521056535])).addTo(map);

View File

@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="../style.css" />
<link rel="stylesheet" href="../../../lib/leaflet/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="../../../lib/leaflet/leaflet.js"></script>
<script src="../../../lib/proj4-compressed.js"></script>
<script src="../../../src/proj4leaflet.js"></script>
<script src="script_austria.js"></script>
</body>
</html>

View File

@ -0,0 +1,36 @@
var crs31258 = new L.Proj.CRS('EPSG::31258',
"+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs",
{
origin: [-5172500.0, 5001000.0],
resolutions: [
400.00079375158754,
200.000529167725,
100.0002645838625,
50,
25,
15.000052916772502,
9.9999470832275,
5.000105833545001,
3.0001164168995005,
2.5000529167725003,
1.9999894166455001,
1.4999259165184997,
1.0001270002540006,
0.5000635001270003,
0.25003175006350015],
});
var map = L.map('map', {
crs: crs31258,
});
var attrib = "&copy KAGIS http://www.kagis.ktn.gv.at";
var basemap = new L.TileLayer("http://gis.ktn.gv.at/arcgis/rest/services/tilecache/Ortho_2010_2012/MapServer/tile/{z}/{y}/{x}", {
tileSize: 512,
maxZoom: 14,
minZoom: 0,
attribution: attrib
});
map.addLayer(basemap);
map.setView([46.66411, 14.63602], 12);

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="../style.css" />
<link rel="stylesheet" href="../../../lib/leaflet/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="../../../lib/leaflet/leaflet.js"></script>
<script src="../../../lib/proj4-compressed.js"></script>
<script src="../../../src/proj4leaflet.js"></script>
<script src="script_auckland.js"></script>
</body>
</html>

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="https://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="https://cdn.leafletjs.com/leaflet/v0.7.7/leaflet.js"></script>
<script src="../../../lib/proj4-compressed.js"></script>
<script src="../../../src/proj4leaflet.js"></script>
<script src="script_wellington.js"></script>
</body>
</html>

View File

@ -0,0 +1,35 @@
var crs = new L.Proj.CRS('EPSG:2193',
'+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',
{
origin: [1565000, 6150000],
resolutions: [
264.583862501058,
201.083735500804,
132.291931250529,
66.1459656252646,
26.4583862501058,
13.2291931250529,
6.61459656252646,
3.96875793751588,
2.11667090000847,
1.32291931250529,
0.661459656252646,
0.264583862501058,
0.132291931250529
]
});
var map = new L.Map('map', {
crs: crs,
});
var tileUrl = 'https://maps.aucklandcouncil.govt.nz/ArcGIS/rest/services/Aerials/MapServer/tile/{z}/{y}/{x}',
attrib = 'Auckland City Council &copy; 2012',
tilelayer = new L.TileLayer(tileUrl, {
maxZoom: 12,
minZoom: 0,
attribution: attrib,
});
map.addLayer(tilelayer);
map.setView([-36.852931, 174.762057], 10);

View File

@ -0,0 +1,45 @@
var crs = new L.Proj.CRS('EPSG:2193',
'+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',
{
origin: [-5099531.19635, 57089446.18],
resolutions: [
66.1459656252646,
33.0729828126323,
16.933367200067735,
8.466683600033868,
4.233341800016934,
2.116670900008467,
1.0583354500042335,
0.5291677250021167,
0.26458386250105836,
0.13229193125052918,
0.06614596562526459
]
});
var map = new L.Map('map', {
crs: crs,
continuousWorld: true,
worldCopyJump: false
});
/*
Wellington City Council's GIS web services are available under the following terms and conditions:
https://wellington.govt.nz/about-wellington/maps/gis-data-terms-and-conditions
Aerial Imagery: Creative Commons Attribution 3.0 New Zealand Licence, https://creativecommons.org/licenses/by/3.0/nz/
Additional services listed at https://wellington.govt.nz/~/media/maps/gis/ogc-services-list.pdf
*/
var tileUrl = 'https://gis.wcc.govt.nz/arcgis/rest/services/Basemap/Aerial_Photo/MapServer/tile/{z}/{y}/{x}',
attrib = 'Wellington City Council &copy; 2012',
tilelayer = new L.TileLayer(tileUrl, {
maxZoom: 10,
minZoom: 0,
continuousWorld: true,
attribution: attrib,
tileSize: 512
});
map.addLayer(tilelayer);
map.setView([-41.288889, 174.777222], 5);

View File

@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="../../lib/leaflet/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="../../lib/leaflet/leaflet.js"></script>
<script src="../../lib/proj4-compressed.js"></script>
<script src="../../src/proj4leaflet.js"></script>
<script src="script.js"></script>
</body>
</html>

View File

@ -0,0 +1,21 @@
var crs = new L.Proj.CRS('EPSG:3006',
'+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',
{
resolutions: [
8192, 4096, 2048, 1024, 512, 256, 128,
64, 32, 16, 8, 4, 2, 1, 0.5
],
origin: [0, 0],
bounds: L.bounds([218128.7031, 6126002.9379], [1083427.2970, 7692850.9468])
}),
map = new L.Map('map', {
crs: crs,
});
L.tileLayer('https://api.geosition.com/tile/osm-bright-3006/{z}/{x}/{y}.png', {
maxZoom: 14,
minZoom: 0,
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap contributors</a>, Imagery &copy; <a href="http://www.kartena.se/">Kartena</a>'
}).addTo(map);
map.setView([57.704, 11.965], 13);

View File

@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="../../lib/leaflet/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="../../lib/leaflet/leaflet.js"></script>
<script src="../../lib/proj4-compressed.js"></script>
<script src="../../src/proj4leaflet.js"></script>
<script src="script.js"></script>
</body>
</html>

View File

@ -0,0 +1,27 @@
var crs = new L.Proj.CRS('EPSG:5181',
'+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',
{
resolutions: [2048, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 0.5, 0.25],
origin: [-30000, -60000],
bounds: L.bounds([-30000, -60000], [494288, 464288])
}),
map = L.map('map', {
crs: crs,
continuousWorld: true,
worldCopyJump: false,
});
new L.TileLayer('http://i{s}.maps.daum-img.net/map/image/G03/i/1.20/L{z}/{y}/{x}.png', {
maxZoom: 14,
minZoom: 0,
zoomReverse: true,
subdomains: '0123',
continuousWorld: true,
attribution: 'ⓒ Daum',
tms: true
}).addTo(map);
//Gunsan Airport
new L.marker([35.925937, 126.615810]).addTo(map);
map.setView([36.0, 127.0], 0);

View File

@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}

View File

@ -0,0 +1,15 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="../../lib/leaflet/leaflet.css" />
</head>
<body>
<div id="map"></div>
<script src="../../lib/leaflet/leaflet.js"></script>
<script src="../../lib/proj4-compressed.js"></script>
<script src="../../src/proj4leaflet.js"></script>
<script src="script.js"></script>
</body>
</html>

View File

@ -0,0 +1,22 @@
var crs = new L.Proj.CRS('EPSG:3006',
'+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs',
{
resolutions: [
8192, 4096, 2048, 1024, 512, 256, 128,
64, 32, 16, 8, 4, 2, 1, 0.5
],
origin: [0, 0]
}),
map = new L.Map('map', {
crs: crs,
});
L.tileLayer.wms('https://geodatatest.havochvatten.se/geoservices/ows', {
layers: 'hav-bakgrundskartor:hav-grundkarta',
format: 'image/png',
maxZoom: 14,
minZoom: 0,
attribution: '&copy; OpenStreetMap contributors <a href="https://www.havochvatten.se/kunskap-om-vara-vatten/kartor-och-geografisk-information/karttjanster.html">Havs- och vattenmyndigheten (Swedish Agency for Marine and Water Management)</a>'
}).addTo(map);
map.setView([55.8, 14.3], 3);

View File

@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}

Some files were not shown because too many files have changed in this diff Show More