From 8d94b93072d451099f2ab51865e730b0e4e1d85b Mon Sep 17 00:00:00 2001 From: Edward Sargisson Date: Mon, 11 Jun 2012 06:23:22 -0700 Subject: [PATCH 1/7] Added instructions for how to load coastline data. --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 9c70cde..209d28c 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,30 @@ Terrain A collection of files for generating the OSM US Terrain Map: http://tile.stamen.com/terrain/preview.html + +# Dependencies + +This section is based on the Toner style at https://github.com/Citytracking/toner/blob/master/README.md. + +## Data Dependencies (required) +* PostGIS database tables for the OpenStreetMap coastline in EPSG 90091 (http://tile.openstreetmap.org/processed_p.tar.bz2) + +### OpenStreetMap (OSM) + +You will also need to add a copy of the OSM coastline to your planet_osm +database. The OSM coastline is distributed as a shapefile that you will need to +import using the 'shp2pgsql' program: + +http://tile.openstreetmap.org/processed_p.tar.bz2 + +#### Steps + +1. Get the coastline data + wget http://tile.openstreetmap.org/processed_p.tar.bz2 +2. Extract it + tar xvjf processed_p.tar.gz2 +4. Convert into a shapefile + shp2pgsql -dID -s 900913 processed_p.shp coastline > coastline.pgsql +5. Import into your osm database + sudo -u postgres psql -d planet_osm -f coastline.pgsql + \ No newline at end of file From 5d719572bd73ed19258fda10200366ff5d52be89 Mon Sep 17 00:00:00 2001 From: Edward Sargisson Date: Mon, 11 Jun 2012 06:25:01 -0700 Subject: [PATCH 2/7] Added newlines to get code display --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 209d28c..b5702bc 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,15 @@ http://tile.openstreetmap.org/processed_p.tar.bz2 #### Steps 1. Get the coastline data + wget http://tile.openstreetmap.org/processed_p.tar.bz2 2. Extract it + tar xvjf processed_p.tar.gz2 4. Convert into a shapefile + shp2pgsql -dID -s 900913 processed_p.shp coastline > coastline.pgsql 5. Import into your osm database + sudo -u postgres psql -d planet_osm -f coastline.pgsql \ No newline at end of file From 5c900de34b6ac3e76b9d6d91274ee2f9b67b91ec Mon Sep 17 00:00:00 2001 From: Edward Sargisson Date: Tue, 12 Jun 2012 06:01:34 -0700 Subject: [PATCH 3/7] Added skeletron_routes and skeletron_roads views to combine the output of CountiesOSM (these are only done for Washington state at present). Added instructions for how to run CountiesOSM and Skeletron to create the necessary data --- README.md | 38 +++++++++++++++++++++++++++++++++++++- mapnik/skeletron.pgsql | 27 +++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b5702bc..a3ab85a 100644 --- a/README.md +++ b/README.md @@ -13,24 +13,60 @@ This section is based on the Toner style at https://github.com/Citytracking/tone ### OpenStreetMap (OSM) +#### Coastline You will also need to add a copy of the OSM coastline to your planet_osm database. The OSM coastline is distributed as a shapefile that you will need to import using the 'shp2pgsql' program: http://tile.openstreetmap.org/processed_p.tar.bz2 -#### Steps +##### Steps 1. Get the coastline data wget http://tile.openstreetmap.org/processed_p.tar.bz2 + 2. Extract it tar xvjf processed_p.tar.gz2 + 4. Convert into a shapefile shp2pgsql -dID -s 900913 processed_p.shp coastline > coastline.pgsql + 5. Import into your osm database sudo -u postgres psql -d planet_osm -f coastline.pgsql + +#### Roads and Routes + +##### Skeletron +One key part of the Terrain style is simplifying roads and routes so they display better at less detailed zoom levels. +This requires a tool called [Skeletron](https://github.com/migurski/Skeletron) and there is a set of scripts to do this for the US called [CountiesOSM](https://github.com/Citytracking/CountyOSM). +Note that this processing is very time-consuming. Running it for just Washington state took in the order of a day. + +###### Steps +1. Download and install Skeletron, CountiesOSM and related dependencies. +2. In CountiesOSM, run `make`. Use parameters to run it for just one state e.g. `make out/53` will just process Washington state. +3. Change to `out/` for your state where is the FIPS number used by CountiesOSM. +4. Load the routes-.pgsql and roads-.pqsql. + + sudo -u postgres psql -d planet_osm -f roads-53.pgsql + sudo -u postgres psql -d planet_osm -f routes-53.pgsql + +##### Database Views +The output of Skeletron is a set of tables of the form roads53 and routes53. The Terrain styles are expecting single views called skeletron_routes, skeletron_roads and skeletron_routes_cleanrefs. To create this run the following SQL. If you want it to include more than just Washington state then you will need to add your state to the view. + +1. Change to Terrain/mapnik +2. Run the following: + + sudo -u postgres psql -d planet_osm -f skeletron.pgsql + + sudo -u postgres psql -d planet_osm -f views.pgsql + +##### Lines and labels +Create the mapnik xml with make in Terrain/mapnik. + + make labels.xml + make lines.xml \ No newline at end of file diff --git a/mapnik/skeletron.pgsql b/mapnik/skeletron.pgsql index 23ef078..32650b6 100644 --- a/mapnik/skeletron.pgsql +++ b/mapnik/skeletron.pgsql @@ -18,6 +18,33 @@ -- zoomlevel | integer | DROP VIEW IF EXISTS skeletron_routes_cleanrefs; +DROP VIEW IF EXISTS skeletron_routes; +DROP VIEW IF EXISTS skeletron_roads; + +DELETE FROM geometry_columns +WHERE f_table_name = 'skeletron_routes'; + +CREATE VIEW skeletron_routes AS + SELECT gid, ref, network, highway, the_geom, zoomlevel, 'routes_us_53' as source + FROM routes53; + +INSERT INTO geometry_columns +(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type") +VALUES + ('', 'public', 'skeletron_routes', 'the_geom', 2, 900913, 'LINESTRING'); + + +DELETE FROM geometry_columns +WHERE f_table_name = 'skeletron_roads'; + +CREATE VIEW skeletron_roads AS + SELECT gid, zoomlevel, shortname, name, pixelwidth, the_geom, 'roads_us_53'::character varying(16) as source + FROM roads53; + +INSERT INTO geometry_columns +(f_table_catalog, f_table_schema, f_table_name, f_geometry_column, coord_dimension, srid, "type") +VALUES + ('', 'public', 'skeletron_roads', 'the_geom', 2, 900913, 'LINESTRING'); DELETE FROM geometry_columns WHERE f_table_name = 'skeletron_routes_cleanrefs'; From e99cd925a8799fe9b543aebf326f93b82dea1266 Mon Sep 17 00:00:00 2001 From: Edward Sargisson Date: Tue, 12 Jun 2012 06:05:39 -0700 Subject: [PATCH 4/7] Tidied up some formatting in README.md --- README.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index a3ab85a..42318f4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A collection of files for generating the OSM US Terrain Map: # Dependencies -This section is based on the Toner style at https://github.com/Citytracking/toner/blob/master/README.md. +This section is based on the [Toner style](https://github.com/Citytracking/toner/blob/master/README.md.). ## Data Dependencies (required) * PostGIS database tables for the OpenStreetMap coastline in EPSG 90091 (http://tile.openstreetmap.org/processed_p.tar.bz2) @@ -15,28 +15,26 @@ This section is based on the Toner style at https://github.com/Citytracking/tone #### Coastline You will also need to add a copy of the OSM coastline to your planet_osm -database. The OSM coastline is distributed as a shapefile that you will need to +database. The [OSM coastline](http://tile.openstreetmap.org/processed_p.tar.bz2) is distributed as a shapefile that you will need to import using the 'shp2pgsql' program: -http://tile.openstreetmap.org/processed_p.tar.bz2 - ##### Steps 1. Get the coastline data - wget http://tile.openstreetmap.org/processed_p.tar.bz2 + `wget http://tile.openstreetmap.org/processed_p.tar.bz2` 2. Extract it - tar xvjf processed_p.tar.gz2 + `tar xvjf processed_p.tar.gz2` 4. Convert into a shapefile - shp2pgsql -dID -s 900913 processed_p.shp coastline > coastline.pgsql + `shp2pgsql -dID -s 900913 processed_p.shp coastline > coastline.pgsql` 5. Import into your osm database - sudo -u postgres psql -d planet_osm -f coastline.pgsql + `sudo -u postgres psql -d planet_osm -f coastline.pgsql` #### Roads and Routes @@ -61,7 +59,6 @@ The output of Skeletron is a set of tables of the form roads53 and routes53. The 2. Run the following: sudo -u postgres psql -d planet_osm -f skeletron.pgsql - sudo -u postgres psql -d planet_osm -f views.pgsql ##### Lines and labels From ef6383a2c4787c28592f68d30cdf1c91ca7ac95e Mon Sep 17 00:00:00 2001 From: Edward Sargisson Date: Tue, 12 Jun 2012 06:07:06 -0700 Subject: [PATCH 5/7] Tidied up more formatting in README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 42318f4..8bcd340 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,8 @@ Note that this processing is very time-consuming. Running it for just Washington 3. Change to `out/` for your state where is the FIPS number used by CountiesOSM. 4. Load the routes-.pgsql and roads-.pqsql. - sudo -u postgres psql -d planet_osm -f roads-53.pgsql - sudo -u postgres psql -d planet_osm -f routes-53.pgsql + `sudo -u postgres psql -d planet_osm -f roads-53.pgsql + sudo -u postgres psql -d planet_osm -f routes-53.pgsql` ##### Database Views The output of Skeletron is a set of tables of the form roads53 and routes53. The Terrain styles are expecting single views called skeletron_routes, skeletron_roads and skeletron_routes_cleanrefs. To create this run the following SQL. If you want it to include more than just Washington state then you will need to add your state to the view. @@ -58,8 +58,8 @@ The output of Skeletron is a set of tables of the form roads53 and routes53. The 1. Change to Terrain/mapnik 2. Run the following: - sudo -u postgres psql -d planet_osm -f skeletron.pgsql - sudo -u postgres psql -d planet_osm -f views.pgsql + `sudo -u postgres psql -d planet_osm -f skeletron.pgsql + sudo -u postgres psql -d planet_osm -f views.pgsql` ##### Lines and labels Create the mapnik xml with make in Terrain/mapnik. From 717993de8a3291f18cbab21c8215ee8f01f40abd Mon Sep 17 00:00:00 2001 From: Edward Sargisson Date: Tue, 12 Jun 2012 06:07:47 -0700 Subject: [PATCH 6/7] Tidied up more formatting in README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8bcd340..9bf1b98 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,9 @@ Note that this processing is very time-consuming. Running it for just Washington 3. Change to `out/` for your state where is the FIPS number used by CountiesOSM. 4. Load the routes-.pgsql and roads-.pqsql. - `sudo -u postgres psql -d planet_osm -f roads-53.pgsql - sudo -u postgres psql -d planet_osm -f routes-53.pgsql` + `sudo -u postgres psql -d planet_osm -f roads-53.pgsql` + + `sudo -u postgres psql -d planet_osm -f routes-53.pgsql` ##### Database Views The output of Skeletron is a set of tables of the form roads53 and routes53. The Terrain styles are expecting single views called skeletron_routes, skeletron_roads and skeletron_routes_cleanrefs. To create this run the following SQL. If you want it to include more than just Washington state then you will need to add your state to the view. @@ -58,8 +59,9 @@ The output of Skeletron is a set of tables of the form roads53 and routes53. The 1. Change to Terrain/mapnik 2. Run the following: - `sudo -u postgres psql -d planet_osm -f skeletron.pgsql - sudo -u postgres psql -d planet_osm -f views.pgsql` + `sudo -u postgres psql -d planet_osm -f skeletron.pgsql` + + `sudo -u postgres psql -d planet_osm -f views.pgsql` ##### Lines and labels Create the mapnik xml with make in Terrain/mapnik. From 10a1cd884ab6a882cc81185a473f430713521fa8 Mon Sep 17 00:00:00 2001 From: Edward Sargisson Date: Fri, 15 Jun 2012 06:20:12 -0700 Subject: [PATCH 7/7] Now display course and trail from TrailHunger.com database using provided styles #224 --- mapnik/Makefile | 5 +++ mapnik/background.ini | 8 ++-- mapnik/course.mml | 72 +++++++++++++++++++++++++++++++++ mapnik/course.mss | 21 ++++++++++ mapnik/labels-halomask.mml | 16 ++++---- mapnik/labels.mml | 23 +++++------ mapnik/labels.mss | 1 - mapnik/lines.mml | 12 +++--- mapnik/skeletron.pgsql | 7 ++-- mapnik/water-mask-osm2pgsql.ini | 8 ++-- mapnik/water-mask.ini | 8 ++-- tilestache.cfg | 43 ++++++++++++-------- 12 files changed, 166 insertions(+), 58 deletions(-) create mode 100644 mapnik/course.mml create mode 100644 mapnik/course.mss diff --git a/mapnik/Makefile b/mapnik/Makefile index ae8a415..8263db3 100644 --- a/mapnik/Makefile +++ b/mapnik/Makefile @@ -90,3 +90,8 @@ labels-halomask.xml: labels-halomask.mml labels.mss cities.mss states.mss routes lines.xml: lines.mml lines.mss states.mss cascadenik-compile.py lines.mml $@ chmod a+r $@ + +course.xml: course.mml course.mss + cascadenik-compile.py course.mml $@ + chmod a+r $@ + diff --git a/mapnik/background.ini b/mapnik/background.ini index fb86ca2..b0a0d0f 100644 --- a/mapnik/background.ini +++ b/mapnik/background.ini @@ -3,14 +3,14 @@ srs900913 = +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_ [postgis_conn] type = postgis -port = 5432 +port = 5433 host = localhost -dbname = planet_osm -user = osm +dbname = osm +user = postgres estimate_extent = false extent = -20037508,-20037508,20037508,20037508 layer_srs = %(srs900913)s -password = None +password = k3wlon3 [aeroways] template = postgis_conn diff --git a/mapnik/course.mml b/mapnik/course.mml new file mode 100644 index 0000000..01d2220 --- /dev/null +++ b/mapnik/course.mml @@ -0,0 +1,72 @@ + + + + + + + + + + + +]> + + + + + + + postgis + &osm_host; + &osm_port; + &osm_user; + &osm_pass; + &osm_name; + &epsg900913_extent; + false + 900913 + geometry + + + + + + + postgis + &osm_host; + &osm_port; + &osm_user; + &osm_pass; + &osm_name; + &epsg900913_extent; + false + 900913 + + + + + diff --git a/mapnik/course.mss b/mapnik/course.mss new file mode 100644 index 0000000..92737a5 --- /dev/null +++ b/mapnik/course.mss @@ -0,0 +1,21 @@ +Map { + map-bgcolor: transparent; } + +.course, .trail +{ + line-join: round; + line-cap: round; +} + +.course[render=outline] +{ + line-color: #ff6633; + line-width: 3; +} + +.course[render=inline], .trail +{ + line-color: #5a3b00; + line-width: 2; + line-dasharray: 8,3; +} diff --git a/mapnik/labels-halomask.mml b/mapnik/labels-halomask.mml index 55fb23b..7c4f973 100644 --- a/mapnik/labels-halomask.mml +++ b/mapnik/labels-halomask.mml @@ -5,10 +5,10 @@ - - - - + + + + @@ -163,15 +163,15 @@ &epsg900913_extent; = 250000 THEN 32 - WHEN CAST(population AS integer) >= 50000 THEN 24 + SELECT place, name, way, + (CASE + WHEN place IN ('city', 'town') THEN 24 ELSE 18 END) AS font_size FROM planet_osm_point WHERE place IN ('city', 'town', 'village', 'hamlet') - ORDER BY CAST(population AS integer) DESC + ) AS labels ]]> diff --git a/mapnik/labels.mml b/mapnik/labels.mml index 3121c3e..27fe68a 100644 --- a/mapnik/labels.mml +++ b/mapnik/labels.mml @@ -5,10 +5,10 @@ - - - - + + + + @@ -140,15 +140,14 @@ &epsg900913_extent; = 250000 THEN 32 - WHEN CAST(population AS integer) >= 50000 THEN 24 + SELECT place, name , way, + (CASE + WHEN place IN ('city', 'town') THEN 24 ELSE 18 END) AS font_size FROM planet_osm_point WHERE place IN ('city', 'town', 'village', 'hamlet') - ORDER BY CAST(population AS integer) DESC ) AS labels ]]> @@ -195,7 +194,7 @@ - + diff --git a/mapnik/labels.mss b/mapnik/labels.mss index 53d3c4f..ca74bc2 100644 --- a/mapnik/labels.mss +++ b/mapnik/labels.mss @@ -3,7 +3,6 @@ Map map-bgcolor: transparent; } -#place-names[zoom>=11][zoom<15][population>0] name, #place-names[zoom>=11][zoom<15][place=city] name, #place-names[zoom>=11][zoom<15][place=town] name, #place-names[zoom>=15][zoom<17] name diff --git a/mapnik/lines.mml b/mapnik/lines.mml index e4ce33f..b06a0fa 100644 --- a/mapnik/lines.mml +++ b/mapnik/lines.mml @@ -5,10 +5,10 @@ - - - - + + + + @@ -33,7 +33,7 @@ - + diff --git a/mapnik/skeletron.pgsql b/mapnik/skeletron.pgsql index 32650b6..d6ccd09 100644 --- a/mapnik/skeletron.pgsql +++ b/mapnik/skeletron.pgsql @@ -16,7 +16,6 @@ -- the_geom | geometry | -- source | character varying(16) | -- zoomlevel | integer | - DROP VIEW IF EXISTS skeletron_routes_cleanrefs; DROP VIEW IF EXISTS skeletron_routes; DROP VIEW IF EXISTS skeletron_roads; @@ -25,7 +24,7 @@ DELETE FROM geometry_columns WHERE f_table_name = 'skeletron_routes'; CREATE VIEW skeletron_routes AS - SELECT gid, ref, network, highway, the_geom, zoomlevel, 'routes_us_53' as source + SELECT gid, ref, network, highway, the_geom, zoomlevel, 'routes_us_53'::character varying(16) as source FROM routes53; INSERT INTO geometry_columns @@ -33,7 +32,6 @@ INSERT INTO geometry_columns VALUES ('', 'public', 'skeletron_routes', 'the_geom', 2, 900913, 'LINESTRING'); - DELETE FROM geometry_columns WHERE f_table_name = 'skeletron_roads'; @@ -46,6 +44,9 @@ INSERT INTO geometry_columns VALUES ('', 'public', 'skeletron_roads', 'the_geom', 2, 900913, 'LINESTRING'); + + + DELETE FROM geometry_columns WHERE f_table_name = 'skeletron_routes_cleanrefs'; diff --git a/mapnik/water-mask-osm2pgsql.ini b/mapnik/water-mask-osm2pgsql.ini index ecd87f9..91ff89e 100644 --- a/mapnik/water-mask-osm2pgsql.ini +++ b/mapnik/water-mask-osm2pgsql.ini @@ -3,14 +3,14 @@ srs900913 = +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_ [postgis_conn] type = postgis -port = 5432 +port = 5433 host = localhost -dbname = planet_osm -user = osm +dbname = osm +user = postgres estimate_extent = false extent = -20037508,-20037508,20037508,20037508 layer_srs = %(srs900913)s -password = None +password = k3wlon3 [postgis_terrain] type = postgis diff --git a/mapnik/water-mask.ini b/mapnik/water-mask.ini index ecd87f9..91ff89e 100644 --- a/mapnik/water-mask.ini +++ b/mapnik/water-mask.ini @@ -3,14 +3,14 @@ srs900913 = +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_ [postgis_conn] type = postgis -port = 5432 +port = 5433 host = localhost -dbname = planet_osm -user = osm +dbname = osm +user = postgres estimate_extent = false extent = -20037508,-20037508,20037508,20037508 layer_srs = %(srs900913)s -password = None +password = k3wlon3 [postgis_terrain] type = postgis diff --git a/tilestache.cfg b/tilestache.cfg index 76a18c5..3572237 100644 --- a/tilestache.cfg +++ b/tilestache.cfg @@ -1,7 +1,15 @@ { - "cache": { "name": "Test" }, + "cache": {"name": "Test"}, "layers": { + "roads": + { + "provider": + { + "name": "proxy", + "url": "http://tile.openstreetmap.org/{Z}/{X}/{Y}.png" + } + }, "water-mask": { "provider": @@ -13,7 +21,6 @@ "preview": {"zoom": 11, "lat": 37.811, "lon": -122.266, "ext": "png"}, "write cache": 0 }, - "background-polygons": { "provider": @@ -26,7 +33,6 @@ "metatile": {"rows": 4, "columns": 4, "buffer": 256}, "write cache": 0 }, - "labels": { "provider": @@ -40,7 +46,6 @@ "metatile": {"rows": 4, "columns": 4, "buffer": 256}, "write cache": 1 }, - "labels-halomask": { "provider": @@ -54,7 +59,6 @@ "metatile": {"rows": 4, "columns": 4, "buffer": 256}, "write cache": 1 }, - "lines": { "provider": @@ -68,6 +72,18 @@ "metatile": {"rows": 4, "columns": 4, "buffer": 256}, "write cache": 1 }, + "course": + { + "provider": + { + "name": "mapnik", + "fonts": "mapnik/fonts", + "mapfile": "mapnik/course.xml" + }, + "projection": "spherical mercator", + "metatile": {"rows": 4, "columns": 4, "buffer": 256}, + "write cache": 1 + }, "grey-hills": { @@ -80,7 +96,6 @@ "preview": {"zoom": 13, "lat": 37.811, "lon": -122.266, "ext": "jpg"}, "write cache": 0 }, - "land-cover-z4": { "provider": @@ -114,7 +129,6 @@ "preview": {"zoom": 11, "lat": 37.811, "lon": -122.266, "ext": "jpg"}, "write cache": 0 }, - "hillshading": { "provider": @@ -142,7 +156,6 @@ "projection": "spherical mercator", "write cache": 0 }, - "terrain-background": { "provider": @@ -163,8 +176,7 @@ {"color": "#bacbab", "zoom": "12", "opacity": 0.8, "mode": "screen"}, {"color": "#bacbab", "zoom": "13-20", "opacity": 0.9, "mode": "screen"}, {"src": "background-polygons"}, - {"src": "hillshading", "zoom": "0-17", "mode": "linear light"}, - {"color": "#99b3cc", "mask": "water-mask"} + {"src": "hillshading", "zoom": "0-17", "mode": "linear light"} ] } }, @@ -174,8 +186,7 @@ "jpeg options": {"quality": 85}, "write cache": 1 }, - - "terrain": + "terrain": { "provider": { @@ -197,10 +208,10 @@ {"src": "background-polygons"}, {"src": "hillshading", "zoom": "0-17", "mode": "linear light", "mask": "labels-halomask"}, {"color": "#99b3cc", "mask": "water-mask"}, - {"src": "lines", "zoom": "0-11", "mask": "labels-halomask"}, {"src": "lines", "zoom": "12-20"}, - {"src": "labels"} + {"src": "labels"}, + {"src": "course"} ] } }, @@ -208,6 +219,6 @@ "preview": {"zoom": 12, "lat": 37.811, "lon": -122.266, "ext": "jpg"}, "jpeg options": {"quality": 85}, "write cache": 0 - } - } + } + } }