udsleeds / openinfra

Open access data for transport research: tools, modelling and simulation
https://udsleeds.github.io/openinfra/
Other
31 stars 4 forks source link

recode_road_class #78

Open hulsiejames opened 2 years ago

hulsiejames commented 2 years ago

It seems (at least in Leeds - likely elsewhere) that some residential roads are listed as highway="service"

Need to look into adding this to recode_road_class function.

Hopefully there is a logcial way we can distinguish between genuine service roads, and residential roads labelled as service.

Robinlovelace commented 2 years ago

Very interesting observation.

hulsiejames commented 2 years ago

Update:

Back Hamilton Ave is marked as highway=service, which is actually in convention with the documentation on highway=service

This is also commonly used for access to parking, driveways, and alleys.

Of which Back Hamilton Ave is (also the other roads inbetween gardens, see Back Grange Ave above.)

Visualising on street view we see:

The next road up (front house facing) is classified as a local road, and mapped as highway=residential appropriately is Hamilton Avenue:

This is captured by the current recode_road_class function:

The question: Is this okay functionality? - do we need to be capturing such back alleys/parking routes as these are not likely to be prioritised in terms of infrastructure development.

If we do wish to try and capture such back alleys - how? (would need some thought). Looking at the intial alley road tags (for Back Hamilton Ave - same for all Back Aves here): I don't see an immediate way we could classify them as such? One thought could be seeing if these highway=service ways intersect or connect to a way tagged highway=residential as the service road is likely also used primarily by residents, as in the examples here.

Personally I'm not sure such information is useful to local authorities who will be focused on more important aspects, but that is just an opinion!

Robinlovelace commented 2 years ago

Back streets can be great active travel infrastructure because they have low car traffic volumes (0 if blocked as is the case with the backstreet I used to live on) and speeds. Note last edit to this OSM element was by me, setting width as tiny 2.8m: https://www.openstreetmap.org/way/150133137

Great job identifying the cause of these residential service roads. Are some service roads much bigger? I guess so, meaning post-processing steps to classify them may be worthwhile.

Robinlovelace commented 2 years ago

One thought could be seeing if these highway=service ways intersect or connect to a way tagged highway=residential as the service road is likely also used primarily by residents, as in the examples here.

That is a good idea :+1: there may be other ways of doing it but this is a solid starter for 10.

hulsiejames commented 2 years ago

Are some service roads much bigger? I guess so

I will try and create a plot of highway=service and corresponding width=* to see the distribution, though I expect not many will have width added!

Robinlovelace commented 2 years ago

I will try and create a plot of highway=service and corresponding width=* to see the distribution, though I expect not many will have width added!

I wasn't referring to width= tags in OSM. I meant are some of them larger non-residential roads in reality.

hulsiejames commented 2 years ago

I see - I can't think of a way of identifying such misclassified roads at this moment, apart from maybe a width sense check.

I.e. if a way has highway=service and a width of 5 meters or greater it could likely be a missclassified non-residential road

Robinlovelace commented 2 years ago

Looking at overpass turbo it seems most service roads are eminently cyclable:

image

Source: https://overpass-turbo.eu/

Robinlovelace commented 2 years ago

Although some of them are definitely NOT cyclable. So basing it on whether or not they connect with residential (and cyclways/other active travel ways) is my suggestion.

image

Robinlovelace commented 2 years ago

Source: https://www.openstreetmap.org/way/673677250

Does access:no cover it?

hulsiejames commented 2 years ago

Source: https://www.openstreetmap.org/way/673677250 Does access:no cover it?

And access:private

Source: https://www.openstreetmap.org/edit?way=673677250#map=17/53.73074/-1.51185

Robinlovelace commented 2 years ago

Does that mean that it will be excluded from the cycle network and by extension the openinfra packs? I should probably check the code, but quicker to ask! I guess the key questions are:

hulsiejames commented 2 years ago

osmextract of same area

Included ways in the bottom left of the figure [1, 2, 3] are just highway==service, though they are connected to ways that have either access="no" OR "private" so perhaps there could be a check for that?

Robinlovelace commented 2 years ago

so perhaps there could be a check for that?

Yes, good sanity checking and worth excluding service roads that are not on active travel networks.

Robinlovelace commented 2 years ago

Or solving the issue upstream. I think it's worth opening an issue to report this in the osmextract issue tracker. Heads-up @agila5, another issue may be incoming!

Robinlovelace commented 2 years ago

