fix svg_renderer
This commit is contained in:
parent
d3836bc71a
commit
6a0e593d87
4 changed files with 180 additions and 95 deletions
|
@ -33,13 +33,15 @@ void svg_renderer<T>::process(line_symbolizer const& sym,
|
|||
mapnik::feature_impl & /*feature*/,
|
||||
proj_transform const& /*prj_trans*/)
|
||||
{
|
||||
path_attributes_.set_stroke_color(sym.get_stroke().get_color());
|
||||
path_attributes_.set_stroke_opacity(sym.get_stroke().get_opacity());
|
||||
path_attributes_.set_stroke_width(sym.get_stroke().get_width());
|
||||
path_attributes_.set_stroke_color(get<color>(sym, keys::stroke, mapnik::color(0,0,0)));
|
||||
path_attributes_.set_stroke_opacity(get<value_double>(sym,keys::stroke_opacity, 1.0));
|
||||
path_attributes_.set_stroke_width(get<value_double>(sym, keys::stroke_width, 1.0));
|
||||
/*
|
||||
path_attributes_.set_stroke_linecap(sym.get_stroke().get_line_cap());
|
||||
path_attributes_.set_stroke_linejoin(sym.get_stroke().get_line_join());
|
||||
path_attributes_.set_stroke_dasharray(sym.get_stroke().get_dash_array());
|
||||
path_attributes_.set_stroke_dashoffset(sym.get_stroke().dash_offset());
|
||||
*/
|
||||
}
|
||||
|
||||
template void svg_renderer<std::ostream_iterator<char> >::process(line_symbolizer const& sym,
|
||||
|
|
|
@ -33,8 +33,8 @@ void svg_renderer<T>::process(polygon_symbolizer const& sym,
|
|||
mapnik::feature_impl & feature,
|
||||
proj_transform const& prj_trans)
|
||||
{
|
||||
path_attributes_.set_fill_color(sym.get_fill());
|
||||
path_attributes_.set_fill_opacity(sym.get_opacity());
|
||||
path_attributes_.set_fill_color(get<mapnik::color>(sym, keys::fill, mapnik::color(128,128,128)));
|
||||
path_attributes_.set_fill_opacity(get<value_double>(sym,keys::fill_opacity, 1.0));
|
||||
}
|
||||
|
||||
template void svg_renderer<std::ostream_iterator<char> >::process(polygon_symbolizer const& sym,
|
||||
|
|
|
@ -97,7 +97,6 @@ void svg_renderer<T>::end_map_processing(Map const& map)
|
|||
{
|
||||
// generate SVG root element closing tag.
|
||||
generator_.generate_closing_root();
|
||||
|
||||
MAPNIK_LOG_DEBUG(svg_renderer) << "svg_renderer: End map processing";
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,10 @@
|
|||
#include <mapnik/datasource_cache.hpp>
|
||||
#include <mapnik/expression.hpp>
|
||||
#include <mapnik/color_factory.hpp>
|
||||
#include <mapnik/image_util.hpp>
|
||||
#include <mapnik/graphics.hpp>
|
||||
#include <mapnik/agg_renderer.hpp>
|
||||
|
||||
|
||||
// stl
|
||||
#include <fstream>
|
||||
|
@ -22,119 +26,186 @@
|
|||
namespace fs = boost::filesystem;
|
||||
using namespace mapnik;
|
||||
|
||||
void prepare_map(Map& m)
|
||||
const std::string srs_lcc="+proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95 +lat+1=49 +lat_2=77 \
|
||||
+datum=NAD83 +units=m +no_defs";
|
||||
const std::string srs_merc="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 \
|
||||
+y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over";
|
||||
|
||||
void prepare_map(Map & m)
|
||||
{
|
||||
const std::string mapnik_dir("/usr/local/lib/mapnik/");
|
||||
std::cout << " looking for 'shape.input' plugin in... " << mapnik_dir << "input/" << "\n";
|
||||
datasource_cache::instance().register_datasources(mapnik_dir + "input/");
|
||||
|
||||
// create styles
|
||||
|
||||
// Provinces (polygon)
|
||||
feature_type_style provpoly_style;
|
||||
|
||||
rule provpoly_rule_on;
|
||||
provpoly_rule_on.set_filter(parse_expression("[NAME_EN] = 'Ontario'"));
|
||||
provpoly_rule_on.append(polygon_symbolizer(color(250, 190, 183)));
|
||||
provpoly_style.add_rule(provpoly_rule_on);
|
||||
|
||||
rule provpoly_rule_qc;
|
||||
provpoly_rule_qc.set_filter(parse_expression("[NOM_FR] = 'Québec'"));
|
||||
provpoly_rule_qc.append(polygon_symbolizer(color(217, 235, 203)));
|
||||
provpoly_style.add_rule(provpoly_rule_qc);
|
||||
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[NAME_EN] = 'Ontario'"));
|
||||
{
|
||||
polygon_symbolizer poly_sym;
|
||||
put(poly_sym, keys::fill, color(250, 190, 183));
|
||||
r.append(std::move(poly_sym));
|
||||
}
|
||||
provpoly_style.add_rule(r);
|
||||
}
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[NOM_FR] = 'Québec'"));
|
||||
{
|
||||
polygon_symbolizer poly_sym;
|
||||
put(poly_sym, keys::fill, color(217, 235, 203));
|
||||
r.append(std::move(poly_sym));
|
||||
}
|
||||
provpoly_style.add_rule(r);
|
||||
}
|
||||
m.insert_style("provinces",provpoly_style);
|
||||
|
||||
// Provinces (polyline)
|
||||
feature_type_style provlines_style;
|
||||
|
||||
stroke provlines_stk (color(0,0,0),1.0);
|
||||
provlines_stk.add_dash(8, 4);
|
||||
provlines_stk.add_dash(2, 2);
|
||||
provlines_stk.add_dash(2, 2);
|
||||
|
||||
rule provlines_rule;
|
||||
provlines_rule.append(line_symbolizer(provlines_stk));
|
||||
provlines_style.add_rule(provlines_rule);
|
||||
|
||||
{
|
||||
rule r;
|
||||
{
|
||||
line_symbolizer line_sym;
|
||||
put(line_sym,keys::stroke,color(0,0,0));
|
||||
put(line_sym,keys::stroke_width,1.0);
|
||||
dash_array dash;
|
||||
dash.emplace_back(8,4);
|
||||
dash.emplace_back(2,2);
|
||||
dash.emplace_back(2,2);
|
||||
put(line_sym,keys::stroke_dasharray,dash);
|
||||
r.append(std::move(line_sym));
|
||||
}
|
||||
provlines_style.add_rule(r);
|
||||
}
|
||||
m.insert_style("provlines",provlines_style);
|
||||
|
||||
// Drainage
|
||||
feature_type_style qcdrain_style;
|
||||
|
||||
rule qcdrain_rule;
|
||||
qcdrain_rule.set_filter(parse_expression("[HYC] = 8"));
|
||||
qcdrain_rule.append(polygon_symbolizer(color(153, 204, 255)));
|
||||
qcdrain_style.add_rule(qcdrain_rule);
|
||||
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[HYC] = 8"));
|
||||
{
|
||||
polygon_symbolizer poly_sym;
|
||||
put(poly_sym, keys::fill, color(153, 204, 255));
|
||||
r.append(std::move(poly_sym));
|
||||
}
|
||||
qcdrain_style.add_rule(r);
|
||||
}
|
||||
m.insert_style("drainage",qcdrain_style);
|
||||
|
||||
// Roads 3 and 4 (The "grey" roads)
|
||||
feature_type_style roads34_style;
|
||||
rule roads34_rule;
|
||||
roads34_rule.set_filter(parse_expression("[CLASS] = 3 or [CLASS] = 4"));
|
||||
stroke roads34_rule_stk(color(171,158,137),2.0);
|
||||
roads34_rule_stk.set_line_cap(ROUND_CAP);
|
||||
roads34_rule_stk.set_line_join(ROUND_JOIN);
|
||||
roads34_rule.append(line_symbolizer(roads34_rule_stk));
|
||||
roads34_style.add_rule(roads34_rule);
|
||||
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[CLASS] = 3 or [CLASS] = 4"));
|
||||
{
|
||||
line_symbolizer line_sym;
|
||||
put(line_sym,keys::stroke,color(171,158,137));
|
||||
put(line_sym,keys::stroke_width,2.0);
|
||||
put(line_sym,keys::stroke_linecap,ROUND_CAP);
|
||||
put(line_sym,keys::stroke_linejoin,ROUND_JOIN);
|
||||
r.append(std::move(line_sym));
|
||||
}
|
||||
roads34_style.add_rule(r);
|
||||
}
|
||||
m.insert_style("smallroads",roads34_style);
|
||||
|
||||
// Roads 2 (The thin yellow ones)
|
||||
feature_type_style roads2_style_1;
|
||||
rule roads2_rule_1;
|
||||
roads2_rule_1.set_filter(parse_expression("[CLASS] = 2"));
|
||||
stroke roads2_rule_stk_1(color(171,158,137),4.0);
|
||||
roads2_rule_stk_1.set_line_cap(ROUND_CAP);
|
||||
roads2_rule_stk_1.set_line_join(ROUND_JOIN);
|
||||
roads2_rule_1.append(line_symbolizer(roads2_rule_stk_1));
|
||||
roads2_style_1.add_rule(roads2_rule_1);
|
||||
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[CLASS] = 2"));
|
||||
{
|
||||
line_symbolizer line_sym;
|
||||
put(line_sym,keys::stroke,color(171,158,137));
|
||||
put(line_sym,keys::stroke_width,4.0);
|
||||
put(line_sym,keys::stroke_linecap,ROUND_CAP);
|
||||
put(line_sym,keys::stroke_linejoin,ROUND_JOIN);
|
||||
r.append(std::move(line_sym));
|
||||
}
|
||||
roads2_style_1.add_rule(r);
|
||||
}
|
||||
m.insert_style("road-border", roads2_style_1);
|
||||
|
||||
feature_type_style roads2_style_2;
|
||||
rule roads2_rule_2;
|
||||
roads2_rule_2.set_filter(parse_expression("[CLASS] = 2"));
|
||||
stroke roads2_rule_stk_2(color(255,250,115),2.0);
|
||||
roads2_rule_stk_2.set_line_cap(ROUND_CAP);
|
||||
roads2_rule_stk_2.set_line_join(ROUND_JOIN);
|
||||
roads2_rule_2.append(line_symbolizer(roads2_rule_stk_2));
|
||||
roads2_style_2.add_rule(roads2_rule_2);
|
||||
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[CLASS] = 2"));
|
||||
{
|
||||
line_symbolizer line_sym;
|
||||
put(line_sym,keys::stroke,color(255,250,115));
|
||||
put(line_sym,keys::stroke_width,2.0);
|
||||
put(line_sym,keys::stroke_linecap,ROUND_CAP);
|
||||
put(line_sym,keys::stroke_linejoin,ROUND_JOIN);
|
||||
r.append(std::move(line_sym));
|
||||
}
|
||||
roads2_style_2.add_rule(r);
|
||||
}
|
||||
m.insert_style("road-fill", roads2_style_2);
|
||||
|
||||
// Roads 1 (The big orange ones, the highways)
|
||||
feature_type_style roads1_style_1;
|
||||
rule roads1_rule_1;
|
||||
roads1_rule_1.set_filter(parse_expression("[CLASS] = 1"));
|
||||
stroke roads1_rule_stk_1(color(188,149,28),7.0);
|
||||
roads1_rule_stk_1.set_line_cap(ROUND_CAP);
|
||||
roads1_rule_stk_1.set_line_join(ROUND_JOIN);
|
||||
roads1_rule_1.append(line_symbolizer(roads1_rule_stk_1));
|
||||
roads1_style_1.add_rule(roads1_rule_1);
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[CLASS] = 1"));
|
||||
{
|
||||
line_symbolizer line_sym;
|
||||
put(line_sym,keys::stroke,color(188,149,28));
|
||||
put(line_sym,keys::stroke_width,7.0);
|
||||
put(line_sym,keys::stroke_linecap,ROUND_CAP);
|
||||
put(line_sym,keys::stroke_linejoin,ROUND_JOIN);
|
||||
r.append(std::move(line_sym));
|
||||
}
|
||||
roads1_style_1.add_rule(r);
|
||||
}
|
||||
m.insert_style("highway-border", roads1_style_1);
|
||||
|
||||
feature_type_style roads1_style_2;
|
||||
rule roads1_rule_2;
|
||||
roads1_rule_2.set_filter(parse_expression("[CLASS] = 1"));
|
||||
stroke roads1_rule_stk_2(color(242,191,36),5.0);
|
||||
roads1_rule_stk_2.set_line_cap(ROUND_CAP);
|
||||
roads1_rule_stk_2.set_line_join(ROUND_JOIN);
|
||||
roads1_rule_2.append(line_symbolizer(roads1_rule_stk_2));
|
||||
roads1_style_2.add_rule(roads1_rule_2);
|
||||
{
|
||||
rule r;
|
||||
r.set_filter(parse_expression("[CLASS] = 1"));
|
||||
{
|
||||
line_symbolizer line_sym;
|
||||
put(line_sym,keys::stroke,color(242,191,36));
|
||||
put(line_sym,keys::stroke_width,5.0);
|
||||
put(line_sym,keys::stroke_linecap,ROUND_CAP);
|
||||
put(line_sym,keys::stroke_linejoin,ROUND_JOIN);
|
||||
r.append(std::move(line_sym));
|
||||
}
|
||||
roads1_style_2.add_rule(r);
|
||||
}
|
||||
m.insert_style("highway-fill", roads1_style_2);
|
||||
|
||||
// Populated Places
|
||||
feature_type_style popplaces_style;
|
||||
{
|
||||
rule r;
|
||||
{
|
||||
text_symbolizer text_sym;
|
||||
text_placements_ptr placement_finder = std::make_shared<text_placements_dummy>();
|
||||
placement_finder->defaults.format->face_name = "DejaVu Sans Book";
|
||||
placement_finder->defaults.format->text_size = 10;
|
||||
placement_finder->defaults.format->fill = color(0,0,0);
|
||||
placement_finder->defaults.format->halo_fill = color(255,255,200);
|
||||
placement_finder->defaults.format->halo_radius = 1;
|
||||
placement_finder->defaults.set_old_style_expression(parse_expression("[GEONAME]"));
|
||||
put<text_placements_ptr>(text_sym, keys::text_placements_, placement_finder);
|
||||
r.append(std::move(text_sym));
|
||||
}
|
||||
popplaces_style.add_rule(r);
|
||||
}
|
||||
|
||||
m.insert_style("popplaces",popplaces_style );
|
||||
|
||||
// layers
|
||||
// Provincial polygons
|
||||
{
|
||||
parameters p;
|
||||
p["type"]="shape";
|
||||
p["file"]="../../../demo/data/boundaries";
|
||||
p["file"]="demo/data/boundaries";
|
||||
p["encoding"]="latin1";
|
||||
|
||||
layer lyr("Provinces");
|
||||
lyr.set_datasource(datasource_cache::instance().create(p));
|
||||
lyr.add_style("provinces");
|
||||
lyr.set_srs(srs_lcc);
|
||||
m.add_layer(lyr);
|
||||
}
|
||||
|
||||
|
@ -142,9 +213,10 @@ void prepare_map(Map& m)
|
|||
{
|
||||
parameters p;
|
||||
p["type"]="shape";
|
||||
p["file"]="../../../demo/data/qcdrainage";
|
||||
p["file"]="demo/data/qcdrainage";
|
||||
layer lyr("Quebec Hydrography");
|
||||
lyr.set_datasource(datasource_cache::instance().create(p));
|
||||
lyr.set_srs(srs_lcc);
|
||||
lyr.add_style("drainage");
|
||||
m.add_layer(lyr);
|
||||
}
|
||||
|
@ -152,10 +224,10 @@ void prepare_map(Map& m)
|
|||
{
|
||||
parameters p;
|
||||
p["type"]="shape";
|
||||
p["file"]="../../../demo/data/ontdrainage";
|
||||
|
||||
p["file"]="demo/data/ontdrainage";
|
||||
layer lyr("Ontario Hydrography");
|
||||
lyr.set_datasource(datasource_cache::instance().create(p));
|
||||
lyr.set_srs(srs_lcc);
|
||||
lyr.add_style("drainage");
|
||||
m.add_layer(lyr);
|
||||
}
|
||||
|
@ -164,8 +236,9 @@ void prepare_map(Map& m)
|
|||
{
|
||||
parameters p;
|
||||
p["type"]="shape";
|
||||
p["file"]="../../../demo/data/boundaries_l";
|
||||
p["file"]="demo/data/boundaries_l";
|
||||
layer lyr("Provincial borders");
|
||||
lyr.set_srs(srs_lcc);
|
||||
lyr.set_datasource(datasource_cache::instance().create(p));
|
||||
lyr.add_style("provlines");
|
||||
m.add_layer(lyr);
|
||||
|
@ -175,8 +248,9 @@ void prepare_map(Map& m)
|
|||
{
|
||||
parameters p;
|
||||
p["type"]="shape";
|
||||
p["file"]="../../../demo/data/roads";
|
||||
p["file"]="demo/data/roads";
|
||||
layer lyr("Roads");
|
||||
lyr.set_srs(srs_lcc);
|
||||
lyr.set_datasource(datasource_cache::instance().create(p));
|
||||
lyr.add_style("smallroads");
|
||||
lyr.add_style("road-border");
|
||||
|
@ -186,6 +260,18 @@ void prepare_map(Map& m)
|
|||
|
||||
m.add_layer(lyr);
|
||||
}
|
||||
// popplaces
|
||||
{
|
||||
parameters p;
|
||||
p["type"]="shape";
|
||||
p["file"]="demo/data/popplaces";
|
||||
p["encoding"] = "latin1";
|
||||
layer lyr("Populated Places");
|
||||
lyr.set_srs(srs_lcc);
|
||||
lyr.set_datasource(datasource_cache::instance().create(p));
|
||||
lyr.add_style("popplaces");
|
||||
m.add_layer(lyr);
|
||||
}
|
||||
}
|
||||
|
||||
void render_to_file(Map const& m, const std::string output_filename)
|
||||
|
@ -195,17 +281,12 @@ void render_to_file(Map const& m, const std::string output_filename)
|
|||
if(output_stream)
|
||||
{
|
||||
typedef svg_renderer<std::ostream_iterator<char> > svg_ren;
|
||||
|
||||
std::ostream_iterator<char> output_stream_iterator(output_stream);
|
||||
|
||||
svg_ren renderer(m, output_stream_iterator);
|
||||
renderer.apply();
|
||||
|
||||
output_stream.close();
|
||||
|
||||
fs::path output_filename_path =
|
||||
fs::system_complete(fs::path(".")) / fs::path(output_filename);
|
||||
|
||||
BOOST_CHECK_MESSAGE(fs::exists(output_filename_path),
|
||||
"File '"+output_filename_path.string()+"' was created.");
|
||||
}
|
||||
|
@ -217,13 +298,16 @@ void render_to_file(Map const& m, const std::string output_filename)
|
|||
|
||||
BOOST_AUTO_TEST_CASE(path_element_test_case_1)
|
||||
{
|
||||
std::cout << " looking for 'shape.input' plugin in ./plugins/input/" << "\n";
|
||||
datasource_cache::instance().register_datasources("plugins/input/");
|
||||
Map m(800,600);
|
||||
m.set_background(parse_color("steelblue"));
|
||||
|
||||
m.set_background(parse_color("white"));
|
||||
m.set_srs(srs_merc);
|
||||
prepare_map(m);
|
||||
|
||||
//m.zoom_to_box(box2d<double>(1405120.04127408, -247003.813399447,
|
||||
//1706357.31328276, -25098.593149577));
|
||||
m.zoom_all();
|
||||
m.zoom_to_box(box2d<double>(-8024477.28459,5445190.38849,-7381388.20071,5662941.44855));
|
||||
render_to_file(m, "path_element_test_case_1.svg");
|
||||
mapnik::image_32 buf(m.width(),m.height());
|
||||
mapnik::agg_renderer<mapnik::image_32> ren(m,buf);
|
||||
ren.apply();
|
||||
mapnik::save_to_file(buf,"path_element_test_case_1.png");
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue