Author SHA1 Message Date
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
137 changed files with 44775 additions and 99 deletions

No files matched your search

+2
View File
@@ -0,0 +1,2 @@
vendor/GeoNature-citizen/frontend/node_modules
node_modules/
+3
View File
@@ -0,0 +1,3 @@
dist/
db/data/
node_modules/
+3
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
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
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
+49
View File
@@ -0,0 +1,49 @@
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 -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"]
+174 -3
View File
@@ -1,7 +1,173 @@
# 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
```
#### Compilation du JS de Taxhub
This is probably not needed as we don't use Taxhub.
##### Mise à jour de npm
```
$ docker-compose exec -u root taxhub bash
taxhub $ npm install npm@latest -g
```
#### Compilation du code
```
$ docker-compose exec taxhub bash
taxhub $ cd static
taxhub $ cp app/constants.js.sample app/constants.js
taxhub $ npm install
```
### 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
```
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 are automatically loaded (meaning, the app is watching the changes). 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.
## 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 +192,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
```
+87 -4
View File
@@ -1,11 +1,94 @@
version: '3.3'
services:
citizen:
tty: true
db:
image: postgis/postgis:12-3.1-alpine
ports:
- "5432: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:
+1 -1
View File
@@ -3,4 +3,4 @@ services:
citizen:
build: .
ports:
- "8080:80"
- "8888:80"
+26
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
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.
+10
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
+6
View File
@@ -0,0 +1,6 @@
\includepdf{./src/cover.pdf}
\newpage
+18
View File
@@ -0,0 +1,18 @@
```{=latex}
\begingroup
\hypersetup{linkcolor=linkcolortoc}
\tableofcontents
\listoffigures
\listoftables
\endgroup
```
Binary file not shown.
+904
View File
@@ -0,0 +1,904 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<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:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg10836"
xml:space="preserve"
width="793.70074"
height="1122.5197"
viewBox="0 0 793.70074 1122.5197"
sodipodi:docname="cover.svg"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata
id="metadata10842"><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 /></cc:Work></rdf:RDF></metadata><defs
id="defs10840"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath10854"><path
d="M 39.32,22.195 H 252.242 V 78.109 H 39.32 Z"
id="path10852"
inkscape:connector-curvature="0" /></clipPath><mask
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="1"
height="1"
id="mask10858"><image
width="1"
height="1"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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 truncated
id="image10860" /></mask></defs><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="namedview10838"
showgrid="false"
inkscape:zoom="0.52879845"
inkscape:cx="-176.67708"
inkscape:cy="421.62718"
inkscape:current-layer="g10844"
inkscape:window-x="54"
inkscape:window-y="27"
inkscape:window-maximized="1" /><g
id="g10844"
inkscape:groupmode="layer"
inkscape:label="cover"
transform="matrix(1.3333333,0,0,1.3333333,0,3.3396326e-5)"><g
id="g10846" /><text
id="text10874"
style="font-variant:normal;font-weight:300;font-size:10px;font-family:'Open Sans Light';-inkscape-font-specification:OpenSans-Light;writing-mode:lr-tb;fill:#666666;fill-opacity:1;fill-rule:nonzero;stroke:none"
x="52.24614"
y="750.02234"><tspan
id="tspan10866"
sodipodi:role="line"
y="750.02234"
x="52.24614 58.456142 64.306145 70.196144 74.086143 77.976143 80.236137 85.716141 87.976143 90.566139 92.936142 98.116142 100.37614 106.26614 109.25614 115.10614 123.96614 128.71614 134.60614 139.89615 148.71614 154.66614 159.34615 162.55614 164.81615 167.07614 173.02614 176.91614 182.39613 187.04614 189.44614 194.19614 200.04614 205.89613 211.84615">Courriel : info@champs-libres.coop </tspan><tspan
id="tspan10868"
sodipodi:role="line"
y="764.02228"
x="52.24614 57.476143 62.956142 65.216141 70.696144 76.646141 82.53614 88.386139 94.276138 99.756142 102.34614 104.71614 107.30614 113.00614 118.70614 124.40614 126.99614 132.69614 138.39615 140.98615 146.68614 152.38614 154.97615 160.64615 166.34615 168.93614 174.63614 180.33614">Téléphone : +32 81 13 69 17 </tspan><tspan
id="tspan10870"
sodipodi:role="line"
y="778.02228"
x="52.24614 58.24614 64.196144 68.086143 73.566139 78.216141 82.866142 88.346138 90.936142 93.306145 95.896141 101.83614 107.72614 113.20614 115.79614 123.00614 128.29614 134.18614 140.03615 145.92615 148.06615 150.65614 156.35614 162.05614">Adresse : Rue Nanon, 98 </tspan><tspan
id="tspan10872"
sodipodi:role="line"
y="792.02222"
x="52.24614 57.94614 63.646141 69.346138 75.046143 77.636139 84.846138 90.10614 98.92614 104.81614 108.70614 110.84614 113.43614 119.69614 125.17614 127.43614 132.65614 134.91614 140.86615 146.75615">5000 Namur, Belgique</tspan></text>
<text
id="text10878"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:31.5359993px;font-family:'Open Sans';-inkscape-font-specification:'Open Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
x="235.55736"
y="517.39728"><tspan
sodipodi:role="line"
id="tspan11019"
x="235.55736"
y="517.39728">Documentation</tspan><tspan
sodipodi:role="line"
x="235.55736"
y="556.81726"
id="tspan860">technique</tspan></text>
<text
id="text10882"
style="font-variant:normal;font-weight:600;font-size:29.22932816px;line-height:1;font-family:'Open Sans Semibold';-inkscape-font-specification:OpenSans-Semibold;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
x="235.8806"
y="599.04022"><tspan
sodipodi:role="line"
x="235.8806"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18px;line-height:1;font-family:'Open Sans Semibold';-inkscape-font-specification:'Open Sans Semibold, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start"
y="599.04022"
id="tspan862">Champs-Libres</tspan></text>
<text
id="text10892"
style="font-variant:normal;font-weight:300;font-size:11.39781189px;font-family:'Open Sans Light';-inkscape-font-specification:OpenSans-Light;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.03616476"
x="227.33582"
y="644.94403"
transform="scale(1.0361647,0.96509753)"><tspan
id="tspan10890"
sodipodi:role="line"
x="227.33582"
y="655.02844"
style="stroke-width:1.03616476" /></text>
<g
transform="matrix(0.85039371,0,0,0.85039371,91.131486,-42.859661)"
id="layer1"
inkscape:label="Layer 1"><text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.17499995px;line-height:0%;font-family:Verdana;-inkscape-font-specification:Verdana;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="93.752739"
y="137.35451"
id="text3892"><tspan
sodipodi:role="line"
x="93.752739"
y="138.26678"
id="tspan3894"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.39583206px;line-height:1.25;font-family:Convergence;-inkscape-font-specification:Convergence;stroke-width:0.26458332" /></text>
<text
id="text1506"
y="58.398136"
x="137.14842"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="stroke-width:0.26458332px"
y="67.761902"
x="137.14842"
id="tspan1504"
sodipodi:role="line" /></text>
<flowRoot
style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="flowRoot835"
xml:space="preserve"><flowRegion
id="flowRegion837"><rect
y="280.44125"
x="648.57141"
height="40.250282"
width="225.38579"
id="rect839" /></flowRegion><flowPara
id="flowPara841" /></flowRoot><g
style="display:inline"
id="g350"
transform="matrix(0.4349593,0,0,0.4349593,-243.97253,-5.0535097)"><path
sodipodi:nodetypes="ccc"
inkscape:connector-curvature="0"
id="path346"
d="m 808.79643,318.73946 c -41.36411,9.35099 -57.15548,-39.13936 -45.23747,-103.07579 42.94906,32.20104 91.23498,85.91655 45.23747,103.07579 z"
style="display:inline;fill:#88aa00;stroke:none" /><path
style="display:inline;fill:#333333;fill-opacity:1;stroke:none"
d="m 793.72622,311.92153 c 38.21383,15.97487 50.47164,-45.5142 44.88524,-71.72984 -34.49716,16.4416 -76.63248,56.77549 -44.88524,71.72984 z"
id="path348"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" /></g><text
id="text358"
y="122.67696"
x="131.27934"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.1355536px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#88aa00;fill-opacity:1;stroke:none;stroke-width:0.26129612"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.83948517px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;letter-spacing:0px;fill:#88aa00;fill-opacity:1;stroke-width:0.26129612"
y="122.67696"
x="131.27934"
id="tspan356"
sodipodi:role="line"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.83948517px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;letter-spacing:0px;opacity:0.98000004;fill:#88aa00;fill-opacity:1;stroke-width:0.26129612"
id="tspan354"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.83948517px;font-family:Convergence;-inkscape-font-specification:Convergence;fill:#88aa00;fill-opacity:1;stroke-width:0.26129612"
id="tspan352">L</tspan>ibres</tspan></tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.1355536px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;display:inline;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.26129612"
x="-57.47934"
y="122.67696"
id="text368"><tspan
sodipodi:role="line"
id="tspan364"
x="-57.47934"
y="122.67696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.83948517px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;letter-spacing:0px;fill:#333333;fill-opacity:1;stroke-width:0.26129612"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.83948517px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;letter-spacing:0px;fill:#333333;fill-opacity:1;stroke-width:0.26129612"
id="tspan360">C</tspan><tspan
id="tspan362"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.83948517px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;letter-spacing:0px;opacity:0.98000004;fill:#333333;fill-opacity:1;stroke-width:0.26129612">hamps</tspan></tspan><tspan
sodipodi:role="line"
x="-57.47934"
y="122.67696"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:34.83948517px;line-height:0%;font-family:Convergence;-inkscape-font-specification:Convergence;letter-spacing:0px;fill:#333333;fill-opacity:1;stroke-width:0.26129612"
id="tspan366" /></text>
</g><flowRoot
xml:space="preserve"
id="flowRoot1411"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(0.75000002,0,0,0.75000002,9.9281686,138.68659)"><flowRegion
id="flowRegion1413"><rect
id="rect1415"
width="381.05255"
height="312.97369"
x="298.79059"
y="185.48967" /></flowRegion><flowPara
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;font-family:Convergence;-inkscape-font-specification:'Convergence, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start"
id="flowPara865">BiomMap: développements &amp; adaptations d'une application GeoNature-citizen</flowPara></flowRoot><flowRoot
xml:space="preserve"
id="flowRoot856"
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
transform="matrix(0.75000002,0,0,0.75000002,144.13673,116.26997)"><flowRegion
id="flowRegion858"><rect
id="rect860"
width="463.31454"
height="161.68735"
x="123.86572"
y="660.1507" /></flowRegion><flowPara
id="flowPara862"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:16px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start">Version 31 octobre 2021</flowPara></flowRoot><image
y="187.90811"
x="237.52534"
id="image970"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAEsCAYAAADTvUpQAAABhGlDQ1BJQ0MgcHJvZmlsZQAAKJF9
kT1Iw0AcxV9TRSkVwVYQcchQnSyIijhKFYtgobQVWnUwufQLmjQkKS6OgmvBwY/FqoOLs64OroIg
+AHi5uak6CIl/i8ptIjx4Lgf7+497t4BQqPCVLNrAlA1y0jFY2I2tyr2vEJACAEMYkBipp5IL2bg
Ob7u4ePrXZRneZ/7c/QpeZMBPpF4jumGRbxBPLNp6Zz3icOsJCnE58TjBl2Q+JHrsstvnIsOCzwz
bGRS88RhYrHYwXIHs5KhEk8TRxRVo3wh67LCeYuzWqmx1j35C4N5bSXNdZojiGMJCSQhQkYNZVRg
IUqrRoqJFO3HPPzDjj9JLplcZTByLKAKFZLjB/+D392ahalJNykYA7pfbPtjFOjZBZp12/4+tu3m
CeB/Bq60tr/aAGY/Sa+3tcgR0L8NXFy3NXkPuNwBhp50yZAcyU9TKBSA9zP6phwQugUCa25vrX2c
PgAZ6mr5Bjg4BMaKlL3u8e7ezt7+PdPq7wc7uXKR8PX46gAAAAZiS0dEAK0AggBvTkhTfwAAAAlw
SFlzAAAuIwAALiMBeKU/dgAAAAd0SU1FB+UCEwsVLlUHj7oAAAAZdEVYdENvbW1lbnQAQ3JlYXRl
ZCB3aXRoIEdJTVBXgQ4XAAAgAElEQVR42uzdd3gU1f4/8Hca6b1CEkiBQOi9dxARpCj+UOGKit2L
igUUVJQiiIAiICJSRAUUVHrvLdSEFggppPe62WyS3WTL7w+/ei2UlDO7s5v363nu83hD8jkzZ2Z2
Zz5zzudYGQwGA4iIiIiIiIiIiGTIysrKyprdQEREREREREREcsYEFhERERERERERyRoTWERERERE
REREJGtMYBERERERERERkawxgUVERERERERERLLGBBYREREREREREckaE1hERERERERERCRrTGAR
EREREREREZGsMYFFRERERERERESyxgQWERERERERERHJGhNYREREREREREQka0xgERERERERERGR
rDGBRUREREREREREssYEFhERERERERERyRoTWEREREREREREJGtMYBERERERERERkawxgUVERERE
RERERLLGBBYREREREREREckaE1hERERERERERCRrtuyCmvNMbN+g9rekxTUedCIiIiIiIiIyOY7A
qqGGlrxqqPtMRERERERERPLDBFYNNOREDpNYRERERERERGRqTGDRfTGJRURERERERESmxATWfTB5
Q0RERERERERkWkxgERERERERERGRrDGBRUREREREREREssYEFhERERERERERyRoTWERERERERERE
JGtMYBERERERERERkawxgUVERERERERERLLGBBYREREREREREckaE1hERERERERERCRrTGARERER
EREREZGsMYFFRERERERERESyxgQWERERERERERHJGhNYREREREREREQka0xgERERERERERGRrDGB
RUREREREREREssYEFhERERERERERyRoTWEREREREREREJGtMYBERERERERERkawxgUVERERERERE
RLLGBBYREREREREREckaE1hERERERERERCRrtuwCMiXPxPZ3/beSFtfYQURERERERETEBBYZz72S
Vff7fSaziIiIiIiIiBouJrBIMrVNWNUkFhNZRERERERERA0PE1gkhMhk1f3aYRKLiIiIiIiIqGFh
AovqzFhJqzu1yyQWERERERERUcPBVQjJLJkqeUZERERERERExscEFhERERERERERyRoTWGS2OAqL
iIiIiIiIqGFgAouIiIiIiIiIiGSNCSwyaxyFRURERERERGT5mMAiIiIiIiIiIiJZYwKLiIiIiIiI
iIhkjQksIiIiIiIiIiKSNSawiIiIiIiIiIhI1pjAIiIiIiIiIiIiWWMCi4iIiIiIiIiIZM2WXUBE
RGR8BoMBeaX5SClMQVzeLaSWpqJAXYi0ykykV2WjlUM4gp0CEe4eig5NOqCFXwsEePiz44iIiIio
QWICi4iIyIg01RpcTLmENVfXY3vp8bv+XmZ5MVB+ESgAkPT7z94MfAZPdnwcEY1bsCOJiIiIqEGx
MhgMBnbD3XkmtmcnAChpcU2WfXOn7SIikqsraVfxzskZuKRJqFecRS3fw6SeT8Hezp6dSkREREQW
z8rKyoo1sIiIiCSm1Wmx+cJPGHhoXL2TVwAwLf5TvLlrGpSVSnYuERERETUIZjWFsKYjfjgqh4iI
5MJgMGB91HeYFv+p0LibivfC/mAjLBgxDw52DuxoIiIiIrJoZjECyzOxfa2mq9X298k8MVFJROZg
3/X9wpNXf1hfsB1rzqxlJxMRERGRxZN9Aqs+iSgmsiwXk1dEZA6yS7Ix4cJrkrbxQdIXSMhJYGcT
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
wmgpfLHENmR4RURERERERNfDAIs0xxJCGC2HLpYUYjG8IiIiIiIioqZggEWapOUQxlJCF7YhERER
ERERWQsGWKRpWgphLDV0YRsSERERERGRpWOARRZDjSDG2gIXtiERERERERFZIgZYZHGUCGGsPXRh
GxIREREREZElYYBFFktWCGMrwYvMEIvhFREREREREYnEAIssmsgQxlZDF7YhERERERERaR0DLLIa
LQliGLiwDYmIiIiIiEj7GGCR1WlKCMPQhW1IREREREREloMBFlmta4UwDF5a135sQyIiIiIiIlIa
AyyyaleGMAxd2IZERERERERkmRhgERERERERERGRpul0Op0dm4GIiIiIiIiIiLSMARYRERERERER
EWkaAywiIiIiIiIiItI0BlhERERERERERKRpDLCIiIiIiIiIiEjTGGAREREREREREZGmMcAiIiIi
IiIiIiJNY4BFRERERERERESaxgCLiIiIiIiIiIg0jQEWERERERERERFpGgMsIiIiIiIiIiLSNAZY
RERERERERESkaQywiIiIiIiIiIhI0xhgERERERERERGRpjHAIiIiIiIiIiIiTWOARURERERERERE
mvb/iVywUW/6SS8AAAAASUVORK5CYII=
"
preserveAspectRatio="none"
height="72"
width="288" /></g></svg>

After

Width:  |  Height:  |  Size: 95 KiB

+438
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}
+51 -16
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) l’occupation du sol sur la parcelle où se situe l'arbre'",
"description": "Quel est le type de milieu représentant le mieux (milieu dominant) l’occupation du sol sur la parcelle où se situe l'arbre",
"type": "string"
},
"hauteur": {
"title": "Hauteur",
"description": "Vous pouvez l’estimer ...",
"title": "Hauteur (en m)",
"description": "Vous pouvez l’estimer 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
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) l’occupation du sol sur la parcelle où se situe la haie",
"type": "string"
},
"longueur": {
"title": "Longueur (en m)",
"description": "À exprimer en mètres. Vous pouvez l’estimer 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 l’estimer 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
}
]
}
]
}
+239
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) l’occupation 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 l’estimer 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 l’estimer 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 l’estimer 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
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
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
View File
@@ -0,0 +1,2 @@
FROM nginx
COPY ./default.conf /etc/nginx/conf.d/default.conf
+40
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;
}
}
+70
View File
@@ -0,0 +1,70 @@
# 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 = "http://taxhub:5000"
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 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 = 'smtpd host'
MAIL_PORT = 493 # mandatory SSL port
MAIL_AUTH_LOGIN = 'smtpd/relay host username'
MAIL_AUTH_PASSWD = 'smtpd/relay host password'
# API flasgger main config
+140
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
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
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
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

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: 93 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.

After

Width:  |  Height:  |  Size: 13 KiB

@@ -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

+7 -7
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 d’arbres, 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",
@@ -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 d’arbres, 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"
}
@@ -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>
}
+109
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;
+159 -49
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/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_CLASSE_2013_2014/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 2019",
maxZoom: 20,
layer: "//geoservices.wallonie.be/arcgis/services/AGRICULTURE/SIGEC_PARC_AGRI_ANON__2019/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/INSPIRE/AU_wms/MapServer/WMSServer?",
layers: ['1', '2', '3', '4'],
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'
}
Whitespace-only changes.
@@ -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 d’un territoire. L’ensemble 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 s’agit d’un prototype porté par la Commune de Wasseiges et le GAL Meuse@Campagnes et soutenu financièrement par La Wallonie, Digital Wallonia et l’Union 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 c’est quoi ?</h2>
<p>Le maillage écologique constitue l’infrastructure écologique fine d’un 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 s’agit, par exemple, des arbres isolés, haies, bandes boisées, bosquets, cours d’eau, 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). C’est 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 s’agit de la présence de la nature dans l’ensemble de l’espace ; c’est la « nature ordinaire ».</p>
<p>(D’après : E. Melin 1997 – La problématique du réseau écologique – Bases théoriques et perspectives d’une stratégie écologique d’occupation et de gestion de l’espace)</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>
+29
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;
}
}
@@ -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;
}
}
@@ -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>
Whitespace-only changes.
Whitespace-only changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

+8 -8
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
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
+20
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}"
+144
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
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)
+74
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
View File
File diff suppressed because it is too large. Load diff
+590
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
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>
File diff suppressed because it is too large. Load diff
+3
View File
@@ -0,0 +1,3 @@
How to draw lines and polygons in Leaflet: sandbox for testing
=================================
+122
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>
@@ -0,0 +1,2 @@
node_modules
.lvimrc
@@ -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
}
@@ -0,0 +1,3 @@
language: node_js
node_js:
- "6.9"
@@ -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.
@@ -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);
```
@@ -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"
}
}
@@ -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>
@@ -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);
@@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
@@ -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>
@@ -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);
@@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
@@ -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>
@@ -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);
@@ -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>
@@ -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>
@@ -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);
@@ -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);
@@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
@@ -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>
@@ -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);
@@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
@@ -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>
@@ -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);
@@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
@@ -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>
@@ -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);
@@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
@@ -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>
@@ -0,0 +1,30 @@
/*
Example using Sweden Lantmäteriet Topografisk Webbkarta
https://opendata.lantmateriet.se/#apis
*/
/*** INSERT YOUR LANTMÄTERIET API TOKEN BELOW ***/
var token = '';
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: [
4096, 2048, 1024, 512, 256, 128, 64, 32, 16, 8
],
origin: [-1200000.000000, 8500000.000000 ],
bounds: L.bounds( [-1200000.000000, 8500000.000000], [4305696.000000, 2994304.000000])
}),
map = new L.Map('map', {
crs: crs,
continuousWorld: true,
});
new L.TileLayer('https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/'+ token +'/?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=topowebb&STYLE=default&TILEMATRIXSET=3006&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fpng', {
maxZoom: 9,
minZoom: 0,
continuousWorld: true,
attribution: '&copy; <a href="https://www.lantmateriet.se/en/">Lantmäteriet</a> Topografisk Webbkarta Visning, CCB',
}).addTo(map);
//Set view over Stockholm Södermalm
map.setView([59.3167, 18.0667], 7);
@@ -0,0 +1,10 @@
html, body {
height: 100%;
padding: 0;
margin: 0;
}
#map {
width: 100%;
height: 100%;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Loaded 100 of 137 files, more files were not shown because too many files have changed in this diff. Show more