+ applying patch proposed by dane that add explicit_defaults selection when saving maps (closes #327)

This commit is contained in:
Lucio Asnaghi 2009-04-28 21:44:34 +00:00
parent 158989fc56
commit eaa49ca028
3 changed files with 39 additions and 33 deletions

View file

@ -224,6 +224,7 @@ unsigned mapnik_version()
BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_overloads, load_map, 2, 3); BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_overloads, load_map, 2, 3);
BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_string_overloads, load_map_string, 2, 3); BOOST_PYTHON_FUNCTION_OVERLOADS(load_map_string_overloads, load_map_string, 2, 3);
BOOST_PYTHON_FUNCTION_OVERLOADS(save_map_overloads, save_map, 2, 3);
BOOST_PYTHON_MODULE(_mapnik) BOOST_PYTHON_MODULE(_mapnik)
{ {
@ -406,7 +407,8 @@ BOOST_PYTHON_MODULE(_mapnik)
def("load_map_from_string", & load_map_string, load_map_string_overloads()); def("load_map_from_string", & load_map_string, load_map_string_overloads());
def("save_map", & save_map, def("save_map", & save_map, save_map_overloads());
/*
"\n" "\n"
"Save Map object to XML file\n" "Save Map object to XML file\n"
"\n" "\n"
@ -420,6 +422,7 @@ BOOST_PYTHON_MODULE(_mapnik)
">>> save_map(m,'mapfile_mercator.xml')\n" ">>> save_map(m,'mapfile_mercator.xml')\n"
"\n" "\n"
); );
*/
def("mapnik_version", &mapnik_version,"Get the Mapnik version number"); def("mapnik_version", &mapnik_version,"Get the Mapnik version number");

View file

@ -30,7 +30,7 @@
namespace mapnik namespace mapnik
{ {
MAPNIK_DECL void save_map(Map const& map, std::string const& filename); MAPNIK_DECL void save_map(Map const& map, std::string const& filename, bool explicit_defaults = false);
} }
#endif // SAVE_MAP_HPP #endif // SAVE_MAP_HPP

View file

@ -52,7 +52,9 @@ namespace mapnik
class serialize_symbolizer : public boost::static_visitor<> class serialize_symbolizer : public boost::static_visitor<>
{ {
public: public:
serialize_symbolizer( ptree & r ) : rule_(r) {} serialize_symbolizer( ptree & r , bool explicit_defaults):
rule_(r),
explicit_defaults_(explicit_defaults) {}
void operator () ( const point_symbolizer & sym ) void operator () ( const point_symbolizer & sym )
{ {
@ -69,23 +71,23 @@ namespace mapnik
const stroke & strk = sym.get_stroke(); const stroke & strk = sym.get_stroke();
stroke dfl = stroke(); stroke dfl = stroke();
if ( strk.get_color() != dfl.get_color() ) if ( strk.get_color() != dfl.get_color() || explicit_defaults_ )
{ {
set_css( sym_node, "stroke", strk.get_color() ); set_css( sym_node, "stroke", strk.get_color() );
} }
if ( strk.get_width() != dfl.get_width() ) if ( strk.get_width() != dfl.get_width() || explicit_defaults_ )
{ {
set_css( sym_node, "stroke-width", strk.get_width() ); set_css( sym_node, "stroke-width", strk.get_width() );
} }
if ( strk.get_opacity() != dfl.get_opacity() ) if ( strk.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
{ {
set_css( sym_node, "stroke-opacity", strk.get_opacity() ); set_css( sym_node, "stroke-opacity", strk.get_opacity() );
} }
if ( strk.get_line_join() != dfl.get_line_join() ) if ( strk.get_line_join() != dfl.get_line_join() || explicit_defaults_ )
{ {
set_css( sym_node, "stroke-linejoin", strk.get_line_join() ); set_css( sym_node, "stroke-linejoin", strk.get_line_join() );
} }
if ( strk.get_line_cap() != dfl.get_line_cap() ) if ( strk.get_line_cap() != dfl.get_line_cap() || explicit_defaults_ )
{ {
set_css( sym_node, "stroke-linecap", strk.get_line_cap() ); set_css( sym_node, "stroke-linecap", strk.get_line_cap() );
} }
@ -116,11 +118,11 @@ namespace mapnik
ptree::value_type("PolygonSymbolizer", ptree()))->second; ptree::value_type("PolygonSymbolizer", ptree()))->second;
polygon_symbolizer dfl; polygon_symbolizer dfl;
if ( sym.get_fill() != dfl.get_fill() ) if ( sym.get_fill() != dfl.get_fill() || explicit_defaults_ )
{ {
set_css( sym_node, "fill", sym.get_fill() ); set_css( sym_node, "fill", sym.get_fill() );
} }
if ( sym.get_opacity() != dfl.get_opacity() ) if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
{ {
set_css( sym_node, "fill-opacity", sym.get_opacity() ); set_css( sym_node, "fill-opacity", sym.get_opacity() );
} }
@ -141,15 +143,15 @@ namespace mapnik
ptree::value_type("RasterSymbolizer", ptree()))->second; ptree::value_type("RasterSymbolizer", ptree()))->second;
raster_symbolizer dfl; raster_symbolizer dfl;
if ( sym.get_mode() != dfl.get_mode() ) if ( sym.get_mode() != dfl.get_mode() || explicit_defaults_ )
{ {
set_css( sym_node, "mode", sym.get_mode() ); set_css( sym_node, "mode", sym.get_mode() );
} }
if ( sym.get_scaling() != dfl.get_scaling() ) if ( sym.get_scaling() != dfl.get_scaling() || explicit_defaults_ )
{ {
set_css( sym_node, "scaling", sym.get_scaling() ); set_css( sym_node, "scaling", sym.get_scaling() );
} }
if ( sym.get_opacity() != dfl.get_opacity() ) if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
{ {
set_css( sym_node, "opacity", sym.get_opacity() ); set_css( sym_node, "opacity", sym.get_opacity() );
} }
@ -181,11 +183,11 @@ namespace mapnik
ptree::value_type("BuildingSymbolizer", ptree()))->second; ptree::value_type("BuildingSymbolizer", ptree()))->second;
building_symbolizer dfl; building_symbolizer dfl;
if ( sym.get_fill() != dfl.get_fill() ) if ( sym.get_fill() != dfl.get_fill() || explicit_defaults_ )
{ {
set_css( sym_node, "fill", sym.get_fill() ); set_css( sym_node, "fill", sym.get_fill() );
} }
if ( sym.get_opacity() != dfl.get_opacity() ) if ( sym.get_opacity() != dfl.get_opacity() || explicit_defaults_ )
{ {
set_css( sym_node, "fill-opacity", sym.get_opacity() ); set_css( sym_node, "fill-opacity", sym.get_opacity() );
} }
@ -245,59 +247,60 @@ namespace mapnik
0, color(0,0,0) ); 0, color(0,0,0) );
position displacement = sym.get_displacement(); position displacement = sym.get_displacement();
if ( displacement.get<0>() != dfl.get_displacement().get<0>() ) if ( displacement.get<0>() != dfl.get_displacement().get<0>() || explicit_defaults_ )
{ {
set_attr( node, "dx", displacement.get<0>() ); set_attr( node, "dx", displacement.get<0>() );
} }
if ( displacement.get<1>() != dfl.get_displacement().get<1>() ) if ( displacement.get<1>() != dfl.get_displacement().get<1>() || explicit_defaults_ )
{ {
set_attr( node, "dy", displacement.get<1>() ); set_attr( node, "dy", displacement.get<1>() );
} }
if (sym.get_label_placement() != dfl.get_label_placement() ) if (sym.get_label_placement() != dfl.get_label_placement() || explicit_defaults_ )
{ {
set_attr( node, "placement", sym.get_label_placement() ); set_attr( node, "placement", sym.get_label_placement() );
} }
if (sym.get_vertical_alignment() != dfl.get_vertical_alignment() ) if (sym.get_vertical_alignment() != dfl.get_vertical_alignment() || explicit_defaults_ )
{ {
set_attr( node, "vertical_alignment", sym.get_vertical_alignment() ); set_attr( node, "vertical_alignment", sym.get_vertical_alignment() );
} }
if (sym.get_halo_radius() != dfl.get_halo_radius()) if (sym.get_halo_radius() != dfl.get_halo_radius() || explicit_defaults_ )
{ {
set_attr( node, "halo_radius", sym.get_halo_radius() ); set_attr( node, "halo_radius", sym.get_halo_radius() );
} }
const color & c = sym.get_halo_fill(); const color & c = sym.get_halo_fill();
if ( c != dfl.get_halo_fill() ) if ( c != dfl.get_halo_fill() || explicit_defaults_ )
{ {
set_attr( node, "halo_fill", c ); set_attr( node, "halo_fill", c );
} }
if (sym.get_text_ratio() != dfl.get_text_ratio() ) if (sym.get_text_ratio() != dfl.get_text_ratio() || explicit_defaults_ )
{ {
set_attr( node, "text_ratio", sym.get_text_ratio() ); set_attr( node, "text_ratio", sym.get_text_ratio() );
} }
if (sym.get_wrap_width() != dfl.get_wrap_width()) if (sym.get_wrap_width() != dfl.get_wrap_width() || explicit_defaults_ )
{ {
set_attr( node, "wrap_width", sym.get_wrap_width() ); set_attr( node, "wrap_width", sym.get_wrap_width() );
} }
if (sym.get_label_spacing() != dfl.get_label_spacing()) if (sym.get_label_spacing() != dfl.get_label_spacing() || explicit_defaults_ )
{ {
set_attr( node, "spacing", sym.get_label_spacing() ); set_attr( node, "spacing", sym.get_label_spacing() );
} }
if (sym.get_minimum_distance() != dfl.get_minimum_distance()) if (sym.get_minimum_distance() != dfl.get_minimum_distance() || explicit_defaults_ )
{ {
set_attr( node, "min_distance", sym.get_minimum_distance() ); set_attr( node, "min_distance", sym.get_minimum_distance() );
} }
if (sym.get_allow_overlap() != dfl.get_allow_overlap() ) if (sym.get_allow_overlap() != dfl.get_allow_overlap() || explicit_defaults_ )
{ {
set_attr( node, "allow_overlap", sym.get_allow_overlap() ); set_attr( node, "allow_overlap", sym.get_allow_overlap() );
} }
} }
ptree & rule_; ptree & rule_;
bool explicit_defaults_;
}; };
void serialize_rule( ptree & style_node, const rule_type & rule) void serialize_rule( ptree & style_node, const rule_type & rule, bool explicit_defaults)
{ {
ptree & rule_node = style_node.push_back( ptree & rule_node = style_node.push_back(
ptree::value_type("Rule", ptree() ))->second; ptree::value_type("Rule", ptree() ))->second;
@ -329,7 +332,7 @@ namespace mapnik
} }
} }
if (rule.get_min_scale() != dfl.get_min_scale()) if (rule.get_min_scale() != dfl.get_min_scale() )
{ {
ptree & min_scale = rule_node.push_back( ptree::value_type( ptree & min_scale = rule_node.push_back( ptree::value_type(
"MinScaleDenominator", ptree()))->second; "MinScaleDenominator", ptree()))->second;
@ -345,11 +348,11 @@ namespace mapnik
symbolizers::const_iterator begin = rule.get_symbolizers().begin(); symbolizers::const_iterator begin = rule.get_symbolizers().begin();
symbolizers::const_iterator end = rule.get_symbolizers().end(); symbolizers::const_iterator end = rule.get_symbolizers().end();
serialize_symbolizer serializer( rule_node ); serialize_symbolizer serializer( rule_node, explicit_defaults);
std::for_each( begin, end , boost::apply_visitor( serializer )); std::for_each( begin, end , boost::apply_visitor( serializer ));
} }
void serialize_style( ptree & map_node, Map::const_style_iterator style_it ) void serialize_style( ptree & map_node, Map::const_style_iterator style_it, bool explicit_defaults )
{ {
const feature_type_style & style = style_it->second; const feature_type_style & style = style_it->second;
const std::string & name = style_it->first; const std::string & name = style_it->first;
@ -363,7 +366,7 @@ namespace mapnik
rules::const_iterator end = style.get_rules().end(); rules::const_iterator end = style.get_rules().end();
for (; it != end; ++it) for (; it != end; ++it)
{ {
serialize_rule( style_node, * it ); serialize_rule( style_node, * it , explicit_defaults);
} }
} }
@ -465,7 +468,7 @@ namespace mapnik
} }
} }
void save_map(Map const & map, std::string const& filename) void save_map(Map const & map, std::string const& filename, bool explicit_defaults)
{ {
ptree pt; ptree pt;
@ -492,7 +495,7 @@ namespace mapnik
Map::const_style_iterator end = map.styles().end(); Map::const_style_iterator end = map.styles().end();
for (; it != end; ++it) for (; it != end; ++it)
{ {
serialize_style( map_node, it); serialize_style( map_node, it, explicit_defaults);
} }
std::vector<Layer> const & layers = map.layers(); std::vector<Layer> const & layers = map.layers();