Некорректное отображение кэша mapproxy
- gala-kt
- Участник
- Сообщения: 89
- Зарегистрирован: 26 июл 2010, 12:05
- Репутация: 6
- Откуда: Санкт-Петербург
Некорректное отображение кэша mapproxy
Добрый день! проблема с отображением кэша mapproxy.
Цель - на основу OpenStreetMaps положить топографическую сетку.
Данные честно скачаны с gis-lab. С помощью shp2pgsql размещены в базе PostGIS так, что на каждый масштаб (10 км, 5 км, 2 км и т.д.) создается таблица. Для рендеринга данных посредством mapnik созданы простенькие *xml - на каждую таблицу по 2: описывющие полилинии с границами видимости (сама разграфка) и описывающие подписи (номенклатура), также с заданными границами видимости. Подписи вынесены в отдельный xml для того, чтобы при раздаче данных через mapproxy, можно было спокойно отключить слой подписей.
При раздаче данных через mapproxy непосредственно свежесгенерированных mapnik'ом данных все выглядит отлично: , , .
Если же в качестве источника транслируемых данных указан кэш (mbtiles), картинка существенно меняется, причем в худшую сторону: .
В чем может быть беда? грешу на границы видимости, но толком не могу понять, в какую сторону их чинить.
Цель - на основу OpenStreetMaps положить топографическую сетку.
Данные честно скачаны с gis-lab. С помощью shp2pgsql размещены в базе PostGIS так, что на каждый масштаб (10 км, 5 км, 2 км и т.д.) создается таблица. Для рендеринга данных посредством mapnik созданы простенькие *xml - на каждую таблицу по 2: описывющие полилинии с границами видимости (сама разграфка) и описывающие подписи (номенклатура), также с заданными границами видимости. Подписи вынесены в отдельный xml для того, чтобы при раздаче данных через mapproxy, можно было спокойно отключить слой подписей.
При раздаче данных через mapproxy непосредственно свежесгенерированных mapnik'ом данных все выглядит отлично: , , .
Если же в качестве источника транслируемых данных указан кэш (mbtiles), картинка существенно меняется, причем в худшую сторону: .
В чем может быть беда? грешу на границы видимости, но толком не могу понять, в какую сторону их чинить.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Некорректное отображение кэша mapproxy
А первые две картинки - кэш настроен на хранение в MBTiles?
Spatial is now, more than ever, just another column- The Geometry Column.
- gala-kt
- Участник
- Сообщения: 89
- Зарегистрирован: 26 июл 2010, 12:05
- Репутация: 6
- Откуда: Санкт-Петербург
Re: Некорректное отображение кэша mapproxy
первый две картинки - рендеринг на лету, без настроек кэша
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Некорректное отображение кэша mapproxy
Приведите конфиги ваших примеров.
Spatial is now, more than ever, just another column- The Geometry Column.
- gala-kt
- Участник
- Сообщения: 89
- Зарегистрирован: 26 июл 2010, 12:05
- Репутация: 6
- Откуда: Санкт-Петербург
Re: Некорректное отображение кэша mapproxy
Рендеринг на лету:
То же самое с настройкой кэша:
Код: Выделить всё
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
Унесите ваши 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
Расчет значений происходил с использованием mapproxy-util scales, а потом подгонялся по результату.
Первоначальные значения были получены примерно так:
Значением --as-res-config принят масштаб в метрах (1:200 000 000), подсмотренный в QGIS при загруженным по wms картам OSM. Сейчас вчитываюсь в документацию, и подозреваю, что это неверно.
Каким образом значения min_res/max_res должны быть рассчитаны корректно?
p.s. Обозначить границы видимости в xml - не помогло.
Первоначальные значения были получены примерно так:
Код: Выделить всё
mapproxy-util scales -l 11 --as-res-config 20000000
Каким образом значения min_res/max_res должны быть рассчитаны корректно?
p.s. Обозначить границы видимости в xml - не помогло.
- gala-kt
- Участник
- Сообщения: 89
- Зарегистрирован: 26 июл 2010, 12:05
- Репутация: 6
- Откуда: Санкт-Петербург
Re: Некорректное отображение кэша mapproxy
Отпишусь по поводу решения проблемы.
При формировании кэша стоит обратить внимание на разрешение. По умолчанию mapproxy кэширует данные, с каждым уровнем увеличивая разрешение вдвое. Если мы проанализируем утилитой grids сетку на базе GLOBAL_MERCATOR для собранного кэша OSM, получим для 0-го уровня значение разрешения в метрах 156543.03392804097, для 1-го - 78271.51696402048, для 2-го - 39135.75848201024 и т.д.
В случае, когда запрашивается промежуточное значение разрешения, данные могут быть сгенерированы из кэша более низкого разрешения (само значение параметра при этом будет больше). Например, данные с разрешением 130000 будут сгенерированы из кэша данных 0-го уровня с разрешением 156543. Отсюда возникает беда, подобная моей (линейные объекты не прорисованы, текст нечитабельный).
Решение - установить подходящий коэффициент изменения разрешения между уровнями.
В моем случае в файле конфигурации была описана пользовательская сетка, где параметру res_factor задано значение sqrt2 (квадратный корень из двух - 1,41421).
Фактически, параметром res_factor мы добавляем промежуточные масштабные уровни, для которых будут отрендерены данные с соответствующими разрешениями.
Дальше - нюансы.
1. При сидировании следует помнить о том, что в сетку добавлены промежуточные масштабные уровни. Таким образом, в seed.yaml при указании уровней сидирования для каждого слоя ориентируемся на нумерацию уровней в сетке, рассчитанной с учетом параметра res_factor: sqrt2.
2. В файле конфигурации, задавая значения уровней видимости данных (вернее, рамки, обозначающие в каких масштбаных уровнях данные будут рендериться), не забываем, что параметром res_factor мы добавляем промежуточные уровни.
То есть: сравниваем две сетки и видим, что 3-ему масштабному уровню OSM будет соответствовать 6-ой уровень кэшируемых данных, 4-му - 8-ой, 5-му - 10й и т.д. (фактически, мы удвоили номер уровня).
Итого, если мы хотим видеть данные в пределах привычных нам масштабных уровней google, OSM и т.д. значения разрешения относительно уровня берем из сетки базовой карты.
Таким образом, в приведенном выше примере кэширования топографической сетки для слоя topo_10000, который будет рендериться в рамках разрешений от 95000.0 до 4000.0 и отображаться на 1, 2, 3, 4, 5 уровнях зума базовой карты OSM, при сидировании будут выставлены масштабные уровни с 1-го по 10-й.
Возможно, доводы ламерские, но вдруг кому пригодится. Ну или кто что добавить может или поправить.
При формировании кэша стоит обратить внимание на разрешение. По умолчанию 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
Дальше - нюансы.
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
...
Таким образом, в приведенном выше примере кэширования топографической сетки для слоя topo_10000, который будет рендериться в рамках разрешений от 95000.0 до 4000.0 и отображаться на 1, 2, 3, 4, 5 уровнях зума базовой карты OSM, при сидировании будут выставлены масштабные уровни с 1-го по 10-й.
Возможно, доводы ламерские, но вдруг кому пригодится. Ну или кто что добавить может или поправить.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость