Некорректное отображение кэша mapproxy

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Аватара пользователя
gala-kt
Участник
Сообщения: 89
Зарегистрирован: 26 июл 2010, 12:05
Репутация: 6
Откуда: Санкт-Петербург

Некорректное отображение кэша mapproxy

Сообщение gala-kt » 28 июл 2014, 12:24

Добрый день! проблема с отображением кэша mapproxy.
Цель - на основу OpenStreetMaps положить топографическую сетку.
Данные честно скачаны с gis-lab. С помощью shp2pgsql размещены в базе PostGIS так, что на каждый масштаб (10 км, 5 км, 2 км и т.д.) создается таблица. Для рендеринга данных посредством mapnik созданы простенькие *xml - на каждую таблицу по 2: описывющие полилинии с границами видимости (сама разграфка) и описывающие подписи (номенклатура), также с заданными границами видимости. Подписи вынесены в отдельный xml для того, чтобы при раздаче данных через mapproxy, можно было спокойно отключить слой подписей.
При раздаче данных через mapproxy непосредственно свежесгенерированных mapnik'ом данных все выглядит отлично:
1.png
type: mapnik
1.png (226.95 КБ) 8094 просмотра
,
2.png
type: mapnik_2
2.png (614.58 КБ) 8094 просмотра
, .
Если же в качестве источника транслируемых данных указан кэш (mbtiles), картинка существенно меняется, причем в худшую сторону:
2_2.png
sources: cache
2_2.png (479.42 КБ) 8094 просмотра
.
В чем может быть беда? грешу на границы видимости, но толком не могу понять, в какую сторону их чинить.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Некорректное отображение кэша mapproxy

Сообщение Denis Rykov » 28 июл 2014, 16:43

А первые две картинки - кэш настроен на хранение в MBTiles?
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
gala-kt
Участник
Сообщения: 89
Зарегистрирован: 26 июл 2010, 12:05
Репутация: 6
Откуда: Санкт-Петербург

Re: Некорректное отображение кэша mapproxy

Сообщение gala-kt » 29 июл 2014, 09:46

первый две картинки - рендеринг на лету, без настроек кэша

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Некорректное отображение кэша mapproxy

Сообщение Denis Rykov » 29 июл 2014, 10:16

Приведите конфиги ваших примеров.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
gala-kt
Участник
Сообщения: 89
Зарегистрирован: 26 июл 2010, 12:05
Репутация: 6
Откуда: Санкт-Петербург

Re: Некорректное отображение кэша mapproxy

Сообщение gala-kt » 29 июл 2014, 10:49

Рендеринг на лету:

Код: Выделить всё

services:
  demo:
  kml:
  tms:
  wms:
    md:
      title: OpenStreetMap WMS

layers:
  - name: osm_wgs
    title: OpenStreetMapGeodetic
    sources: [osm_cache_wgs84]

  - name: topo_10000
    title: Razgrafka topo 10 km
    sources: [topo_mapnik_10000]

  - name: topo_lab_10000
    title: Nomenklatura topo 10km
    sources: [topo_mapnik_lab_10000]

  - name: topo_5000
    title: Razgrafka topo 5 km
    sources: [topo_mapnik_5000]

  - name: topo_lab_5000
    title: Nomenklatura topo 5km
    sources: [topo_mapnik_lab_5000]

sources:
  osm_mapnik:
    type: mapnik
    mapfile: /cache/openstreetmap/planet_osm.xml
    use_mapnik2: true

  topo_mapnik_10000:
    type: mapnik
    mapfile: /cache/topo/topo10000.xml
    use_mapnik2: true
    transparent: true
    min_res: 95000.0
    max_res: 4000.0

  topo_mapnik_lab_10000:
    type: mapnik
    mapfile: /cache/topo/topo10000_lab.xml
    use_mapnik2: true
    transparent: true
    min_res: 45000.0
    max_res: 4000.0

  topo_mapnik_5000:
    type: mapnik
    mapfile: /cache/topo/topo5000.xml
    use_mapnik2: true
    transparent: true
    min_res: 4000.0
    max_res: 2000.0

  topo_mapnik_lab_5000:
    type: mapnik
    mapfile: /cache/topo/topo5000_lab.xml
    use_mapnik2: true
    min_res: 4000.0
    max_res: 2000.0
    transparent: true

caches:
  osm_cache_wgs84:
    cache:
      type: file
      directory_layout: tms
      directory: /cache/openstreetmap/cache_data/osm_4326/
    grids: [gridwgs]
    sources: [osm_mapnik]

grids:
  gridmerc:
    base: GLOBAL_MERCATOR
    origin: sw

  gridwgs:
    base: GLOBAL_GEODETIC

globals:
  image:
    resampling_method: bilinear
    jpeg_quality: 90
То же самое с настройкой кэша:

Код: Выделить всё

services:
  demo:
  kml:
  tms:
  wms:
    md:
      title: OpenStreetMap WMS

layers:
  - name: osm_wgs
    title: OpenStreetMapGeodetic
    sources: [osm_cache_wgs84]

  - name: topo_10000
    title: Razgrafka topo 10 km
    sources: [topo_10000_cache]

  - name: topo_lab_10000
    title: Nomenklatura topo 10km
    sources: [topo_10000_lab_cache]

  - name: topo_5000
    title: Razgrafka topo 5 km
    sources: [topo_5000_cache]

  - name: topo_lab_5000
    title: Nomenklatura topo 5km
    sources: [topo_5000_lab_cache]

sources:
  osm_mapnik:
    type: mapnik
    mapfile: /cache/openstreetmap/planet_osm.xml
    use_mapnik2: true

  topo_mapnik_10000:
    type: mapnik
    mapfile: /cache/topo/topo10000.xml
    use_mapnik2: true
    transparent: true
    min_res: 95000.0
    max_res: 4000.0

  topo_mapnik_lab_10000:
    type: mapnik
    mapfile: /cache/topo/topo10000_lab.xml
    use_mapnik2: true
    transparent: true
    min_res: 45000.0
    max_res: 4000.0

  topo_mapnik_5000:
    type: mapnik
    mapfile: /cache/topo/topo5000.xml
    use_mapnik2: true
    transparent: true
    min_res: 4000.0
    max_res: 2000.0

  topo_mapnik_lab_5000:
    type: mapnik
    mapfile: /cache/topo/topo5000_lab.xml
    use_mapnik2: true
    min_res: 4000.0
    max_res: 2000.0
    transparent: true

caches:
  osm_cache_wgs84:
    cache:
      type: file
      directory_layout: tms
      directory: /cache/openstreetmap/cache_data/osm_4326/
    grids: [gridwgs]
    sources: [osm_mapnik]

  topo_10000_cache:
    cache:
      type: mbtiles
      filename: ./cache/topo_10000.mbtiles
    sources: [topo_mapnik_10000]
    grids: [gridwgs]

  topo_10000_lab_cache:
    cache:
      type: mbtiles
      filename: ./cache/topo_10000_lab.mbtiles
    sources: [topo_mapnik_lab_10000]
    grids: [gridwgs]

  topo_5000_cache:
    cache:
      type: mbtiles
      filename: ./cache/topo_5000.mbtiles
    sources: [topo_mapnik_5000]
    grids: [gridwgs]

  topo_5000_lab_cache:
    cache:
      type: mbtiles
      filename: ./cache/topo_5000_lab.mbtiles
    grids: [gridwgs]
    sources: [topo_mapnik_lab_5000]

grids:
  gridmerc:
    base: GLOBAL_MERCATOR
    origin: sw

  gridwgs:
    base: GLOBAL_GEODETIC

globals:
  image:
    resampling_method: bilinear
    jpeg_quality: 90

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Некорректное отображение кэша mapproxy

Сообщение Denis Rykov » 29 июл 2014, 12:12

Унесите ваши min_res и max_res в настройки Mapnik XML, тем более я не очень понял как вы их рассчитали.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
gala-kt
Участник
Сообщения: 89
Зарегистрирован: 26 июл 2010, 12:05
Репутация: 6
Откуда: Санкт-Петербург

Re: Некорректное отображение кэша mapproxy

Сообщение gala-kt » 29 июл 2014, 15:26

Расчет значений происходил с использованием mapproxy-util scales, а потом подгонялся по результату.
Первоначальные значения были получены примерно так:

Код: Выделить всё

mapproxy-util scales -l 11 --as-res-config 20000000
Значением --as-res-config принят масштаб в метрах (1:200 000 000), подсмотренный в QGIS при загруженным по wms картам OSM. Сейчас вчитываюсь в документацию, и подозреваю, что это неверно.

Каким образом значения min_res/max_res должны быть рассчитаны корректно?

p.s. Обозначить границы видимости в xml - не помогло.

Аватара пользователя
gala-kt
Участник
Сообщения: 89
Зарегистрирован: 26 июл 2010, 12:05
Репутация: 6
Откуда: Санкт-Петербург

Re: Некорректное отображение кэша mapproxy

Сообщение gala-kt » 10 сен 2014, 12:47

Отпишусь по поводу решения проблемы.

При формировании кэша стоит обратить внимание на разрешение. По умолчанию mapproxy кэширует данные, с каждым уровнем увеличивая разрешение вдвое. Если мы проанализируем утилитой grids сетку на базе GLOBAL_MERCATOR для собранного кэша OSM, получим для 0-го уровня значение разрешения в метрах 156543.03392804097, для 1-го - 78271.51696402048, для 2-го - 39135.75848201024 и т.д.
В случае, когда запрашивается промежуточное значение разрешения, данные могут быть сгенерированы из кэша более низкого разрешения (само значение параметра при этом будет больше). Например, данные с разрешением 130000 будут сгенерированы из кэша данных 0-го уровня с разрешением 156543. Отсюда возникает беда, подобная моей (линейные объекты не прорисованы, текст нечитабельный).

Решение - установить подходящий коэффициент изменения разрешения между уровнями.
В моем случае в файле конфигурации была описана пользовательская сетка, где параметру res_factor задано значение sqrt2 (квадратный корень из двух - 1,41421).

Код: Выделить всё

grids:
   custom:
    base: GLOBAL_MERCATOR
    res_factor: sqrt2
Фактически, параметром res_factor мы добавляем промежуточные масштабные уровни, для которых будут отрендерены данные с соответствующими разрешениями.

Дальше - нюансы.
1. При сидировании следует помнить о том, что в сетку добавлены промежуточные масштабные уровни. Таким образом, в seed.yaml при указании уровней сидирования для каждого слоя ориентируемся на нумерацию уровней в сетке, рассчитанной с учетом параметра res_factor: sqrt2.
2. В файле конфигурации, задавая значения уровней видимости данных (вернее, рамки, обозначающие в каких масштбаных уровнях данные будут рендериться), не забываем, что параметром res_factor мы добавляем промежуточные уровни.
То есть: сравниваем две сетки и видим, что 3-ему масштабному уровню OSM будет соответствовать 6-ой уровень кэшируемых данных, 4-му - 8-ой, 5-му - 10й и т.д. (фактически, мы удвоили номер уровня).

Код: Выделить всё

gridmerc:
    Configuration:
        base: 'GLOBAL_MERCATOR'
        bbox*: [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]
        origin: 'sw'
        tile_size*: [256, 256]
    Levels: Resolutions, # x * y = total tiles
        00:  156543.03392804097,  #      1 * 1      =        1
        01:  78271.51696402048,   #      2 * 2      =        4
        02:  39135.75848201024,   #      4 * 4      =       16
        03:  19567.87924100512,   #      8 * 8      =       64
        04:  9783.93962050256,    #     16 * 16     =      256
        05:  4891.96981025128,    #     32 * 32     =   1.024K
        06:  2445.98490512564,    #     64 * 64     =   4.096K
        07:  1222.99245256282,    #    128 * 128    =  16.384K
        ...

Код: Выделить всё

custom_gm:
    Configuration:
        base: 'GLOBAL_MERCATOR'
        bbox*: [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244]
        origin*: 'll'
        res_factor: 'sqrt2'
        tile_size*: [256, 256]
    Levels: Resolutions, # x * y = total tiles
        00:  156543.03392804097,  #      1 * 1      =        1
        01:  110692.64083803355,  #      2 * 2      =        4
        02:  78271.51696402048,   #      2 * 2      =        4
        03:  55346.320419016774,  #      3 * 3      =        9
        04:  39135.75848201024,   #      4 * 4      =       16
        05:  27673.160209508387,  #      6 * 6      =       36
        06:  19567.87924100512,   #      8 * 8      =       64
        07:  13836.580104754194,  #     12 * 12     =      144
        08:  9783.93962050256,    #     16 * 16     =      256
        09:  6918.290052377097,   #     23 * 23     =      529
        10:  4891.96981025128,    #     32 * 32     =   1.024K
        11:  3459.1450261885484,  #     46 * 46     =   2.116K
        12:  2445.98490512564,    #     64 * 64     =   4.096K
        13:  1729.5725130942742,  #     91 * 91     =   8.281K
        14:  1222.99245256282,    #    128 * 128    =  16.384K
        15:  864.7862565471371,   #    182 * 182    =  33.124K
        ... 
Итого, если мы хотим видеть данные в пределах привычных нам масштабных уровней google, OSM и т.д. значения разрешения относительно уровня берем из сетки базовой карты.
Таким образом, в приведенном выше примере кэширования топографической сетки для слоя topo_10000, который будет рендериться в рамках разрешений от 95000.0 до 4000.0 и отображаться на 1, 2, 3, 4, 5 уровнях зума базовой карты OSM, при сидировании будут выставлены масштабные уровни с 1-го по 10-й.

Возможно, доводы ламерские, но вдруг кому пригодится. Ну или кто что добавить может или поправить.

Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость