Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Readme instructions and updated views for loading coastline, roads and routes data (Fix for Issue #5) #6

Closed
wants to merge 7 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -3,3 +3,69 @@ Terrain

A collection of files for generating the OSM US Terrain Map:
http://tile.stamen.com/terrain/preview.html

# Dependencies

This section is based on the [Toner style](https://github.com/Citytracking/toner/blob/master/README.md.).

## Data Dependencies (required)
* PostGIS database tables for the OpenStreetMap coastline in EPSG 90091 (http://tile.openstreetmap.org/processed_p.tar.bz2)

### OpenStreetMap (OSM)

#### Coastline
You will also need to add a copy of the OSM coastline to your planet_osm
database. The [OSM coastline](http://tile.openstreetmap.org/processed_p.tar.bz2) is distributed as a shapefile that you will need to
import using the 'shp2pgsql' program:

##### Steps

1. Get the coastline data

`wget http://tile.openstreetmap.org/processed_p.tar.bz2`

2. Extract it

`tar xvjf processed_p.tar.gz2`

4. Convert into a shapefile

`shp2pgsql -dID -s 900913 processed_p.shp coastline > coastline.pgsql`

5. Import into your osm database

`sudo -u postgres psql -d planet_osm -f coastline.pgsql`

#### Roads and Routes

##### Skeletron
One key part of the Terrain style is simplifying roads and routes so they display better at less detailed zoom levels.
This requires a tool called [Skeletron](https://github.com/migurski/Skeletron) and there is a set of scripts to do this for the US called [CountiesOSM](https://github.com/Citytracking/CountyOSM).
Note that this processing is very time-consuming. Running it for just Washington state took in the order of a day.

###### Steps
1. Download and install Skeletron, CountiesOSM and related dependencies.
2. In CountiesOSM, run `make`. Use parameters to run it for just one state e.g. `make out/53` will just process Washington state.
3. Change to `out/<FIPS>` for your state where <FIPS> is the FIPS number used by CountiesOSM.
4. Load the routes-<FIPS>.pgsql and roads-<FIPS>.pqsql.

`sudo -u postgres psql -d planet_osm -f roads-53.pgsql`

`sudo -u postgres psql -d planet_osm -f routes-53.pgsql`

##### Database Views
The output of Skeletron is a set of tables of the form roads53 and routes53. The Terrain styles are expecting single views called skeletron_routes, skeletron_roads and skeletron_routes_cleanrefs. To create this run the following SQL. If you want it to include more than just Washington state then you will need to add your state to the view.

1. Change to Terrain/mapnik
2. Run the following:

`sudo -u postgres psql -d planet_osm -f skeletron.pgsql`

`sudo -u postgres psql -d planet_osm -f views.pgsql`

##### Lines and labels
Create the mapnik xml with make in Terrain/mapnik.

make labels.xml
make lines.xml

5 changes: 5 additions & 0 deletions mapnik/Makefile
Original file line number Diff line number Diff line change
@@ -90,3 +90,8 @@ labels-halomask.xml: labels-halomask.mml labels.mss cities.mss states.mss routes
lines.xml: lines.mml lines.mss states.mss
cascadenik-compile.py lines.mml $@
chmod a+r $@

course.xml: course.mml course.mss
cascadenik-compile.py course.mml $@
chmod a+r $@

8 changes: 4 additions & 4 deletions mapnik/background.ini
Original file line number Diff line number Diff line change
@@ -3,14 +3,14 @@ srs900913 = +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_

[postgis_conn]
type = postgis
port = 5432
port = 5433
host = localhost
dbname = planet_osm
user = osm
dbname = osm
user = postgres
estimate_extent = false
extent = -20037508,-20037508,20037508,20037508
layer_srs = %(srs900913)s
password = None
password = k3wlon3

[aeroways]
template = postgis_conn
72 changes: 72 additions & 0 deletions mapnik/course.mml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Map[
<!ENTITY epsg4326 "+proj=longlat +datum=WGS84">
<!ENTITY epsg900913 "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over">
<!ENTITY epsg900913_extent "-20037508,-20037508,20037508,20037508">

<!ENTITY osm_host "localhost">
<!ENTITY osm_port "5432">
<!ENTITY osm_name "trailhunger">
<!ENTITY osm_user "web">
<!ENTITY osm_pass "50vRezha">

]>
<Map srs="&epsg900913;">

<Stylesheet src="course.mss"/>

<Layer id="not-course-trail" class="trail" srs="&epsg900913;">
<Datasource>
<Parameter name="type">postgis</Parameter>
<Parameter name="host">&osm_host;</Parameter>
<Parameter name="port">&osm_port;</Parameter>
<Parameter name="user">&osm_user;</Parameter>
<Parameter name="password">&osm_pass;</Parameter>
<Parameter name="dbname">&osm_name;</Parameter>
<Parameter name="extent">&epsg900913_extent;</Parameter>
<Parameter name="estimate_extent">false</Parameter>
<Parameter name="srid">900913</Parameter>
<Parameter name="geometry_field">geometry</Parameter>
<Parameter name="table"><![CDATA[
(
SELECT ST_Transform(seg.geometry, 900913) AS geometry
FROM pub_trail_segment seg
WHERE seg.id NOT IN
(SELECT pub_trail_segment_id
FROM pub_course_pub_trail_segment
WHERE pub_course_id = 48)
) AS trail
]]></Parameter>
</Datasource>
</Layer>

<Layer id="course" class="course" srs="&epsg900913;">
<Datasource>
<Parameter name="type">postgis</Parameter>
<Parameter name="host">&osm_host;</Parameter>
<Parameter name="port">&osm_port;</Parameter>
<Parameter name="user">&osm_user;</Parameter>
<Parameter name="password">&osm_pass;</Parameter>
<Parameter name="dbname">&osm_name;</Parameter>
<Parameter name="extent">&epsg900913_extent;</Parameter>
<Parameter name="estimate_extent">false</Parameter>
<Parameter name="srid">900913</Parameter>
<Parameter name="table"><![CDATA[
(SELECT geometry, render
FROM (
SELECT 'outline' AS render, ST_Transform(geometry, 900913) AS geometry
FROM pub_trail_segment seg, pub_course_pub_trail_segment cseg
WHERE seg.id = cseg.pub_trail_segment_id AND cseg.pub_course_id = 48
UNION
SELECT 'inline' AS render, ST_Transform(geometry, 900913) AS geometry
FROM pub_trail_segment seg, pub_course_pub_trail_segment cseg
WHERE seg.id = cseg.pub_trail_segment_id AND cseg.pub_course_id = 48
) AS course_base
ORDER BY render DESC) AS course
]]></Parameter>
</Datasource>
</Layer>
</Map>

21 changes: 21 additions & 0 deletions mapnik/course.mss
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Map {
map-bgcolor: transparent; }

.course, .trail
{
line-join: round;
line-cap: round;
}

.course[render=outline]
{
line-color: #ff6633;
line-width: 3;
}

.course[render=inline], .trail
{
line-color: #5a3b00;
line-width: 2;
line-dasharray: 8,3;
}
16 changes: 8 additions & 8 deletions mapnik/labels-halomask.mml
Original file line number Diff line number Diff line change
@@ -5,10 +5,10 @@
<!ENTITY epsg900913_extent "-20037508,-20037508,20037508,20037508">

<!ENTITY osm_host "localhost">
<!ENTITY osm_port "5432">
<!ENTITY osm_name "planet_osm">
<!ENTITY osm_user "osm">
<!ENTITY osm_pass "">
<!ENTITY osm_port "5433">
<!ENTITY osm_name "osm">
<!ENTITY osm_user "postgres">
<!ENTITY osm_pass "k3wlon3">

<!ENTITY ter_name "terrain">
<!ENTITY ter_user "terrain">
@@ -163,15 +163,15 @@
<Parameter name="extent">&epsg900913_extent;</Parameter>
<Parameter name="table"><![CDATA[
(
SELECT place, name, COALESCE(CAST(population AS integer), 0) AS population, way,
(CASE WHEN CAST(population AS integer) >= 250000 THEN 32
WHEN CAST(population AS integer) >= 50000 THEN 24
SELECT place, name, way,
(CASE
WHEN place IN ('city', 'town') THEN 24
ELSE 18
END) AS font_size
FROM planet_osm_point
WHERE place IN ('city', 'town', 'village', 'hamlet')
ORDER BY CAST(population AS integer) DESC
) AS labels
]]></Parameter>
</Datasource>
23 changes: 11 additions & 12 deletions mapnik/labels.mml
Original file line number Diff line number Diff line change
@@ -5,10 +5,10 @@
<!ENTITY epsg900913_extent "-20037508,-20037508,20037508,20037508">

<!ENTITY osm_host "localhost">
<!ENTITY osm_port "5432">
<!ENTITY osm_name "planet_osm">
<!ENTITY osm_user "osm">
<!ENTITY osm_pass "">
<!ENTITY osm_port "5433">
<!ENTITY osm_name "osm">
<!ENTITY osm_user "postgres">
<!ENTITY osm_pass "k3wlon3">

<!ENTITY ter_name "terrain">
<!ENTITY ter_user "terrain">
@@ -140,15 +140,14 @@
<Parameter name="extent">&epsg900913_extent;</Parameter>
<Parameter name="table"><![CDATA[
(
SELECT place, name, COALESCE(CAST(population AS integer), 0) AS population, way,
(CASE WHEN CAST(population AS integer) >= 250000 THEN 32
WHEN CAST(population AS integer) >= 50000 THEN 24
SELECT place, name , way,
(CASE
WHEN place IN ('city', 'town') THEN 24
ELSE 18
END) AS font_size
FROM planet_osm_point
WHERE place IN ('city', 'town', 'village', 'hamlet')
ORDER BY CAST(population AS integer) DESC
) AS labels
]]></Parameter>
</Datasource>
@@ -195,7 +194,7 @@
</Datasource>
</Layer>

<Layer id="airports" srs="&epsg900913;">
<!--<Layer id="airports" srs="&epsg900913;">
<Datasource>
<Parameter name="type">postgis</Parameter>
<Parameter name="host">&osm_host;</Parameter>
@@ -219,7 +218,7 @@
) AS airports
]]></Parameter>
</Datasource>
</Layer>
</Layer>-->

<!--
<Layer id="road-labels" class="labels" srs="&epsg900913;">
@@ -302,7 +301,7 @@
</Datasource>
</Layer>

<Layer class="state-insets" id="state-insets-z9" srs="&epsg900913;">
<!--<Layer class="state-insets" id="state-insets-z9" srs="&epsg900913;">
<Datasource>
<Parameter name="type">postgis</Parameter>
<Parameter name="host">&osm_host;</Parameter>
@@ -390,6 +389,6 @@
<Parameter name="geometry_field">inset_z14</Parameter>
<Parameter name="table">state_insets</Parameter>
</Datasource>
</Layer>
</Layer>-->

</Map>
1 change: 0 additions & 1 deletion mapnik/labels.mss
Original file line number Diff line number Diff line change
@@ -3,7 +3,6 @@ Map
map-bgcolor: transparent;
}

#place-names[zoom>=11][zoom<15][population>0] name,
#place-names[zoom>=11][zoom<15][place=city] name,
#place-names[zoom>=11][zoom<15][place=town] name,
#place-names[zoom>=15][zoom<17] name
12 changes: 6 additions & 6 deletions mapnik/lines.mml
Original file line number Diff line number Diff line change
@@ -5,10 +5,10 @@
<!ENTITY epsg900913_extent "-20037508,-20037508,20037508,20037508">

<!ENTITY osm_host "localhost">
<!ENTITY osm_port "5432">
<!ENTITY osm_name "planet_osm">
<!ENTITY osm_user "osm">
<!ENTITY osm_pass "">
<!ENTITY osm_port "5433">
<!ENTITY osm_name "osm">
<!ENTITY osm_user "postgres">
<!ENTITY osm_pass "k3wlon3">

<!ENTITY ter_name "terrain">
<!ENTITY ter_user "terrain">
@@ -33,7 +33,7 @@
</Datasource>
</Layer>

<Layer class="state-lines political-boundaries" id="state-lines-full" srs="&epsg900913;">
<!--<Layer class="state-lines political-boundaries" id="state-lines-full" srs="&epsg900913;">
<Datasource>
<Parameter name="type">postgis</Parameter>
<Parameter name="host">&osm_host;</Parameter>
@@ -46,7 +46,7 @@
<Parameter name="geometry_field">border_land</Parameter>
<Parameter name="table">state_lines</Parameter>
</Datasource>
</Layer>
</Layer>-->

<Layer id="buildings" srs="&epsg900913;">
<Datasource>
30 changes: 29 additions & 1 deletion mapnik/skeletron.pgsql
Original file line number Diff line number Diff line change
@@ -16,8 +16,36 @@
-- the_geom | geometry |
-- source | character varying(16) |
-- zoomlevel | integer |

DROP VIEW IF EXISTS skeletron_routes_cleanrefs;
DROP VIEW IF EXISTS skeletron_routes;
DROP VIEW IF EXISTS skeletron_roads;

DELETE FROM geometry_columns
WHERE f_table_name = 'skeletron_routes';

CREATE VIEW skeletron_routes AS
SELECT gid, ref, network, highway, the_geom, zoomlevel, 'routes_us_53'::character varying(16) as source
FROM routes53;

INSERT INTO geometry_columns
(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type")
VALUES
('', 'public', 'skeletron_routes', 'the_geom', 2, 900913, 'LINESTRING');

DELETE FROM geometry_columns
WHERE f_table_name = 'skeletron_roads';

CREATE VIEW skeletron_roads AS
SELECT gid, zoomlevel, shortname, name, pixelwidth, the_geom, 'roads_us_53'::character varying(16) as source
FROM roads53;

INSERT INTO geometry_columns
(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type")
VALUES
('', 'public', 'skeletron_roads', 'the_geom', 2, 900913, 'LINESTRING');




DELETE FROM geometry_columns
WHERE f_table_name = 'skeletron_routes_cleanrefs';
8 changes: 4 additions & 4 deletions mapnik/water-mask-osm2pgsql.ini
Original file line number Diff line number Diff line change
@@ -3,14 +3,14 @@ srs900913 = +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_

[postgis_conn]
type = postgis
port = 5432
port = 5433
host = localhost
dbname = planet_osm
user = osm
dbname = osm
user = postgres
estimate_extent = false
extent = -20037508,-20037508,20037508,20037508
layer_srs = %(srs900913)s
password = None
password = k3wlon3

[postgis_terrain]
type = postgis
8 changes: 4 additions & 4 deletions mapnik/water-mask.ini
Original file line number Diff line number Diff line change
@@ -3,14 +3,14 @@ srs900913 = +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_

[postgis_conn]
type = postgis
port = 5432
port = 5433
host = localhost
dbname = planet_osm
user = osm
dbname = osm
user = postgres
estimate_extent = false
extent = -20037508,-20037508,20037508,20037508
layer_srs = %(srs900913)s
password = None
password = k3wlon3

[postgis_terrain]
type = postgis
43 changes: 27 additions & 16 deletions tilestache.cfg
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
{
"cache": { "name": "Test" },
"cache": {"name": "Test"},
"layers":
{
"roads":
{
"provider":
{
"name": "proxy",
"url": "http://tile.openstreetmap.org/{Z}/{X}/{Y}.png"
}
},
"water-mask":
{
"provider":
@@ -13,7 +21,6 @@
"preview": {"zoom": 11, "lat": 37.811, "lon": -122.266, "ext": "png"},
"write cache": 0
},

"background-polygons":
{
"provider":
@@ -26,7 +33,6 @@
"metatile": {"rows": 4, "columns": 4, "buffer": 256},
"write cache": 0
},

"labels":
{
"provider":
@@ -40,7 +46,6 @@
"metatile": {"rows": 4, "columns": 4, "buffer": 256},
"write cache": 1
},

"labels-halomask":
{
"provider":
@@ -54,7 +59,6 @@
"metatile": {"rows": 4, "columns": 4, "buffer": 256},
"write cache": 1
},

"lines":
{
"provider":
@@ -68,6 +72,18 @@
"metatile": {"rows": 4, "columns": 4, "buffer": 256},
"write cache": 1
},
"course":
{
"provider":
{
"name": "mapnik",
"fonts": "mapnik/fonts",
"mapfile": "mapnik/course.xml"
},
"projection": "spherical mercator",
"metatile": {"rows": 4, "columns": 4, "buffer": 256},
"write cache": 1
},

"grey-hills":
{
@@ -80,7 +96,6 @@
"preview": {"zoom": 13, "lat": 37.811, "lon": -122.266, "ext": "jpg"},
"write cache": 0
},

"land-cover-z4":
{
"provider":
@@ -114,7 +129,6 @@
"preview": {"zoom": 11, "lat": 37.811, "lon": -122.266, "ext": "jpg"},
"write cache": 0
},

"hillshading":
{
"provider":
@@ -142,7 +156,6 @@
"projection": "spherical mercator",
"write cache": 0
},

"terrain-background":
{
"provider":
@@ -163,8 +176,7 @@
{"color": "#bacbab", "zoom": "12", "opacity": 0.8, "mode": "screen"},
{"color": "#bacbab", "zoom": "13-20", "opacity": 0.9, "mode": "screen"},
{"src": "background-polygons"},
{"src": "hillshading", "zoom": "0-17", "mode": "linear light"},
{"color": "#99b3cc", "mask": "water-mask"}
{"src": "hillshading", "zoom": "0-17", "mode": "linear light"}
]
}
},
@@ -174,8 +186,7 @@
"jpeg options": {"quality": 85},
"write cache": 1
},

"terrain":
"terrain":
{
"provider":
{
@@ -197,17 +208,17 @@
{"src": "background-polygons"},
{"src": "hillshading", "zoom": "0-17", "mode": "linear light", "mask": "labels-halomask"},
{"color": "#99b3cc", "mask": "water-mask"},

{"src": "lines", "zoom": "0-11", "mask": "labels-halomask"},
{"src": "lines", "zoom": "12-20"},
{"src": "labels"}
{"src": "labels"},
{"src": "course"}
]
}
},
"projection": "spherical mercator",
"preview": {"zoom": 12, "lat": 37.811, "lon": -122.266, "ext": "jpg"},
"jpeg options": {"quality": 85},
"write cache": 0
}
}
}
}
}