Gebruik voor schaduwrijke fietsroute

Goede dag,

Ik probeer het proces beschreven in deze post https://medium.com/@tanyamarleytsui/shady-streets-6dad0979c13a te herhalen…

Maar van het onderstaande kan ik niks maken…

bikeGraph = ox.io.load_graphml(‘data/bikePaths.graphml’)
bikeGdfs = ox.utils_graph.graph_to_gdfs(bikeGraph)
bikeNodes = bikeGdfs[0]
bikeEdges = bikeGdfs[1]

Zou dit graag werkend krijgen voor de Achterhoek. Kan iemand mij hiermee helpen?

Groeten Charel van Dijk

Welkom Charel (Daisy?),

Zoals men op Tweakers en Stackoverflow dan eerst vraagt: wat heb je al gedaan, waar loop je precies tegenaan?

PS: ik ken deze leuke toepassing, en ook een klein beetje Python sinds kort. In hoeverre ík je kan helpen zullen we zien.

Leuk. Ik optimaliseer vaak (in mijn hoofd) op dit soort zaken, zoals een minder windrijke route door de wijken ipv de grote weg waar de wind pal tegen is. Of de tent op de camping zo neerzetten dat die in de ochtend schaduw heeft. Dit vind ik een hele gave toepassing!

Bedankt voor de link, die kende ik nog niet maar is een mooie toepassing van openstreetmap data en publiek beschikbare overheidsdata.

Ik vermoed dat de vraag is hoe je aan de twee inputfiles komt, data/trees_delft.shp en data/bikePaths.graphml, dat staat alleen op hoog niveau beschreven.

Wat betreft de data/bikePaths.graphml:

Zie dit Engelstalig artikel OSMnx: Python for Street Networks, met OSMnx kan je makkelijk de OSM “bike” data voor bijvoorbeeld een gemeente binnenladen.

Voor de Achterhoek is het moeilijker omdat er geen relatie lijkt te zijn voor de Achterhoek, alleen een label.Ik zie dat Wikipedia wel een kaartje voor de Achterhoek heeft maar tegelijk is er “Over de precieze grens lopen de meningen uiteen omdat er geen duidelijke historische grens is geweest.” Als alternatief zou je de data voor meerdere gemeentes of een passende bbox kunnen gebruiken, iets als:

ox.graph_from_bbox(6.36, 51.84, 6.86, 52.13, network_type='bike')

Nadat je de data hebt geladen met OSMnx moet je het weer saven als GraphML, zie “4. Save street networks to disk”. Waarschijnlijk is het beter om met iets kleiners dan de Achterhoek te beginnen, python blinkt niet uit in efficiency.

De conversie van .tif in https://data.rivm.nl/data/ank/20200629_gm_Bomenkaart_v2.zip naar z’n .shp file zou moeten kunnen met bijv. gdal. Ook hier is het goed om eerst een data uitsnede te maken van bijvoorbeeld een gemeente of een bbox en dan de conversie te doen want raster naar polygoon conversie is vrij arbeidsintensief.

Hey, dat artikel over hoe je netwerkdata binnenhaalt is ook erg leuk! Dank. En het mooie is dat OSMnx als module al gebruikt wordt in het schaduwgebeuren. Dus dan kun je daarbinnen on the fly het graphml bestand genereren, kwestie van een paar regels Python invoegen.
‘Achterhoek’ zou je ook als het gebied binnen x kilometer van het label kunnen definiëren, dan krijg je een cirkel in plaats van rechthoek.

Ja, inderdaad, OSMnx kan worden gebruikt om de data binnen te laden en wordt ook in het script gebruikt.

De tussenstap om het in een .graphml file (OSMnx intern formaat) te saven is wel een goede want je wilt niet elke keer als je het script start weer opnieuw de data ophalen.

Goed punt. Dat is meer iets voor als je het script voor verschillende gebieden start.

Maar is Charel hiermee geholpen is nu de vraag.

Ik vermoed dat Charel nog een probleem heeft met het laden van de bomenkaart raster data, daar ben ik ook nog niet uit maar dat is een kwestie van tijd en proberen.

Beste mensen! Allemaal dank voor jullie reactie.
De bomendata ben ik uitgekomen. ANK 2016 downloaden en die heb ik via arcgis pro geclipt, het rasters omgezet naar features en daarna exporteren naar shapes.
Met de OSM data kon ik helemaal niets… edge, nodes en denk ik een kaart…
Ik zie dat hierboven suggesties die ik eerst eens goed ga studeren. Het lijkt mij echt heel cool als dit lukt, vooral omdat we vandaag deze vraag van een van de gemeenten in de Achterhoek kregen…

Groeten Charel

