User:Barnes38/Tools
(2014) Tools/Outils
- How did you contribute
- Overview of the ResultMaps
- Who Did it
- Osmose
- Overpass turbo
- Grenoble, correspondance entre OSM et FANTOIR
- Grenoble, rendu Bano Explications ici
- Tutoriels OSMAnd
- SPARQL @arkanosis
- Sparql Langage d’interrogation du web sémantique
- WikiConvention francophone 2017
- WikiConvention francophone 2018
- BDOrtho
- tms[19:http://proxy-ign.openstreetmap.fr/bdortho/{zoom}/{x}/{y}.jpg "source=BDOrtho IGN 2016"]
- ffdn
(2024) Annoncer
- GreMag
- ICI Grenoble
- CRIC Grenoble
- L'Agenda du Libre
- La Fête des Possibles
- L'OSM Calendar
- Isère Tourisme
- EchoSciences Grenoble
- Le Forum OpenStreetMap France
(2023) Adresses
(2018) Datatrucs
(2023) OSRM
(2023) VROOM
OpenRouteService
Valhalla
MapBox
OpenData
bicycle_repair_station
- /home/paul/ASSOS/ADTC/2023/OpenData
- Jeux de données sur les stations de réparation des vélos en libre service
Pistes Cyclables
Photos dans JOSM
Signalisation routière
- Signalisation cyclable, Signalisation de type Dv
- Signalisation routière en France
- Comparaison européenne
Panoramax
Podcasts
Articles
Vidéos
JOSM
Plugins JOSM à installer:
- Photoadjust
- Photo_geotagging
Et rajouter le heading dans les photos, éventuellement les recaler, ensuite les sauverarger, ce qui modifie les infos exifs
update geovisio_cli
pip install --upgrade geovisio_cli
Premier essai de téléversement d'une séquence de 50 photos
$ geovisio upload --api-url https://panoramax.openstreetmap.fr/ /home/paul/Panoramax/2023-10-07/BergesIsère/
🔭 Your computer is not yet authorized against GeoVisio API https://panoramax.openstreetmap.fr/. To authenticate, please either go to the URL below, or scan the QR code below https://panoramax.openstreetmap.fr/api/auth/tokens/5a33454b-5250-4e67-ba73-e63dff725550/claim
$ geovisio upload --api-url https://panoramax.openstreetmap.fr/ /home/paul/Panoramax/2023-10-07/BergesIsère/
👤 Using stored credentials, logged in as barnes38
🔍 Listing pictures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
🗂 All pictures belong to a single sequence
📡 Uploading sequence "BergesIsère" (part 1/1)
- Folder: /home/paul/Panoramax/2023-10-07/BergesIsère
✅ Created collection https://panoramax.openstreetmap.fr/api/collections/1a4240dc-1cb9-44a5-999e-ef1d321553e9
🚀 Uploading pictures... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0:01:19 [50/50]
📷 Processing IMG_20231007_175210.jpg ..
╭───────────────────────────────────────────────────────────────Errors───────────────────────────────────────────────────────────────╮
│ No errors
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
🎉 50 pictures uploaded
Note: You can follow the picture processing with the command:
geovisio collection-status --wait --location https://panoramax.openstreetmap.fr/api/collections/1a4240dc-1cb9-44a5-999e-ef1d321553e9
$ geovisio collection-status --wait --location https://panoramax.openstreetmap.fr/api/collections/1a4240dc-1cb9-44a5-999e-ef1d321553e9
Sequence BergesIsère produced by barnes38 taken with Fairphone FP4
┏━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┓
┃ Total ┃ Ready ┃ Waiting ┃ Preparing ┃ Broken ┃
┡━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━┩
│ 50 │ 0 │ 50 │ 0 │ 0 │
└───────┴───────┴─────────┴───────────┴────────┘
🔭 Waiting for pictures to be processed by geovisio
⏳ Processing ... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0:01:26 0/50 • 0 picture currently processedgeovisio upload --api-url https://panoramax.openstreetmap.fr/ /home/paul/Panoramax/2023-10-07/BergesIsère/
⏳ Processing ... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0:02:33 0/50 • 0 picture currently processed
⏳ Processing ... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0:02:34 0/50 • 0 picture currently processed
⏳ Processing ... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 0:02:41 0/50 • 0 picture currently processed
$ geovisio collection-status --wait --location https://panoramax.openstreetmap.fr/api/collections/1a4240dc-1cb9-44a5-999e-ef1d321553e9
Sequence BergesIsère produced by barnes38 taken with Fairphone FP4
┏━━━━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━┓
┃ Total ┃ Ready ┃ Waiting ┃ Preparing ┃ Broken ┃
┡━━━━━━━╇━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━┩
│ 50 │ 50 │ 0 │ 0 │ 0 │
└───────┴───────┴─────────┴───────────┴────────┘
🎉 50 pictures processed
Résultat
Répertoire de sauvegarde des photos
cd /home/paul/ASSOS/OSM/2023/Panoramax
Instance Panoramax de l'IGN
Forum GeoCommuns
scrcpy
geocode
Canvas
BRouter
1
2
Northwest France: N45W005, N45W000 http://brouter.de/brouter/segments4/W5_N45.rd5 http://brouter.de/brouter/segments4/E0_N45.rd5 Northeast France: N45E005, N45E010 http://brouter.de/brouter/segments4/E5_N45.rd5 http://brouter.de/brouter/segments4/E10_N45.rd5 Southwest France: N40W005, N40W000 http://brouter.de/brouter/segments4/W5_N40.rd5 http://brouter.de/brouter/segments4/E0_N40.rd5 Southeast France: N40E005, N40E010 http://brouter.de/brouter/segments4/E5_N40.rd5 http://brouter.de/brouter/segments4/E10_N40.rd5
for a in W5_N45.rd5 E0_N45.rd5 E5_N45.rd5 E10_N45.rd5 W5_N40.rd5 E0_N40.rd5 E5_N40.rd5 E10_N40.rd5 do echo $a wget http://brouter.de/brouter/segments4/${a} done
3
cd /home/paul/brouter/abrensch/brouter
docker run --rm -v ./misc/segments4:/segments4 -v ./misc/profiles2:/profiles2 -p 17777:17777 --name brouter brouter
//wget "http://localhost:17777/brouter?lonlats=4.8357,45.7640%7C4.8357,45.7640&profile=trekking&alternativeidx=0&format=gpx"
wget -O output "http://localhost:17777/brouter?lonlats=4.8357,45.7640%7C4.8357,45.7640&profile=trekking&alternativeidx=0&format=gpx"
4 v0.1 quick&dirty
Explications
- On fonctionne offline à partir d'un fichier .osm récupéré à partir d'un .osm.xz file construit à partir de [BBBike Extract Service](http://extract.bbbike.org/). Ce fichier est un boite carrée autour de la localité choisie, et ne couvre pas toute la France
- Possibilité d'avoir un polygone par exemple https://extract.bbbike.org/?sw_lng=5.442&sw_lat=44.955&ne_lng=6.215&ne_lat=45.513&format=osm.xz&coords=5.6%2C44.986%7C5.594%2C44.955%7C5.637%2C44.968%7C5.654%2C45.007%7C5.718%2C44.995%7C5.743%2C45.04%7C5.796%2C45.036%7C5.819%2C45.023%7C5.85%2C45.025%7C5.884%2C45.054%7C5.85%2C45.067%7C6.024%2C45.216%7C6.085%2C45.217%7C6.146%2C45.252%7C6.215%2C45.335%7C6.196%2C45.372%7C6.161%2C45.417%7C6.13%2C45.447%7C6.105%2C45.441%7C6.067%2C45.446%7C6.002%2C45.463%7C5.962%2C45.492%7C5.911%2C45.476%7C5.878%2C45.411%7C5.839%2C45.335%7C5.765%2C45.312%7C5.681%2C45.375%7C5.718%2C45.46%7C5.672%2C45.495%7C5.593%2C45.513%7C5.493%2C45.48%7C5.446%2C45.447%7C5.516%2C45.39%7C5.485%2C45.372%7C5.442%2C45.315%7C5.445%2C45.284%7C5.514%2C45.258%7C5.574%2C45.262%7C5.651%2C45.184%7C5.581%2C45&ref=download&lang=fr&city=Fontaine
- Une zone autour de Grenoble, une autre autour de Saint-Etienne
- Ce fichier .osm.xz est converti en .osm par xz --decompress path/to/your/file.osm.xz
- La lecture des coordonnées des points est effectuée offline également en récupérant tous les points du fichier .osm, et en sérialisant le résultat dans un fichier .pkl. Ce fichier .pkl s'il existe est utilisé directement : moins de cpu, mais plus d'ES disque
- Toutes les routes de transport du réseau TAG sont lues, dans les membres on ne garde que les arrêts ('stop'), puis que le premier et le dernier de la ligne pour avoir les points de départ et d'arrivée, on récupère dans un second temps leurs lon et lat pour pouvoir passer une requete à brouter.
- La req peut être passée en wget pour tester puis en python avec requests.
- Le json result est parsé pour ne garder que ce qui nous intéresse : la longueur du trajet à vélo, le dénivelé positif (filtered-ascend), le dénivelé total (plain-ascend) ou plutôt la différence d'altitude entre le point d'arrivée et le point de départ.
- C'est quick&dirty mais ça marche
- A partir de là, il faudrait
- continuer le poc -- essayer des profils vélos : safety/shortest -- faire des stats et en déduire (comment ?) un index global -- faire tourner ceci sur plusieurs métropoles - améliorer globalement -- améliorer le code -- tout mettre dans le container -- mettre ça dans git -- avoir des outils d'intégration
Les requêtes Overpass qui vont bien
Geographie
Grenoble-Alpes Métropole https://overpass-turbo.eu/s/1QvX
boundary = local_authority local_authority:FR = metropole name = Grenoble-Alpes Métropole ref:FR:SIREN = 200040715 short_name = La Métro type = boundary website = https://www.lametro.fr/ wikidata = Q999238 wikipedia = fr:Grenoble-Alpes Métropole
Saint-Étienne Métropole https://overpass-turbo.eu/s/1Qwu
boundary = local_authority local_authority:FR = metropole name = Saint-Étienne Métropole ref:FR:SIREN = 244200770 short_name = SEM type = boundary
Auvergne-Rhone-Alpes https://overpass-turbo.eu/s/1Qws
ISO3166-2 = FR-ARA admin_level = 4 boundary = administrative name = Auvergne-Rhône-Alpes type = boundary
Saint-Brieuc Armor Agglomération https://overpass-turbo.eu/s/1QNq
boundary = local_authority local_authority:FR = CA name = Saint-Brieuc Armor Agglomération type = boundary
Saint-Brieuc Agglomération - Baie d'Armor https://overpass-turbo.eu/s/1QNr
disused:boundary = local_authority disused:local_authority:FR = CA end_date = 2016-12-31 population = 113801 type = boundary
Wiki local_authority:FR https://wiki.openstreetmap.org/wiki/FR:Key:local_authority:FR
Toutes les communautés de communes dans Isère https://overpass-turbo.eu/s/1Qw2
Toutes les communautés d'agglomération en France https://overpass-turbo.eu/s/1Qw0
Toutes les communautés urbaines en France https://overpass-turbo.eu/s/1Qw1
Toutes les métropoles en France https://overpass-turbo.eu/s/1QvZ
Réseaux de transport
Grenoble
- Le réseau TAG dans GAM https://overpass-turbo.eu/s/1QvY
- réso-mobilités Grenoble
- Le réseau "M réso" dans GAM https://overpass-turbo.eu/s/1RbO
- La ligne C8 du réseau "M réso" https://overpass-turbo.eu/s/1RbP
- La ligne C9 du réseau "M réso" https://overpass-turbo.eu/s/1RbQ
- La ligne C10 du réseau "M réso" https://overpass-turbo.eu/s/1RbR
- La ligne C14 du réseau "M réso" https://overpass-turbo.eu/s/1RbS
- La ligne 17 du réseau "M réso" https://overpass-turbo.eu/s/1RbT
- La ligne C8 du réseau "M réso" https://overpass-turbo.eu/s/1RbP
Saint-Etienne, Clermond-Ferrand, Nancy, Saint-Brieuc
- Le réseau STAS dans STEM https://overpass-turbo.eu/s/1QwB
- Le réseau T2C de Clermont-Ferrand https://overpass-turbo.eu/s/1QwZ
- Le réseau Stan de Nancy https://overpass-turbo.eu/s/1QJ0
- Les bus de Saint-Brieuc Armor Agglomération https://overpass-turbo.eu/s/1QNo
- Le réseau FR:TUB de Saint-Brieuc Armor Agglomération https://overpass-turbo.eu/s/1QNp
ce qu'il faudrait faire pour faire ça dans une autre ville
Les adhérences actuelles sont:
tests
tests1
$ cd /home/paul/brouter/osmium
$ python3 transports7offserialized.py >output-fastbike-verylowtraffic2 2>&1
$ python3 transports8Grenoble.py > output-Grenoble 2>&1 OK
$ python3 transports8SaintEtienne.py > output-SaintEtienne 2>&1 KO
$ python3 transports8ClermontFerrand.py > output-ClermontFerrand 2>&1 KO
$ python3 transports8Nancy.py > output-Nancy 2>&1 OK
tests2
$ cd /home/paul/brouter/osmium/py
$ python3 transports8Grenoble.py > ../outputs/output-Grenoble 2>&1 OK
$ python3 transports8Nancy.py > ../outputs/output-Nancy 2>&1 OK
$ python3 transports8SaintEtienne.py > ../outputs/output-SaintEtienne 2>&1 KO
$ python3 transports8ClermontFerrand.py > ../outputs/output-ClermontFerrand 2>&1 KO
tests3
$ cd /home/paul/brouter/osmium/py
$ python3 transports8.py
- Taking input-data.yml file and generating ../outputs/output-XXXX
tests 4
$ cd /home/paul/brouter/osmium/py
$ python3 transports9.py
- Taking input-data.yml file and generating ../outputs/output-XXXX
- Trying to optimise the way the nodes lon/lat are read, by only fetching nodes which are necessary
tests 11 ok
$ cd /home/paul/brouter/osmium/py
$ python3 transports11.py
- Taking input-data.yml file and generating ../outputs/output-XXXX
- Refacto
- Trying to optimise the way the nodes lon/lat are read, by only fetching nodes which are necessary
- OK
24 -rw-rw-r-- 1 paul paul 21911 sept. 15 10:50 Grenoble_output.json
12 -rw-rw-r-- 1 paul paul 8234 sept. 15 10:51 Nancy_output.json
16 -rw-rw-r-- 1 paul paul 13278 sept. 15 10:52 Saint-Brieuc_output.json
code
import osmium as osm from shapely.geometry import Polygon, Point import xml.etree.ElementTree as ET import requests import json import pickle import os import re
osm_file_name = 'planet_5.487,44.962_6.106,45.315.osm' serialized_file_name = 'planet_5.487,44.962_6.106,45.315.pkl'
def compute_allnodes(osm_file): print(f"starting parsing all nodes") tree = ET.parse(osm_file) root = tree.getroot() allnodes = root.findall('node') print(f"done parsing all nodes") return allnodes
def save_allnodes(allnodes, filename): with open(filename, 'wb') as f: pickle.dump(allnodes, f)
def load_allnodes(filename): with open(filename, 'rb') as f: return pickle.load(f) if os.path.exists(serialized_file_name): # Load 'allnodes' from the file if it exists print(f"starting loading all nodes from file") allnodes = load_allnodes(serialized_file_name) print("done loading all nodes from file") else: # Compute 'allnodes' and save it to the file allnodes = compute_allnodes(osm_file_name) save_allnodes(allnodes, serialized_file_name)
def fetch_and_parse_geojson(lon1, lat1, lon2, lat2, profile): url = f"http://localhost:17777/brouter?lonlats={lon1},{lat1}%7C{lon2},{lat2}&profile={profile}&alternativeidx=0&format=geojson" response = requests.get(url) if response.status_code == 200: json_data = response.text json_data = re.sub(r"'", '"', json_data) # print(f"json_data: {json_data}") data = json.loads(str(json_data))
# Extract the required properties properties = data['features'][0]['properties'] mydata = { "track-length": properties["track-length"], "filtered ascend": properties["filtered ascend"], "plain-ascend": properties["plain-ascend"] } return mydata else: print(f"error with this url: {url}") return { "track-length": "unknown", "filtered ascend": "unknown", "plain-ascend": "unknown" }
def get_node_lon_lat(node_id): for node in allnodes: if node.attrib['id'] == str(node_id): lon = node.attrib['lon'] lat = node.attrib['lat'] return lon, lat return None
def nodesStartEnd(relation): # print(f"relation {relation}") # print(f"relation.id {relation['id']}") # print(f"relation.tags {relation['tags']}") # print(f"relation.members {relation['members'][0][0]} {relation['members'][-1][0]}") nodesStartEnd = { 'id': relation['id'], 'lonlatstart': get_node_lon_lat(relation['members'][0][0]), 'lonlatend': get_node_lon_lat(relation['members'][-1][0]) } return nodesStartEnd
# Define a handler to process the OSM data class Handler(osm.SimpleHandler): def __init__(self): super(Handler, self).__init__() self.relations = []
def relation(self, r): if 'network' in r.tags and r.tags['network'] == 'TAG' \ and 'type' in r.tags and r.tags['type'] == 'route': # print(f"Line: {r.tags.get('name')} {r.tags.get('from')} {r.tags.get('to')} ") # Make a deep copy of the relation object only_stop_members = [member for member in r.members if member.role == "stop"] rcopy = { 'id': r.id, 'tags': {tag.k: tag.v for tag in r.tags}, 'members': [(m.ref, m.role, m.type) for m in only_stop_members] } # print(f"rcopy {rcopy} ") nodes = nodesStartEnd(rcopy) # print(f"nodesStartEnd {nodesStartEnd}") relationKept = { 'Name': r.tags.get('name'), 'From': r.tags.get('from'), 'To': r.tags.get('to'), 'NodesStartEnd': nodes } # print(f"relationKept {relationKept}") self.relations.append(relationKept)
# Initialize the handler handler = Handler()
# Apply the handler to your local .osm file handler.apply_file("planet_5.487,44.962_6.106,45.315.osm")
print(f"handler.relations size= {len(handler.relations)}")
profile = 'trekking' for relation2 in handler.relations: print(f"relation2: {relation2.get('Name')}\n\t(From: {relation2.get('From')}\n\tTo: {relation2.get('To')}\n\tNodesStartEnd: {relation2.get('NodesStartEnd')}") lon1 = relation2.get('NodesStartEnd')['lonlatstart'][0] lat1 = relation2.get('NodesStartEnd')['lonlatstart'][1] lon2 = relation2.get('NodesStartEnd')['lonlatend'][0] lat2 = relation2.get('NodesStartEnd')['lonlatend'][1] geojson_data = fetch_and_parse_geojson(lon1, lat1, lon2, lat2, profile) print(f"longueur et denivelés: {geojson_data}")
print(f"handler.relations size= {len(handler.relations)}")
LidarHD
Umap
Wikipedia
- Statistique de consultation d'une page de wikipedia
- Débats d'admissibilité
- Didacticiels cartographiques
OSM Toulouse
- [ https://tile.openstreetmap.fr/ tile.openstreetmap.fr]
organic map = rendu vectoriel avec un rendu calculé avec les préferences utilisateurs
Cartes.map = rendu vectoriel aussi
Street complete : traduire de nouvelles quêtes