Как добавить номера домов на карту

Sep 05, 2014 08:05

На карте, отрисовываемой из 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



http://shoorick.ru/2014/09/05/how-to-add-house-numbers/

ЮУрГУ, work, ГИС, номер, tilemill, osm, gis, postgresql, карта

Previous post Next post
Up