Hi Marcin ,

Excellent stuff! And great looking maps. I'll be in touch regarding
your patches no doubts, this is just a quick email to say thank you
very much for your contributions!

I started work on compositing (merging) using
agg:http://trac.mapnik.org/wiki/Compositing and I know that Brian
Quinion has done some work as well. This would be a great feature to
have in Mapnik. I'll have a look at all implementation asap.

Thanks again!
Artem

2009/2/26 Marcin Rudowski <[email protected]>:
> Hi again
>
> After seeing hill shading in action, I did some research too in this
> matter. I based my work on:
> http://wiki.openstreetmap.org/wiki/HikingBikingMaps
> and again came across some issues with Mapnik.
>
> Mapnik problems:
> - very basic support for rasters, no opacity, no advanced merging, only
> replacing already drawn background.
> - no raster scaling, only nearest neighbor. I need scaling up to 64x
> (12-18 zoom level) and mapnik generated only big squares
> - despite my last patch, 256 color palette was still bad for slow
> gradients like shading.
>
> I corrected, in some degree, all of above limits, and want
> to share with You.
>
> Here are some examples of my work in action:
> http://mapa.ump.waw.pl/ump-www/?zoom=11&lat=49.70878&lon=19.28666
> http://mapa.ump.waw.pl/ump-www/?zoom=15&lat=49.30126&lon=19.94725
> http://mapa.ump.waw.pl/ump-www/?zoom=13&lat=52.56388&lon=19.70792
> http://mapa.ump.waw.pl/ump-www/?zoom=11&lat=51.29269&lon=19.3567
> http://mapa.ump.waw.pl/ump-www/?zoom=11&lat=54.61966&lon=18.23952
> http://mapa.ump.waw.pl/ump-www/?zoom=11&lat=53.2975&lon=18.36724
> http://mapa.ump.waw.pl/ump-www/?zoom=14&lat=49.39029&lon=22.47346
>
> I use SRTM-3 v2:
> ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM30/
> converted to mercator projection (gdal) avoiding elipsoid->spheroid
> reprojection (only latlon->mercator) with pixel size: 76.437 x 76.437 m.
> Based on srtm-3 resolution, it should be 90x90, but alignment to output
> resolution was needed. 76.437 is closest number to 90 from
> (2*pi*6378137)/2^n set.
> For Poland, this gives 16000x14000 GeoTIFF in resolution aligned
> to zoom 11. I made scaled copies 50% and 25% for lower zooms, to
> increase speed and avoid downscaling. I could do the same to avoid
> upscaling, but already it is 250MB file, and each zoom would make it 4x
> bigger then previous.
>
>
> Patches are in attachment (hopefully this time :) ), here I will
> describe in short, what is changed, and what can be done more.
>
> 1) Raster opacity
>
> Added opacity handling using existing methods. It isn't needed
> for shading, but can be useful. To enable opacity, add css style opacity
> to RasterSymbolizer. It works both for cairo and internal agg renderer.
>
> 2) Raster merging
>
> Added some basic merging methods. I use for hill shading which is gimp
> like "merge grain":
> http://docs.gimp.org/en/gimp-concepts-layer-modes.html#id2834930
> Default is normal mode, to select differently, set css "mode" to
> desired value. Available modes based on given link:
> - grain_merge : bg + fg - 0.5
> - grain_merge2 : bg + fg*2 - 1.0
> - multiply : fg * bg
> - multiply2 : fg * bg * 2.0
> - divide : bg / fg
> - divide2 : bg * 2.0 / fg
> - screen : 1 - (1-fg)(1-g)
> - hard_light : ..... (look ad link above)
>
> Agg renderer have some similar code in
> agg/include/agg_pixfmt_rgba.h
> but I didn't use it. I wrote my code based on existing part for alpha
> blending from mapnik/include/mapnik/graphics.hpp.
> This fix works only with agg renderer, I couldn't find appropriate way
> to implement it using Cairo. I googled and found some references to
> filters for ie. hard light, but no documentation or examples, and I'm
> not sure if it exists in cairo.
> This fix and previous probably handle:
> http://trac.mapnik.org/ticket/157
> if someone could implement it also in cairo, or at least show me right
> direction.
>
> 3) Raster scaling
>
> Added bilinear scaling algorithm. Algorithm can be selected with css
> "scaling" parameter and available values are:
> - fast : nearest neighbor as it was already
> - bilinear : new bilinear interpolation for all 4 chanels (RGBA)
> - bilinear8 : as bilinear, but only one channel assumed. This probably
> needs some fix, as it doesn't handle alfa. I added it to speedup in my
> case, where raster is grayscale without transparency.
>
> Scaling in cairo renderer could be reimplemented using matrix, but I use
> mapnik-0.5.1 with my patches, so basically I concentrated on
> agg renderer.
>
> 4) 256 color palette optimizations
>
> My previous patch removed obvious bug in octree. Still, generated
> palette is not enough for hill shading. It looks more like 50 colors,
> then 256. The problem is with prunning only on lowest level, so all left
> leafs are almost on the same level. It is similar to dividing to even
> ranges, regardless of density. My patch prunes only branches with lowest
> pixel count from all levels, so subtrees with many leafs, remain deeper,
> then one with smaller sample count.
>
> Some limiting was needed, to allow colors with small sample count to
> remain unharmed (ie, some distinctive feature on map with not enough
> pixels, to "fight" with gradients should be preserved).
> I didn't find any significant increase in processing time, and
> only 5-10% increase in size (due to more significant colors). Effects
> are almost as good, as optimal palette without error-diffusion in
> imagemagick or Gimp.
>
> Still there are problem with color assignment, because quite often cube
> for classified color doesn't have the best color. Neighbor cubes should
> be compared, but traversing octree is fast, but not free. I made some
> fix, to check siblings and neighbour cubes (going up and down the
> three), but it increased processing time of quantization about 40% and
> effects aren't so much worse without it. It isn't included in
> attachment.
>
>
>
> Example osm.xml fragment:
> <Style name="raster18">
>    <Rule>
>        <MaxScaleDenominator>1000000</MaxScaleDenominator>
>        <MinScaleDenominator>250000</MinScaleDenominator>
>        <RasterSymbolizer>
>            <CssParameter name="opacity">1.0</CssParameter>
>            <CssParameter name="scaling">bilinear</CssParameter>
>            <CssParameter name="mode">grain_merge</CssParameter>
>        </RasterSymbolizer>
>    </Rule>
> </Style>
> <Layer name="dem18" status="on" >
>    <StyleName>raster18</StyleName>
>    <Datasource>
>        <Parameter name="type">gdal</Parameter>
>        <Parameter name="file">&geotiffs;/hill_15m.tif</Parameter>
>        <Parameter name="format">tiff</Parameter>
>    </Datasource>
> </Layer>
>
>
>
> Attachments:
>
> - mapnik.mr.palette2.patch.gz : palette fix 4)
> - mapnik.mr.scale.patch.gz : scaling methods
> - mapnik.mr.raster1.patch.gz : parsing RasterSymbolizer rule
> - mapnik.mr.process.patch.gz : using raster params to select scaling
> algorithm, opacity and merging method.
>
>
>
>
> Additional notes:
>
> If scaling and tiling, there can be some problems with alignment if
> raster resolution isn't integer multiply of output resolution and
> rendered regions have margin, like in mod_tile:
> A---------B---|---A-----------B
> Because size and position of source raster bbox is averaged to pixel steps,
> error can be different on each edge and '|' in A image could be
> displaced in B image. 0.5 pix in raster could mean 16px after 32x scaling (5
> zoom steps) and this is noticeable even earlier.
>
> I use raster in resolution of zoom 11, so scaling is power of 2 and any
> errors are same on each rendered edge. In my case, mod_tile renders
> in each zoom:  9*256 x 9*256 region. This is cut with 128 margin to 8x8
> tiles, each 256x256 size. Everything is scaled by power of 2, and
> everything is aligned.
>
> It shouldn't(?) matter if we consider no margin tile joining:
> A--------AB---------B.
>
>
>
> Adding hill shading to my Mapnik using raster increased generation time
> only about 2x (35tiles/s -> 17 tiles/s).
>
> In my case map is updated ~twice a week and only 300k are forced to
> redraw and send to cache server.
>
> I use self-patched mapnik 0.5.1 with some 3 months old version
> of mod_tile for apache. Actually I have two mod_tile modules, to handle
> two separate osm.xml and two databases, which I switch on update.
>
> My osm.xml is divided to separate files defining layers, styles, db
> settings etc. Styles are grouped by categories. In effect I have 22 xml
> files that sum up to 420kB. Thank You for libxml2 features, or I would
> go insane managing this in one osm.xml :)
>
> Regards,
> Marcin Rudowski
>
> _______________________________________________
> Mapnik-users mailing list
> [email protected]
> https://lists.berlios.de/mailman/listinfo/mapnik-users
>
>
_______________________________________________
Mapnik-users mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/mapnik-users

Reply via email to