В прошлых сериях экспериментов с ТайлМиллом доводилось раскрашивать находящиеся в университетском городке здания и добавлять номера домов. Теперь попробуем раскрасить какую-нибудь территорию, да и здания можно перекрасить как-нибудь иначе. Заодно и повод подвернулся: авторы сайта mapstr.ru решили поменять самодельную карту Стерлитамака на OpenStreetMap — там город неплохо отрисован (хотя, конечно, есть ещё, что улучшать), им в целом нравится стиль, которым отрисована карта окрестностей нашего университета, но им хочется, чтоб было как в ДубльГИСе — чтоб стоянки, дворы и частный сектор были залиты разными цветами. Ну и школы с детсадами хочется выделить цветом.
Делаем так:
1. Перед импортом данных OSM в PostGIS в файле imposm-mapping.py указываем, что нам нужно предназначение здания, а относится ли оно к университету, нас не интересует:
buildings = Polygons(
name = 'buildings',
fields = (
('area', PseudoArea()),
('addr:housenumber',String()),
('building:levels',Integer()),
('height',Integer()),
('amenity',String()),
),
mapping = {
'building': (
'__any__',
),
'railway': (
'station',
),
'aeroway': (
'terminal',
),
}
)
там же указываем, что у территорий нас интересует тэг residential
— его значение rural
можно использовать для обозначения деревенских жилых территорий.
landusages = Polygons(
name = 'landusages',
fields = (
('area', PseudoArea()),
('residential', String()),
('z_order', ZOrder([
'pedestrian',
...
2. Импортируем данные.
3. Запускаем TileMill, выбираем нужный проект, идём в свойства слоёв, путём редактирования фрагмента SQL-запроса добавляем поля:
- amenity — к слою #buildings
- residential — к слоям #landuse, #landuse_gen0, #landuse_gen1
4. Исправляем стилевые правила:
В базовом файле base.mss указываем необходимость особенной заливки частного сектора
#landuse[zoom>12] {
[type='allotments'] { polygon-fill: @agriculture; }
// ...
[type='residential'] {
polygon-fill: @residential;
[residential='rural'] {
polygon-fill: @rural;
}
}
}
а также зданий образовательных учреждений: детских садов, школ, ПТУ/техникумов/колледжей и институтов/академий/университетов:
// At the highest zoom levels, render buildings in fancy pseudo-3D.
// Ordering polygons by their Y-position is necessary for this effect
// so we use a separate layer that does this for us.
[type != 'hedge'] {
building-fill: @building;
building-height: 2 + [building:levels] * 2;
[height>0] {
building-height: 2 + [height] / 1.5;
}
// Our buildings
[amenity = 'kindergarten'] {
building-fill: @kindergarten_building;
line-color:darken(@kindergarten_building,10%);
}
[amenity = 'school'] {
building-fill: @school_building;
line-color:darken(@school_building,10%);
}
[amenity = 'college'] {
building-fill: @college_building;
line-color:darken(@college_building,10%);
}
[amenity = 'university'] {
building-fill: @university_building;
line-color:darken(@university_building,10%);
}
}
[type = 'hedge'] {
building-fill:@wooded;
building-height:1.25;
}
}
}
добавляем цвета в палитру palette.mss
@residential: #e9e1cd;
@rural: #ece2b5;
@commercial: #e7e0f4;
@industrial: #eeeeee;
@parking: #e5eaf0;
/* Buildings */
@building: #bbaa99;
@educational_mix: #0099ff;
@kindergarten_building: mix(@building, @educational_mix, 90%);
@school_building: mix(@building, @educational_mix, 85%);
@college_building: mix(@building, @educational_mix, 80%);
@university_building: mix(@building, @educational_mix, 75%);
Результат — на http://mapstr.ru/map/