На карте, отрисовываемой из OpenStreetMap стилем, основанным на OSM Bright, нет номеров домов. Попытки на скорю руку сочинить какой-нибудь стиль, заглядывая в нагугленное, не увенчались успехом — пришлось разобраться подробнее. Выяснилось следующее: одним редактированием стилевого файла не обойтись, надо ещё и внести данные в базу.
Итак, есть PostgreSQL, PostGIS, imposm, TileMill и OSM Bright. Как запустить этот комбайн, написано, например, на mapbox.com/tilemill/docs/guides/osm-bright-ubuntu-quickstart/. Пробуем, запускаем — номеров домов нет. Если посмотреть, какие данные, относящиеся к зданиям, хранятся в базе данных, то увидим, что там нет адресов:
$ psql -U юзер -d база -c '\d osm_buildings'
Table "public.osm_buildings" Column | Type | Modifiers ----------+------------------------+------------------------------------------------------------ id | integer | not null default nextval('osm_buildings_id_seq'::regclass) osm_id | bigint | name | character varying(255) | type | character varying(255) | area | real | geometry | geometry | Indexes: "osm_buildings_pkey" PRIMARY KEY, btree (id) "osm_buildings_geom" gist (geometry) CLUSTER Check constraints: "enforce_dims_geometry" CHECK (st_ndims(geometry) = 2) "enforce_srid_geometry" CHECK (st_srid(geometry) = 900913)
Чтоб сохранять адрес (а точнее, номер дома — нам этого достаточно), надо добавить строковое поле (точнее, это будет VARCHAR(255)
) с именем 'addr:housenumber'
к таблице с зданиями и заполнить это поле номерами. Сделать это можно, указав его в файле, где хранятся правила соответствия (в OSM Bright такой файл называется imposm-mapping.py):
--- a/imposm-mapping.py
+++ b/imposm-mapping.py
@@ -143,6 +143,7 @@ buildings = Polygons(
name = 'buildings',
fields = (
('area', PseudoArea()),
+ ('addr:housenumber',String()),
),
mapping = {
'building': (
После этого можно запускать импорт, в получившейся таблице появится поле addr:housenumber, содержащее номера домов.
Следующий этап — указать новое поле в настройках слоя TileMill в поле Table or subquery:
Содержимое поля должно быть таким:
( SELECT geometry, type, name, area,"addr:housenumber"
FROM osm_buildings
ORDER BY ST_YMin(ST_Envelope(geometry)) DESC
) AS data
После чего останется добавить стиль номеров в файл labels.mss:
#buildings[zoom>16] {
text-name:'[addr:housenumber]';
text-face-name:@sans;
text-size:9;
text-fill: lighten(@poi_text, 20%);
}
Результат — susu.ac.ru/ru/about/campus