[openstreetmap-carto] 01/04: Imported Upstream version 2.40.0

Bas Couwenberg sebastic at debian.org
Wed Jun 22 05:09:03 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository openstreetmap-carto.

commit a88c47f18cd9995fd96c74c1cb40d81513583542
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Wed Jun 22 06:59:09 2016 +0200

    Imported Upstream version 2.40.0
---
 CONTRIBUTING.md           |  34 ++++++
 INSTALL.md                |   8 ++
 amenity-points.mss        | 108 ++++++++++---------
 indexes.sql               |  37 +++++++
 indexes.yml               |  34 ++++++
 openstreetmap-carto.style |  11 +-
 placenames.mss            |  18 +++-
 power.mss                 |  19 +++-
 project.mml               |  40 +++----
 project.yaml              | 163 +++++++++++++++-------------
 roads.mss                 | 263 +++++++++++++++++++++++++---------------------
 scripts/README.md         |   3 +
 scripts/indexes.py        |  72 +++++++++++++
 scripts/shop_values.rb    |   6 ++
 symbols/library.14.svg    |  38 +++++++
 symbols/library.p.20.png  | Bin 715 -> 0 bytes
 symbols/shop_books.16.svg |  12 ---
 17 files changed, 573 insertions(+), 293 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 83d4efc..4ccccd6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -17,6 +17,11 @@ contain a cropped screenshot of the problem, and a link to the area. Don't assum
 that we will see exactly what you see. If a particular OSM object is an issue,
 the issue should contain the tagging of the object.
 