(It's still good to do the check in this repo IMO and not rely too much on external dependencies; starting from the full raw OSM data and keeping all the rules in one place could be good for documentation and transparency to people reading the code and trying to get their head round the outputs.)

hulsiejames commented 2 years ago

Does that mean that it will be excluded from the cycle network and by extension the openinfra packs? I should probably check the code, but quicker to ask! I guess the key questions are:

Currently, any way with highway="service" is not included by recode_road_class.

The "cycleway" option in recode_road_class is only matching to ways with highway="cycleway", rather than indicating a cycleable network (this will be captured by oi_active_cycle column, decribed below).

Origionally Chan and Cooper defined this class as "Traffic Free Roads", however as `highway="cycleway" indicates a seperate way for cyclists, it is not a road at all thus I changed the description to "cycleway"

The next function I will make oi_active_travel which will include two columns oi_active_walk & oi_active_cycle which will contain "yes", "no" values based on whether an OSM way is included by oe_get_network(type="walking") OR (type="cycling")

On classifying such highway="service" ways

How should they be classified (residential if they intersect with residential roads being a good default, what about service ways that do not?)?

I agree classifying ways with highway="service" as residential when intesecting with other ways labelled as highway="residential" in the recode_road_class function.

There may also be a way to identifty highway="service" roads that lead into industrial estates - these should probably not be counted as local/residential roads but as industrial estate? bearing in mind we are creating more road descriptions we dont want to overwhelm

Robinlovelace commented 2 years ago

The next function I will make oi_active_travel which will include two columns oi_active_walk & oi_active_cycle which will contain "yes", "no" values based on whether an OSM way is included by oe_get_network(type="walking") OR (type="cycling")

Based on the concept of modularity, I suggest first creating/documenting two separate functions and then combining them.

Robinlovelace commented 2 years ago

There may also be a way to identifty highway="service" roads that lead into industrial estates - these should probably not be counted as local/residential roads but as industrial estate? bearing in mind we are creating more road descriptions we dont want to overwhelm

Quickfire idea on this: add an 'other' category. There is a diversity of roads and a balance between simplicity (good) and the dataset's ability to describe the real world in a decent amount of detail (also good). We don't need to stick religiously to Chan and Cooper's definition, we can build on it so I suggest separating out cycleway from traffic free roads. Putting this together my current thinking is:

That final point links to long conversations about how to define LTNs based on OSM data alone: https://github.com/a-b-street/abstreet/discussions/770

Robinlovelace commented 2 years ago

FYI we can could build on CycleStreets' definition of LTNs and their API: https://www.cyclestreets.net/api/v2/advocacydata.ltns/

See here https://rpackage.cyclestreets.net/reference/ltns.html for an R function that gets ways classified by LTN status from CycleStreets. A question here is whether LTNs are defined based on infrastructure e.g. planters preventing rat running and sign-posts saying there's no through traffic or regulation (my thinking: regulation without infrastructure is unusual and weak and that given the importance of no through traffic roads aka LTNs it's worth representing them in our data packs).

hulsiejames commented 2 years ago

Quickfire idea on this: add an 'other' category. There is a diversity of roads and a balance between simplicity (good) and the dataset's ability to describe the real world in a decent amount of detail (also good). We don't need to stick religiously to Chan and Cooper's definition, we can build on it so I suggest separating out cycleway from traffic free roads. Putting this together my current thinking is:

  • New 'other' category that may not fit into the others
  • Add cycleway as a distinct category that is worthy of documenting in open transport infrastructure data packs
  • Add highway=foot and other walking-only ways (e.g. steps) as another category
  • Keep the car-free category buy maybe rename it and redefine it as ways on which cars can go but on which there is no through traffic

That final point links to long conversations about how to define LTNs based on OSM data alone: a-b-street/abstreet#770

Just to clarify the car-free category would be it's own column within the datapack rather than part of the functionality of recode_road_class - could be part of a function that calls the cyclestreet API to determin rat-runs/through roads/LTNs etc.? This could be an additional data pack column, say oi_traffic_status or something similar.

I like this - current idea for recode_road_class descriptions is for the follwoing:

Is your plan to have Cycleways (as a piece of infrastrcutre) included in the oi_highways column, the output of recode_road_class - or to have a seperate column entirely that is just called oi_cycleway which has values "yes" if the feature is a cycleway?

The above will be in addition to oi_active_cycle which will be the cycling network returned by osmextract oe_get_network(type="walking"), not just seperate ways designated for cyclists.

Similarly with walking the walking point, should I create two instances? one say oi_active_walk which is the network returned from osmextract oe_get_network(type="walking") and a second, say oi_walk that returns specific ways designated for pedestrian traffic only?

Note: currently working on the oi_active_cycle & oi_active_walk as two seperate functions (as advised) that return walking & cycling networks as defined by osmextarct - these can be combined later as you suggest - so hopefully should provide more context when I set up PR!

Robinlovelace commented 2 years ago

Lots of good questions in there. One to discuss on the phone and probably with practitioners like Brian Deegan, Kit Allwinter and Catriona Swanson!