Zh-hans:Standard tile layer

From OpenStreetMap Wiki
Jump to navigation Jump to search
Open bug tracker
OpenStreetMap Carto,osm-carto
Baclaran, Paranaque and Pasay Rotunda, Pasay
Baclaran, Paranaque and Pasay Rotunda, Pasay
作者 Andy AllanBlacktocat.svg other contributors
Slippy map www.openstreetmap.org
Usage policy operations.osmfoundation.org/policies/tiles/
Tiles license CC-BY-SA 2.0
Style website Blacktocat.svg gravitystorm/openstreetmap-carto
Style license Blacktocat.svg CC0 1.0
Version 5.1.0 releases
Date 2020-04-10

标准瓦片层OpenStreetMap 默认的瓦片层。通常也因样式表的名字(Blacktocat.svg OpenStreetMap Carto[1] 而被简称为 OSM Cartoosm-carto

可以在Blacktocat.svg 这里(仅限样式问题,例如:特定物品的渲染问题)或Blacktocat.svg 这里(报告在OSM.org, caching等地方的某个特定瓦片渲染问题)报告问题……两个网址都需要GitHub账号。

OSM 服务器部署

OSM.org 的标准瓦片层

OSM 瓦片服务器从2013年8月就持续使用 OpenStreetMap Carto 样式。OSM tileserver生成统计在运行中,你也可以了解瓦片渲染处理

低到中的缩放等级(z0-z12)瓦片通常只有在每月第一个星期天部署新的 OSM Carto 版本时才会被重新渲染[2]。数据库架构调整不应多于每年1-2次(通常配合 PostgreSQL 主要更新)。

如果要在其他应用里使用 openstreetmap.org 瓦片服务器的标准瓦片,必须要遵循Tile usage policy


鉴于样式的特点比较丰富,OSM.org 体现出来的关键字十分有限,请查看Standard tile layer/Key及其子页面以获取最完整及最新的版本:



2017年的OSM Carto 与旧版本的比较(伦敦,缩放等级1)
  • 2012 - 将 XML 版本移植为 CartoCSS(OSM Carto 的开始)
  • 2013 - 部署 OSM 瓦片服务器
  • 2014 - 重写建筑部分代码
  • 2015 - 调整道路样式、SVG图标
  • 2016 - 更好的地名渲染
  • 2017 - 水域颜色,中缩放等级提升,数据库架构变更
  • 2018 - 办公室及卫生机构关键字渲染,新 POI 颜色分类




  • 特殊的物件(如不会渲染海上标志或者铁路细节)
  • 标识会以name=*的值来渲染(无论其值如何),所以不会全世界都显示英文名称
  • 没有特定国家的标识(比如路障或者地铁标志),它们都一个样

尽管 OpenStreetMap Carto 试图展现尽可能多的物件,渲染数据库里的所有东西仍然是不可能的,所以进行了挑选。

各个放缩等级的Blacktocat.svg 使用情况被定好了。

Mapnik 与 CartoCSS

OpenStreetMap Carto 瓦片通过 Mapnik 工具集进行渲染,也就是说,OpenStreetMap Carto 与 Mapnik 不是同一个东西!Mapnik 是一个被许多地图样式表(包括OpenStreetMap Carto)使用了的地图渲染库。

CartoCSS 是用来预处理样式表为 Mapnik XML格式(2013年8月起)。


In this case upper residential area is larger than forest area and lower residential area is smaller than forest area

This style has multiple layers. For example names of waterways are rendered over waterways, shops are rendered over buildings, tunnels are rendered over buildings, roads are rendered over landcover etc.

The remaining question is how objects are rendered within layer. For some cases collisions are not allowed and objects that would cover already rendered object from given layer is not rendered. It is done for example for cities, where labels for smaller that would collide with label for larger one are not rendered.

Landcover areas are ordered by area, with smaller ones later and collisions are allowed. It means that for a given layer smaller areas will cover larger.

For example small leisure=park area will be rendered over larger landuse=residential area.

There is also a separate overlay layer containing for example tree symbols for forest landcover, that is rendered over landcover fill.

  • area covered by small landuse=forest and large landuse=residential
    • forest fill will be rendered over residential fill and cover it, later forest overlay will be rendered over that
  • area covered by large landuse=forest and small landuse=residential
    • residential fill will be rendered over forest fill and cover it, later forest overlay will be rendered over that


OpenStreetMap Carto uses as its standard database PostgreSQL with PostGIS geospatial extension and is named "gis". It is derived from the OSM database, but does not store the full dataset - only the rendering-related elements are available. Since v4.0.0, OpenStreetMap Carto uses the PostgreSQL hstore (extension and data type) and is pre-processed with Blacktocat.svg a lua script by the osm2pgsql tool.

Code structure

General project configuration is included in Blacktocat.svg project.mml (YAML). There are defined so called "layers", which include mainly SQL statements selecting the objects, while actual styling is done in multiple MSS files.

Roads code is very complex and is partially generated by the helper scripts.

Icons and patterns

Icons are pixel-aligned vector images (SVG), generally based on 14 px matrix. While most of them are monochrome and their rendering color is defined in the MSS files, some of the icons have more than one color and they are defined in the vector file itself in such cases. Halftones might be used.

Some patterns are also done as vector images, but if they are still raster images (PNG), they are derived from vector elements and the process is Blacktocat.svg documented, so it should be easy to migrate to a vector format when possible.


Noto font is used if possible, with DejaVu Sans, Hanazono and Unifont used as fallbacks.

External sources

The style relies partly on some external data files coming from Natural Earth and preprocessed OSM data repository OpenStreetMapData. They can be updated with a Python script (Blacktocat.svg scripts/get-shapefiles.py) or by hand.

Rendering coastline on openstreetmap.org is described here: Coastline#Rendering_in_Standard_tile_layer_on_openstreetmap.org.

Contributing and installing

You can set up a copy of the OpenStreetMap Carto rendering stylesheets for yourself. For more technical information, including setup instructions, see Blacktocat.svg gravitystorm/openstreetmap-carto on GitHub:

If you still don't know where to start, just ask for the assistance (for example in the ticket comments).

More experienced developers are also very welcomed. Some complex tasks that need attention are:

Forks and independent deployments

Apart from OSM.org deployment, osm-carto is being used for different independent services, like OSM Japan or Geofabrik Maps.

OpenStreetMap Carto is used as a base for other map style rendering forks, especially:

There is also a separate project called OpenGeofiction (OGF), which uses OSM tools - including osm-carto as default style - for creating maps of fictional places.

External links



Blog posts: