diff --git a/CARTOGRAPHY.md b/CARTOGRAPHY.md index e93597c8fd..68543ed2f2 100644 --- a/CARTOGRAPHY.md +++ b/CARTOGRAPHY.md @@ -18,7 +18,7 @@ This style has multiple purposes: * It's an important feedback mechanism for mappers to validate their edits and helps to prevent unfavorable fragmentation of tag use. * It's a major part of the public face of OpenStreetMap, for many people the map on osm.org rendered with this style _is_ OpenStreetMap. * It's used in many map applications as a general purpose map. -* It's an examplar stylesheet for rendering OSM data. +* It's an exemplar stylesheet for rendering OSM data. There is no ranking of these purposes. To allow serving all of them and to avoid satisfying only some at the cost of the others the following main goals diff --git a/CHANGELOG.md b/CHANGELOG.md index bce69672c5..1cc9ce6139 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ -## [Unreleased](https://github.com/gravitystorm/openstreetmap-carto/compare/v3.1.0...master) +## [Unreleased](https://github.com/gravitystorm/openstreetmap-carto/compare/v3.2.0...master) + +## [v3.2.0](https://github.com/gravitystorm/openstreetmap-carto/compare/v3.1.0...v3.2.0) - 2017-04-17 +### Changes +- Render aeroway terminal buildings like other buildings +- Removed rendering of `landuse=farm` +- Added rendering for arts centre, fitness centre, plant nursery, mixed lift aerialways +- Rendering for fens changed +- Typography for point road-related features, addresses, and water features changed +- Removed rendering of `waterway=canal` as an area +- Take text properties of roads under construction from the type of road they will be ## [v3.1.0](https://github.com/gravitystorm/openstreetmap-carto/compare/v3.0.1...v3.1.0) - 2017-01-28 ### Changes diff --git a/INSTALL.md b/INSTALL.md index bef96167a7..c2987e21aa 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -43,13 +43,15 @@ The repeated www.naturalearthdata.com in the Natural Earth shapefiles is correct Put these shapefiles at `path/to/openstreetmap-carto/data`. ## Fonts -The stylesheet uses Noto Sans, an openly licensed font from Google with support for multiple scripts. The "UI" version is used where available, with its vertical metrics which fit better with Latin text. Other fonts from the Noto family are used for some other languages. +The stylesheet uses Noto, an openly licensed font family from Google with support for multiple scripts. The stylesheet uses Noto's "Sans" style where available. If not available, this stylesheet uses another appropriate style of the Noto family. The "UI" version is used where available, with its vertical metrics which fit better with Latin text. DejaVu Sans is used as an optional fallback font for systems without Noto Sans. If all the Noto fonts are installed, it should never be used. Unifont is used as a last resort fallback, with it's excellent coverage, common presence on machines, and ugly look. -On Ubuntu 16.04 or Debian Testing you can install the required fonts except Noto Emoji Regular with +### Installation on Ubuntu/Debian + +On Ubuntu 16.04 or Debian Testing you can download and install the required fonts except Noto Emoji Regular with ``` sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont @@ -61,6 +63,16 @@ It might be useful to have a more recent version of the fonts for [rare non-lati DejaVu is packaged as `fonts-dejavu-core`. +### Installation on other operation systems + +The fonts can be downloaded here: + +* [Noto homepage](http://www.google.com/get/noto/) and [Noto github repositories](http://github.com/googlei18n?utf8=%E2%9C%93&q=noto) +* [DejaVu homepage](http://dejavu-fonts.org/) +* [Unifont homepage](http://unifoundry.com/) + +After the download, you have to install the font files in the usual way of your operation system. + ### Non-latin scripts For proper rendering of non-latin scripts, particularly those with complicated diacritics and tone marks the requirements are diff --git a/README.md b/README.md index 22eb1a9b29..361da6216e 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ maps using Mapnik, many based on this project. Some alternatives are: * [OSM-Bright](https://github.com/mapbox/osm-bright) * [XML-based stylesheets](https://trac.openstreetmap.org/browser/subversion/applications/rendering/mapnik) * [osmfr-cartocss](https://github.com/cquest/osmfr-cartocss) -* [openstreetmap-carto-german](https://github.com/woodpeck/openstreetmap-carto-german) +* [openstreetmap-carto-german](https://github.com/giggls/openstreetmap-carto-de) # Maintainers diff --git a/RELEASES.md b/RELEASES.md index 2321bc5a05..5b1cbb130b 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -7,6 +7,7 @@ Throughout this document, replace $OLD_VERSION with the previous release and $NE 1. Update your local master branch 2. Review the changes in git since the last release with a command like `git log --graph $OLD_VERSION...master` or online at https://github.com/gravitystorm/openstreetmap-carto/compare/$OLD_VERSION...master 3. Review [pull requests](https://github.com/gravitystorm/openstreetmap-carto/pulls) for anything that should be merged before release +4. Check [`preview.png`](preview.png) and update it if needed. Preferred way is to import current Chicago data, export new image (for example from Kosmtik via [this link](http://127.0.0.1:6789/openstreetmap-carto/export/?showExtent=true&format=png&width=849&height=310&scale=1&zoom=15&bounds=-87.65145778656006%2C41.86914537674214%2C-87.61502265930177%2C41.8790515319021)) and upload as new version of this file Decide among the maintainers if a new release is due. @@ -54,4 +55,4 @@ https://github.com/gravitystorm/openstreetmap-carto/issues. 3. Post an [openstreetmap.org diary entry](http://www.openstreetmap.org/diary/new) with the text from the email. Add links and other markdown if needed. -4. *Optional: Post on twitter with a link to the diary entry.* \ No newline at end of file +4. *Optional: Post on twitter with a link to the diary entry.* diff --git a/addressing.mss b/addressing.mss index 7a525c4b49..ccc8ff57f8 100644 --- a/addressing.mss +++ b/addressing.mss @@ -21,14 +21,17 @@ } text-placement: interior; text-min-distance: 1; - text-wrap-width: 20; text-face-name: @book-fonts; text-fill: @address-color; text-halo-radius: @standard-halo-radius; text-halo-fill: @standard-halo-fill; text-size: 10; + text-wrap-width: 20; // 2.0 em + text-line-spacing: -1.5; // -0.15 em [zoom >= 20] { text-size: 11; + text-wrap-width: 22; // 2.0 em + text-line-spacing: -1.65; // -0.15 em } } } @@ -41,11 +44,12 @@ no official postal addresses) */ [zoom >= 17] { text-name: "[name]"; text-placement: interior; - text-wrap-width: 20; text-face-name: @book-fonts; text-fill: #444; text-halo-radius: @standard-halo-radius; text-halo-fill: @standard-halo-fill; text-size: 11; + text-wrap-width: 22; // 2.0 em + text-line-spacing: -1.65; // -0.15 em } } diff --git a/aerialways.mss b/aerialways.mss index 7cd915416c..0a0e5cf7c0 100644 --- a/aerialways.mss +++ b/aerialways.mss @@ -1,6 +1,7 @@ #aerialways { [aerialway = 'cable_car'], - [aerialway = 'gondola'] { + [aerialway = 'gondola'], + [aerialway = 'mixed_lift'] { [zoom >= 12] { line/line-width: 1; line/line-join: round; diff --git a/amenity-points.mss b/amenity-points.mss index be5b115d55..0cba35b0f2 100644 --- a/amenity-points.mss +++ b/amenity-points.mss @@ -501,6 +501,13 @@ marker-clip: false; } + [feature = 'amenity_arts_centre'][zoom >= 17] { + marker-file: url('symbols/shop/art.svg'); + marker-fill: @amenity-brown; + marker-placement: interior; + marker-clip: false; + } + [feature = 'amenity_toilets'][zoom >= 17] { marker-file: url('symbols/toilets.svg'); marker-fill: @amenity-brown; @@ -1233,7 +1240,8 @@ [feature = 'amenity_theatre'], [feature = 'amenity_courthouse'], [feature = 'amenity_townhall'], - [feature = 'amenity_cinema'] { + [feature = 'amenity_cinema'], + [feature = 'amenity_arts_centre'] { [zoom >= 17] { text-name: "[name]"; text-size: @standard-text-size; @@ -1248,7 +1256,8 @@ [feature = 'amenity_library'], [feature = 'tourism_museum'], [feature = 'amenity_theatre'], - [feature = 'amenity_cinema'] { + [feature = 'amenity_cinema'], + [feature = 'amenity_arts_centre'] { text-dy: 11; } } @@ -1549,6 +1558,7 @@ [feature = 'landuse_quarry'], [feature = 'landuse_vineyard'], [feature = 'landuse_orchard'], + [feature = 'landuse_plant_nursery'], [feature = 'landuse_cemetery'], [feature = 'amenity_grave_yard'], [feature = 'landuse_residential'], @@ -1581,6 +1591,7 @@ [feature = 'natural_beach'], [feature = 'natural_shoal'], [feature = 'natural_reef'], + [feature = 'leisure_fitness_centre'], [feature = 'leisure_sports_centre'], [feature = 'leisure_stadium'], [feature = 'leisure_track'], @@ -1623,7 +1634,8 @@ text-fill: darken(@quarry, 60%); } [feature = 'landuse_vineyard'], - [feature = 'landuse_orchard'] { + [feature = 'landuse_orchard'], + [feature = 'landuse_plant_nursery'] { text-fill: darken(@orchard, 50%); } [feature = 'landuse_cemetery'], @@ -1695,6 +1707,7 @@ [feature = 'natural_shoal'] { text-fill: darken(@beach, 60%); } + [feature = 'leisure_fitness_centre'], [feature = 'leisure_sports_centre'], [feature = 'leisure_stadium'] { text-fill: darken(@stadium, 70%); diff --git a/buildings.mss b/buildings.mss index 721e74d509..cbad8256ed 100644 --- a/buildings.mss +++ b/buildings.mss @@ -5,9 +5,6 @@ @building-major-fill: darken(@building-fill, 20%); @building-major-line: darken(@building-major-fill, 25%); -@building-aeroway-fill: #cc99ff; -@building-aeroway-line: darken(@building-aeroway-fill,15%); - #buildings { [zoom >= 13] { @@ -24,15 +21,7 @@ #buildings-major { [zoom >= 13] { - [aeroway = 'terminal'] { - polygon-fill: @building-aeroway-fill; - polygon-clip: false; - [zoom >= 15] { - line-width: .75; - line-clip: false; - line-color: @building-aeroway-line; - } - } + [aeroway = 'terminal'], [amenity = 'place_of_worship'], [building = 'train_station'] { polygon-fill: @building-major-fill; diff --git a/landcover.mss b/landcover.mss index 0d11dcf827..23ce1ec631 100644 --- a/landcover.mss +++ b/landcover.mss @@ -5,7 +5,7 @@ @forest: #add19e; // Lch(80,30,135) @forest-text: #46673b; // Lch(40,30,135) @park: #c8facc; // Lch(94,30,145) also recreation_ground -@orchard: #aedfa3; +@orchard: #aedfa3; // also vineyard, plant_nursery // --- "Base" landuses --- @@ -17,7 +17,7 @@ @commercial-line: #d1b2b0; // Lch(75,12,25) @industrial: #ebdbe8; // Lch(89,9,330) (Also used for railway) @industrial-line: #c6b3c3; // Lch(75,11,330) (Also used for railway-line) -@farmland: #fbecd7; // Lch(94,12,80) (Also used for farm) +@farmland: #fbecd7; // Lch(94,12,80) @farmland-line: #d6c4ab; // Lch(80,15,80) @farmyard: #f5dcba; // Lch(89,20,80) @farmyard-line: #d1b48c; // Lch(75,25,80) @@ -59,7 +59,7 @@ @pitch: #aae0cb; // also track @track: @pitch; -@stadium: @societal_amenities; // also sports_centre +@stadium: @societal_amenities; // also fitness_centre and sports_centre @golf_course: #b5e3b5; #landcover-low-zoom[zoom < 10], @@ -145,6 +145,20 @@ } } + [feature = 'landuse_plant_nursery'] { + [zoom >= 10] { + polygon-fill: @orchard; + [way_pixels >= 4] { polygon-gamma: 0.75; } + [way_pixels >= 64] { polygon-gamma: 0.3; } + } + [zoom >= 14] { + polygon-pattern-file: url('symbols/plant_nursery.png'); + polygon-pattern-alignment: global; + [way_pixels >= 4] { polygon-pattern-gamma: 0.75; } + [way_pixels >= 64] { polygon-pattern-gamma: 0.3; } + } + } + [feature = 'landuse_cemetery'], [feature = 'amenity_grave_yard'] { [zoom >= 10] { @@ -282,7 +296,6 @@ [way_pixels >= 64] { polygon-gamma: 0.3; } } - [feature = 'landuse_farm'], [feature = 'landuse_farmland'], [feature = 'landuse_greenhouse_horticulture'] { [zoom >= 10] { @@ -454,6 +467,7 @@ } [feature = 'wetland_wet_meadow'], + [feature = 'wetland_fen'], [feature = 'wetland_marsh'] { [zoom >= 10] { polygon-fill: @grass; @@ -474,7 +488,7 @@ polygon-fill: @societal_amenities; [zoom >= 13] { line-width: 0.3; - line-color: brown; + line-color: darken(@societal_amenities, 35%); } } [way_pixels >= 4] { polygon-gamma: 0.75; } @@ -528,12 +542,17 @@ polygon-fill: @station; } + [feature = 'leisure_fitness_centre'], [feature = 'leisure_sports_centre'], [feature = 'leisure_stadium'] { [zoom >= 10] { polygon-fill: @stadium; [way_pixels >= 4] { polygon-gamma: 0.75; } [way_pixels >= 64] { polygon-gamma: 0.3; } + [zoom >= 13] { + line-width: 0.3; + line-color: darken(@stadium, 35%); + } } } @@ -586,8 +605,7 @@ [zoom >= 14] { [int_wetland = 'marsh'], [int_wetland = 'saltmarsh'], - [int_wetland = 'wet_meadow'], - [int_wetland = 'fen'] { + [int_wetland = 'wet_meadow'] { polygon-pattern-file: url('symbols/wetland_marsh.png'); polygon-pattern-alignment: global; } @@ -604,6 +622,7 @@ polygon-pattern-alignment: global; } [int_wetland = 'bog'], + [int_wetland = 'fen'], [int_wetland = 'string_bog'] { polygon-pattern-file: url('symbols/wetland_bog.png'); polygon-pattern-alignment: global; diff --git a/project.mml b/project.mml index a90c0f6df1..c6746afdc6 100644 --- a/project.mml +++ b/project.mml @@ -137,11 +137,11 @@ Layer: 'hospital', 'kindergarten', 'grave_yard', 'prison', 'place_of_worship', 'clinic') THEN amenity ELSE NULL END)) AS amenity, ('landuse_' || (CASE WHEN landuse IN ('quarry', 'vineyard', 'orchard', 'cemetery', 'residential', 'garages', 'meadow', 'grass', - 'allotments', 'forest', 'farmyard', 'farm', 'farmland', 'greenhouse_horticulture', + 'allotments', 'forest', 'farmyard', 'farmland', 'greenhouse_horticulture', 'recreation_ground', 'village_green', 'retail', 'industrial', 'railway', 'commercial', - 'brownfield', 'landfill', 'construction') THEN landuse ELSE NULL END)) AS landuse, + 'brownfield', 'landfill', 'construction', 'plant_nursery') THEN landuse ELSE NULL END)) AS landuse, ('leisure_' || (CASE WHEN leisure IN ('swimming_pool', 'playground', 'park', 'recreation_ground', 'common', 'garden', - 'golf_course', 'miniature_golf', 'picnic_table', 'sports_centre', 'stadium', 'pitch', + 'golf_course', 'miniature_golf', 'picnic_table', 'fitness_centre', 'sports_centre', 'stadium', 'pitch', 'track', 'dog_park') THEN leisure ELSE NULL END)) AS leisure, ('military_' || (CASE WHEN military IN ('danger_area') THEN military ELSE NULL END)) AS military, ('natural_' || (CASE WHEN "natural" IN ('beach', 'shoal', 'heath', 'grassland', 'wood', 'sand', 'scree', 'shingle', 'bare_rock', 'scrub') THEN "natural" ELSE NULL END)) AS "natural", @@ -241,7 +241,7 @@ Layer: way_area/NULLIF(!pixel_width!::real*!pixel_height!::real,0) AS way_pixels FROM planet_osm_polygon WHERE - (waterway IN ('dock', 'riverbank', 'canal') + (waterway IN ('dock', 'riverbank') OR landuse IN ('reservoir', 'basin') OR "natural" IN ('water', 'glacier')) AND building IS NULL @@ -1124,7 +1124,7 @@ Layer: ORDER BY COALESCE(layer,0) ) AS waterway_bridges properties: - minzoom: 15 + minzoom: 12 - id: bridges name: bridges class: bridges-fill bridges-casing access @@ -1621,7 +1621,7 @@ Layer: 'police', 'post_box', 'post_office', 'pub', 'biergarten', 'recycling', 'restaurant', 'food_court', 'fast_food', 'telephone', 'emergency_phone', 'taxi', 'theatre', 'toilets', 'drinking_water', 'prison', 'hunting_stand', 'nightclub', 'veterinary', 'social_facility', - 'charging_station') THEN amenity ELSE NULL END, + 'charging_station', 'arts_centre') 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', 'fishmonger', 'florist', 'garden_centre', 'hairdresser', 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', @@ -1657,7 +1657,7 @@ Layer: 'dentist', 'place_of_worship', 'police', 'post_box', 'post_office', 'pub', 'biergarten', 'recycling', 'restaurant', 'food_court', 'fast_food', 'telephone', 'emergency_phone', 'taxi', 'theatre', 'toilets', 'drinking_water', 'prison', 'hunting_stand', 'nightclub', 'veterinary', - 'social_facility', 'charging_station') + 'social_facility', 'charging_station', 'arts_centre') OR shop IS NOT NULL -- skip checking a huge list and use a null check OR leisure IN ('water_park', 'playground', 'miniature_golf', 'golf_course', 'picnic_table') OR man_made IN ('mast', 'water_tower', 'lighthouse', 'windmill', 'obelisk') @@ -1690,7 +1690,7 @@ Layer: 'police', 'post_box', 'post_office', 'pub', 'biergarten', 'recycling', 'restaurant', 'food_court', 'fast_food', 'telephone', 'emergency_phone', 'taxi', 'theatre', 'toilets', 'drinking_water', 'prison', 'hunting_stand', 'nightclub', 'veterinary', 'social_facility', - 'charging_station') THEN amenity ELSE NULL END, + 'charging_station', 'arts_centre') 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', 'fishmonger', 'florist', 'garden_centre', 'hairdresser', 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', 'photo', 'photo_studio', @@ -1737,7 +1737,7 @@ Layer: 'dentist', 'place_of_worship', 'police', 'post_box', 'post_office', 'pub', 'biergarten', 'recycling', 'restaurant', 'food_court', 'fast_food', 'telephone', 'emergency_phone', 'taxi', 'theatre', 'toilets', 'drinking_water', 'prison', 'hunting_stand', 'nightclub', - 'veterinary', 'social_facility', 'charging_station') + 'veterinary', 'social_facility', 'charging_station', 'arts_centre') OR shop IS NOT NULL -- skip checking a huge list and use a null check OR leisure IN ('water_park', 'playground', 'miniature_golf', 'golf_course', 'picnic_table', 'slipway', 'dog_park') @@ -1953,7 +1953,7 @@ Layer: way, CASE WHEN substr(highway, length(highway)-3, 4) = 'link' THEN substr(highway, 0, length(highway)-4) ELSE highway END, CASE WHEN (tunnel = 'yes' OR tunnel = 'building_passage' OR covered = 'yes') THEN 'yes' ELSE 'no' END AS tunnel, - CASE WHEN construction IN ('service', 'footway', 'cycleway', 'bridleway', 'path', 'track') THEN 'yes' ELSE 'no' END AS int_construction_minor, + construction, name, CASE WHEN oneway IN ('yes', '-1') THEN oneway @@ -2071,7 +2071,7 @@ Layer: 'school', 'college', 'kindergarten', 'hospital', 'ice_cream', 'pharmacy', 'doctors', 'dentist', 'atm', 'bicycle_rental', 'car_rental', 'car_wash', 'post_box', 'post_office', 'recycling', 'telephone', 'emergency_phone', 'toilets', 'taxi', 'drinking_water', 'hunting_stand', - 'nightclub', 'veterinary', 'social_facility', 'charging_station') THEN amenity ELSE NULL END, + 'nightclub', 'veterinary', 'social_facility', 'charging_station', 'arts_centre') 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', 'fishmonger', 'florist', 'garden_centre', 'hairdresser', 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', 'photo', 'photo_studio', @@ -2081,14 +2081,14 @@ Layer: 'perfumery', 'cosmetics', 'variety_store', 'wine', 'outdoor', 'copyshop', 'sports', 'deli', 'tobacco', 'art', 'tea', 'coffee') THEN shop WHEN shop IN ('no', 'vacant', 'closed', 'disused', 'empty') OR shop IS NULL THEN NULL ELSE 'other' END, - 'leisure_' || CASE WHEN leisure IN ('swimming_pool', 'water_park', 'miniature_golf', 'golf_course', 'sports_centre', 'stadium', 'track', + 'leisure_' || CASE WHEN leisure IN ('swimming_pool', 'water_park', 'miniature_golf', 'golf_course', 'fitness_centre', 'sports_centre', 'stadium', 'track', 'pitch', 'playground', 'park', 'recreation_ground', 'common', 'garden', 'nature_reserve', 'marina', 'picnic_table', 'dog_park') THEN leisure ELSE NULL END, 'power_' || CASE WHEN power IN ('plant', 'station', 'generator', 'sub_station', 'substation') THEN power ELSE NULL END, 'landuse_' || CASE WHEN landuse IN ('reservoir', 'basin', 'recreation_ground', 'village_green', 'quarry', 'vineyard', 'orchard', 'cemetery', - 'residential', 'garages', 'meadow', 'grass', 'allotments', 'forest', 'farmyard', 'farm', 'farmland', + 'residential', 'garages', 'meadow', 'grass', 'allotments', 'forest', 'farmyard', 'farmland', 'greenhouse_horticulture', 'retail', 'industrial', 'railway', 'commercial', 'brownfield', 'landfill', - 'construction', 'military') THEN landuse ELSE NULL END, + 'construction', 'military', 'plant_nursery') THEN landuse ELSE NULL END, 'man_made_' || CASE WHEN man_made IN ('lighthouse', 'windmill', 'mast', 'water_tower', 'pier', 'breakwater', 'groyne', 'obelisk') THEN man_made ELSE NULL END, 'natural_' || CASE WHEN "natural" IN ('wood', 'water', 'mud', 'wetland', 'marsh', 'bay', 'spring', 'scree', 'shingle', 'bare_rock', 'sand', 'heath', 'grassland', 'scrub', 'beach', 'shoal', 'reef', 'glacier') THEN "natural" ELSE NULL END, @@ -2199,7 +2199,7 @@ Layer: 'ice_cream', 'pharmacy', 'doctors', 'dentist', 'atm', 'bicycle_rental', 'car_rental', 'car_wash', 'post_box', 'post_office', 'recycling', 'telephone', 'emergency_phone', 'toilets', 'taxi', 'drinking_water', 'hunting_stand', 'nightclub', 'veterinary', 'social_facility', - 'charging_station') THEN amenity ELSE NULL END, + 'charging_station', 'arts_centre') 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', 'fishmonger', 'florist', 'garden_centre', 'hairdresser', 'hifi', 'ice_cream', 'car', 'car_repair', 'bicycle', 'mall', 'pet', 'photo', 'photo_studio', 'photography', @@ -2208,14 +2208,14 @@ Layer: 'greengrocer', 'farm', 'stationery', 'laundry', 'dry_cleaning', 'beverages', 'perfumery', 'cosmetics', 'variety_store', 'wine', 'outdoor', 'copyshop', 'sports', 'deli', 'tobacco', 'art', 'tea', 'coffee') THEN shop WHEN shop IN ('no', 'vacant', 'closed', 'disused', 'empty') OR shop IS NULL THEN NULL ELSE 'other' END, - 'leisure_' || CASE WHEN leisure IN ('swimming_pool', 'water_park', 'miniature_golf', 'golf_course', 'sports_centre', 'stadium', 'track', + 'leisure_' || CASE WHEN leisure IN ('swimming_pool', 'water_park', 'miniature_golf', 'golf_course', 'fitness_centre', 'sports_centre', 'stadium', 'track', 'pitch','playground', 'park', 'recreation_ground', 'common', 'garden', 'nature_reserve', 'marina', 'slipway', 'picnic_table', 'dog_park') THEN leisure ELSE NULL END, 'power_' || CASE WHEN power IN ('plant', 'station', 'generator', 'sub_station', 'substation') THEN power ELSE NULL END, 'landuse_' || CASE WHEN landuse IN ('reservoir', 'basin', 'recreation_ground', 'village_green', 'quarry', 'vineyard', 'orchard', 'cemetery', - 'residential', 'garages', 'meadow', 'grass', 'allotments', 'forest', 'farmyard', 'farm', 'farmland', + 'residential', 'garages', 'meadow', 'grass', 'allotments', 'forest', 'farmyard', 'farmland', 'greenhouse_horticulture', 'retail', 'industrial', 'railway', 'commercial', 'brownfield', 'landfill', - 'construction', 'military') THEN landuse ELSE NULL END, + 'construction', 'military', 'plant_nursery') THEN landuse ELSE NULL END, 'man_made_' || CASE WHEN man_made IN ('lighthouse', 'windmill', 'mast', 'water_tower', 'obelisk') THEN man_made ELSE NULL END, 'natural_' || CASE WHEN "natural" IN ('wood', 'peak', 'volcano', 'saddle', 'cave_entrance', 'water', 'mud', 'wetland', 'marsh', 'bay', 'spring', 'scree', 'shingle', 'bare_rock', 'sand', 'heath', 'grassland', 'scrub', 'beach', 'glacier', 'tree') @@ -2254,8 +2254,8 @@ Layer: OR shop IS NOT NULL OR leisure IS NOT NULL OR landuse IN ('reservoir', 'basin', 'recreation_ground', 'village_green', 'quarry', 'vineyard', 'orchard', 'cemetery', 'residential', - 'garages', 'meadow', 'grass', 'allotments', 'forest', 'farmyard', 'farm', 'farmland', 'greenhouse_horticulture', - 'retail', 'industrial', 'railway', 'commercial', 'brownfield', 'landfill', 'construction', 'military') + 'garages', 'meadow', 'grass', 'allotments', 'forest', 'farmyard', 'farmland', 'greenhouse_horticulture', + 'retail', 'industrial', 'railway', 'commercial', 'brownfield', 'landfill', 'construction', 'military', 'plant_nursery') OR man_made IN ('lighthouse', 'windmill', 'mast', 'water_tower', 'cross', 'obelisk') OR "natural" IS NOT NULL OR place IN ('island', 'islet') diff --git a/roads.mss b/roads.mss index 6e638beab8..08d6dd82e2 100644 --- a/roads.mss +++ b/roads.mss @@ -267,9 +267,14 @@ @track-oneway-arrow-color: darken(@track-fill, 15%); @bridleway-oneway-arrow-color: darken(@track-fill, 10%); -@shield-size: 9; -@shield-size-z16: 10; -@shield-size-z18: 11; +// Shield’s line wrap is based on OpenStreetMap data and not on line-wrap-width, +// but lines are typically rather short, so we use narrow line spacing. +@shield-size: 10; +@shield-line-spacing: -1.50; // -0.15 em +@shield-size-z16: 11; +@shield-line-spacing-z16: -1.65; // -0.15 em +@shield-size-z18: 12; +@shield-line-spacing-z18: -1.80; // -0.15 em @shield-spacing: 760; @shield-min-distance: 40; @shield-font: @book-fonts; @@ -2389,27 +2394,26 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ #junctions { [highway = 'motorway_junction'] { [zoom >= 11] { - ref/text-name: "[ref]"; - ref/text-size: 10; - ref/text-fill: @junction-text-color; - ref/text-min-distance: 2; - ref/text-face-name: @oblique-fonts; - ref/text-halo-radius: @standard-halo-radius * 1.5; + text-name: "[ref]"; + text-size: 10; + text-fill: @junction-text-color; + text-min-distance: 2; + text-face-name: @oblique-fonts; + text-halo-radius: @standard-halo-radius; + text-wrap-character: ";"; + text-wrap-width: 2; // effectively break after every wrap character + text-line-spacing: -1.5; // -0.15 em [zoom >= 12] { - name/text-name: "[name]"; - name/text-size: 9; - name/text-fill: @junction-text-color; - name/text-dy: -9; - name/text-face-name: @oblique-fonts; - name/text-halo-radius: @standard-halo-radius; - name/text-wrap-character: ";"; - name/text-wrap-width: 2; - name/text-min-distance: 2; + ["name" != null]["ref" = null] { + text-name: "[name]"; + } + ["name" != null]["ref" != null] { + text-name: [name] + "\n" + [ref]; + } } [zoom >= 15] { - ref/text-size: 12; - name/text-size: 11; - name/text-dy: -10; + text-size: 11; + text-line-spacing: -1.65; // -0.15 em } } } @@ -2423,10 +2427,12 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ text-face-name: @book-fonts; text-halo-radius: @standard-halo-radius; text-halo-fill: @standard-halo-fill; - text-wrap-width: 30; + text-wrap-width: 30; // 3.0 em + text-line-spacing: -1.5; // -0.15 em text-min-distance: 2; [zoom >= 17] { text-size: 11; + text-line-spacing: -1.65; // -0.15 em /* Offset name on traffic_signals on zoomlevels where they are displayed in order not to hide the text */ [highway = 'traffic_signals'] { @@ -2441,7 +2447,9 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ [man_made = 'bridge'] { [zoom >= 12][way_pixels > 62.5] { text-name: "[name]"; - text-size: 8; + text-size: 10; + text-wrap-width: 30; // 3 em + text-line-spacing: -1.2; // -0.15 em text-fill: black; text-face-name: @book-fonts; text-halo-radius: @standard-halo-radius; @@ -2450,17 +2458,25 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ text-wrap-width: 30; text-placement: interior; [way_pixels > 250] { - text-size: 9; + text-size: 11; + text-wrap-width: 33; // 3 em + text-line-spacing: -1.35; // -0.15 em } [way_pixels > 1000] { - text-size: 11; + text-size: 12; + text-wrap-width: 36; // 3 em + text-line-spacing: -1.65; // -0.15 em text-halo-radius: @standard-halo-radius * 1.5; } [way_pixels > 4000] { - text-size: 12; + text-size: 13; + text-wrap-width: 39; // 3 em + text-line-spacing: -1.80; // -0.15 em } [way_pixels > 16000] { - text-size: 13; + text-size: 14; + text-wrap-width: 42; // 3 em + text-line-spacing: -1.95; // -0.15 em text-halo-radius: 2; } } @@ -2589,6 +2605,7 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ [highway = 'secondary'][zoom >= 12] { shield-name: "[refs]"; shield-size: @shield-size; + shield-line-spacing: @shield-line-spacing; shield-placement: line; shield-spacing: @shield-spacing; shield-min-distance: @shield-min-distance; @@ -2626,12 +2643,15 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ [zoom >= 13] { shield-name: "[refs]"; shield-size: @shield-size; + shield-line-spacing: @shield-line-spacing; [zoom >= 16] { shield-size: @shield-size-z16; + shield-line-spacing: @shield-line-spacing-z16; } [zoom >= 18] { shield-size: @shield-size-z18; + shield-line-spacing: @shield-line-spacing-z18; } shield-placement: line; @@ -2741,7 +2761,10 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ #roads-text-name { [highway = 'motorway'], [highway = 'trunk'], - [highway = 'primary'] { + [highway = 'primary'], + [highway = 'construction'][construction = 'motorway'], + [highway = 'construction'][construction = 'trunk'], + [highway = 'construction'][construction = 'primary'] { [zoom >= 13] { text-name: "[name]"; text-size: 8; @@ -2770,7 +2793,8 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ text-size: 12; } } - [highway = 'secondary'] { + [highway = 'secondary'], + [highway = 'construction'][construction = 'secondary'] { [zoom >= 13] { text-name: "[name]"; text-size: 8; @@ -2796,7 +2820,7 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ } } [highway = 'tertiary'], - [highway = 'tertiary_link'] { + [highway = 'construction'][construction = 'tertiary'] { [zoom >= 14] { text-name: "[name]"; text-size: 9; @@ -2815,29 +2839,32 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ text-size: 12; } } - [highway = 'construction'] { - [int_construction_minor = 'no'][zoom >= 13], - [int_construction_minor = 'yes'][zoom >= 14] { - text-name: "[name]"; - text-size: 9; - text-fill: black; - text-spacing: 300; - text-clip: false; - text-placement: line; - text-halo-radius: @standard-halo-radius; - text-halo-fill: @standard-halo-fill; - text-face-name: @book-fonts; - [zoom >= 17] { - text-size: 11; - } - [zoom >= 19] { - text-size: 12; - } + [highway = 'construction'][construction = null][zoom >= 16] { + text-name: "[name]"; + text-size: 9; + text-fill: black; + text-spacing: 300; + text-clip: false; + text-placement: line; + text-halo-radius: @standard-halo-radius; + text-halo-fill: @standard-halo-fill; + text-face-name: @book-fonts; + + [zoom >= 17] { + text-size: 11; + text-spacing: 400; + } + [zoom >= 19] { + text-size: 12; + text-spacing: 400; } } [highway = 'residential'], [highway = 'unclassified'], - [highway = 'road'] { + [highway = 'road'], + [highway = 'construction'][construction = 'residential'], + [highway = 'construction'][construction = 'unclassified'], + [highway = 'construction'][construction = 'road'] { [zoom >= 15] { text-name: "[name]"; text-size: 8; @@ -2863,7 +2890,9 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ } [highway = 'raceway'], - [highway = 'service'] { + [highway = 'service'], + [highway = 'construction'][construction = 'raceway'], + [highway = 'construction'][construction = 'service'] { [zoom >= 16] { text-name: "[name]"; text-size: 9; @@ -2882,7 +2911,9 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ } [highway = 'living_street'], - [highway = 'pedestrian'] { + [highway = 'pedestrian'], + [highway = 'construction'][construction = 'living_street'], + [highway = 'construction'][construction = 'pedestrian'] { [zoom >= 15] { text-name: "[name]"; text-size: 8; @@ -2910,19 +2941,12 @@ tertiary is rendered from z10 and is not included in osm_planet_roads. */ #roads-area-text-name { [way_pixels > 3000], [zoom >= 17] { - [zoom >= 15] { - text-name: "[name]"; - text-size: 8; - text-face-name: @book-fonts; - text-placement: interior; - text-wrap-width: 30; - } - [zoom >= 16] { - text-size: 9; - } - [zoom >= 17] { - text-size: 11; - } + text-name: "[name]"; + text-size: 11; + text-face-name: @book-fonts; + text-placement: interior; + text-wrap-width: 30; // 2.7 em + text-line-spacing: -1.7; // -0.15 em } } diff --git a/symbols/generating_patterns/plant_nursery.md b/symbols/generating_patterns/plant_nursery.md new file mode 100644 index 0000000000..8c2cd3477f --- /dev/null +++ b/symbols/generating_patterns/plant_nursery.md @@ -0,0 +1,5 @@ +This pattern is generated by jsdotpattern script through this link: + +http://www.imagico.de/map/jsdotpattern.php#x,128,jdp32360;gv,6,32,32;rd,1,0,0,pixel,0.125,4,4,0,jdp23814,749d6c,aedea3; + +Since exported SVG file is not properly handled by Mapnik, it was converted to PNG file with alpha channel. diff --git a/symbols/generating_patterns/plant_nursery.svg b/symbols/generating_patterns/plant_nursery.svg new file mode 100644 index 0000000000..27491ca438 --- /dev/null +++ b/symbols/generating_patterns/plant_nursery.svg @@ -0,0 +1,9 @@ + + + + + + + + + Created with Snap \ No newline at end of file diff --git a/symbols/plant_nursery.png b/symbols/plant_nursery.png new file mode 100644 index 0000000000..90b46aa98b Binary files /dev/null and b/symbols/plant_nursery.png differ diff --git a/water.mss b/water.mss index f4f2d6c4a9..c3b26fe298 100644 --- a/water.mss +++ b/water.mss @@ -2,13 +2,6 @@ @glacier: #ddecec; @glacier-line: #9cf; -@water-font-size: 10; -@water-font-size-big: 12; -@water-font-size-bigger: 15; -@water-wrap-width-size: 25; -@water-wrap-width-size-big: 35; -@water-wrap-width-size-bigger: 45; - #water-areas { [natural = 'glacier']::natural { [zoom >= 6] { @@ -25,8 +18,7 @@ } } - [waterway = 'dock'], - [waterway = 'canal'] { + [waterway = 'dock'] { [zoom >= 9]::waterway { polygon-fill: @water-color; [way_pixels >= 4] { @@ -292,15 +284,23 @@ [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; - text-size: @water-font-size; - text-wrap-width: @water-wrap-width-size; + text-size: 10; + text-wrap-width: 25; // 2.5 em + text-line-spacing: -1.5; // -0.15 em [way_pixels > 12000] { - text-size: @water-font-size-big; - text-wrap-width: @water-wrap-width-size-big; + text-size: 12; + text-wrap-width: 37; // 3.1 em + text-line-spacing: -1.6; // -0.13 em } [way_pixels > 48000] { - text-size: @water-font-size-bigger; - text-wrap-width: @water-wrap-width-size-bigger; + text-size: 15; + text-wrap-width: 59; // 3.9 em + text-line-spacing: -1.5; // -0.10 em + } + [way_pixels > 192000] { + text-size: 19; + text-wrap-width: 95; // 5.0 em + text-line-spacing: -0.95; // -0.05 em } text-fill: @water-text; text-face-name: @oblique-fonts;