Carto stylesheet; Cycle focused overlay based on OSM data
#!/usr/bin/env python | |
# Copyright (c) 2011, Development Seed, Inc. | |
# 2011, Andrew Harvey <andrew.harvey4@gmail.com> | |
# All rights reserved. | |
# | |
# Redistribution and use in source and binary forms, with or without | |
# modification, are permitted provided that the following conditions are | |
# met: | |
# | |
# * Redistributions of source code must retain the above copyright | |
# notice, this list of conditions and the following disclaimer. | |
# * Redistributions in binary form must reproduce the above copyright | |
# notice, this list of conditions and the following disclaimer in | |
# the documentation and/or other materials provided with the | |
# distribution. | |
# * Neither the name of the Development Seed, Inc. nor the names of | |
# its contributors may be used to endorse or promote products | |
# derived from this software without specific prior written | |
# permission. | |
# | |
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS | |
# IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER | |
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
import json | |
from sys import path | |
from os.path import join | |
import argparse | |
################################# | |
## argparse | |
parser = argparse.ArgumentParser(description='Configure an MML file with datasource settings') | |
parser.add_argument('--host', default='localhost') | |
parser.add_argument('--port', default='5432') | |
parser.add_argument('--dbname', default='osm') | |
parser.add_argument('--user', default='osm') | |
parser.add_argument('--password', default='osm') | |
# Increase performance if you are only rendering a particular area by | |
# specifying a bounding box to restrict queries. Format is "XMIN,YMIN,XMAX,YMAX" in the | |
# same units as the database (probably spherical mercator meters). The | |
# whole world is "-20037508.34,-20037508.34,20037508.34,20037508.34". | |
# Leave blank to let Mapnik estimate. | |
parser.add_argument('--extent', default='') | |
args = parser.parse_args() | |
################################# | |
## configure mml | |
mml = join(path[0], 'cycle-overlay/cycle-overlay.mml') | |
with open(mml, 'r') as f: | |
newf = json.loads(f.read()) | |
f.closed | |
with open(mml, 'w') as f: | |
for layer in newf["Layer"]: | |
layer["Datasource"]["host"] = args.host | |
layer["Datasource"]["port"] = args.port | |
layer["Datasource"]["dbname"] = args.dbname | |
layer["Datasource"]["user"] = args.user | |
layer["Datasource"]["password"] = args.password | |
layer["Datasource"]["extent"] = args.extent | |
f.write(json.dumps(newf, indent=2)) | |
f.closed |
{ | |
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", | |
"Stylesheet": [ | |
"cycle.mss" | |
], | |
"Layer": [ | |
{ | |
"geometry": "linestring", | |
"name": "cycle-route", | |
"id": "cycle-route", | |
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", | |
"class": "cycle", | |
"Datasource": { | |
"table": "(\n SELECT way, lcn, rcn, ncn\n FROM planet_osm_line\n WHERE (lcn = 'yes' OR rcn = 'yes' OR ncn = 'yes')\n) AS cycleroutes", | |
"key_field": "", | |
"geometry_field": "way", | |
"extent": "", | |
"type": "postgis", | |
"dbname": "", | |
"host": "", | |
"port": "", | |
"user": "", | |
"password": "" | |
} | |
}, | |
{ | |
"geometry": "linestring", | |
"name": "cycle-lane", | |
"id": "cycle-lane", | |
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", | |
"class": "cycle", | |
"Datasource": { | |
"table": "(\n SELECT way, tags->'cycleway' as cycleway\n FROM planet_osm_line\n WHERE tags->'cycleway' in ('lane', 'opposite_lane')\n) AS cyclelanes", | |
"key_field": "", | |
"geometry_field": "way", | |
"extent": "", | |
"type": "postgis", | |
"dbname": "", | |
"host": "", | |
"port": "", | |
"user": "", | |
"password": "" | |
} | |
}, | |
{ | |
"geometry": "linestring", | |
"name": "cycle-path", | |
"id": "cycle-path", | |
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", | |
"class": "cycle", | |
"Datasource": { | |
"table": "(\n SELECT way, highway\n FROM planet_osm_line\n WHERE highway in ('cycleway')\n) AS cyclepath", | |
"key_field": "", | |
"geometry_field": "way", | |
"extent": "", | |
"type": "postgis", | |
"dbname": "", | |
"host": "", | |
"port": "", | |
"user": "", | |
"password": "" | |
} | |
}, | |
{ | |
"geometry": "point", | |
"name": "cycle-poi", | |
"id": "cycle-poi", | |
"srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", | |
"class": "", | |
"Datasource": { | |
"table": "(\n (\n SELECT\n way,\n amenity,\n shop,\n name,\n tags->'capacity' as capacity\n FROM\n planet_osm_point\n WHERE\n amenity in ('bicycle_parking', 'drinking_water', 'toilets') OR\n shop in ('bicycle')\n ) UNION (\n SELECT\n way,\n amenity,\n shop,\n name,\n tags->'capacity' as capacity\n FROM\n planet_osm_polygon\n WHERE\n amenity in ('bicycle_parking', 'drinking_water', 'toilets') OR\n shop in ('bicycle')\n )\n) AS cyclepoi", | |
"key_field": "", | |
"geometry_field": "way", | |
"extent": "", | |
"type": "postgis", | |
"dbname": "", | |
"host": "", | |
"port": "", | |
"user": "", | |
"password": "" | |
} | |
} | |
], | |
"name": "cycle-overlay", | |
"description": "A simple transparent map overlay showing cycle lanes, cycle paths and cycle routes." | |
} |
/* | |
* Cycle lanes, paths and routes OSM style sheet, intended as an | |
* overlay for other maps. | |
* | |
* Author: Andrew Harvey <andrew.harvey4@gmail.com> | |
* License: CC0 http://creativecommons.org/publicdomain/zero/1.0/ | |
* To the extent possible under law, the person who associated CC0 | |
* with this work has waived all copyright and related or neighboring | |
* rights to this work. | |
*/ | |
.cycle { | |
line-join: round; | |
line-cap: round; | |
} | |
/* on road marked route, but no lane */ | |
#cycle-route { | |
line-color: #61b6f7; | |
line-opacity: 0.5; | |
[zoom<10] { line-width: 1 } | |
[zoom=10] { line-width: 2 } | |
[zoom=11] { line-width: 2 } | |
[zoom=12] { line-width: 4 } | |
[zoom=13] { line-width: 6 } | |
[zoom=14] { line-width: 8 } | |
[zoom=15] { line-width: 10 } | |
[zoom=16] { line-width: 12 } | |
[zoom=17] { line-width: 15 } | |
[zoom>17] { line-width: 20 } | |
} | |
/* on road lane */ | |
#cycle-lane { | |
line-color: #050060; | |
line-width: 5; | |
/* thinner than routes so we can see cycle lanes which are part of routes */ | |
[zoom<10] { line-width: 0.5 } | |
[zoom=10] { line-width: 1 } | |
[zoom=11] { line-width: 1.2 } | |
[zoom=12] { line-width: 1.5 } | |
[zoom=13] { line-width: 1.75 } | |
[zoom=14] { line-width: 2.5 } | |
[zoom=15] { line-width: 3 } | |
[zoom=16] { line-width: 4 } | |
[zoom=17] { line-width: 6 } | |
[zoom>17] { line-width: 9 } | |
} | |
/* off road path */ | |
#cycle-path { | |
line-color: #050060; | |
[zoom<10] { line-width: 0.5 ; line-dasharray: 0.5,1 } | |
[zoom=10] { line-width: 1 ; line-dasharray: 0.5,1 } | |
[zoom=11] { line-width: 1.5 ; line-dasharray: 1,2 } | |
[zoom=12] { line-width: 1.5 ; line-dasharray: 1,3 } | |
[zoom=13] { line-width: 1.75 ; line-dasharray: 1,4 } | |
[zoom=14] { line-width: 2.5 ; line-dasharray: 1,5 } | |
[zoom=15] { line-width: 3 ; line-dasharray: 1,5 } | |
[zoom=16] { line-width: 4; line-dasharray: 1,7 } | |
[zoom=17] { line-width: 6; line-dasharray: 1,10 } | |
[zoom>17] { line-width: 9; line-dasharray: 1,12 } | |
} | |
/* cycle related POI */ | |
#cycle-poi[zoom > 14] { | |
[amenity='toilets'] { | |
point-file: url('/usr/share/icons/sjjb/png/amenity/toilets.n.000000.16.png'); | |
} | |
[amenity='bicycle_parking'] { | |
point-file: url('/usr/share/icons/sjjb/png/transport/parking_bicycle.n.0092DA.16.png'); | |
} | |
[shop='bicycle'] { | |
point-file: url('/usr/share/icons/sjjb/png/shopping/bicycle.n.AC39AC.16.png'); | |
::label { | |
text-name: "[name]"; | |
text-face-name: "Liberation Sans Bold"; | |
text-fill: #AC39AC; | |
text-placement: point; | |
text-wrap-width: 75; | |
text-halo-radius: 1.5; | |
text-size: 10; | |
text-dy: 12; | |
} | |
} | |
[amenity='drinking_water'] { | |
point-file: url('/usr/share/icons/sjjb/png/food/drinkingtap.n.39AC39.16.png'); | |
} | |
} |
Creative Commons Legal Code | |
CC0 1.0 Universal | |
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE | |
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN | |
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS | |
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES | |
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS | |
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM | |
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED | |
HEREUNDER. | |
Statement of Purpose | |
The laws of most jurisdictions throughout the world automatically confer | |
exclusive Copyright and Related Rights (defined below) upon the creator | |
and subsequent owner(s) (each and all, an "owner") of an original work of | |
authorship and/or a database (each, a "Work"). | |
Certain owners wish to permanently relinquish those rights to a Work for | |
the purpose of contributing to a commons of creative, cultural and | |
scientific works ("Commons") that the public can reliably and without fear | |
of later claims of infringement build upon, modify, incorporate in other | |
works, reuse and redistribute as freely as possible in any form whatsoever | |
and for any purposes, including without limitation commercial purposes. | |
These owners may contribute to the Commons to promote the ideal of a free | |
culture and the further production of creative, cultural and scientific | |
works, or to gain reputation or greater distribution for their Work in | |
part through the use and efforts of others. | |
For these and/or other purposes and motivations, and without any | |
expectation of additional consideration or compensation, the person | |
associating CC0 with a Work (the "Affirmer"), to the extent that he or she | |
is an owner of Copyright and Related Rights in the Work, voluntarily | |
elects to apply CC0 to the Work and publicly distribute the Work under its | |
terms, with knowledge of his or her Copyright and Related Rights in the | |
Work and the meaning and intended legal effect of CC0 on those rights. | |
1. Copyright and Related Rights. A Work made available under CC0 may be | |
protected by copyright and related or neighboring rights ("Copyright and | |
Related Rights"). Copyright and Related Rights include, but are not | |
limited to, the following: | |
i. the right to reproduce, adapt, distribute, perform, display, | |
communicate, and translate a Work; | |
ii. moral rights retained by the original author(s) and/or performer(s); | |
iii. publicity and privacy rights pertaining to a person's image or | |
likeness depicted in a Work; | |
iv. rights protecting against unfair competition in regards to a Work, | |
subject to the limitations in paragraph 4(a), below; | |
v. rights protecting the extraction, dissemination, use and reuse of data | |
in a Work; | |
vi. database rights (such as those arising under Directive 96/9/EC of the | |
European Parliament and of the Council of 11 March 1996 on the legal | |
protection of databases, and under any national implementation | |
thereof, including any amended or successor version of such | |
directive); and | |
vii. other similar, equivalent or corresponding rights throughout the | |
world based on applicable law or treaty, and any national | |
implementations thereof. | |
2. Waiver. To the greatest extent permitted by, but not in contravention | |
of, applicable law, Affirmer hereby overtly, fully, permanently, | |
irrevocably and unconditionally waives, abandons, and surrenders all of | |
Affirmer's Copyright and Related Rights and associated claims and causes | |
of action, whether now known or unknown (including existing as well as | |
future claims and causes of action), in the Work (i) in all territories | |
worldwide, (ii) for the maximum duration provided by applicable law or | |
treaty (including future time extensions), (iii) in any current or future | |
medium and for any number of copies, and (iv) for any purpose whatsoever, | |
including without limitation commercial, advertising or promotional | |
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each | |
member of the public at large and to the detriment of Affirmer's heirs and | |
successors, fully intending that such Waiver shall not be subject to | |
revocation, rescission, cancellation, termination, or any other legal or | |
equitable action to disrupt the quiet enjoyment of the Work by the public | |
as contemplated by Affirmer's express Statement of Purpose. | |
3. Public License Fallback. Should any part of the Waiver for any reason | |
be judged legally invalid or ineffective under applicable law, then the | |
Waiver shall be preserved to the maximum extent permitted taking into | |
account Affirmer's express Statement of Purpose. In addition, to the | |
extent the Waiver is so judged Affirmer hereby grants to each affected | |
person a royalty-free, non transferable, non sublicensable, non exclusive, | |
irrevocable and unconditional license to exercise Affirmer's Copyright and | |
Related Rights in the Work (i) in all territories worldwide, (ii) for the | |
maximum duration provided by applicable law or treaty (including future | |
time extensions), (iii) in any current or future medium and for any number | |
of copies, and (iv) for any purpose whatsoever, including without | |
limitation commercial, advertising or promotional purposes (the | |
"License"). The License shall be deemed effective as of the date CC0 was | |
applied by Affirmer to the Work. Should any part of the License for any | |
reason be judged legally invalid or ineffective under applicable law, such | |
partial invalidity or ineffectiveness shall not invalidate the remainder | |
of the License, and in such case Affirmer hereby affirms that he or she | |
will not (i) exercise any of his or her remaining Copyright and Related | |
Rights in the Work or (ii) assert any associated claims and causes of | |
action with respect to the Work, in either case contrary to Affirmer's | |
express Statement of Purpose. | |
4. Limitations and Disclaimers. | |
a. No trademark or patent rights held by Affirmer are waived, abandoned, | |
surrendered, licensed or otherwise affected by this document. | |
b. Affirmer offers the Work as-is and makes no representations or | |
warranties of any kind concerning the Work, express, implied, | |
statutory or otherwise, including without limitation warranties of | |
title, merchantability, fitness for a particular purpose, non | |
infringement, or the absence of latent or other defects, accuracy, or | |
the present or absence of errors, whether or not discoverable, all to | |
the greatest extent permissible under applicable law. | |
c. Affirmer disclaims responsibility for clearing rights of other persons | |
that may apply to the Work or any use thereof, including without | |
limitation any person's Copyright and Related Rights in the Work. | |
Further, Affirmer disclaims responsibility for obtaining any necessary | |
consents, permissions or other rights required for any use of the | |
Work. | |
d. Affirmer understands and acknowledges that Creative Commons is not a | |
party to this document and has no duty or obligation with respect to | |
this CC0 or use of the Work. | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment