Свои собственные стили карт, Mapnik, CloudMade

Рисует тайлы Новосибирской области, только почему-то от 1 до 9 зума он считает, что область находится в океане. Экстент - по bounding box области. В чём может быть дело?

Для рендера запускаю команду так:

render_tiles((82.57681, 54.70948, 83.27714, 55.2735), os.path.join(os.getcwd(), 'osm.xml'), os.path.join(os.getcwd(), 'tiles/'), 5, 18, name="Novosibirsk", num_threads=2)

Содержимое world boundaries.

-rw-r--r--  1 siberiano siberiano  29M 2010-02-27 04:59 10m_populated_places.dbf
-rw-r--r--  1 siberiano siberiano  145 2010-02-27 02:56 10m_populated_places.prj
-rw-r--r--  1 siberiano siberiano  68K 2010-02-27 04:59 10m_populated_places.sbn
-rw-r--r--  1 siberiano siberiano 3.3K 2010-02-27 04:59 10m_populated_places.sbx
-rw-r--r--  1 siberiano siberiano 201K 2010-02-27 04:59 10m_populated_places.shp
-rw-r--r--  1 siberiano siberiano  58K 2010-02-27 04:59 10m_populated_places.shx
-rw-r--r--  1 siberiano siberiano 9.0K 2010-03-26 01:16 110m_admin_0_boundary_lines_land.dbf
-rw-r--r--  1 siberiano siberiano  145 2010-03-26 01:16 110m_admin_0_boundary_lines_land.prj
-rw-r--r--  1 siberiano siberiano 1.8K 2010-03-26 01:16 110m_admin_0_boundary_lines_land.sbn
-rw-r--r--  1 siberiano siberiano  276 2010-03-26 01:16 110m_admin_0_boundary_lines_land.sbx
-rw-r--r--  1 siberiano siberiano  52K 2010-03-26 01:16 110m_admin_0_boundary_lines_land.shp
-rw-r--r--  1 siberiano siberiano 1.3K 2010-03-26 01:16 110m_admin_0_boundary_lines_land.shp.xml
-rw-r--r--  1 siberiano siberiano 1.4K 2010-03-26 01:16 110m_admin_0_boundary_lines_land.shx
-rw-r--r--  1 siberiano siberiano 3.4M 2007-03-10 16:05 builtup_area.dbf
-rw-r--r--  1 siberiano siberiano 273K 2007-03-10 16:05 builtup_area.index
-rw-r--r--  1 siberiano siberiano  513 2007-03-10 16:05 builtup_area.prj
-rw-r--r--  1 siberiano siberiano  13M 2007-03-10 16:05 builtup_area.shp
-rw-r--r--  1 siberiano siberiano 285K 2007-03-10 16:05 builtup_area.shx
-rw-r--r--  1 siberiano siberiano  16K 2007-03-10 16:07 places.dbf
-rw-r--r--  1 siberiano siberiano  333 2007-03-10 16:07 places.prj
-rw-r--r--  1 siberiano siberiano 7.0K 2007-03-10 16:07 places.shp
-rw-r--r--  1 siberiano siberiano 2.1K 2007-03-10 16:07 places.shx
-rw-r--r--  1 siberiano siberiano 5.0M 2011-01-02 05:19 processed_p.dbf
-rw-r--r--  1 siberiano siberiano 2.3M 2011-01-02 05:19 processed_p.index
-rw-r--r--  1 siberiano siberiano 456M 2011-01-02 05:19 processed_p.shp
-rw-r--r--  1 siberiano siberiano 4.0M 2011-01-02 05:19 processed_p.shx
-rw-r--r--  1 siberiano siberiano 2.9M 2011-01-02 03:54 shoreline_300.dbf
-rw-r--r--  1 siberiano siberiano 1.3M 2011-01-02 03:54 shoreline_300.index
-rw-r--r--  1 siberiano siberiano 6.4M 2011-01-15 00:41 shoreline_300.shp
-rw-r--r--  1 siberiano siberiano 2.0M 2011-01-02 03:54 shoreline_300.shx
-rw-r--r--  1 siberiano siberiano 4.0M 2007-03-09 17:31 world_bnd_m.dbf
-rw-r--r--  1 siberiano siberiano 246K 2007-09-10 02:28 world_bnd_m.index
-rw-r--r--  1 siberiano siberiano  355 2007-03-09 17:31 world_bnd_m.prj
-rw-r--r--  1 siberiano siberiano  47M 2007-03-09 17:32 world_bnd_m.shp
-rw-r--r--  1 siberiano siberiano 244K 2007-03-09 17:32 world_bnd_m.shx
-rw-r--r--  1 siberiano siberiano 659K 2008-03-31 04:42 world_boundaries_m.dbf
-rw-r--r--  1 siberiano siberiano  85K 2008-03-31 04:48 world_boundaries_m.index
-rw-r--r--  1 siberiano siberiano  355 2008-03-31 04:51 world_boundaries_m.prj
-rw-r--r--  1 siberiano siberiano 6.4M 2008-03-31 04:42 world_boundaries_m.shp
-rw-r--r--  1 siberiano siberiano  30K 2008-03-31 04:42 world_boundaries_m.shx