Heb vanmorgen een eerste stap werkend gekregen.
Anaconda, environment van OX en dan Jupyter… met onderstaande code kreeg ik een plaatje

import osmnx as ox
ox.plot_graph(ox.graph_from_place(‘Modena, Italy’))

Nu draait de code met de BBOX maar dat duurt ff.

Bovenstaand lees ik het een en ander over het opslaan van de afbeelding en code. Helaas beheers ik het schrijven van de code in Python niet.
Heeft iemand een suggesties?.. heb dit net gevonden! lijkt goed te werken… https://github.com/gboeing/osmnx-examples/blob/main/notebooks/05-save-load-networks.ipynb

De volgende stap wordt die edges en nodes. haha ook dat gevonden. in de download die gemaakt met het voorbeeld in de bovenstaande link zitten de edges en nodes!!

Het gaat langzaam, maar zet toch wat stappen… dank voor jullie hulp!

Groeten Charel

Goede dag,

Heb een graphml kunnen downloaden… en die wil ik nu gaan inlezen in het script van schaduwrijke routes…
Maar in dat stukje krijg ik telkens onderstaande foutmelding. Heeft iemand een idee wat hier mis gaat?

KeyError Traceback (most recent call last)
Input In [4], in <cell line: 2>()
1 bikeGraph = ox.io.load_graphml(‘c:/data/doetinchem.graphml’)
----> 2 bikeGdfs = ox.utils_graph.graph_to_gdfs(bikeGraph)
3 bikeNodes = bikeGdfs[0]
4 bikeEdges = bikeGdfs[1]

File ~\anaconda3\envs\ox\lib\site-packages\osmnx\utils_graph.py:42, in graph_to_gdfs(G, nodes, edges, node_geometry, fill_edge_geometry)
16 def graph_to_gdfs(G, nodes=True, edges=True, node_geometry=True, fill_edge_geometry=True):
17 “”"
18 Convert a MultiDiGraph to node and/or edge GeoDataFrames.
19
(…)
40 following normal MultiDiGraph structure.
41 “”"
—> 42 crs = G.graph[“crs”]
44 if nodes:
46 if not G.nodes: # pragma: no cover

KeyError: ‘crs’

Als het hier fout gaat betekend het dat de regel “bikeGraph = ox.io.load_graphml(‘c:/data/doetinchem.graphml’)” niet succesvol was, op zich gaat het laden goed (want geen foutmelding daar) maar de code mist iets (“crs”) in de data.

Gebaseerd hierop zou ik zeggen dat je de bikeGraph eerst moet projecteren zonder dat ik direct weet hoe dat moet (dat zou ik ook moeten opzoeken)

Ik heb nog geen tijd genomen om osmnx te installeren en de de bomenkaart raster data converteren.

zat er in mijn vakantie ook over te denken, een routeplanner die met de wind rekening houdt. Met een stukje omrijden ben je dan soms toch sneller.
Geen idee of dat soort dingen mogelijk zijn… Ik verwacht er nog niet veel van, in OSMAND kun je voor zover ik weet nog altijd niet je eigen geschatte fietssnelheid instellen, die rekent standaard met 20km/h. Stuitte ooit hier op, maar dat is al lang geleden
https://github.com/osmandapp/Osmand/issues/5622

Stoplichten vermijden zou ook een leuke optie zijn (op de fiets)

grappig trouwens, bij die World Solar Chalenge in Australie, waar Nederlandse TU altijd goed presteert, gebruikten ze weerdata om schaduwgebieden juist te omzeilen. Of liever langs de zonkant van een flatgebouw rijden, ook al is het een klein stukje verder.

brouter heeft een heel algoritme aan bord om jouw snelheid/reistijd te berekenen dat rekening houd met:

# Kinematic model parameters (travel time computation)
assign totalMass  = 90     # %totalMass% | Mass (in kg) of the bike + biker, for travel time computation | number
assign maxSpeed   = 45     # %maxSpeed% | Absolute maximum speed (in km/h), for travel time computation | number
assign S_C_x      = 0.225  # %S_C_x% | Drag coefficient times the reference area (in m^2), for travel time computation | number
assign C_r        = 0.01   # %C_r% | Rolling resistance coefficient (dimensionless), for travel time computation | number
assign bikerPower = 100    # %bikerPower% | Average power (in W) provided by the biker, for travel time computation | number

Dat model (met de bovenstaande parameters die je in het profiel kan vinden) wordt gebruikt om de “Travel time” te bereken die je onderaan de Brouter web client kan vinden. De parameters kloppen aardig voor de gemiddelde “normale” fietser. Zie https://zod.github.io/brouter/ voor documentatie.

Verkeerslichten worden (nog) niet meegenomen, ik heb een eigen profiel dat verkeerslichten meeneemt en zover ik kan zie werkt dat goed.