4

I am using ArcGIS and I try to find all roundabouts in the OSM data of Germany. Although, there is a OSM road type depicted as 'roundabout', the type is not used for the OSM data. At least not for the data I downloaded...

How can I find all those line segments that belong to a roundabout?

Do I have to check all features for their geometry? I tried already to see if the geometry object returns a 'curve' element when converted to a JSON object, but it only contains the coordinates of the vertices and the spatial reference.

7
  • Good question, you have other problems such as how are you going to distinguish between roundabouts and ring roads?
    – Hornbydd
    Sep 13 '16 at 9:40
  • Create big polygon to cover all area and start editing it. Select all roads and from edit toolbar select split polygon. Test if smallish polygons are roundabouts. Just a thought
    – FelixIP
    Sep 13 '16 at 9:47
  • Well, my approach was to figure out if a line segment is a 'curve', calculate the center point a circle indicated by the line segment, and use radius and center point to look for other features in the vicinity, to check if it is a possible roundabout. However, that fails if I cannot distinguish between straight line and curve. Ring roads though, could be 'identified' by setting a limit to the radius of the circle. Sep 13 '16 at 9:50
  • How should I test if 'smallish polygons are roundabouts' if not looking manually at everything? I am talking about the whole country of Germany! What's also good to know - a roundabout is not a circle, but always split into several segments of a circle. Sep 13 '16 at 9:53
  • 1
    I doubt it's safe to assume all roundabouts are captured with CAD curves.
    – Vince
    Sep 13 '16 at 10:36
4

INPUT:

93660 projected streets of New Zealand, 1026 of them named “ROUNDABOUT”:

enter image description here

WORKFLOW:

arcpy.FeatureToPolygon_management(in_features="NZL_ST", out_feature_class="D:/Scratch/Scratch.gdb/PGONS", cluster_tolerance="", attributes="NO_ATTRIBUTES", label_features="")
arcpy.SelectLayerByAttribute_management(in_layer_or_view="PGONS", selection_type="NEW_SELECTION", where_clause="Shape_Area >2500")
arcpy.Dissolve_management(in_features="PGONS", out_feature_class="D:/Scratch/Scratch.gdb/DISSOLVED", dissolve_field="", statistics_fields="", multi_part="SINGLE_PART", unsplit_lines="DISSOLVE_LINES")
arcpy.AddField_management(in_table="DISSOLVED", field_name="RATIO", field_type="FLOAT", field_precision="", field_scale="", field_length="", field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")
arcpy.CalculateField_management(in_table="DISSOLVED", field="RATIO", expression="!Shape_Area!/math.pow( !Shape_Length! /math.pi/2,2 )/math.pi", expression_type="PYTHON_9.3", code_block="")
arcpy.SelectLayerByAttribute_management(in_layer_or_view="DISSOLVED", selection_type="NEW_SELECTION", where_clause="RATIO >=0.95")

VERIFICATION:

arcpy.SelectLayerByLocation_management(in_layer="NZL_ST", overlap_type="SHARE_A_LINE_SEGMENT_WITH", select_features="DISSOLVED", search_distance="", selection_type="NEW_SELECTION", invert_spatial_relationship="NOT_INVERT")

RESULTS SHOW SUMMARY STATISTICS OF LAST SELECTION:

enter image description here

This means that model identified 9 out of 10 existing shapes. Technically this percentage is even higher, e.g.:

enter image description here

I badly wish all of my models give me such high level of confidence.

2
  • The proposed workflow worked pretty well. I guess altering the area in the first select statement I have to adapt to typical size of roundabouts in Germany and the second select statement gives me another possibility to fine tune the workflow. All in all the proposed workflow is also pretty fast. Thanks a lot! Sep 15 '16 at 8:44
  • Glad it works. Your understanding is very much correct. Moreover if there is no cross in the middle, you can skip dissolve part and select by area. Testing the shape similarity to a circle might give much better results
    – FelixIP
    Sep 15 '16 at 9:26
2

Here is an alternative approach which is imperfect and would require you to convert the road network into a geometric network then do some data cleaning. You will also require at least a Standard license level. This approach would at least filter out a subset of polylines you need to consider.

Below is an example of road data extracted for Berlin from the bbbike website. I have loaded this into a geodatabase and converted it to a geometric network, accepting all defaults.

Berlin Example

Notice the green flag square I have placed on some part of the connected network.

I then run the find loops network solver and had set the option to record results as a selection as shown below:

Selected polylines

As well as selecting the lines that make up the roundabouts it has selected roads that ultimately form loops within the network. You would at this point retrospectively go back to this selection, export and delete out the lines you do not need. For my sample that is a trivial task but if you are planning to do it for the whole of Germany then another approach is like required?

1

You could convert the lines to polygons and then calculate the isoperimetric quotient on the polygons. Values closer to 1 are more circular.

https://en.wikipedia.org/wiki/Isoperimetric_inequality

4
  • This is interesting. Could you elaborate a bit more ?
    – gisnside
    Sep 13 '16 at 15:41
  • The IQ is a measure of the the ratio of the area of a circle to the area of your shape. So if the equation returns a value of 1, your shape is a circle. Convert the lines to polygons, then run the calculation in the field calculator. Like Hornbydd said, you may find errors as something like a ring road may calculate to a value of 1. I may have a Python tool to solve this but it would be on my home computer. I will try to upload it tonight.
    – GBG
    Sep 13 '16 at 16:22
  • @GBG That would be great... would not have to write it myself. But will certainly read the linked Wiki page! Thanks in advance. Sep 13 '16 at 19:12
  • I would add this en.wikipedia.org/wiki/Polsby%E2%80%93Popper_test . with some script and SQL you can do it this way Oct 24 '19 at 13:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.