Вот мой стиль , давно делал.

Список файлов совпадает с моим. Ты используешь стандартный osm.xml? Проверь путь к каталогу с шейпами в inc/settings.xml.inc.

По-моему, это не та ссылка. Стиль 29057 - это мой. :slight_smile:

в файле layer-shapefiles.xml.inc нашёл такие пути:

<Datasource>
      <Parameter name="type">shape</Parameter>
      <Parameter name="file">&world_boundaries;/10m_populated_places</Parameter>
      <Parameter name="encoding">latin1</Parameter>
    </Datasource>

У некоторых были .shp на конце, у некоторых - нет. Попробовал и добавить везде, и убрать - всё равно вода получается.

Ну да, здесь ссылка на settings.xml.inc, где определяется путь к world_boundaries. А поскольку шейпы — это несколько файлов, здесь название написано без расширения.

Можно попробовать в settings.xml.inc написать полный путь, а не относительный.

Вот мой стиль , давно делал.

Ня, мой стиль.

Спасибо!

Не нравится мне, что в КМ нельзя редактировать natural=heath. Написал им тикет.

Кстати, похоже, в Мапнике изменили стиль: теперь райцентры рисуются до 9 зума, а раньше - до 12.

Нет, это просто кто-то переделал райцентры в town, как рекомендует вики :slight_smile: А они издавна на 9-м зуме рисовались.

Понятно.

Помните, тут обсуждали, чтобы города и деревни рисовать не точками, а полигонами, чтобы не дублировать точкой то, что сделано полигоном?

Сейчас мапник криво рисует (на более низких зумах) то, что сделано полигонами. Из-за этого под него многое просто рисуют точками.

Вот попытка исправить это. Переписаны запросы из layer-placenames.xml.inc, последние 2 блока Layer:

<Layer name="placenames-medium" status="on" srs="&osm2pgsql_projection;">
    <StyleName>city</StyleName>
    <StyleName>town</StyleName>
    <Datasource>
      <Parameter name="table">
      (select way,place,name
      from &prefix;_point
      where place in ('city','metropolis','town','large_town','small_town')
        and (capital is null or capital<>'yes')
      union
      select way,place,name
      from &prefix;_polygon
      where place in ('city','metropolis','town','large_town','small_town')
      ) as placenames</Parameter>
      &datasource-settings;
    </Datasource>
</Layer>
<Layer name="placenames-small" status="on" srs="&osm2pgsql_projection;">
    <StyleName>suburb</StyleName>
    <StyleName>village</StyleName>
    <StyleName>hamlet</StyleName>
    <Datasource>
      <Parameter name="table">
      (
        select way,place,name
        from &prefix;_point
        where place in ('suburb','village','large_village','hamlet','locality','isolated_dwelling')
        union
        select way,place,name
        from &prefix;_polygon
        where place in ('suburb','village','large_village','hamlet','locality','isolated_dwelling')
       ) as placenames</Parameter>
      &datasource-settings;
    </Datasource>
</Layer>

Просто к местам-точкам были добавлены места-полигоны.
В первом блоке Layer второй запрос не содержит условия на capital, т.к. в таблице полигонов такой колонки нет.

Однако есть проблема: не все деревни рисуются.

Вот деревня, которая рисуется из полигона (её точку я удалил из базы вручную):

  <way id="58704171" version="3" timestamp="2010-05-31T04:10:49Z" uid="243916" user="titanlis" changeset="4859141">
    (точки)
    <tag k="addr:country" v="RU"/>
    <tag k="addr:district" v="Мошковский район"/>
    <tag k="addr:postcode" v="633145"/>
    <tag k="addr:region" v="Новосибирская область"/>
    <tag k="cladr:code" v="5401900003500"/>
    <tag k="cladr:name" v="Старый Порос"/>
    <tag k="cladr:suffix" v="Село"/>
    <tag k="landuse" v="residential"/>
    <tag k="name" v="Старый Порос"/>
    <tag k="place" v="village"/>
  </way>

А вот эта деревня даже не записана из .osm в БД (select * from planet_osm_polygon where osm_id=89434804; => 0 строк).

<way id="89434804" version="3" timestamp="2010-12-13T18:19:21Z" uid="237049" user="siberiano" changeset="6650537">
    (точки)
    <tag k="name" v="Журавка"/>
    <tag k="name:en" v="Zhuravka"/>
    <tag k="place" v="village"/>
    <tag k="place_name" v="Журавка"/>
  </way>

