Skip to content

Commit

Permalink
Highway turning circle rendering.
Browse files Browse the repository at this point in the history
The generate_turning_circles.py script creates the circles based on its
parameters, which, currently, are to make circle 2.5 time the width of
the roads they're on.  generate_turning_circles.py must be run before
rendering, naturally.
  • Loading branch information
asciipip committed Oct 9, 2012
1 parent 140a42b commit 1a56fd6
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ landcoverrelief.xml
ocean.xml
include/*.inc

# These are generated by programs
custom-symbols/turning_circle*

*.pyc
errors.log
geodata
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,11 @@ Generate hillshade and colormaps:
```
$ ./prep_toposm_data
```
Generate turning circle images:
```
$ ./generate_turning_circles.py
```


Add a shortcut for your area(s) of interest to areas.py.

Expand Down
30 changes: 30 additions & 0 deletions generate_turning_circles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/python

import subprocess

# Fill is 2.5 times the width of the corresponding road fills.
metrics = { 'tertiary': { 15: { 'fill': 8.75, 'border': 1.0 },
16: { 'fill': 20.00, 'border': 1.0 } },
'minor': { 15: { 'fill': 5.0, 'border': 1.0 },
16: { 'fill': 12.5, 'border': 1.0 } },
'service': { 15: { 'fill': 3.25, 'border': 0.6 },
16: { 'fill': 5.00, 'border': 1.0 } } }
colors = { 'border': 'black', 'fill': 'white' }

def save_circle(diameter, color, file_name):
img_size = int(diameter + 4) # Two pixels on either side of the circle.
circle_center = img_size / 2.0
circle_edge = (img_size - diameter) / 2
file_path = 'custom-symbols/' + file_name
subprocess.call(['convert',
'-size', '{0}x{0}'.format(img_size), 'xc:none',
'-fill', color,
'-draw', 'circle {0},{0} {0},{1}'.format(circle_center, circle_edge),
file_path])

for classification, zooms in metrics.items():
for zoom, dimensions in zooms.items():
save_circle(dimensions['fill'], colors['fill'],
'turning_circle-{0}-z{1}-fill.png'.format(classification, zoom))
save_circle(dimensions['fill'] + dimensions['border'] * 2, colors['border'],
'turning_circle-{0}-z{1}-casing.png'.format(classification, zoom))
76 changes: 76 additions & 0 deletions include/highway.inc.templ
Original file line number Diff line number Diff line change
Expand Up @@ -466,10 +466,86 @@

</Style>

<Style name="turning-circles-outline">
<Rule>
&minz15;
&maxz15;
<Filter>[int_tc_type] = 'tertiary'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-tertiary-z15-casing.png" allow-overlap="true" />
</Rule>
<Rule>
&minz16;
<Filter>[int_tc_type] = 'tertiary'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-tertiary-z16-casing.png" allow-overlap="true" />
</Rule>

<Rule>
&minz15;
&maxz15;
<Filter>[int_tc_type] = 'unclassified' or [int_tc_type] = 'residential'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-minor-z15-casing.png" allow-overlap="true" />
</Rule>
<Rule>
&minz16;
<Filter>[int_tc_type] = 'unclassified' or [int_tc_type] = 'residential'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-minor-z16-casing.png" allow-overlap="true" />
</Rule>

<Rule>
&minz15;
&maxz15;
<Filter>[int_tc_type] = 'service'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-service-z15-casing.png" allow-overlap="true" />
</Rule>
<Rule>
&minz16;
<Filter>[int_tc_type] = 'service'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-service-z16-casing.png" allow-overlap="true" />
</Rule>
</Style>

<Style name="highway-highzoom-fill">
&highway-highzoom-fill-rules;
</Style>

<Style name="turning-circles-fill">
<Rule>
&minz15;
&maxz15;
<Filter>[int_tc_type] = 'tertiary'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-tertiary-z15-fill.png" allow-overlap="true" />
</Rule>
<Rule>
&minz16;
<Filter>[int_tc_type] = 'tertiary'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-tertiary-z16-fill.png" allow-overlap="true" />
</Rule>

<Rule>
&minz15;
&maxz15;
<Filter>[int_tc_type] = 'unclassified' or [int_tc_type] = 'residential'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-minor-z15-fill.png" allow-overlap="true" />
</Rule>
<Rule>
&minz16;
<Filter>[int_tc_type] = 'unclassified' or [int_tc_type] = 'residential'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-minor-z16-fill.png" allow-overlap="true" />
</Rule>

<Rule>
&minz15;
&maxz15;
<Filter>[int_tc_type] = 'service'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-service-z15-fill.png" allow-overlap="true" />
</Rule>
<Rule>
&minz16;
<Filter>[int_tc_type] = 'service'</Filter>
<PointSymbolizer file="&customsymbolsdir;/turning_circle-service-z16-fill.png" allow-overlap="true" />
</Rule>
</Style>

<!-- parking lots are rendered (outline+fill) just like roads -->
<Style name="parking-outline">
<Rule>
Expand Down
34 changes: 34 additions & 0 deletions templates/features.xml.templ
Original file line number Diff line number Diff line change
Expand Up @@ -615,6 +615,23 @@
</Datasource>
</Layer>

<Layer name="turning-circles-outline" status="on" srs="&srs900913;">
<StyleName>turning-circles-outline</StyleName>
<Datasource>
&dbsettings;
&extents;
<Parameter name="table">
(SELECT p.way as way, l.highway AS int_tc_type
FROM ${DB_PREFIX}_point p
JOIN ${DB_PREFIX}_line l
ON ST_DWithin(p.way, l.way, 0.1)
WHERE p.highway = 'turning_circle'
AND l.highway in ('tertiary', 'unclassified', 'residential', 'service')
) as turning_circle
</Parameter>
</Datasource>
</Layer>

<!-- Roads at z9+ (all roads) -->
<Layer name="highway-highzoom" status="on">
<StyleName>highway-highzoom-outline</StyleName>
Expand Down Expand Up @@ -642,6 +659,23 @@
</Datasource>
</Layer>

<Layer name="turning-circles-fill" status="on" srs="&srs900913;">
<StyleName>turning-circles-fill</StyleName>
<Datasource>
&dbsettings;
&extents;
<Parameter name="table">
(SELECT p.way as way, l.highway AS int_tc_type
FROM ${DB_PREFIX}_point p
JOIN ${DB_PREFIX}_line l
ON ST_DWithin(p.way, l.way, 0.1)
WHERE p.highway = 'turning_circle'
AND l.highway in ('tertiary', 'unclassified', 'residential', 'service')
) as turning_circle
</Parameter>
</Datasource>
</Layer>

<Layer name="parking-fill" status="on">
<StyleName>parking-fill</StyleName>
<Datasource>
Expand Down

0 comments on commit 1a56fd6

Please sign in to comment.