+## Easy pickings
+
+Some [easy issues](https://github.com/gravitystorm/openstreetmap-carto/issues?q=is%3Aopen+is%3Aissue+label%3Aeasy) have been selected
+that are particularly suitable for new contributors to get familiar with the project's code base and the contribution process.
+
 ## Editing Layers
 
 OpenStreetMap Carto uses a YAML file for defining layers. Some of the rationale
@@ -89,6 +94,35 @@ instead of
 * Order the selectors in a style-sheet in rough order of importance (i.e.,
   `highway=primary`, then `highway=secondary`) and beyond that, add layers that
   are rendered later (i.e., higher) lower in the file.
+* For features where the symbolizer attributes change on different zoom levels,
+  the main definition should be for the lowest zoom level. Also, avoid nesting
+  zoom-based overrides. For example:
+
+```
+#layer[feature = 'foo'][zoom >= 13] {
+  line-width: 6;
+  line-color: black;
+  [zoom >= 15] {
+    line-width: 7;
+  }
+  [zoom >= 17] {
+    line-width: 10;
+  }
+}
+```
+instead of
+```
+#layer[feature = 'foo'][zoom >= 13] {
+  line-width: 10;
+  line-color: black;
+  [zoom < 18] {
+    line-width: 7;
+    [zoom < 16] {
+      line-width: 6;
+    }
+  }
+}
+```
 
 ## SQL Style Guidelines
 Because SQL within JSON or YAML will not generally be syntax highlighted, indentation and caps are particularly important.
diff --git a/INSTALL.md b/INSTALL.md
index 2930a54..51da6bf 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,5 +1,6 @@
 # Installation
 
+## OpenStreetMap data
 You need OpenStreetMap data loaded into a PostGIS database (see below for [dependencies](#dependencies)). These stylesheets currently work only with the osm2pgsql defaults (i.e. database name is `gis`, table names are `planet_osm_point`, etc).
 
 It's probably easiest to grab an PBF of OSM data from [Mapzen](https://mapzen.com/metro-extracts/) or [geofabrik](http://download.geofabrik.de/). Once you've set up your PostGIS database, import with osm2pgsql:
@@ -10,6 +11,13 @@ osm2pgsql -d gis ~/path/to/data.osm.pbf --style openstreetmap-carto.style
 
 You can find a more detailed guide to setting up a database and loading data with osm2pgsql at [switch2osm.org](http://switch2osm.org/loading-osm-data/).
 
+### Custom indexes
+Custom indexes are not required, but will speed up rendering, particularly for full planet databases, heavy load, or other production environments. They will not be as helpful with development using small extracts.
+
+```
+psql -d gis -f indexes.sql
+```
+
 Additionally you need some shapefiles.
 
 ## Scripted download
diff --git a/amenity-points.mss b/amenity-points.mss
index 765d836..a25aa1a 100644
--- a/amenity-points.mss
+++ b/amenity-points.mss
@@ -19,6 +19,7 @@
 @landcover-face-name: @oblique-fonts;
 
 @standard-wrap-width: 30;
+ at standard-text-size: 10;
 
 /* Note that .points is also used in water-features.mss */
 .points {
@@ -261,8 +262,10 @@
   }
 
   [feature = 'amenity_library'][zoom >= 16] {
-    point-file: url('symbols/library.p.20.png');
-    point-placement: interior;
+    marker-file: url('symbols/library.14.svg');
+    marker-fill: @amenity-brown;
+    marker-placement: interior;
+    marker-clip: false;
   }
 
   [feature = 'amenity_courthouse'][zoom >= 16] {
@@ -579,7 +582,7 @@
   }
 
   [feature = 'shop_books'][zoom >= 17] {
-    marker-file: url('symbols/shop_books.16.svg');
+    marker-file: url('symbols/library.14.svg');
     marker-fill: @shop-icon;
     marker-placement: interior;
     marker-clip: false;
@@ -1028,24 +1031,24 @@
 }
 
 .amenity-low-priority {
-  [man_made = 'cross'][zoom >= 16],
-  [historic = 'wayside_cross'][zoom >= 16] {
+  [feature = 'man_made_cross'][zoom >= 16],
+  [feature = 'historic_wayside_cross'][zoom >= 16] {
     marker-file: url('symbols/christian.9.svg');
     marker-fill: #000000;
     marker-placement: interior;
     marker-clip: false;
   }
 
-  [amenity = 'parking'][zoom >= 17],
-  [amenity = 'bicycle_parking'][zoom >= 17],
-  [amenity = 'motorcycle_parking'][zoom >= 17] {
-    [amenity = 'parking'] {
+  [feature = 'amenity_parking'][zoom >= 17],
+  [feature = 'amenity_bicycle_parking'][zoom >= 17],
+  [feature = 'amenity_motorcycle_parking'][zoom >= 17] {
+    [feature = 'amenity_parking'] {
       marker-file: url('symbols/parking.svg');
     }
-    [amenity = 'bicycle_parking'] {
+    [feature = 'amenity_bicycle_parking'] {
       marker-file: url('symbols/bicycle_parking.16.svg');
     }
-    [amenity = 'motorcycle_parking'] {
+    [feature = 'amenity_motorcycle_parking'] {
       marker-file: url('symbols/motorcycle_parking.16.svg');
     }
     marker-placement: interior;
@@ -1056,7 +1059,7 @@
     }
   }
 
-  [railway = 'level_crossing'][zoom >= 14]::railway {
+  [feature = 'railway_level_crossing'][zoom >= 14]::railway {
     point-file: url('symbols/level_crossing.svg');
     point-placement: interior;
     [zoom >= 16] {
@@ -1064,13 +1067,13 @@
     }
   }
 
-  [highway = 'mini_roundabout'][zoom >= 16]::highway {
+  [feature = 'highway_mini_roundabout'][zoom >= 16]::highway {
     marker-file: url('symbols/mini_roundabout.svg');
     marker-placement: interior;
     marker-clip: false;
   }
 
-  [barrier = 'gate']::barrier {
+  [feature = 'barrier_gate']::barrier {
     [zoom >= 16] {
       marker-file: url('symbols/gate.svg');
       marker-placement: interior;
@@ -1078,16 +1081,16 @@
     }
   }
 
-  [barrier = 'lift_gate'][zoom >= 16]::barrier,
-  [barrier = 'swing_gate'][zoom >= 16]::barrier {
+  [feature = 'barrier_lift_gate'][zoom >= 16]::barrier,
+  [feature = 'barrier_swing_gate'][zoom >= 16]::barrier {
     marker-file: url('symbols/liftgate.svg');
     marker-fill: #3f3f3f;
     marker-placement: interior;
     marker-clip: false;
   }
 
-  [barrier = 'bollard'],
-  [barrier = 'block'] {
+  [feature = 'barrier_bollard'],
+  [feature = 'barrier_block'] {
     [zoom >= 16] {
       marker-width: 3;
       marker-line-width: 0;
@@ -1100,13 +1103,13 @@
     }
   }
 
-  [amenity = 'bench'][zoom >= 19]::amenity {
+  [feature = 'amenity_bench'][zoom >= 19]::amenity {
     marker-file: url('symbols/bench.16.svg');
     marker-fill: @amenity-brown;
     marker-placement: interior;
   }
 
-  [amenity = 'waste_basket'][zoom >= 19]::amenity {
+  [feature = 'amenity_waste_basket'][zoom >= 19]::amenity {
     marker-file: url('symbols/waste_basket.10.svg');
     marker-fill: @amenity-brown;
     marker-placement: interior;
@@ -1122,7 +1125,7 @@
   [feature = 'place_islet'][zoom >= 17][way_pixels < 800000] {
     text-name: "[name]";
     text-fill: #000;
-    text-size: 10;
+    text-size: @standard-text-size;
     [way_pixels > 12000] { text-size: 12; }
     [way_pixels > 48000] { text-size: 15; }
     text-face-name: @oblique-fonts;
@@ -1144,7 +1147,7 @@
     [zoom >= 17] {
       text-name: "[name]";
       text-fill: @amenity-brown;
-      text-size: 10;
+      text-size: @standard-text-size;
       text-dy: 11;
       text-face-name: @bold-fonts;
       text-halo-radius: 1;
@@ -1168,7 +1171,7 @@
   [feature = 'amenity_cinema'] {
     [zoom >= 17] {
       text-name: "[name]";
-      text-size: 10;
+      text-size: @standard-text-size;
       text-fill: @amenity-brown;
       text-dy: 13;
       text-face-name: @bold-fonts;
@@ -1177,6 +1180,7 @@
       text-halo-fill: rgba(255,255,255,0.6);
       text-wrap-width: @standard-wrap-width;
       text-placement: interior;
+      [feature = 'amenity_library'],
       [feature = 'tourism_museum'],
       [feature = 'amenity_theatre'],
       [feature = 'amenity_cinema'] {
@@ -1189,7 +1193,7 @@
   [feature = 'amenity_bicycle_rental'][zoom >= 17],
   [feature = 'leisure_slipway'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: @transportation-text;
     [feature = 'amenity_car_rental']     { text-dy: 10; }
     [feature = 'amenity_bicycle_rental'] { text-dy: 10; }
@@ -1205,7 +1209,7 @@
   [feature = 'amenity_bicycle_parking'][zoom >= 10][way_pixels > 900],
   [feature = 'amenity_motorcycle_parking'][zoom >= 10][way_pixels > 900] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: @transportation-text;
     text-dy: 9;
     text-face-name: @book-fonts;
@@ -1233,7 +1237,7 @@
   [feature = 'leisure_picnic_table'][zoom >= 17],
   [feature = 'amenity_post_office'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-fill: @amenity-brown;
     text-dy: 10;
     [feature = 'amenity_police'] { text-dy: 11; }
@@ -1248,7 +1252,7 @@
 
   [feature = 'amenity_place_of_worship'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-fill: #000033;
     text-dy: 12;
     text-face-name: @book-fonts;
@@ -1263,7 +1267,7 @@
   [feature = 'natural_saddle'][zoom >= 15],
   [feature = 'tourism_viewpoint'][zoom >= 16] {
     text-name: "[name]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-fill: darken(@landform-color, 30%);
     [feature = 'natural_volcano'] { text-fill: #d40000; }
     text-dy: 7;
@@ -1281,7 +1285,7 @@
   [feature = 'man_made_mast'][zoom >= 17],
   [feature = 'man_made_water_tower'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-fill: black;
     [feature = 'natural_cave_entrance'],
     [feature = 'man_made_water_tower'] {
@@ -1291,7 +1295,7 @@
     [feature = 'historic_wayside_cross'] {
       text-dy: 6;
     }
-    [feature = 'man_made_mast']         { text-dy: 10; }
+    [feature = 'man_made_mast'] { text-dy: 10; }
     text-face-name: @book-fonts;
     text-halo-radius: 1;
     text-halo-fill: rgba(255,255,255,0.6);
@@ -1303,7 +1307,7 @@
   [feature = 'historic_monument'][zoom >= 16],
   [feature = 'historic_archaeological_site'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: @amenity-brown;
     text-dy: 11;
     text-face-name: @book-fonts;
@@ -1316,7 +1320,7 @@
   [feature = 'leisure_miniature_golf'][zoom >= 17],
   [feature = 'leisure_golf_course'][zoom >= 15] {
     text-name: "[name]";
-    text-size: 11;
+    text-size: @standard-text-size;
     text-fill: darken(@park, 60%);
     text-face-name: @book-fonts;
     text-halo-radius: 1;
@@ -1332,7 +1336,7 @@
     [way_area >= 20000][zoom >= 16],
     [zoom >= 17] {
       text-name: "[name]";
-      text-size: 11;
+      text-size: @standard-text-size;
       text-fill: darken(@park, 60%);
       text-dy: 11;
       text-face-name: @book-fonts;
@@ -1371,7 +1375,7 @@
     [way_area >= 20000][zoom >= 16],
     [zoom >= 17] {
       text-name: "[name]";
-      text-size: 11;
+      text-size: @standard-text-size;
       text-dy: 13;
       text-fill: darken(@park, 60%);
       text-face-name: @book-fonts;
@@ -1656,7 +1660,7 @@
     [feature = 'amenity_atm'] {
       text-name: "[operator]";
     }
-    text-size: 10;
+    text-size: @standard-text-size;
     [feature = 'amenity_bank'] { text-dy: 9; }
     [feature = 'amenity_atm']  { text-dy: 10; }
     text-fill: @amenity-brown;
@@ -1676,7 +1680,7 @@
   [feature = 'tourism_guest_house'][zoom >= 17],
   [feature = 'tourism_camp_site'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-fill: #0066ff;
     text-dy: 11;
     text-face-name: @book-fonts;
@@ -1694,7 +1698,7 @@
 
   [feature = 'amenity_embassy'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: #0066ff;
     text-dy: 10;
     text-face-name: @book-fonts;
@@ -1706,7 +1710,7 @@
 
   [feature = 'amenity_taxi'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: #0066ff;
     text-dy: 11;
     text-face-name: @book-fonts;
@@ -1721,7 +1725,7 @@
   [feature = 'amenity_bus_station'] {
     [zoom >= 17] {
       text-name: "[name]";
-      text-size: 9;
+      text-size: @standard-text-size;
       text-fill: @transportation-text;
       text-dy: 11;
       text-face-name: @book-fonts;
@@ -1759,7 +1763,7 @@
 
   [feature = 'amenity_fountain'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: @marina-text;
     text-dy: 4;
     text-face-name: @book-fonts;
@@ -1775,7 +1779,7 @@
 
   [feature = 'amenity_prison'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-fill: @amenity-brown;
     text-dy: 12;
     text-face-name: @book-fonts;
@@ -1788,7 +1792,7 @@
 
   [feature = 'man_made_lighthouse'][zoom >= 15] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: @transportation-text;
     text-dy: 16;
     text-face-name: @book-fonts;
@@ -1801,7 +1805,7 @@
   [feature = 'man_made_windmill'][zoom >= 17],
   [feature = 'amenity_recycling'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: @amenity-brown;
     text-dy: 12;
     [feature = 'amenity_recycling'] { text-dy: 10; }
@@ -1815,7 +1819,7 @@
   [feature = 'amenity_hospital'][zoom >= 16] {
     text-name: "[name]";
     text-fill: @health-color;
-    text-size: 8;
+    text-size: @standard-text-size;
     text-dy: 10;
     text-face-name: @book-fonts;
     text-halo-radius: 1;
@@ -1832,7 +1836,7 @@
   [feature = 'amenity_veterinary'] {
     [zoom >= 17] {
       text-name: "[name]";
-      text-size: 8;
+      text-size: @standard-text-size;
       text-dy: 12;
       text-fill: @health-color;
       text-face-name: @book-fonts;
@@ -1902,7 +1906,7 @@
   [feature = 'shop_other']{
     [zoom >= 17] {
       text-name: "[name]";
-      text-size: 10;
+      text-size: @standard-text-size;
       text-dy: 12;
       text-fill: @shop-text;
       text-face-name: @book-fonts;
@@ -1920,7 +1924,7 @@
   [feature = 'shop_department_store'] {
     [zoom >= 16] {
       text-name: "[name]";
-      text-size: 10;
+      text-size: @standard-text-size;
       text-dy: 12;
       text-fill: @shop-text;
       text-face-name: @book-fonts;
@@ -1933,7 +1937,7 @@
 
   [feature = 'aeroway_gate'][zoom >= 17] {
     text-name: "[ref]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-fill: #aa66cc;
     text-face-name: @book-fonts;
     text-halo-radius: 1;
@@ -2070,7 +2074,7 @@
 
   [feature = 'aeroway_helipad'][zoom >= 16] {
     text-name: "[name]";
-    text-size: 8;
+    text-size: @standard-text-size;
     text-fill: @airtransport;
     text-dy: -10;
     text-face-name: @bold-fonts;
@@ -2082,7 +2086,7 @@
 
   [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14] {
     text-name: "[name]";
-    text-size: 8;
+    text-size: @standard-text-size;
     text-fill: darken(@airtransport, 15%);
     text-dy: -10;
     text-face-name: @oblique-fonts;
@@ -2094,7 +2098,7 @@
 
   [feature = 'amenity_hunting_stand'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 10;
+    text-size: @standard-text-size;
     text-dy: 11;
     text-fill: @man-made-icon;
     text-face-name: @book-fonts;
@@ -2106,7 +2110,7 @@
 
   [feature = 'natural_tree'][zoom >= 17] {
     text-name: "[name]";
-    text-size: 9;
+    text-size: @standard-text-size;
     text-fill: green;
     text-dy: 7;
     [zoom >= 18] { text-dy: 8; }
diff --git a/indexes.sql b/indexes.sql
new file mode 100644
index 0000000..e392840
--- /dev/null
+++ b/indexes.sql
@@ -0,0 +1,37 @@
+-- These are optional but suggested indexes for rendering OpenStreetMap Carto
+-- with a full planet database.
+-- This file is generated with scripts/indexes.py
+
+CREATE INDEX planet_osm_roads_admin
+  ON planet_osm_roads USING GIST (way)
+  WHERE boundary = 'administrative';
+CREATE INDEX planet_osm_roads_roads_ref
+  ON planet_osm_roads USING GIST (way)
+  WHERE highway IS NOT NULL AND ref IS NOT NULL;
+CREATE INDEX planet_osm_roads_admin_low
+  ON planet_osm_roads USING GIST (way)
+  WHERE boundary = 'administrative' AND admin_level IN ('0', '1', '2', '3', '4');
+CREATE INDEX planet_osm_line_ferry
+  ON planet_osm_line USING GIST (way)
+  WHERE route = 'ferry';
+CREATE INDEX planet_osm_line_river
+  ON planet_osm_line USING GIST (way)
+  WHERE waterway = 'river';
+CREATE INDEX planet_osm_line_name
+  ON planet_osm_line USING GIST (way)
+  WHERE name IS NOT NULL;
+CREATE INDEX planet_osm_polygon_military
+  ON planet_osm_polygon USING GIST (way)
+  WHERE landuse = 'military';
+CREATE INDEX planet_osm_polygon_nobuilding
+  ON planet_osm_polygon USING GIST (way)
+  WHERE building IS NULL;
+CREATE INDEX planet_osm_polygon_name
+  ON planet_osm_polygon USING GIST (way)
+  WHERE name IS NOT NULL;
+CREATE INDEX planet_osm_polygon_way_area_z6
+  ON planet_osm_polygon USING GIST (way)
+  WHERE way_area > 59750;
+CREATE INDEX planet_osm_point_place
+  ON planet_osm_point USING GIST (way)
+  WHERE place IS NOT NULL AND name IS NOT NULL;
diff --git a/indexes.yml b/indexes.yml
new file mode 100644
index 0000000..fe48822
--- /dev/null
+++ b/indexes.yml
@@ -0,0 +1,34 @@
+# A goal with the indexes is to have them general-purpose enough to not need
+# frequent changing with stylesheet changes, but to be usable with many
+# versions, and potentially other styles.
+
+point:
+  # The point table is small, but so are the partial indexes
+  place:
+    where: place IS NOT NULL AND name IS NOT NULL
+line:
+  name:
+    where: name IS NOT NULL
+  ferry:
+    where: route = 'ferry'
+  river:
+    where: waterway = 'river'
+polygon:
+  # The polygon table is by far the largest, and generally the slowest
+  name:
+    where: name IS NOT NULL
+  nobuilding:
+    where: building IS NULL
+  military:
+    where: landuse = 'military'
+  way_area_z6:
+    where: way_area > 59750
+roads:
+  # The roads table only has a subset of data, so it's just got some low-zoom
+  # indexes and some fairly selective ones for high zoom
+  admin_low:
+    where: boundary = 'administrative' AND admin_level IN ('0', '1', '2', '3', '4')
+  admin:
+    where: boundary = 'administrative'
+  roads_ref:
+    where: highway IS NOT NULL AND ref IS NOT NULL
diff --git a/openstreetmap-carto.style b/openstreetmap-carto.style
index f2322cf..d3a005c 100644
--- a/openstreetmap-carto.style
+++ b/openstreetmap-carto.style
@@ -1,5 +1,7 @@
 # This is the .style file for OpenStreetMap Carto, which is currently
 # the same as the upstream osm2pgsql style
+# phstore is used instead of polygon,nocolumn to preserve compatibility
+# with older osm2pgsql versions
 
 # OsmType  Tag          DataType     Flags
 node,way   access       text         linear
@@ -10,9 +12,9 @@ node,way   admin_level  text         linear
 node,way   aerialway    text         linear
 node,way   aeroway      text         polygon
 node,way   amenity      text         polygon
-node,way   area         text         # hard coded support for area=1/yes => polygon is in osm2pgsql
+node,way   area         text         polygon # hard coded support for area=1/yes => polygon is in osm2pgsql
 node,way   barrier      text         linear
-node,way   bicycle      text
+node,way   bicycle      text         linear
 node,way   brand        text         linear
 node,way   bridge       text         linear
 node,way   boundary     text         linear
@@ -47,14 +49,13 @@ node,way   office       text         polygon
 node,way   oneway       text         linear
 node,way   operator     text         linear
 node,way   place        text         polygon
-node       poi          text
 node,way   population   text         linear
 node,way   power        text         polygon
 node,way   power_source text         linear
 node,way   public_transport text     polygon
 node,way   railway      text         linear
 node,way   ref          text         linear
-node,way   religion     text         nocache
+node,way   religion     text         linear
 node,way   route        text         linear
 node,way   service      text         linear
 node,way   shop         text         polygon
@@ -71,7 +72,7 @@ node,way   wetland      text         polygon
 node,way   width        text         linear
 node,way   wood         text         linear
 node,way   z_order      int4         linear # This is calculated during import
-way        way_area     real                # This is calculated during import
+way        way_area     real         linear # This is calculated during import
 
 # Area tags
 # We don't make columns for these tags, but objects with them are areas.
diff --git a/placenames.mss b/placenames.mss
index ec05e60..7c89860 100644
--- a/placenames.mss
+++ b/placenames.mss
@@ -66,7 +66,7 @@
     [zoom >= 4][score >= 3000000],
     [zoom >= 5][score >= 400000] {
       text-name: "[name]";
-      text-size: 8;
+      text-size: 11;
       text-fill: @placenames;
       text-face-name: @book-fonts;
       text-halo-radius: 1.5;
@@ -74,13 +74,21 @@
       text-wrap-width: 30;
       text-min-distance: 10;
       [zoom >= 5] {
-        text-size: 10;
+        text-size: 11;
         text-wrap-width: 45;
       }
       [zoom >= 6] {
         text-size: 12;
         text-wrap-width: 60;
       }
+      [zoom >= 8] {
+        text-size: 13;
+        text-wrap-width: 60;
+      }
+      [zoom >= 9] {
+        text-size: 14;
+        text-wrap-width: 65;
+      }
       [zoom >= 11] {
         text-size: 15;
         text-wrap-width: 75;
@@ -94,7 +102,7 @@
     [zoom >= 6][score >= 70000],
     [zoom >= 7] {
       text-name: "[name]";
-      text-size: 9;
+      text-size: 10;
       text-fill: @placenames;
       text-face-name: @book-fonts;
       text-halo-radius: 1.5;
@@ -102,7 +110,7 @@
       text-wrap-width: 30;
       text-min-distance: 10;
       [zoom >= 9] {
-        text-size: 11;
+        text-size: 12;
         text-wrap-width: 60;
       }
       [zoom >= 11] {
@@ -121,7 +129,7 @@
   [category = 2] {
     [zoom >= 9][zoom < 16] {
       text-name: "[name]";
-      text-size: 9;
+      text-size: 10;
       text-fill: @placenames;
       text-face-name: @book-fonts;
       text-halo-radius: 1.5;
diff --git a/power.mss b/power.mss
index 249a0f0..065f6d7 100644
--- a/power.mss
+++ b/power.mss
@@ -2,24 +2,33 @@
 
 #power-line {
   [zoom >= 14] {
-    line-width: 0.8;
+    line-width: 0.5;
     line-color: @power-line-color;
     [zoom >= 15] {
-      line-width: 0.9;
+      line-width: 0.6;
     }
     [zoom >= 16] {
-      line-width: 1.3;
+      line-width: 0.7;
     }
     [zoom >= 18] {
-      line-width: 1.5;
+      line-width: 1;
+    }
+    [zoom >= 19] {
+      line-width: 1.2;
     }
   }
 }
 
 #power-minorline {
   [zoom >= 16] {
-    line-width: 0.5;
+    line-width: 0.3;
     line-color: @power-line-color;
+    [zoom >= 17] {
+      line-width: 0.4;
+    }
+    [zoom >= 18] {
+      line-width: 0.5;
+    }
   }
 }
 
diff --git a/project.mml b/project.mml
index aac77f8..8c182dc 100644
--- a/project.mml
+++ b/project.mml
@@ -279,7 +279,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way, surface, \n    COALESCE(\"natural\", CASE WHEN landuse = 'forest' THEN 'wood' ELSE NULL END) AS \"natural\",\n    CASE WHEN \"natural\" IN ('marsh', 'mud') \n        THEN \"natural\" \n        ELSE CASE WHEN (\"natural\" = 'wetland' AND wetland IS NULL) \n          THEN 'wetland' \n          ELSE CASE WHEN (\"natural\" = 'wetland')\n            THEN wetland\n            ELSE NULL\n            END \n        END\n      END AS int_wetland\n  FROM planet_o [...]
+        "table": "(SELECT\n    way, surface, \n    COALESCE(CASE WHEN landuse = 'forest' THEN 'wood' ELSE NULL END, \"natural\") AS \"natural\",\n    CASE WHEN \"natural\" IN ('marsh', 'mud') \n        THEN \"natural\" \n        ELSE CASE WHEN (\"natural\" = 'wetland' AND wetland IS NULL) \n          THEN 'wetland' \n          ELSE CASE WHEN (\"natural\" = 'wetland')\n            THEN wetland\n            ELSE NULL\n            END \n        END\n      END AS int_wetland\n  FROM planet_o [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -548,7 +548,7 @@
         85.05112877980659
       ],
       "properties": {
-        "minzoom": 12
+        "minzoom": 13
       },
       "advanced": {}
     },
@@ -574,7 +574,7 @@
         85.05112877980659
       ],
       "properties": {
-        "minzoom": 12
+        "minzoom": 13
       },
       "advanced": {}
     },
@@ -587,7 +587,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n        horse, foot, bicycle, tracktype, int_surface, access, construction,\n        service, oneway, link, layernotnull\n  FROM ( -- subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on\n        horse,\n   [...]
+        "table": "(SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n        horse, foot, bicycle, tracktype, int_surface, access, construction,\n        service, oneway, link, layernotnull\n  FROM ( -- subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on\n        horse,\n   [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -821,7 +821,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n        horse, foot, bicycle, tracktype, int_surface, access, construction,\n        service, oneway, link, layernotnull\n  FROM ( -- subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on\n        horse,\n   [...]
+        "table": "(SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n        horse, foot, bicycle, tracktype, int_surface, access, construction,\n        service, oneway, link, layernotnull\n  FROM ( -- subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on\n        horse,\n   [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -873,7 +873,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n        horse, foot, bicycle, tracktype, int_surface, access, construction,\n        service, oneway, link, layernotnull\n  FROM ( -- subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on\n        horse,\n   [...]
+        "table": "(SELECT\n    way,\n    (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n    horse,\n    foot,\n    bicycle,\n    tracktype,\n    int_surface,\n    access,\n    construction,\n    service,\n    oneway,\n    link,\n    layernotnull\n  FROM ( -- begin \"features\" subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, -- only m [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -951,7 +951,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    COALESCE(\n      ('highway_' || (CASE WHEN substr(highway, length(highway)-3, 4) = 'link' THEN substr(highway, 0, length(highway)-4) ELSE highway end)),\n      ('railway_' || (CASE WHEN (railway = 'rail' AND service IN ('spur', 'siding', 'yard')) THEN 'INT-spur-siding-yard' \n                           WHEN railway IN ('rail', 'tram', 'light_rail', 'funicular', 'narrow_gauge') THEN railway ELSE NULL END))\n    ) AS feature,\n    CASE WHEN tunnel = [...]
+        "table": "(SELECT\n    way,\n    COALESCE(\n      ('highway_' || (CASE WHEN substr(highway, length(highway)-3, 4) = 'link' THEN substr(highway, 0, length(highway)-4) ELSE highway end)),\n      ('railway_' || (CASE WHEN (railway = 'rail' AND service IN ('spur', 'siding', 'yard')) THEN 'INT-spur-siding-yard' \n                           WHEN railway IN ('rail', 'tram', 'light_rail', 'funicular', 'narrow_gauge') THEN railway ELSE NULL END))\n    ) AS feature,\n    CASE WHEN tunnel = [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1004,7 +1004,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n        horse, foot, bicycle, tracktype, int_surface, access, construction,\n        service, oneway, link, layernotnull\n  FROM ( -- subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on\n        horse,\n   [...]
+        "table": "(SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,\n        horse, foot, bicycle, tracktype, int_surface, access, construction,\n        service, oneway, link, layernotnull\n  FROM ( -- subselect that contains both roads and rail/aero\n    SELECT\n        way,\n        ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on\n        horse,\n   [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1031,7 +1031,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way\n  FROM planet_osm_line\n  WHERE highway = 'bus_guideway' AND (tunnel IS NULL OR tunnel != 'yes')\n) AS guideways",
+        "table": "(SELECT\n    way\n  FROM planet_osm_line\n  WHERE highway = 'bus_guideway'\n) AS guideways",
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1266,7 +1266,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    way_area/NULLIF(!pixel_width!::real*!pixel_height!::real,0) AS way_pixels,\n    name,\n    ref,\n    admin_level\n  FROM planet_osm_polygon\n  WHERE boundary = 'administrative'\n    AND admin_level IN ('2', '4')\n    AND name IS NOT NULL\n  ORDER BY admin_level ASC, way_area DESC\n) AS placenames_large",
+        "table": "(SELECT\n    way,\n    way_area/NULLIF(!pixel_width!::real*!pixel_height!::real,0) AS way_pixels,\n    name,\n    ref,\n    admin_level\n  FROM planet_osm_polygon\n  WHERE boundary = 'administrative'\n    AND admin_level IN ('2', '4')\n    AND name IS NOT NULL\n    AND way_area > 750*!pixel_width!::real*!pixel_height!::real -- only labels for larger areas are displayed\n  ORDER BY admin_level ASC, way_area DESC\n) AS placenames_large",
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1292,7 +1292,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    name,\n    score,\n    CASE\n      WHEN (place = 'city' OR (capital = 'yes' AND score >= 100000)) THEN 1\n      ELSE 2\n    END as category\n  FROM \n    (SELECT\n        way,\n        place,\n        name,\n        capital,\n        (\n          (CASE\n            WHEN (population ~ '^[0-9]{1,8}$') THEN population::INTEGER\n            WHEN (place = 'city') THEN 100000\n            WHEN (place = 'town') THEN 1000\n            ELSE 1\n          EN [...]
+        "table": "(SELECT\n    way,\n    name,\n    score,\n    CASE\n      WHEN (place = 'city' OR (capital = 'yes' AND score >= 100000)) THEN 1\n      ELSE 2\n    END as category\n  FROM \n    (SELECT\n        way,\n        place,\n        name,\n        capital,\n        (\n          (CASE\n            WHEN (population ~ '^[0-9]{1,8}$') THEN population::INTEGER\n            WHEN (place = 'city') THEN 100000\n            WHEN (place = 'town') THEN 1000\n            ELSE 1\n          EN [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1306,7 +1306,7 @@
       ],
       "properties": {
         "maxzoom": 15,
-        "minzoom": 3
+        "minzoom": 4
       },
       "advanced": {}
     },
@@ -1319,7 +1319,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    place,\n    name\n  FROM planet_osm_point\n  WHERE place IN ('suburb', 'village', 'hamlet', 'neighbourhood', 'locality', 'isolated_dwelling', 'farm')\n    AND name IS NOT NULL\n  ORDER BY CASE\n      WHEN place = 'suburb' THEN 3\n      WHEN place = 'village' THEN 4\n      WHEN place = 'hamlet' THEN 5\n      WHEN place = 'neighbourhood' THEN 6\n      WHEN place = 'locality' THEN 7\n      WHEN place = 'isolated_dwelling' THEN 8\n      WHEN place = ' [...]
+        "table": "(SELECT\n    way,\n    place,\n    name\n  FROM planet_osm_point\n  WHERE place IN ('suburb', 'village', 'hamlet', 'neighbourhood', 'locality', 'isolated_dwelling', 'farm')\n    AND name IS NOT NULL\n  ORDER BY CASE\n      WHEN place = 'suburb' THEN 3\n      WHEN place = 'village' THEN 4\n      WHEN place = 'hamlet' THEN 5\n      WHEN place = 'neighbourhood' THEN 6\n      WHEN place = 'locality' THEN 7\n      WHEN place = 'isolated_dwelling' THEN 8\n      WHEN place = ' [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1397,7 +1397,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    COALESCE(\n      'aeroway_' || CASE WHEN aeroway IN ('helipad', 'aerodrome') THEN aeroway ELSE NULL END,\n      'tourism_' || CASE WHEN tourism IN ('alpine_hut', 'camp_site', 'caravan_site', 'chalet', 'guest_house', \n                                          'hostel', 'hotel', 'motel', 'information', 'museum', 'picnic_site') THEN tourism ELSE NULL END,\n      'amenity_' || CASE WHEN amenity IN ('shelter', 'atm', 'bank', 'bar', 'bicycle_rental', ' [...]
+        "table": "(SELECT\n    way,\n    COALESCE(\n      'aeroway_' || CASE WHEN aeroway IN ('helipad', 'aerodrome') THEN aeroway ELSE NULL END,\n      'tourism_' || CASE WHEN tourism IN ('alpine_hut', 'camp_site', 'caravan_site', 'chalet', 'guest_house', \n                                          'hostel', 'hotel', 'motel', 'information', 'museum', 'picnic_site') THEN tourism ELSE NULL END,\n      'amenity_' || CASE WHEN amenity IN ('shelter', 'atm', 'bank', 'bar', 'bicycle_rental', ' [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1423,7 +1423,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    COALESCE(\n      'aeroway_' || CASE WHEN aeroway IN ('helipad', 'aerodrome') THEN aeroway ELSE NULL END,\n      'tourism_' || CASE WHEN tourism IN ('alpine_hut', 'camp_site', 'caravan_site', 'chalet', 'guest_house', 'hostel', \n                                          'hotel', 'motel', 'information', 'museum', 'picnic_site') THEN tourism ELSE NULL END,\n      'amenity_' || CASE WHEN amenity IN ('shelter', 'atm', 'bank', 'bar', 'bicycle_rental', ' [...]
+        "table": "(SELECT\n    way,\n    COALESCE(\n      'aeroway_' || CASE WHEN aeroway IN ('helipad', 'aerodrome') THEN aeroway ELSE NULL END,\n      'tourism_' || CASE WHEN tourism IN ('alpine_hut', 'camp_site', 'caravan_site', 'chalet', 'guest_house', 'hostel', \n                                          'hotel', 'motel', 'information', 'museum', 'picnic_site') THEN tourism ELSE NULL END,\n      'amenity_' || CASE WHEN amenity IN ('shelter', 'atm', 'bank', 'bar', 'bicycle_rental', ' [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1711,7 +1711,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    way_area/NULLIF(!pixel_width!::real*!pixel_height!::real,0) AS way_pixels,\n    COALESCE(\n      'aeroway_' || CASE WHEN aeroway IN ('gate', 'apron', 'helipad', 'aerodrome') THEN aeroway ELSE NULL END,\n      'tourism_' || CASE WHEN tourism IN ('alpine_hut', 'hotel', 'motel', 'hostel', 'chalet', 'guest_house', 'camp_site', 'caravan_site', \n                                          'theme_park', 'museum', 'zoo', 'information', 'picnic_site') THEN  [...]
+        "table": "(SELECT\n    way,\n    way_area/NULLIF(!pixel_width!::real*!pixel_height!::real,0) AS way_pixels,\n    COALESCE(\n      'aeroway_' || CASE WHEN aeroway IN ('gate', 'apron', 'helipad', 'aerodrome') THEN aeroway ELSE NULL END,\n      'tourism_' || CASE WHEN tourism IN ('alpine_hut', 'hotel', 'motel', 'hostel', 'chalet', 'guest_house', 'camp_site', 'caravan_site', \n                                          'theme_park', 'museum', 'zoo', 'information', 'picnic_site') THEN  [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1763,7 +1763,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    way_pixels,\n    feature,\n    access,\n    CONCAT(\n        name,\n        CASE WHEN name IS NOT NULL AND elevation IS NOT NULL THEN E'\\n' ELSE NULL END,\n        CASE WHEN elevation IS NOT NULL THEN CONCAT(REPLACE(ROUND(elevation)::TEXT, '-', U&'\\2212'), U&'\\00A0', 'm') ELSE NULL END\n    ) AS name,\n    CASE\n      WHEN \"natural\" IN ('peak', 'volcano', 'saddle') THEN elevation\n      ELSE NULL\n    END AS score,\n    operator,\n    ref,\n  [...]
+        "table": "(SELECT\n    way,\n    way_pixels,\n    feature,\n    access,\n    CONCAT(\n        name,\n        CASE WHEN name IS NOT NULL AND elevation IS NOT NULL THEN E'\\n' ELSE NULL END,\n        CASE WHEN elevation IS NOT NULL THEN CONCAT(REPLACE(ROUND(elevation)::TEXT, '-', U&'\\2212'), U&'\\00A0', 'm') ELSE NULL END\n    ) AS name,\n    CASE\n      WHEN \"natural\" IN ('peak', 'volcano', 'saddle') THEN elevation\n      ELSE NULL\n    END AS score,\n    operator,\n    ref,\n  [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -1997,7 +1997,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    amenity,\n    railway,\n    highway,\n    barrier,\n    man_made,\n    historic,\n    access,\n    name,\n    CASE WHEN amenity='waste_basket' THEN 2 ELSE 1 END AS prio\n  FROM planet_osm_point p\n  WHERE barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block')\n     OR highway IN ('mini_roundabout')\n     OR railway = 'level_crossing'\n     OR amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking', 'bench', 'waste_basket')\n     [...]
+        "table": "(SELECT\n    way,\n    COALESCE(\n      'highway_' || CASE WHEN highway IN ('mini_roundabout') THEN highway ELSE NULL END,\n      'railway_' || CASE WHEN railway IN ('level_crossing') THEN railway ELSE NULL END,\n      'amenity_' || CASE WHEN amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking', 'bench', 'waste_basket') THEN amenity ELSE NULL END,\n      'historic_' || CASE WHEN historic IN ('wayside_cross') THEN historic ELSE NULL END,\n      'man_made_' || C [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -2023,7 +2023,7 @@
       "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",
       "Datasource": {
         "extent": "-20037508,-20037508,20037508,20037508",
-        "table": "(SELECT\n    way,\n    amenity,\n    railway,\n    highway,\n    barrier,\n    man_made,\n    historic,\n    access,\n    name\n  FROM planet_osm_polygon\n  WHERE barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block')\n     OR highway IN ('mini_roundabout')\n     OR railway = 'level_crossing'\n         OR amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking')\n  ) AS amenity_low_priority_poly",
+        "table": "(SELECT\n    way,\n    COALESCE(\n      'amenity_' || CASE WHEN amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking') THEN amenity ELSE NULL END,\n      'barrier_' || CASE WHEN barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block') THEN barrier ELSE NULL END\n    )  AS feature,\n    access\n  FROM planet_osm_polygon p\n  WHERE amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking')\n     OR barrier IN ('bollard', 'gate', 'lift_gate', 'swing [...]
         "geometry_field": "way",
         "type": "postgis",
         "key_field": "",
@@ -2106,5 +2106,5 @@
   ],
   "minzoom": 0,
   "maxzoom": 22,
-  "description": "A faithful reimplementation of the standard OpenStreetMap style"
+  "description": "A general-purpose OpenStreetMap mapnik style, in CartoCSS"
 }
\ No newline at end of file
diff --git a/project.yaml b/project.yaml
index d4f8984..efbcaea 100644
--- a/project.yaml
+++ b/project.yaml
@@ -1,7 +1,7 @@
 scale: 1
 metatile: 2
 name: "OpenStreetMap Carto"
-description: "A faithful reimplementation of the standard OpenStreetMap style"
+description: "A general-purpose OpenStreetMap mapnik style, in CartoCSS"
 bounds: &world
   - -180
   - -85.05112877980659
@@ -278,7 +278,7 @@ Layer:
       table: |-
         (SELECT
             way, surface, 
-            COALESCE("natural", CASE WHEN landuse = 'forest' THEN 'wood' ELSE NULL END) AS "natural",
+            COALESCE(CASE WHEN landuse = 'forest' THEN 'wood' ELSE NULL END, "natural") AS "natural",
             CASE WHEN "natural" IN ('marsh', 'mud') 
                 THEN "natural" 
                 ELSE CASE WHEN ("natural" = 'wetland' AND wetland IS NULL) 
@@ -460,7 +460,7 @@ Layer:
           ORDER BY z_order, way_area DESC
         ) AS buildings
     properties:
-      minzoom: 12
+      minzoom: 13
     advanced: {}
   - id: "buildings-major"
     name: "buildings-major"
@@ -483,7 +483,7 @@ Layer:
           ORDER BY z_order, way_area DESC)
         AS buildings_major
     properties:
-      minzoom: 12
+      minzoom: 13
     advanced: {}
   - id: "tunnels"
     name: "tunnels"
@@ -508,11 +508,12 @@ Layer:
                 foot,
                 bicycle,
                 tracktype,
-                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 
-                                      'grass_paver', 'gravel', 'ground', 'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved' ELSE 
-                  CASE WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes', 
-                                        'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved' 
-                  ELSE null END END AS int_surface,
+                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'ground',
+                                      'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved'
+                  WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes',
+                                      'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved'
+                  ELSE NULL
+                END AS int_surface,
                 CASE WHEN access IN ('destination') THEN 'destination'::text
                   WHEN access IN ('no', 'private') THEN 'no'::text
                   ELSE NULL
@@ -792,11 +793,12 @@ Layer:
                 foot,
                 bicycle,
                 tracktype,
-                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 
-                                      'grass_paver', 'gravel', 'ground', 'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved' ELSE 
-                  CASE WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes', 
-                                        'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved' 
-                  ELSE null END END AS int_surface,
+                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'ground',
+                                      'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved'
+                  WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes',
+                                      'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved'
+                  ELSE NULL
+                END AS int_surface,
                 CASE WHEN access IN ('destination') THEN 'destination'::text
                   WHEN access IN ('no', 'private') THEN 'no'::text
                   ELSE NULL
@@ -938,23 +940,40 @@ Layer:
     <<: *extents
     Datasource:
       <<: *osm2pgsql
+      # This is one of the most complex layers, so it bears explaining in some detail
+      # It is necessary to
+      # - Have roads and railways in the same layer to get ordering right
+      # - Return two linestrings for ways which are both a road and railway
+      # - Compute z_order here, rather than rely on osm2pgsql z_order
       table: |-
-        (SELECT way, (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,
-                horse, foot, bicycle, tracktype, int_surface, access, construction,
-                service, oneway, link, layernotnull
-          FROM ( -- subselect that contains both roads and rail/aero
+        (SELECT
+            way,
+            (CASE WHEN substr(feature, length(feature)-3, 4) = 'link' THEN substr(feature, 0, length(feature)-4) ELSE feature END) AS feature,
+            horse,
+            foot,
+            bicycle,
+            tracktype,
+            int_surface,
+            access,
+            construction,
+            service,
+            oneway,
+            link,
+            layernotnull
+          FROM ( -- begin "features" subselect that contains both roads and rail/aero
             SELECT
                 way,
-                ('highway_' || highway) AS feature, --only motorway to tertiary links are accepted later on
+                ('highway_' || highway) AS feature, -- only motorway to tertiary links are accepted later on
                 horse,
                 foot,
                 bicycle,
                 tracktype,
-                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'ground', 
-                                      'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved' ELSE 
-                  CASE WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes', 
-                                        'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved' 
-                  ELSE null END END AS int_surface,
+                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'ground',
+                                      'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved'
+                  WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes',
+                                      'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved'
+                  ELSE NULL
+                END AS int_surface,
                 CASE WHEN access IN ('destination') THEN 'destination'::text
                   WHEN access IN ('no', 'private') THEN 'no'::text
                   ELSE NULL
@@ -992,7 +1011,7 @@ Layer:
                 foot,
                 bicycle,
                 tracktype,
-                'null',
+                'null' AS surface, -- Should be a SQL NULL?
                 CASE
                   WHEN access IN ('destination') THEN 'destination'::text
                   WHEN access IN ('no', 'private') THEN 'no'::text
@@ -1129,11 +1148,12 @@ Layer:
             ) AS feature,
             CASE WHEN tunnel = 'yes' OR tunnel = 'building_passage' OR covered = 'yes' THEN 'yes' ELSE 'no' END AS int_tunnel,
             CASE WHEN substr(highway, length(highway)-3, 4) = 'link' THEN 'yes' ELSE 'no' END AS link,
-                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'ground', 
-                                      'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved' ELSE 
-                  CASE WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes', 
-                                        'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved' 
-                  ELSE null END END AS int_surface
+            CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'ground',
+                                  'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved'
+              WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes',
+                                  'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved'
+              ELSE NULL
+            END AS int_surface
           FROM planet_osm_roads
           WHERE highway IS NOT NULL
             OR (railway IS NOT NULL AND railway != 'preserved'
@@ -1186,11 +1206,12 @@ Layer:
                 foot,
                 bicycle,
                 tracktype,
-                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 
-                                      'ground', 'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved' ELSE 
-                  CASE WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 
-                                        'concrete:lanes', 'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved' 
-                  ELSE null END END AS int_surface,
+                CASE WHEN surface IN ('unpaved', 'compacted', 'dirt', 'earth', 'fine_gravel', 'grass', 'grass_paver', 'gravel', 'ground',
+                                      'mud', 'pebblestone', 'salt', 'sand', 'woodchips', 'clay') THEN 'unpaved'
+                  WHEN surface IN ('paved', 'asphalt', 'cobblestone', 'cobblestone:flattened', 'sett', 'concrete', 'concrete:lanes',
+                                      'concrete:plates', 'paving_stones', 'metal', 'wood') THEN 'paved'
+                  ELSE NULL
+                END AS int_surface,
                 CASE WHEN access IN ('destination') THEN 'destination'::text
                   WHEN access IN ('no', 'private') THEN 'no'::text
                   ELSE NULL
@@ -1308,7 +1329,7 @@ Layer:
         (SELECT
             way
           FROM planet_osm_line
-          WHERE highway = 'bus_guideway' AND (tunnel IS NULL OR tunnel != 'yes')
+          WHERE highway = 'bus_guideway'
         ) AS guideways
     properties:
       minzoom: 13
@@ -1486,6 +1507,7 @@ Layer:
           WHERE boundary = 'administrative'
             AND admin_level IN ('2', '4')
             AND name IS NOT NULL
+            AND way_area > 750*!pixel_width!::real*!pixel_height!::real -- only labels for larger areas are displayed
           ORDER BY admin_level ASC, way_area DESC
         ) AS placenames_large
     properties:
@@ -1529,11 +1551,12 @@ Layer:
                 ) AS score
               FROM planet_osm_point
               WHERE place IN ('city', 'town')
+                AND name IS NOT NULL
             ) as p
-          ORDER BY score DESC
+          ORDER BY score DESC, length(name) DESC, name
         ) AS placenames_medium
     properties:
-      minzoom: 3
+      minzoom: 4
       maxzoom: 15
     advanced: {}
   - id: "placenames-small"
@@ -1559,7 +1582,7 @@ Layer:
               WHEN place = 'locality' THEN 7
               WHEN place = 'isolated_dwelling' THEN 8
               WHEN place = 'farm' THEN 9
-            END ASC
+            END ASC, length(name) DESC, name
         ) AS placenames_small
     properties:
       minzoom: 12
@@ -1633,7 +1656,7 @@ Layer:
                                                   'fast_food', 'telephone', 'emergency_phone', 'taxi', 'theatre', 'toilets', 'drinking_water', 
                                                   'prison', 'hunting_stand', 'nightclub', 'veterinary', 'social_facility') THEN amenity ELSE NULL END, 
               'shop_' || CASE WHEN shop IN ('supermarket', 'bag', 'bakery', 'beauty', 'books', 'butcher', 'clothes', 'computer', 
-                                            'confectionery', 'fashion', 'convenience', 'department_store', 'doityourself', 'hardware', 'florist', 
+                                            'confectionery', 'fashion', 'convenience', 'department_store', 'doityourself', 'hardware', 'fishmonger', 'florist', 
                                             'garden_centre', 'hairdresser', 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', 
                                             'photo', 'photo_studio', 'photography', 'seafood', 'shoes', 'alcohol', 'gift', 'furniture', 'kiosk', 
                                             'mobile_phone', 'motorcycle', 'musical_instrument', 'newsagent', 'optician', 'jewelry', 'jewellery', 
@@ -1714,7 +1737,7 @@ Layer:
                                                   'fast_food', 'telephone', 'emergency_phone', 'taxi', 'theatre', 'toilets', 'drinking_water', 
                                                   'prison', 'hunting_stand', 'nightclub', 'veterinary', 'social_facility') THEN amenity ELSE NULL END,
               'shop_' || CASE WHEN shop IN ('supermarket', 'bag', 'bakery', 'beauty', 'books', 'butcher', 'clothes', 'computer', 'confectionery', 
-                                            'fashion', 'convenience', 'department_store', 'doityourself', 'hardware', 'florist', 'garden_centre', 
+                                            'fashion', 'convenience', 'department_store', 'doityourself', 'hardware', 'fishmonger', 'florist', 'garden_centre', 
                                             'hairdresser', 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', 'photo', 'photo_studio', 
                                             'photography', 'seafood', 'shoes', 'alcohol', 'gift', 'furniture', 'kiosk', 'mobile_phone', 'motorcycle', 
                                             'musical_instrument', 'newsagent', 'optician', 'jewelry', 'jewellery', 'electronics', 'chemist', 'toys', 
@@ -2031,7 +2054,7 @@ Layer:
                                                   'recycling', 'telephone', 'emergency_phone', 'toilets', 'taxi', 'drinking_water', 'hunting_stand', 
                                                   'nightclub', 'veterinary', 'social_facility') THEN amenity ELSE NULL END,
               'shop_' || CASE WHEN shop IN ('supermarket', 'bag', 'bakery', 'beauty', 'books', 'butcher', 'clothes', 'computer', 'confectionery', 
-                                            'fashion', 'convenience', 'department_store', 'doityourself', 'hardware', 'florist', 'garden_centre', 
+                                            'fashion', 'convenience', 'department_store', 'doityourself', 'hardware', 'fishmonger', 'florist', 'garden_centre', 
                                             'hairdresser', 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', 'photo', 'photo_studio', 
                                             'photography', 'seafood', 'shoes', 'alcohol', 'gift', 'furniture', 'kiosk', 'mobile_phone', 'motorcycle', 
                                             'musical_instrument', 'newsagent', 'optician', 'jewelry', 'jewellery', 'electronics', 'chemist', 'toys', 
@@ -2067,7 +2090,7 @@ Layer:
               'highway_' || CASE WHEN highway IN ('services', 'rest_area', 'bus_stop', 'elevator', 'ford') THEN highway ELSE NULL END,
               'boundary_' || CASE WHEN boundary IN ('national_park') THEN boundary ELSE NULL END,
               'waterway_' || CASE WHEN waterway IN ('dam') THEN waterway ELSE NULL END,
-              'tourism_' || CASE WHEN tourism IN ('attraction') THEN tourism ELSE NULL END
+              'tourism_' || CASE WHEN tourism IN ('viewpoint', 'attraction') THEN tourism ELSE NULL END
             ) AS feature,
             access,
             name,
@@ -2079,7 +2102,7 @@ Layer:
           -- The upcoming where clause is needed for performance only, as the CASE statements would end up doing the equivalent filtering
           WHERE (aeroway IN ('gate', 'apron', 'helipad', 'aerodrome')
               OR tourism IN ('alpine_hut', 'hotel', 'motel', 'hostel', 'chalet', 'guest_house', 'camp_site', 'caravan_site', 'theme_park', 
-                             'museum', 'attraction', 'zoo', 'information', 'picnic_site')
+                             'museum', 'viewpoint', 'attraction', 'zoo', 'information', 'picnic_site')
               OR amenity IS NOT NULL -- skip checking a huge list and use a null check
               OR shop IS NOT NULL
               OR leisure IS NOT NULL
@@ -2170,7 +2193,7 @@ Layer:
                                                       'car_wash', 'post_box', 'post_office', 'recycling', 'telephone', 'emergency_phone', 'toilets', 'taxi', 
                                                       'drinking_water', 'hunting_stand', 'nightclub', 'veterinary', 'social_facility') THEN amenity ELSE NULL END,
                   'shop_' || CASE WHEN shop IN ('supermarket', 'bag','bakery', 'beauty', 'books', 'butcher', 'clothes', 'computer', 'confectionery', 'fashion', 
-                                                'convenience', 'department_store', 'doityourself', 'hardware', 'florist', 'garden_centre', 'hairdresser', 
+                                                'convenience', 'department_store', 'doityourself', 'hardware', 'fishmonger', 'florist', 'garden_centre', 'hairdresser', 
                                                 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', 'photo', 'photo_studio', 'photography', 
                                                 'seafood', 'shoes', 'alcohol', 'gift', 'furniture', 'kiosk', 'mobile_phone', 'motorcycle', 'musical_instrument', 
                                                 'newsagent', 'optician', 'jewelry', 'jewellery', 'electronics', 'chemist', 'toys', 'travel_agency', 'car_parts', 
@@ -2208,7 +2231,7 @@ Layer:
                   'highway_' || CASE WHEN highway IN ('services', 'rest_area', 'bus_stop', 'elevator', 'ford') THEN highway ELSE NULL END,
                   'boundary_' || CASE WHEN boundary IN ('national_park') THEN boundary ELSE NULL END,
                   'waterway_' || CASE WHEN waterway IN ('dam', 'weir') THEN waterway ELSE NULL END,
-                  'tourism_' || CASE WHEN tourism IN ('attraction', 'viewpoint') THEN tourism ELSE NULL END,
+                  'tourism_' || CASE WHEN tourism IN ('viewpoint', 'attraction') THEN tourism ELSE NULL END,
                   'man_made_' || CASE WHEN man_made IN ('cross') THEN man_made ELSE NULL END,
                   'historic_' || CASE WHEN historic IN ('wayside_cross') THEN historic ELSE NULL END
                 ) AS feature,
@@ -2231,7 +2254,7 @@ Layer:
               -- The upcoming where clause is needed for performance only, as the CASE statements would end up doing the equivalent filtering
               WHERE (aeroway IN ('gate', 'apron', 'helipad', 'aerodrome')
                   OR tourism IN ('alpine_hut', 'hotel', 'motel', 'hostel', 'chalet', 'guest_house', 'camp_site', 'caravan_site', 'theme_park', 
-                                 'museum', 'attraction', 'zoo', 'information', 'viewpoint', 'picnic_site')
+                                 'museum', 'viewpoint', 'attraction', 'zoo', 'information', 'picnic_site')
                   OR amenity IS NOT NULL -- skip checking a huge list and use a null check
                   OR shop IS NOT NULL
                   OR leisure IS NOT NULL
@@ -2436,22 +2459,23 @@ Layer:
       table: |-
         (SELECT
             way,
-            amenity,
-            railway,
-            highway,
-            barrier,
-            man_made,
-            historic,
+            COALESCE(
+              'highway_' || CASE WHEN highway IN ('mini_roundabout') THEN highway ELSE NULL END,
+              'railway_' || CASE WHEN railway IN ('level_crossing') THEN railway ELSE NULL END,
+              'amenity_' || CASE WHEN amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking', 'bench', 'waste_basket') THEN amenity ELSE NULL END,
+              'historic_' || CASE WHEN historic IN ('wayside_cross') THEN historic ELSE NULL END,
+              'man_made_' || CASE WHEN man_made IN ('cross') THEN man_made ELSE NULL END,
+              'barrier_' || CASE WHEN barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block') THEN barrier ELSE NULL END
+            )  AS feature,
             access,
-            name,
             CASE WHEN amenity='waste_basket' THEN 2 ELSE 1 END AS prio
           FROM planet_osm_point p
-          WHERE barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block')
-             OR highway IN ('mini_roundabout')
-             OR railway = 'level_crossing'
+          WHERE highway IN ('mini_roundabout')
+             OR railway IN ('level_crossing')
              OR amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking', 'bench', 'waste_basket')
-             OR historic = 'wayside_cross'
-             OR man_made = 'cross'
+             OR historic IN ('wayside_cross')
+             OR man_made IN ('cross')
+             OR barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block')
           ORDER BY prio
           ) AS amenity_low_priority
     properties:
@@ -2467,19 +2491,14 @@ Layer:
       table: |-
         (SELECT
             way,
-            amenity,
-            railway,
-            highway,
-            barrier,
-            man_made,
-            historic,
-            access,
-            name
-          FROM planet_osm_polygon
-          WHERE barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block')
-             OR highway IN ('mini_roundabout')
-             OR railway = 'level_crossing'
-                 OR amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking')
+            COALESCE(
+              'amenity_' || CASE WHEN amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking') THEN amenity ELSE NULL END,
+              'barrier_' || CASE WHEN barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block') THEN barrier ELSE NULL END
+            )  AS feature,
+            access
+          FROM planet_osm_polygon p
+          WHERE amenity IN ('parking', 'bicycle_parking', 'motorcycle_parking')
+             OR barrier IN ('bollard', 'gate', 'lift_gate', 'swing_gate', 'block')
           ) AS amenity_low_priority_poly
     properties:
       minzoom: 14
diff --git a/roads.mss b/roads.mss
index 87a40f1..96af10e 100644
--- a/roads.mss
+++ b/roads.mss
@@ -709,6 +709,8 @@
           }
         }
         [zoom >= 15] {
+          line-color: @bridge-casing;
+          line-join: round;
           line-width: @track-width-z15 + 2 * (@paths-background-width + @paths-bridge-casing-width);
           [tracktype = 'grade1'] {
             line-width: @track-grade1-width-z15 + 2 * (@paths-background-width + @paths-bridge-casing-width);
@@ -958,6 +960,8 @@
           }
         }
         [zoom >= 15] {
+          line-color: @track-casing;
+          line-join: round;
           line-width: @track-width-z15 + 2 * @paths-background-width;
           [tracktype = 'grade1'] {
             line-width: @track-grade1-width-z15 + 2 * @paths-background-width;
@@ -1823,14 +1827,14 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */
           light/line-color: white;
           light/line-join: round;
           [feature = 'railway_rail'] {
-            dark/line-color: #787878;
+            dark/line-color: #707070;
             dark/line-width: 3;
             light/line-width: 1;
             light/line-dasharray: 8,8;
             [zoom >= 15] {
               light/line-dasharray: 0,8,8,1;
             }
-            [zoom >= 19] {
+            [zoom >= 18] {
               dark/line-width: 4;
               light/line-width: 2;
             }
@@ -1840,6 +1844,10 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */
             dark/line-color: #aaa;
             light/line-width: 0.8;
             light/line-dasharray: 0,8,8,1;
+            [zoom >= 18] {
+              dark/line-width: 3;
+              light/line-width: 1;
+            }
           }
         }
         .tunnels-fill {
@@ -1851,8 +1859,11 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */
             line-color: #aaa;
             line-width: 1.9;
             line-dasharray: 3,3;
+            [zoom >= 18] {
+            line-width: 2.7;
+            }
           }
-          [feature = 'railway_rail'][zoom >= 19] {
+          [feature = 'railway_rail'][zoom >= 18] {
             line-dasharray: 8,6;
             line-width: 3.8;
           }
@@ -2060,107 +2071,108 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */
 #turning-circle-casing {
   [int_tc_type = 'tertiary'][zoom >= 15] {
     marker-fill: @tertiary-casing;
-    marker-width: (@tertiary-width-z15 - 2 * @casing-width-z15) * 1.8 + 2 * @casing-width-z15;
-    marker-height: (@tertiary-width-z15 - 2 * @casing-width-z15) * 1.8 + 2 * @casing-width-z15;
+    marker-width: @tertiary-width-z15 * 1.6 + 2 * @casing-width-z15;
+    marker-height: @tertiary-width-z15 * 1.6 + 2 * @casing-width-z15;
     [zoom >= 16] {
-      marker-width: (@tertiary-width-z16 - 2 * @casing-width-z16) * 1.8 + 2 * @casing-width-z16;
-      marker-height: (@tertiary-width-z16 - 2 * @casing-width-z16) * 1.8 + 2 * @casing-width-z16;
+      marker-width: @tertiary-width-z16 * 1.6 + 2 * @casing-width-z16;
+      marker-height: @tertiary-width-z16 * 1.6 + 2 * @casing-width-z16;
     }
     [zoom >= 17] {
-      marker-width: (@tertiary-width-z17 - 2 * @casing-width-z17) * 1.8 + 2 * @casing-width-z17;
-      marker-height: (@tertiary-width-z17 - 2 * @casing-width-z17) * 1.8 + 2 * @casing-width-z17;
+      marker-width: @tertiary-width-z17 * 1.6 + 2 * @casing-width-z17;
+      marker-height: @tertiary-width-z17 * 1.6 + 2 * @casing-width-z17;
     }
     [zoom >= 18] {
-      marker-width: (@tertiary-width-z18 - 2 * @casing-width-z18) * 1.8 + 2 * @casing-width-z18;
-      marker-height: (@tertiary-width-z18 - 2 * @casing-width-z18) * 1.8 + 2 * @casing-width-z18;
+      marker-width: @tertiary-width-z18 * 1.6 + 2 * @casing-width-z18;
+      marker-height: @tertiary-width-z18 * 1.6 + 2 * @casing-width-z18;
     }
     [zoom >= 19] {
-      marker-width: (@tertiary-width-z19 - 2 * @casing-width-z19) * 1.8 + 2 * @casing-width-z19;
-      marker-height: (@tertiary-width-z19 - 2 * @casing-width-z19) * 1.8 + 2 * @casing-width-z19;
+      marker-width: @tertiary-width-z19 * 1.6 + 2 * @casing-width-z19;
+      marker-height: @tertiary-width-z19 * 1.6 + 2 * @casing-width-z19;
     }
     marker-allow-overlap: true;
     marker-ignore-placement: true;
     marker-line-width: 0;
   }
 
-  [int_tc_type = 'residential'],
-  [int_tc_type = 'unclassified'] {
-    [zoom >= 15] {
-      marker-fill: @residential-casing;
-      marker-width: (@residential-width-z15 - 2 * @casing-width-z15) * 1.8 + 2 * @casing-width-z15;
-      marker-height: (@residential-width-z15 - 2 * @casing-width-z15) * 1.8 + 2 * @casing-width-z15;
-      [zoom >= 16] {
-        marker-width: (@residential-width-z16 - 2 * @casing-width-z16) * 1.8 + 2 * @casing-width-z16;
-        marker-height: (@residential-width-z16 - 2 * @casing-width-z16) * 1.8 + 2 * @casing-width-z16;
-      }
-      [zoom >= 17] {
-        marker-width: (@residential-width-z17 - 2 * @casing-width-z17) * 1.8 + 2 * @casing-width-z17;
-        marker-height: (@residential-width-z17 - 2 * @casing-width-z17) * 1.8 + 2 * @casing-width-z17;
-      }
-      [zoom >= 18] {
-        marker-width: (@residential-width-z18 - 2 * @casing-width-z18) * 1.8 + 2 * @casing-width-z18;
-        marker-height: (@residential-width-z18 - 2 * @casing-width-z18) * 1.8 + 2 * @casing-width-z18;
-      }
-      [zoom >= 19] {
-        marker-width: (@residential-width-z19 - 2 * @casing-width-z19) * 1.8 + 2 * @casing-width-z19;
-        marker-height: (@residential-width-z19 - 2 * @casing-width-z19) * 1.8 + 2 * @casing-width-z19;
-      }
-      marker-allow-overlap: true;
-      marker-ignore-placement: true;
-      marker-line-width: 0;
+  [int_tc_type = 'residential'][zoom >= 15],
+  [int_tc_type = 'unclassified'][zoom >= 15] {
+    marker-fill: @residential-casing;
+    marker-width: @residential-width-z15 * 1.6 + 2 * @casing-width-z15;
+    marker-height: @residential-width-z15 * 1.6 + 2 * @casing-width-z15;
+    [zoom >= 16] {
+      marker-width: @residential-width-z16 * 1.6 + 2 * @casing-width-z16;
+      marker-height: @residential-width-z16 * 1.6 + 2 * @casing-width-z16;
     }
+    [zoom >= 17] {
+      marker-width: @residential-width-z17 * 1.6 + 2 * @casing-width-z17;
+      marker-height: @residential-width-z17 * 1.6 + 2 * @casing-width-z17;
+    }
+    [zoom >= 18] {
+      marker-width: @residential-width-z18 * 1.6 + 2 * @casing-width-z18;
+      marker-height: @residential-width-z18 * 1.6 + 2 * @casing-width-z18;
+    }
+    [zoom >= 19] {
+      marker-width: @residential-width-z19 * 1.6 + 2 * @casing-width-z19;
+      marker-height: @residential-width-z19 * 1.6 + 2 * @casing-width-z19;
+    }
+    marker-allow-overlap: true;
+    marker-ignore-placement: true;
+    marker-line-width: 0;
   }
 
   [int_tc_type = 'living_street'][zoom >= 15] {
     marker-fill: @living-street-casing;
-    marker-width: 14;
-    marker-height: 14;
+    marker-width: @living-street-width-z15 * 1.6 + 2 * @casing-width-z15;
+    marker-height: @living-street-width-z15 * 1.6 + 2 * @casing-width-z15;
     [zoom >= 16] {
-      marker-width: 18;
-      marker-height: 18;
+      marker-width: @living-street-width-z16 * 1.6 + 2 * @casing-width-z16;
+      marker-height: @living-street-width-z16 * 1.6 + 2 * @casing-width-z16;
     }
     [zoom >= 17] {
-      marker-width: 24;
-      marker-height: 24;
+      marker-width: @living-street-width-z17 * 1.6 + 2 * @casing-width-z17;
+      marker-height: @living-street-width-z17 * 1.6 + 2 * @casing-width-z17;
     }
     [zoom >= 18] {
-      marker-width: 27;
-      marker-height: 27;
+      marker-width: @living-street-width-z18 * 1.6 + 2 * @casing-width-z18;
+      marker-height: @living-street-width-z18 * 1.6 + 2 * @casing-width-z18;
     }
     [zoom >= 19] {
-      marker-width: 38;
-      marker-height: 38;
+      marker-width: @living-street-width-z19 * 1.6 + 2 * @casing-width-z19;
+      marker-height: @living-street-width-z19 * 1.6 + 2 * @casing-width-z19;
     }
     marker-allow-overlap: true;
     marker-ignore-placement: true;
     marker-line-width: 0;
   }
 
-  [int_tc_type = 'service'][zoom >= 16] {
+  [int_tc_type = 'service'][int_tc_service = 'INT-normal'][zoom >= 16] {
     marker-fill: @service-casing;
-    [int_tc_service = 'INT-normal'] {
-      marker-width: 14;
-      marker-height: 14;
-      [zoom >= 17] {
-        marker-width: 16;
-        marker-height: 16;
-      }
-      [zoom >= 18] {
-        marker-width: 20;
-        marker-height: 20;
-      }
-      [zoom >= 19] {
-        marker-width: 30;
-        marker-height: 30;
-      }
+    marker-width: @service-width-z16 * 1.6 + 2 * @casing-width-z16;
+    marker-height: @service-width-z16 * 1.6 + 2 * @casing-width-z16;
+    [zoom >= 17] {
+      marker-width: @service-width-z17 * 1.6 + 2 * @casing-width-z17;
+      marker-height: @service-width-z17 * 1.6 + 2 * @casing-width-z17;
     }
-    [int_tc_service = 'INT-minor'] {
-      marker-width: 12;
-      marker-height: 12;
-      [zoom >= 19] {
-        marker-width: 16;
-        marker-height: 16;
-      }
+    [zoom >= 18] {
+      marker-width: @service-width-z18 * 1.6 + 2 * @casing-width-z18;
+      marker-height: @service-width-z18 * 1.6 + 2 * @casing-width-z18;
+    }
+    [zoom >= 19] {
+      marker-width: @service-width-z19 * 1.6 + 2 * @casing-width-z19;
+      marker-height: @service-width-z19 * 1.6 + 2 * @casing-width-z19;
+    }
+    marker-allow-overlap: true;
+    marker-ignore-placement: true;
+    marker-line-width: 0;
+  }
+
+  [int_tc_type = 'service'][int_tc_service = 'INT-minor'][zoom >= 18] {
+    marker-fill: @service-casing;
+    marker-width: @minor-service-width-z18 * 1.6 + 2 * @casing-width-z18;
+    marker-height: @minor-service-width-z18 * 1.6 + 2 * @casing-width-z18;
+    [zoom >= 19] {
+      marker-width: @minor-service-width-z19 * 1.6 + 2 * @casing-width-z19;
+      marker-height: @minor-service-width-z19 * 1.6 + 2 * @casing-width-z19;
     }
     marker-allow-overlap: true;
     marker-ignore-placement: true;
@@ -2171,19 +2183,23 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */
 #turning-circle-fill {
   [int_tc_type = 'tertiary'][zoom >= 15] {
     marker-fill: @tertiary-fill;
-    marker-width: (@tertiary-width-z15 - 2 * @casing-width-z15) * 1.8;
-    marker-height: (@tertiary-width-z15 - 2 * @casing-width-z15) * 1.8;
+    marker-width: @tertiary-width-z15 * 1.6;
+    marker-height: @tertiary-width-z15 * 1.6;
+    [zoom >= 16] {
+      marker-width: @tertiary-width-z16 * 1.6;
+      marker-height: @tertiary-width-z16 * 1.6;
+    }
     [zoom >= 17] {
-      marker-width: (@tertiary-width-z17 - 2 * @casing-width-z17) * 1.8;
-      marker-height: (@tertiary-width-z17 - 2 * @casing-width-z17) * 1.8;
+      marker-width: @tertiary-width-z17 * 1.6;
+      marker-height: @tertiary-width-z17 * 1.6;
     }
     [zoom >= 18] {
-      marker-width: (@tertiary-width-z18 - 2 * @casing-width-z18) * 1.8;
-      marker-height: (@tertiary-width-z18 - 2 * @casing-width-z18) * 1.8;
+      marker-width: @tertiary-width-z18 * 1.6;
+      marker-height: @tertiary-width-z18 * 1.6;
     }
     [zoom >= 19] {
-      marker-width: (@tertiary-width-z19 - 2 * @casing-width-z19) * 1.8;
-      marker-height: (@tertiary-width-z19 - 2 * @casing-width-z19) * 1.8;
+      marker-width: @tertiary-width-z19 * 1.6;
+      marker-height: @tertiary-width-z19 * 1.6;
     }
     marker-allow-overlap: true;
     marker-ignore-placement: true;
@@ -2194,23 +2210,23 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */
   [int_tc_type = 'unclassified'] {
     [zoom >= 15] {
       marker-fill: @residential-fill;
-      marker-width: (@residential-width-z15 - 2 * @casing-width-z15) * 1.8;
-      marker-height: (@residential-width-z15 - 2 * @casing-width-z15) * 1.8;
+      marker-width: @residential-width-z15 * 1.6;
+      marker-height: @residential-width-z15 * 1.6;
       [zoom >= 16] {
-        marker-width: (@residential-width-z16 - 2 * @casing-width-z16) * 1.8;
-        marker-height: (@residential-width-z16 - 2 * @casing-width-z16) * 1.8;
+        marker-width: @residential-width-z16 * 1.6;
+        marker-height: @residential-width-z16 * 1.6;
       }
       [zoom >= 17] {
-        marker-width: (@residential-width-z17 - 2 * @casing-width-z17) * 1.8;
-        marker-height: (@residential-width-z17 - 2 * @casing-width-z17) * 1.8;
+        marker-width: @residential-width-z17 * 1.6;
+        marker-height: @residential-width-z17 * 1.6;
       }
       [zoom >= 18] {
-        marker-width: (@residential-width-z18 - 2 * @casing-width-z18) * 1.8;
-        marker-height: (@residential-width-z18 - 2 * @casing-width-z18) * 1.8;
+        marker-width: @residential-width-z18 * 1.6;
+        marker-height: @residential-width-z18 * 1.6;
       }
       [zoom >= 19] {
-        marker-width: (@residential-width-z19 - 2 * @casing-width-z19) * 1.8;
-        marker-height: (@residential-width-z19 - 2 * @casing-width-z19) * 1.8;
+        marker-width: @residential-width-z19 * 1.6;
+        marker-height: @residential-width-z19 * 1.6;
       }
       marker-allow-overlap: true;
       marker-ignore-placement: true;
@@ -2220,54 +2236,57 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */
 
   [int_tc_type = 'living_street'][zoom >= 15] {
     marker-fill: @living-street-fill;
-    marker-width: 12;
-    marker-height: 12;
+    marker-width: @living-street-width-z15 * 1.6;
+    marker-height: @living-street-width-z15 * 1.6;
     [zoom >= 16] {
-      marker-width: 16;
-      marker-height: 16;
+      marker-width: @living-street-width-z16 * 1.6;
+      marker-height: @living-street-width-z16 * 1.6;
     }
     [zoom >= 17] {
-      marker-width: 22;
-      marker-height: 22;
+      marker-width: @living-street-width-z17 * 1.6;
+      marker-height: @living-street-width-z17 * 1.6;
     }
     [zoom >= 18] {
-      marker-width: 25;
-      marker-height: 25;
+      marker-width: @living-street-width-z18 * 1.6;
+      marker-height: @living-street-width-z18 * 1.6;
     }
     [zoom >= 19] {
-      marker-width: 36;
-      marker-height: 36;
+      marker-width: @living-street-width-z19 * 1.6;
+      marker-height: @living-street-width-z19 * 1.6;
     }
     marker-allow-overlap: true;
     marker-ignore-placement: true;
     marker-line-width: 0;
   }
 
-  [int_tc_type = 'service'][zoom >= 16] {
+  [int_tc_type = 'service'][int_tc_service = 'INT-normal'][zoom >= 16] {
     marker-fill: @service-fill;
-    [int_tc_service = 'INT-normal'] {
-      marker-width: 12;
-      marker-height: 12;
-      [zoom >= 17] {
-        marker-width: 14;
-        marker-height: 14;
-      }
-      [zoom >= 18] {
-        marker-width: 18;
-        marker-height: 18;
-      }
-      [zoom >= 19] {
-        marker-width: 28;
-        marker-height: 28;
-      }
+    marker-width: @service-width-z16 * 1.6;
+    marker-height: @service-width-z16 * 1.6;
+    [zoom >= 17] {
+      marker-width: @service-width-z17 * 1.6;
+      marker-height: @service-width-z17 * 1.6;
     }
-    [int_tc_service = 'INT-minor'] {
-      marker-width: 10;
-      marker-height: 10;
-      [zoom >= 19] {
-        marker-width: 14;
-        marker-height: 14;
-      }
+    [zoom >= 18] {
+      marker-width: @service-width-z18 * 1.6;
+      marker-height: @service-width-z18 * 1.6;
+    }
+    [zoom >= 19] {
+      marker-width: @service-width-z19 * 1.6;
+      marker-height: @service-width-z19 * 1.6;
+    }
+    marker-allow-overlap: true;
+    marker-ignore-placement: true;
+    marker-line-width: 0;
+  }
+
+  [int_tc_type = 'service'][int_tc_service = 'INT-minor'][zoom >= 18] {
+    marker-fill: @service-fill;
+    marker-width: @minor-service-width-z18 * 1.6;
+    marker-height: @minor-service-width-z18 * 1.6;
+    [zoom >= 19] {
+      marker-width: @minor-service-width-z19 * 1.6;
+      marker-height: @minor-service-width-z19 * 1.6;
     }
     marker-allow-overlap: true;
     marker-ignore-placement: true;
diff --git a/scripts/README.md b/scripts/README.md
new file mode 100644
index 0000000..c2f6463
--- /dev/null
+++ b/scripts/README.md
@@ -0,0 +1,3 @@
+These scripts are necessary and useful solely during making changes to the map style.
+
+There are unnecessary for map rendering.
\ No newline at end of file
diff --git a/scripts/indexes.py b/scripts/indexes.py
new file mode 100755
index 0000000..a004313
--- /dev/null
+++ b/scripts/indexes.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+
+# This script takes a YAML file defining indexes and creates SQL statements
+# There are a number of options for concurrent index creation, recreating the
+# osm2pgsql-built indexes, fillfactors, and other settings to give full control
+# of the resulting statements
+# indexes.sql is created by this script, with the default options
+
+from __future__ import print_function
+import argparse, sys, os, yaml
+
+def index_statement(table, name, conditions=None, concurrent=False,notexist=False, fillfactor=None):
+    options = ' CONCURRENTLY' if concurrent else ''
+    options += ' IF NOT EXISTS' if notexist else ''
+    storage = '' if fillfactor is None else '\n  WITH (fillfactor={})'.format(fillfactor)
+    where = '' if conditions is None else '\n  WHERE {}'.format(conditions)
+    return ('CREATE INDEX{options} {table}_{name}\n' +
+            '  ON {table} USING GIST (way)' +
+            '{storage}' +
+            '{where};\n').format(table="planet_osm_"+table, name=name,
+                storage=storage, options=options, where=where)
+
+def parse(cb):
+    with open(os.path.join(os.path.dirname(__file__), '../indexes.yml')) as yaml_file:
+        indexes = yaml.safe_load(yaml_file)
+
+    for table, data in indexes.iteritems():
+        for name, definition in data.iteritems():
+            cb(table, name, definition["where"])
+
+# The same as parse, but for osm2pgsql-built indexes
+def osm2pgsql_parse(cb):
+    cb('point', 'index', None)
+    cb('line', 'index', None)
+    cb('polygon', 'index', None)
+    cb('roads', 'index', None)
+
+parser = argparse.ArgumentParser(description='Generates custom index statements')
+parser.add_argument('--concurrent', dest='concurrent', help='Generate indexes CONCURRENTLY', action='store_true', default=False)
+parser.add_argument('--fillfactor', help='Custom fillfactor to use')
+parser.add_argument('--notexist', help='Use IF NOT EXISTS (requires 9.5)', action='store_true', default=False)
+parser.add_argument('--osm2pgsql', help='Include indexes normally built by osm2pgsql', action='store_true', default=False)
+parser.add_argument('--reindex', help='Rebuild existing indexes', action='store_true', default=False)
+args = parser.parse_args()
+
+def cb (table, name, where):
+    print(index_statement(table, name, where, args.concurrent, args.notexist, args.fillfactor), end='')
+
+def reindex_cb(table, name, where):
+    if not args.concurrent:
+        print('REINDEX planet_osm_{table}_{name};'.format(table=table, name=name))
+    else:
+        # Rebuilding indexes concurently requires making a new index, dropping the old one, and renaming.
+        print('ALTER INDEX planet_osm_{table}_{name} RENAME TO planet_osm_{table}_{name}_old;'.format(table=table, name=name))
+        cb(table, name, where)
+        print('DROP INDEX planet_osm_{table}_{name}_old;\n'.format(table=table, name=name))
+
+print(('-- These are optional but suggested indexes for rendering OpenStreetMap Carto\n'+
+      '-- with a full planet database.\n'
+      '-- This file is generated with {}\n').format(' '.join(sys.argv)))
+
+if not args.reindex:
+    parse(cb)
+else:
+    parse(reindex_cb)
+
+if args.osm2pgsql:
+    print('\n-- These indexes are normally built by osm2pgsql')
+    if not args.reindex:
+        osm2pgsql_parse(cb)
+    else:
+        osm2pgsql_parse(reindex_cb)
diff --git a/scripts/shop_values.rb b/scripts/shop_values.rb
index 46f6c54..5dec9a8 100755
--- a/scripts/shop_values.rb
+++ b/scripts/shop_values.rb
@@ -1,4 +1,8 @@
 #!/usr/bin/ruby
+
+#this script generates list of popular shop values - more than MIN_COUNT occurences in OpenStreetMap database according to taginfo
+#it is useful during creating/updating list of shops displayed with generic dot icon
+
 require 'net/http'
 require 'json'
 require 'pp'
@@ -25,6 +29,8 @@ EXCEPTIONS = [
    "gambling", #see https://github.com/gravitystorm/openstreetmap-carto/pull/1900
    "insurance", #see https://github.com/gravitystorm/openstreetmap-carto/pull/1900
    "pharmacy", #see https://github.com/gravitystorm/openstreetmap-carto/pull/1900
+   "street_vendor", #see https://github.com/gravitystorm/openstreetmap-carto/issues/2090
+   "storage_rental", #see https://github.com/gravitystorm/openstreetmap-carto/issues/2090
 ]
 
 
diff --git a/symbols/library.14.svg b/symbols/library.14.svg
new file mode 100644
index 0000000..dba9828
--- /dev/null
+++ b/symbols/library.14.svg
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   id="svg2"
+   viewBox="0 0 16 16"
+   height="100%"
+   width="100%"
+   version="1.1">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <rect
+     width="16"
+     height="16"
+     x="0"
+     y="0"
+     id="rect4174"
+     style="visibility:hidden;fill:none;stroke:none" />
+  <path
+     id="path4176"
+     d="M 3.5917969,2.8769531 C 3.39328,2.8849528 3.1958998,2.9246486 3,3 l 0,8 c 0,0 3.1875,-0.125 4,3 L 7,5.5996094 C 6.38001,4.2940108 4.9814151,2.8209552 3.5917969,2.8769531 Z M 7,14 C 4.9375,12.40625 2,12 2,12 L 2,4.4003906 1,4 l 0,9 6,2 2,0 6,-2 0,-9 -1,0.4003906 0,8.0000004 L 9,14 C 8.333333,13.74532 7.556181,13.790637 7,14 Z M 13,3 C 11.00748,2.8934496 8.7073046,4.0896818 7.5,5.1191406 l 0,8.4648434 c 1.1147712,-0.924639 3.113583,-2.141273 5.5,-2.384765 z"
+     style="fill:#734a08;fill-opacity:1;stroke:none" />
+</svg>
diff --git a/symbols/library.p.20.png b/symbols/library.p.20.png
deleted file mode 100644
index b38c4d1..0000000
Binary files a/symbols/library.p.20.png and /dev/null differ
diff --git a/symbols/shop_books.16.svg b/symbols/shop_books.16.svg
deleted file mode 100644
index 3128c51..0000000
--- a/symbols/shop_books.16.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns="http://www.w3.org/2000/svg"
-   version="1.1"
-   width="100%"
-   height="100%"
-   viewBox="0 0 16 16">
-  <path
-     d="M 3,1 C 1.4915254,1 1,2 1,3 1.02381,4 1.5423729,5 3,5 L 13,5 12,4 3,4 C 2,4 2,3 2,3 2,3 2,2 3,2 L 12,2 13,1 3,1 z m 0,1.75 0,0.5 9,0 0,-0.5 -9,0 z M 5,6 C 3.4915254,6 3,7 3,8 3.02381,9 3.5423729,10 5,10 L 15,10 14,9 5,9 C 4,9 4,8 4,8 4,8 4,7 5,7 L 14,7 15,6 5,6 z m 0,1.75 0,0.5 9,0 0,-0.5 -9,0 z M 3,11 c -1.5084746,0 -2,1 -2,2 0.02381,1 0.5423729,2 2,2 l 10,0 -1,-1 -9,0 C 2,14 2,13 2,13 2,13 2,12 3,12 l 9,0 1,-1 -10,0 z m 0,1.75 0,0.5 9,0 0,-0.5 -9,0 z" />
-</svg>

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/openstreetmap-carto.git



More information about the Pkg-grass-devel mailing list