Я хочу довести это до рабочего патча и отправить разработчикам, либо попросить права коммитить в осм-мапник. У кого какие предложения по поводу деревни?

Результаты опытов:

Мои глаза!


Повозившись с дорогами, понял, в чём проблема с прозрачностью мапника.

Кое-что получаться стало

в правильном направлении движешься! Я тоже как-то думал сделать стиль для гибридного слоя, но быстро поутих энтузиазм, когда не смог почему-то увязать свои тайлы с google satellite.

Спасибо!

А можно ли взять (загрузить себе) стили карт, созданные в редакторе стилей cloudmade, чтобы использовать при самостоятельном рендеринге? Как использовать эти стили на maps.cloudmade.com - здесь все ясно. А вот как забрать у них свое творчество - не ясно.

А не могли бы поконкретнее - как это сделать? Может есть документация какая внятная? То, что я нашёл на вики - не совсем внятно и мало.

ну для начала - берём и правим стандартный стиль импорта osm2pgsql - копируем /usr/share/osm2pgsql/default.style к себе в папочку и правим.
Я например к нему добавил такое:

node,way   name:ru      text         linear
node,way   design       text         linear
node,way   design:ref   text         linear
node,way   voltage      text         linear

Эти строки добавят в импорт теги name:ru, design, design:ref и voltage.
После этого запускаем импорт с новым стилем: osm2pgsql -S rus_names.style planet.osm.bz2
Всё, файлы у нас в базе.
Теперь правим/создаём стиль мапника с нужными нам параметрами.
Например, вот что я сделал с тегом voltage указанным вверху:

  1. Правила
<Style name="power">
    <Rule>
      <Filter>[voltage] = '380' or [voltage] = '400' or [voltage] = '220'</Filter>
      <MinScaleDenominator>10000</MinScaleDenominator>
         <LineSymbolizer>
          <CssParameter name="stroke">green</CssParameter>
          <CssParameter name="stroke-width">1.2</CssParameter>
        <CssParameter name="stroke-opacity">0.6</CssParameter>
         </LineSymbolizer>
    </Rule>
    <Rule>
      <Filter>[voltage] = '35000' or [voltage] = '33000'</Filter>
      <MinScaleDenominator>10000</MinScaleDenominator>
         <LineSymbolizer>
          <CssParameter name="stroke">orange</CssParameter>
        <CssParameter name="stroke-width">2.5</CssParameter>
        <CssParameter name="stroke-opacity">0.6</CssParameter>
         </LineSymbolizer>
    </Rule>
    <Rule>
      <Filter>[voltage] = '110000'</Filter>
      <MinScaleDenominator>10000</MinScaleDenominator>
         <LineSymbolizer>
          <CssParameter name="stroke">red</CssParameter>
        <CssParameter name="stroke-width">2.5</CssParameter>
        <CssParameter name="stroke-opacity">0.6</CssParameter>
         </LineSymbolizer>
    </Rule>
    <Rule>
      <Filter>[voltage] = '330000'</Filter>
      <MinScaleDenominator>10000</MinScaleDenominator>
         <LineSymbolizer>
          <CssParameter name="stroke">#F0A</CssParameter>
        <CssParameter name="stroke-width">3</CssParameter>
        <CssParameter name="stroke-opacity">0.7</CssParameter>
         </LineSymbolizer>
    </Rule>
    <Rule>
    <ElseFilter/>
      <MinScaleDenominator>10000</MinScaleDenominator>
      <LineSymbolizer>
        <CssParameter name="stroke">#AAA</CssParameter>
        <CssParameter name="stroke-width">2.5</CssParameter>
        <CssParameter name="stroke-opacity">0.6</CssParameter>
        <CssParameter name="stroke-dasharray">10,1</CssParameter>
      </LineSymbolizer>
    </Rule> 
</Style>

тут мы описываем, по каким критериям отбирать нужные нам линии и как именно их рисовать
2) Сам слой:

<Layer name="power" status="on" srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs +over">
    <StyleName>power</StyleName>
    <Datasource>
      <Parameter name="type">postgis</Parameter>
      <Parameter name="user">jekader</Parameter>
      <Parameter name="dbname">gis</Parameter>
      <Parameter name="estimate_extent">false</Parameter>
      <Parameter name="table">(select way,voltage from planet_osm_line where "power"='line' ) as power</Parameter>
      <Parameter name="extent">-20037508,-19929239,20037508,19929239</Parameter>
    </Datasource>
</Layer>

тут Мы указываем откуда брать геометрии (включая SELECT из базы)

Эти правки делаются к примеру в файле osm.xml - больше подробностей тут:
http://wiki.openstreetmap.org/wiki/RU:Mapnik