|
|
|
@ -73,7 +73,6 @@
|
|
|
|
|
using boost::lexical_cast;
|
|
|
|
|
using boost::bad_lexical_cast;
|
|
|
|
|
using boost::tokenizer;
|
|
|
|
|
using boost::property_tree::ptree;
|
|
|
|
|
|
|
|
|
|
using std::cerr;
|
|
|
|
|
using std::endl;
|
|
|
|
@ -101,32 +100,31 @@ private:
|
|
|
|
|
void parse_style(Map & map, xml_node const& sty);
|
|
|
|
|
void parse_layer(Map & map, xml_node const& lay);
|
|
|
|
|
void parse_metawriter(Map & map, xml_node const& lay);
|
|
|
|
|
void parse_metawriter_in_symbolizer(symbolizer_base &sym, ptree const &pt);
|
|
|
|
|
void parse_metawriter_in_symbolizer(symbolizer_base &sym, xml_node const& pt);
|
|
|
|
|
|
|
|
|
|
void parse_fontset(Map & map, xml_node const & fset);
|
|
|
|
|
void parse_font(font_set & fset, xml_node const& f);
|
|
|
|
|
|
|
|
|
|
void parse_rule(feature_type_style & style, ptree const & r);
|
|
|
|
|
void parse_rule(feature_type_style & style, xml_node const & r);
|
|
|
|
|
|
|
|
|
|
void parse_point_symbolizer(rule & rule, ptree const & sym);
|
|
|
|
|
void parse_line_pattern_symbolizer(rule & rule, ptree const & sym);
|
|
|
|
|
void parse_polygon_pattern_symbolizer(rule & rule, ptree const & sym);
|
|
|
|
|
void parse_text_symbolizer(rule & rule, ptree const & sym);
|
|
|
|
|
void parse_shield_symbolizer(rule & rule, ptree const & sym);
|
|
|
|
|
void parse_line_symbolizer(rule & rule, ptree const & sym);
|
|
|
|
|
void parse_polygon_symbolizer(rule & rule, ptree const & sym);
|
|
|
|
|
void parse_building_symbolizer(rule & rule, ptree const & sym );
|
|
|
|
|
void parse_raster_symbolizer(rule & rule, ptree const & sym );
|
|
|
|
|
void parse_markers_symbolizer(rule & rule, ptree const & sym );
|
|
|
|
|
void parse_point_symbolizer(rule & rule, xml_node const& sym);
|
|
|
|
|
void parse_line_pattern_symbolizer(rule & rule, xml_node const& sym);
|
|
|
|
|
void parse_polygon_pattern_symbolizer(rule & rule, xml_node const& sym);
|
|
|
|
|
void parse_text_symbolizer(rule & rule, xml_node const& sym);
|
|
|
|
|
void parse_shield_symbolizer(rule & rule, xml_node const& sym);
|
|
|
|
|
void parse_line_symbolizer(rule & rule, xml_node const& sym);
|
|
|
|
|
void parse_polygon_symbolizer(rule & rule, xml_node const& sym);
|
|
|
|
|
void parse_building_symbolizer(rule & rule, xml_node const& sym );
|
|
|
|
|
void parse_raster_symbolizer(rule & rule, xml_node const& sym );
|
|
|
|
|
void parse_markers_symbolizer(rule & rule, xml_node const& sym );
|
|
|
|
|
|
|
|
|
|
void parse_raster_colorizer(raster_colorizer_ptr const& rc, ptree const& node );
|
|
|
|
|
void parse_stroke(stroke & strk, ptree const & sym);
|
|
|
|
|
void parse_raster_colorizer(raster_colorizer_ptr const& rc, xml_node const& node );
|
|
|
|
|
void parse_stroke(stroke & strk, xml_node const & sym);
|
|
|
|
|
expression_ptr parse_expr(std::string const& expr);
|
|
|
|
|
|
|
|
|
|
void ensure_font_face( const std::string & face_name );
|
|
|
|
|
|
|
|
|
|
std::string ensure_relative_to_xml( boost::optional<std::string> opt_path );
|
|
|
|
|
void ensure_attrs( ptree const& sym, std::string name, std::string attrs);
|
|
|
|
|
boost::optional<color> get_opt_color_attr(boost::property_tree::ptree const& node,
|
|
|
|
|
std::string const& name);
|
|
|
|
|
|
|
|
|
@ -144,27 +142,7 @@ private:
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void remove_empty_text_nodes(ptree &pt)
|
|
|
|
|
{
|
|
|
|
|
ptree::iterator itr = pt.begin();
|
|
|
|
|
ptree::iterator end = pt.end();
|
|
|
|
|
while (itr!=end)
|
|
|
|
|
{
|
|
|
|
|
if (itr->first == "<xmltext>") {
|
|
|
|
|
std::string trimmed = boost::algorithm::trim_copy(itr->second.data());
|
|
|
|
|
if (trimmed.empty()) {
|
|
|
|
|
itr = pt.erase(itr);
|
|
|
|
|
} else {
|
|
|
|
|
itr++;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
remove_empty_text_nodes(itr->second);
|
|
|
|
|
itr++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//#include <mapnik/internal/dump_xml.hpp>
|
|
|
|
|
void load_map(Map & map, std::string const& filename, bool strict)
|
|
|
|
|
{
|
|
|
|
|
xml_tree tree;
|
|
|
|
@ -183,7 +161,7 @@ void load_map(Map & map, std::string const& filename, bool strict)
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
map_parser parser(strict, filename);
|
|
|
|
|
// parser.parse_map(map, pt);
|
|
|
|
|
parser.parse_map(map, tree.root());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void load_map_string(Map & map, std::string const& str, bool strict, std::string const& base_path)
|
|
|
|
@ -209,7 +187,7 @@ void load_map_string(Map & map, std::string const& str, bool strict, std::string
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
map_parser parser(strict, base_path);
|
|
|
|
|
// parser.parse_map(map, tree.root(), base_path);
|
|
|
|
|
parser.parse_map(map, tree.root(), base_path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expression_ptr map_parser::parse_expr(std::string const& str)
|
|
|
|
@ -408,15 +386,15 @@ void map_parser::parse_map_include(Map & map, xml_node const& include)
|
|
|
|
|
}
|
|
|
|
|
else if (itr->name() == "Layer")
|
|
|
|
|
{
|
|
|
|
|
// parse_layer(map, *itr);
|
|
|
|
|
parse_layer(map, *itr);
|
|
|
|
|
}
|
|
|
|
|
else if (itr->name() == "FontSet")
|
|
|
|
|
{
|
|
|
|
|
// parse_fontset(map, *itr);
|
|
|
|
|
parse_fontset(map, *itr);
|
|
|
|
|
}
|
|
|
|
|
else if (itr->name() == "MetaWriter")
|
|
|
|
|
{
|
|
|
|
|
// parse_metawriter(map, *itr);
|
|
|
|
|
parse_metawriter(map, *itr);
|
|
|
|
|
}
|
|
|
|
|
else if (itr->name() == "FileSource")
|
|
|
|
|
{
|
|
|
|
@ -459,13 +437,13 @@ void map_parser::parse_map_include(Map & map, xml_node const& include)
|
|
|
|
|
if (*type == "int")
|
|
|
|
|
{
|
|
|
|
|
is_string = false;
|
|
|
|
|
int value = paramIter->get_value<int>("parameter");
|
|
|
|
|
int value = paramIter->get_value<int>();
|
|
|
|
|
params[name] = value;
|
|
|
|
|
}
|
|
|
|
|
else if (*type == "float")
|
|
|
|
|
{
|
|
|
|
|
is_string = false;
|
|
|
|
|
double value = paramIter->get_value<double>("parameter");
|
|
|
|
|
double value = paramIter->get_value<double>();
|
|
|
|
|
params[name] = value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -505,7 +483,7 @@ void map_parser::parse_style(Map & map, xml_node const& sty)
|
|
|
|
|
{
|
|
|
|
|
if (ruleIter->is("Rule"))
|
|
|
|
|
{
|
|
|
|
|
// parse_rule(style, rule_tag.second);
|
|
|
|
|
parse_rule(style, *ruleIter);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -523,7 +501,7 @@ void map_parser::parse_metawriter(Map & map, xml_node const& pt)
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
name = pt.get_attr<std::string>("name");
|
|
|
|
|
// writer = metawriter_create(pt);
|
|
|
|
|
//TODO: writer = metawriter_create(pt);
|
|
|
|
|
map.insert_metawriter(name, writer);
|
|
|
|
|
} catch (const config_error & ex) {
|
|
|
|
|
ex.append_context(std::string("in meta writer '") + name + "'");
|
|
|
|
@ -642,7 +620,7 @@ void map_parser::parse_layer(Map & map, xml_node const& lay)
|
|
|
|
|
|
|
|
|
|
if (child->is("StyleName"))
|
|
|
|
|
{
|
|
|
|
|
std::string style_name = child->get_value<std::string>("style name"); //TODO: get_text
|
|
|
|
|
std::string style_name = child->get_value<std::string>(); //TODO: get_text
|
|
|
|
|
if (style_name.empty())
|
|
|
|
|
{
|
|
|
|
|
std::ostringstream ss;
|
|
|
|
@ -722,149 +700,140 @@ void map_parser::parse_layer(Map & map, xml_node const& lay)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_rule( feature_type_style & style, ptree const & r )
|
|
|
|
|
void map_parser::parse_rule(feature_type_style & style, xml_node const& r)
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(r, "Rule", "name");
|
|
|
|
|
std::string name;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
name = get_attr( r, "name", std::string());
|
|
|
|
|
name = r.get_attr("name", std::string());
|
|
|
|
|
rule rule(name);
|
|
|
|
|
|
|
|
|
|
optional<std::string> filter_expr =
|
|
|
|
|
get_opt_child<std::string>( r, "Filter");
|
|
|
|
|
if (filter_expr)
|
|
|
|
|
xml_node *child = r.get_opt_child("Filter");
|
|
|
|
|
if (child)
|
|
|
|
|
{
|
|
|
|
|
rule.set_filter(parse_expr(*filter_expr));
|
|
|
|
|
rule.set_filter(child->get_value<expression_ptr>());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (has_child(r, "ElseFilter"))
|
|
|
|
|
if (r.has_child("ElseFilter"))
|
|
|
|
|
{
|
|
|
|
|
rule.set_else(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (has_child(r, "AlsoFilter"))
|
|
|
|
|
if (r.has_child("AlsoFilter"))
|
|
|
|
|
{
|
|
|
|
|
rule.set_also(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
optional<double> min_scale =
|
|
|
|
|
get_opt_child<double>(r, "MinScaleDenominator");
|
|
|
|
|
if (min_scale)
|
|
|
|
|
child = r.get_opt_child("MinScaleDenominator");
|
|
|
|
|
if (child)
|
|
|
|
|
{
|
|
|
|
|
rule.set_min_scale(*min_scale);
|
|
|
|
|
rule.set_min_scale(child->get_value<double>());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
optional<double> max_scale =
|
|
|
|
|
get_opt_child<double>(r, "MaxScaleDenominator");
|
|
|
|
|
if (max_scale)
|
|
|
|
|
child = r.get_opt_child("MaxScaleDenominator");
|
|
|
|
|
if (child)
|
|
|
|
|
{
|
|
|
|
|
rule.set_max_scale(*max_scale);
|
|
|
|
|
rule.set_max_scale(child->get_value<double>());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ptree::const_iterator symIter = r.begin();
|
|
|
|
|
ptree::const_iterator endSym = r.end();
|
|
|
|
|
xml_node::const_iterator symIter = r.begin();
|
|
|
|
|
xml_node::const_iterator endSym = r.end();
|
|
|
|
|
|
|
|
|
|
for( ;symIter != endSym; ++symIter)
|
|
|
|
|
{
|
|
|
|
|
ptree::value_type const& sym = *symIter;
|
|
|
|
|
|
|
|
|
|
if ( sym.first == "PointSymbolizer")
|
|
|
|
|
if ( symIter->is("PointSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_point_symbolizer( rule, sym.second );
|
|
|
|
|
parse_point_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "LinePatternSymbolizer")
|
|
|
|
|
else if (symIter->is("LinePatternSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_line_pattern_symbolizer( rule, sym.second );
|
|
|
|
|
parse_line_pattern_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "PolygonPatternSymbolizer")
|
|
|
|
|
else if (symIter->is("PolygonPatternSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_polygon_pattern_symbolizer( rule, sym.second );
|
|
|
|
|
parse_polygon_pattern_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "TextSymbolizer")
|
|
|
|
|
else if (symIter->is("TextSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_text_symbolizer( rule, sym.second );
|
|
|
|
|
parse_text_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "ShieldSymbolizer")
|
|
|
|
|
else if (symIter->is("ShieldSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_shield_symbolizer( rule, sym.second );
|
|
|
|
|
parse_shield_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "LineSymbolizer")
|
|
|
|
|
else if (symIter->is("LineSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_line_symbolizer( rule, sym.second );
|
|
|
|
|
parse_line_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "PolygonSymbolizer")
|
|
|
|
|
else if (symIter->is("PolygonSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_polygon_symbolizer( rule, sym.second );
|
|
|
|
|
parse_polygon_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "BuildingSymbolizer")
|
|
|
|
|
else if (symIter->is("BuildingSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_building_symbolizer( rule, sym.second );
|
|
|
|
|
parse_building_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "RasterSymbolizer")
|
|
|
|
|
else if (symIter->is("RasterSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_raster_symbolizer( rule, sym.second );
|
|
|
|
|
parse_raster_symbolizer( rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
else if ( sym.first == "MarkersSymbolizer")
|
|
|
|
|
else if (symIter->is("MarkersSymbolizer"))
|
|
|
|
|
{
|
|
|
|
|
parse_markers_symbolizer(rule, sym.second);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
else if ( sym.first != "MinScaleDenominator" &&
|
|
|
|
|
sym.first != "MaxScaleDenominator" &&
|
|
|
|
|
sym.first != "Filter" &&
|
|
|
|
|
sym.first != "ElseFilter" &&
|
|
|
|
|
sym.first != "AlsoFilter" &&
|
|
|
|
|
sym.first != "<xmlcomment>" &&
|
|
|
|
|
sym.first != "<xmlattr>" )
|
|
|
|
|
{
|
|
|
|
|
throw config_error(std::string("Unknown symbolizer '") +
|
|
|
|
|
sym.first + "'");
|
|
|
|
|
parse_markers_symbolizer(rule, *symIter);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
style.add_rule(rule);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch (const config_error & ex)
|
|
|
|
|
{
|
|
|
|
|
if ( ! name.empty() )
|
|
|
|
|
if (!name.empty() )
|
|
|
|
|
{
|
|
|
|
|
ex.append_context(std::string("in rule '") + name + "' in map '" + filename_ + "')");
|
|
|
|
|
ex.append_context(std::string("in rule '") + name + "'");
|
|
|
|
|
}
|
|
|
|
|
throw;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_metawriter_in_symbolizer(symbolizer_base &sym, ptree const &pt)
|
|
|
|
|
void map_parser::parse_metawriter_in_symbolizer(symbolizer_base &sym, xml_node const &pt)
|
|
|
|
|
{
|
|
|
|
|
optional<std::string> writer = get_opt_attr<std::string>(pt, "meta-writer");
|
|
|
|
|
optional<std::string> writer = pt.get_opt_attr<std::string>("meta-writer");
|
|
|
|
|
if (!writer) return;
|
|
|
|
|
optional<std::string> output = get_opt_attr<std::string>(pt, "meta-output");
|
|
|
|
|
optional<std::string> output = pt.get_opt_attr<std::string>("meta-output");
|
|
|
|
|
sym.add_metawriter(*writer, output);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_point_symbolizer(rule & rule, xml_node const & sym)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
std::stringstream s;
|
|
|
|
|
s << "file,base,allow-overlap,ignore-placement,opacity,placement,transform,meta-writer,meta-output";
|
|
|
|
|
optional<std::string> file = sym.get_opt_attr<std::string>("file");
|
|
|
|
|
optional<std::string> base = sym.get_opt_attr<std::string>("base");
|
|
|
|
|
optional<boolean> allow_overlap = sym.get_opt_attr<boolean>("allow-overlap");
|
|
|
|
|
optional<boolean> ignore_placement = sym.get_opt_attr<boolean>("ignore-placement");
|
|
|
|
|
optional<float> opacity = sym.get_opt_attr<float>("opacity");
|
|
|
|
|
optional<std::string> transform_wkt = sym.get_opt_attr<std::string>("transform");
|
|
|
|
|
|
|
|
|
|
optional<std::string> file = get_opt_attr<std::string>(sym, "file");
|
|
|
|
|
optional<std::string> base = get_opt_attr<std::string>(sym, "base");
|
|
|
|
|
optional<boolean> allow_overlap =
|
|
|
|
|
get_opt_attr<boolean>(sym, "allow-overlap");
|
|
|
|
|
optional<boolean> ignore_placement =
|
|
|
|
|
get_opt_attr<boolean>(sym, "ignore-placement");
|
|
|
|
|
optional<float> opacity =
|
|
|
|
|
get_opt_attr<float>(sym, "opacity");
|
|
|
|
|
|
|
|
|
|
optional<std::string> transform_wkt = get_opt_attr<std::string>(sym, "transform");
|
|
|
|
|
point_symbolizer symbol;
|
|
|
|
|
if (allow_overlap)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_allow_overlap( * allow_overlap );
|
|
|
|
|
}
|
|
|
|
|
if (opacity)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_opacity( * opacity );
|
|
|
|
|
}
|
|
|
|
|
if (ignore_placement)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_ignore_placement( * ignore_placement );
|
|
|
|
|
}
|
|
|
|
|
point_placement_e placement =
|
|
|
|
|
sym.get_attr<point_placement_e>("placement", CENTROID_POINT_PLACEMENT);
|
|
|
|
|
symbol.set_point_placement( placement );
|
|
|
|
|
|
|
|
|
|
if (file)
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(sym, "PointSymbolizer", s.str());
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if( base )
|
|
|
|
@ -878,23 +847,7 @@ void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
|
|
|
|
|
*file = ensure_relative_to_xml(file);
|
|
|
|
|
|
|
|
|
|
point_symbolizer symbol(parse_path(*file));
|
|
|
|
|
|
|
|
|
|
if (allow_overlap)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_allow_overlap( * allow_overlap );
|
|
|
|
|
}
|
|
|
|
|
if (opacity)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_opacity( * opacity );
|
|
|
|
|
}
|
|
|
|
|
if (ignore_placement)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_ignore_placement( * ignore_placement );
|
|
|
|
|
}
|
|
|
|
|
point_placement_e placement =
|
|
|
|
|
get_attr<point_placement_e>(sym, "placement", CENTROID_POINT_PLACEMENT);
|
|
|
|
|
symbol.set_point_placement( placement );
|
|
|
|
|
symbol.set_filename(parse_path(*file));
|
|
|
|
|
|
|
|
|
|
if (transform_wkt)
|
|
|
|
|
{
|
|
|
|
@ -930,32 +883,9 @@ void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
std::clog << "### WARNING: " << msg << endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(sym, "PointSymbolizer", s.str());
|
|
|
|
|
point_symbolizer symbol;
|
|
|
|
|
|
|
|
|
|
if (allow_overlap)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_allow_overlap( * allow_overlap );
|
|
|
|
|
}
|
|
|
|
|
if (opacity)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_opacity( * opacity );
|
|
|
|
|
}
|
|
|
|
|
if (ignore_placement)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_ignore_placement( * ignore_placement );
|
|
|
|
|
}
|
|
|
|
|
point_placement_e placement =
|
|
|
|
|
get_attr<point_placement_e>(sym, "placement", CENTROID_POINT_PLACEMENT);
|
|
|
|
|
symbol.set_point_placement( placement );
|
|
|
|
|
|
|
|
|
|
parse_metawriter_in_symbolizer(symbol, sym);
|
|
|
|
|
rule.append(symbol);
|
|
|
|
|
}
|
|
|
|
|
parse_metawriter_in_symbolizer(symbol, sym);
|
|
|
|
|
rule.append(symbol);
|
|
|
|
|
}
|
|
|
|
|
catch (const config_error & ex)
|
|
|
|
|
{
|
|
|
|
@ -965,30 +895,17 @@ void map_parser::parse_point_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_markers_symbolizer(rule & rule, xml_node const& sym)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
std::string filename("");
|
|
|
|
|
optional<std::string> file = get_opt_attr<std::string>(sym, "file");
|
|
|
|
|
optional<std::string> base = get_opt_attr<std::string>(sym, "base");
|
|
|
|
|
optional<std::string> transform_wkt = get_opt_attr<std::string>(sym, "transform");
|
|
|
|
|
|
|
|
|
|
std::stringstream s;
|
|
|
|
|
//s << "file,opacity,spacing,max-error,allow-overlap,placement,";
|
|
|
|
|
s << "file,base,transform,fill,opacity,"
|
|
|
|
|
<< "spacing,max-error,allow-overlap,"
|
|
|
|
|
<< "width,height,placement,marker-type,"
|
|
|
|
|
<< "stroke,stroke-width,stroke-opacity,stroke-linejoin,"
|
|
|
|
|
<< "stroke-linecap,stroke-dashoffset,stroke-dasharray,"
|
|
|
|
|
// note: stroke-gamma intentionally left off here as markers do not support them
|
|
|
|
|
<< "meta-writer,meta-output";
|
|
|
|
|
ensure_attrs(sym, "MarkersSymbolizer", s.str());
|
|
|
|
|
optional<std::string> file = sym.get_opt_attr<std::string>("file");
|
|
|
|
|
optional<std::string> base = sym.get_opt_attr<std::string>("base");
|
|
|
|
|
optional<std::string> transform_wkt = sym.get_opt_attr<std::string>("transform");
|
|
|
|
|
|
|
|
|
|
if (file)
|
|
|
|
|
{
|
|
|
|
|
//s << "base,transform";
|
|
|
|
|
//ensure_attrs(sym, "MarkersSymbolizer", s.str());
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (base)
|
|
|
|
@ -1015,14 +932,9 @@ void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/*else
|
|
|
|
|
{
|
|
|
|
|
//s << "fill,marker-type,width,height";
|
|
|
|
|
//ensure_attrs(sym, "MarkersSymbolizer", s.str());
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
markers_symbolizer symbol(parse_path(filename));
|
|
|
|
|
optional<float> opacity = get_opt_attr<float>(sym, "opacity");
|
|
|
|
|
optional<float> opacity = sym.get_opt_attr<float>("opacity");
|
|
|
|
|
if (opacity) symbol.set_opacity( *opacity );
|
|
|
|
|
|
|
|
|
|
if (transform_wkt)
|
|
|
|
@ -1043,17 +955,17 @@ void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
symbol.set_transform(matrix);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
optional<color> c = get_opt_color_attr(sym, "fill");
|
|
|
|
|
optional<color> c = sym.get_opt_attr<color>("fill");
|
|
|
|
|
if (c) symbol.set_fill(*c);
|
|
|
|
|
optional<double> spacing = get_opt_attr<double>(sym, "spacing");
|
|
|
|
|
optional<double> spacing = sym.get_opt_attr<double>("spacing");
|
|
|
|
|
if (spacing) symbol.set_spacing(*spacing);
|
|
|
|
|
optional<double> max_error = get_opt_attr<double>(sym, "max-error");
|
|
|
|
|
optional<double> max_error = sym.get_opt_attr<double>("max-error");
|
|
|
|
|
if (max_error) symbol.set_max_error(*max_error);
|
|
|
|
|
optional<boolean> allow_overlap = get_opt_attr<boolean>(sym, "allow-overlap");
|
|
|
|
|
optional<boolean> allow_overlap = sym.get_opt_attr<boolean>("allow-overlap");
|
|
|
|
|
if (allow_overlap) symbol.set_allow_overlap(*allow_overlap);
|
|
|
|
|
|
|
|
|
|
optional<double> w = get_opt_attr<double>(sym, "width");
|
|
|
|
|
optional<double> h = get_opt_attr<double>(sym, "height");
|
|
|
|
|
optional<double> w = sym.get_opt_attr<double>("width");
|
|
|
|
|
optional<double> h = sym.get_opt_attr<double>("height");
|
|
|
|
|
if (w && h)
|
|
|
|
|
{
|
|
|
|
|
symbol.set_width(*w);
|
|
|
|
@ -1075,7 +987,7 @@ void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
parse_stroke(strk,sym);
|
|
|
|
|
symbol.set_stroke(strk);
|
|
|
|
|
|
|
|
|
|
marker_placement_e placement = get_attr<marker_placement_e>(sym, "placement", MARKER_LINE_PLACEMENT);
|
|
|
|
|
marker_placement_e placement = sym.get_attr<marker_placement_e>("placement", MARKER_LINE_PLACEMENT);
|
|
|
|
|
symbol.set_marker_placement( placement );
|
|
|
|
|
|
|
|
|
|
marker_type_e dfl_marker_type = ARROW;
|
|
|
|
@ -1083,7 +995,7 @@ void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
if (placement == MARKER_POINT_PLACEMENT)
|
|
|
|
|
dfl_marker_type = ELLIPSE;
|
|
|
|
|
|
|
|
|
|
marker_type_e marker_type = get_attr<marker_type_e>(sym, "marker-type", dfl_marker_type);
|
|
|
|
|
marker_type_e marker_type = sym.get_attr<marker_type_e>("marker-type", dfl_marker_type);
|
|
|
|
|
symbol.set_marker_type( marker_type );
|
|
|
|
|
|
|
|
|
|
parse_metawriter_in_symbolizer(symbol, sym);
|
|
|
|
@ -1096,13 +1008,12 @@ void map_parser::parse_markers_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_line_pattern_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_line_pattern_symbolizer( rule & rule, xml_node const & sym )
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(sym, "LinePatternSymbolizer", "file,base,meta-writer,meta-output");
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
std::string file = get_attr<std::string>(sym, "file");
|
|
|
|
|
optional<std::string> base = get_opt_attr<std::string>(sym, "base");
|
|
|
|
|
std::string file = sym.get_attr<std::string>("file");
|
|
|
|
|
optional<std::string> base = sym.get_opt_attr<std::string>("base");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
@ -1144,13 +1055,12 @@ void map_parser::parse_line_pattern_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_polygon_pattern_symbolizer( rule & rule,
|
|
|
|
|
ptree const & sym )
|
|
|
|
|
xml_node const & sym )
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(sym, "PolygonPatternSymbolizer", "file,base,alignment,gamma,meta-writer,meta-output");
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
std::string file = get_attr<std::string>(sym, "file");
|
|
|
|
|
optional<std::string> base = get_opt_attr<std::string>(sym, "base");
|
|
|
|
|
std::string file = sym.get_attr<std::string>("file");
|
|
|
|
|
optional<std::string> base = sym.get_opt_attr<std::string>("base");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
@ -1168,15 +1078,15 @@ void map_parser::parse_polygon_pattern_symbolizer( rule & rule,
|
|
|
|
|
polygon_pattern_symbolizer symbol(parse_path(file));
|
|
|
|
|
|
|
|
|
|
// pattern alignment
|
|
|
|
|
pattern_alignment_e p_alignment = get_attr<pattern_alignment_e>(sym, "alignment",LOCAL_ALIGNMENT);
|
|
|
|
|
pattern_alignment_e p_alignment = sym.get_attr<pattern_alignment_e>("alignment",LOCAL_ALIGNMENT);
|
|
|
|
|
symbol.set_alignment(p_alignment);
|
|
|
|
|
|
|
|
|
|
// gamma
|
|
|
|
|
optional<double> gamma = get_opt_attr<double>(sym, "gamma");
|
|
|
|
|
optional<double> gamma = sym.get_opt_attr<double>("gamma");
|
|
|
|
|
if (gamma) symbol.set_gamma(*gamma);
|
|
|
|
|
|
|
|
|
|
// gamma method
|
|
|
|
|
optional<gamma_method_e> gamma_method = get_opt_attr<gamma_method_e>(sym, "gamma-method");
|
|
|
|
|
optional<gamma_method_e> gamma_method = sym.get_opt_attr<gamma_method_e>("gamma-method");
|
|
|
|
|
if (gamma_method) symbol.set_gamma_method(*gamma_method);
|
|
|
|
|
|
|
|
|
|
parse_metawriter_in_symbolizer(symbol, sym);
|
|
|
|
@ -1203,27 +1113,12 @@ void map_parser::parse_polygon_pattern_symbolizer( rule & rule,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_text_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_text_symbolizer( rule & rule, xml_node const& sym )
|
|
|
|
|
{
|
|
|
|
|
std::stringstream s_common;
|
|
|
|
|
s_common << "name,face-name,fontset-name,size,fill,orientation,"
|
|
|
|
|
<< "dx,dy,placement,vertical-alignment,halo-fill,"
|
|
|
|
|
<< "halo-radius,text-ratio,wrap-width,wrap-before,"
|
|
|
|
|
<< "wrap-character,text-transform,line-spacing,"
|
|
|
|
|
<< "label-position-tolerance,character-spacing,"
|
|
|
|
|
<< "spacing,minimum-distance,minimum-padding,minimum-path-length,"
|
|
|
|
|
<< "avoid-edges,allow-overlap,opacity,max-char-angle-delta,"
|
|
|
|
|
<< "horizontal-alignment,justify-alignment";
|
|
|
|
|
|
|
|
|
|
std::stringstream s_symbolizer;
|
|
|
|
|
s_symbolizer << s_common.str() << ",placements,placement-type,"
|
|
|
|
|
<< "meta-writer,meta-output";
|
|
|
|
|
|
|
|
|
|
ensure_attrs(sym, "TextSymbolizer", s_symbolizer.str());
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
text_placements_ptr placement_finder;
|
|
|
|
|
optional<std::string> placement_type = get_opt_attr<std::string>(sym, "placement-type");
|
|
|
|
|
optional<std::string> placement_type = sym.get_opt_attr<std::string>("placement-type");
|
|
|
|
|
if (placement_type) {
|
|
|
|
|
placement_finder = placements::registry::instance()->from_xml(*placement_type, sym, fontsets_);
|
|
|
|
|
} else {
|
|
|
|
@ -1245,28 +1140,12 @@ void map_parser::parse_text_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_shield_symbolizer(rule & rule, xml_node const& sym )
|
|
|
|
|
{
|
|
|
|
|
std::string s_common(
|
|
|
|
|
"name,face-name,fontset-name,size,fill,orientation,"
|
|
|
|
|
"dx,dy,placement,vertical-alignment,halo-fill,"
|
|
|
|
|
"halo-radius,text-ratio,wrap-width,wrap-before,"
|
|
|
|
|
"wrap-character,text-transform,line-spacing,"
|
|
|
|
|
"label-position-tolerance,character-spacing,"
|
|
|
|
|
"spacing,minimum-distance,minimum-padding,minimum-path-length,"
|
|
|
|
|
"avoid-edges,allow-overlap,opacity,max-char-angle-delta,"
|
|
|
|
|
"horizontal-alignment,justify-alignment");
|
|
|
|
|
|
|
|
|
|
std::string s_symbolizer(s_common + ",file,base,"
|
|
|
|
|
"transform,shield-dx,shield-dy,text-opacity,"
|
|
|
|
|
"unlock-image"
|
|
|
|
|
"placements,placement-type,meta-writer,meta-output");
|
|
|
|
|
|
|
|
|
|
ensure_attrs(sym, "ShieldSymbolizer", s_symbolizer);
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
text_placements_ptr placement_finder;
|
|
|
|
|
optional<std::string> placement_type = get_opt_attr<std::string>(sym, "placement-type");
|
|
|
|
|
optional<std::string> placement_type = sym.get_opt_attr<std::string>("placement-type");
|
|
|
|
|
if (placement_type) {
|
|
|
|
|
placement_finder = placements::registry::instance()->from_xml(*placement_type, sym, fontsets_);
|
|
|
|
|
} else {
|
|
|
|
@ -1279,7 +1158,7 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
|
|
|
|
|
shield_symbolizer shield_symbol = shield_symbolizer(placement_finder);
|
|
|
|
|
/* Symbolizer specific attributes. */
|
|
|
|
|
optional<std::string> transform_wkt = get_opt_attr<std::string>(sym, "transform");
|
|
|
|
|
optional<std::string> transform_wkt = sym.get_opt_attr<std::string>("transform");
|
|
|
|
|
if (transform_wkt)
|
|
|
|
|
{
|
|
|
|
|
agg::trans_affine tr;
|
|
|
|
@ -1297,12 +1176,12 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
shield_symbol.set_transform(matrix);
|
|
|
|
|
}
|
|
|
|
|
// shield displacement
|
|
|
|
|
double shield_dx = get_attr(sym, "shield-dx", 0.0);
|
|
|
|
|
double shield_dy = get_attr(sym, "shield-dy", 0.0);
|
|
|
|
|
double shield_dx = sym.get_attr("shield-dx", 0.0);
|
|
|
|
|
double shield_dy = sym.get_attr("shield-dy", 0.0);
|
|
|
|
|
shield_symbol.set_shield_displacement(shield_dx,shield_dy);
|
|
|
|
|
|
|
|
|
|
// opacity
|
|
|
|
|
optional<double> opacity = get_opt_attr<double>(sym, "opacity");
|
|
|
|
|
optional<double> opacity = sym.get_opt_attr<double>("opacity");
|
|
|
|
|
if (opacity)
|
|
|
|
|
{
|
|
|
|
|
shield_symbol.set_opacity(*opacity);
|
|
|
|
@ -1311,7 +1190,7 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
// text-opacity
|
|
|
|
|
// TODO: Could be problematic because it is named opacity in TextSymbolizer but opacity has a diffrent meaning here.
|
|
|
|
|
optional<double> text_opacity =
|
|
|
|
|
get_opt_attr<double>(sym, "text-opacity");
|
|
|
|
|
sym.get_opt_attr<double>("text-opacity");
|
|
|
|
|
if (text_opacity)
|
|
|
|
|
{
|
|
|
|
|
shield_symbol.set_text_opacity( * text_opacity );
|
|
|
|
@ -1319,7 +1198,7 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
|
|
|
|
|
// unlock_image
|
|
|
|
|
optional<boolean> unlock_image =
|
|
|
|
|
get_opt_attr<boolean>(sym, "unlock-image");
|
|
|
|
|
sym.get_opt_attr<boolean>("unlock-image");
|
|
|
|
|
if (unlock_image)
|
|
|
|
|
{
|
|
|
|
|
shield_symbol.set_unlock_image( * unlock_image );
|
|
|
|
@ -1327,8 +1206,8 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
|
|
|
|
|
parse_metawriter_in_symbolizer(shield_symbol, sym);
|
|
|
|
|
|
|
|
|
|
std::string image_file = get_attr<std::string>(sym, "file");
|
|
|
|
|
optional<std::string> base = get_opt_attr<std::string>(sym, "base");
|
|
|
|
|
std::string image_file = sym.get_attr<std::string>("file");
|
|
|
|
|
optional<std::string> base = sym.get_opt_attr<std::string>("base");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
@ -1366,42 +1245,42 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_stroke(stroke & strk, ptree const & sym)
|
|
|
|
|
void map_parser::parse_stroke(stroke & strk, xml_node const & sym)
|
|
|
|
|
{
|
|
|
|
|
// stroke color
|
|
|
|
|
optional<color> c = get_opt_color_attr(sym, "stroke");
|
|
|
|
|
optional<color> c = sym.get_opt_attr<color>("stroke");
|
|
|
|
|
if (c) strk.set_color(*c);
|
|
|
|
|
|
|
|
|
|
// stroke-width
|
|
|
|
|
optional<double> width = get_opt_attr<double>(sym, "stroke-width");
|
|
|
|
|
optional<double> width = sym.get_opt_attr<double>("stroke-width");
|
|
|
|
|
if (width) strk.set_width(*width);
|
|
|
|
|
|
|
|
|
|
// stroke-opacity
|
|
|
|
|
optional<double> opacity = get_opt_attr<double>(sym, "stroke-opacity");
|
|
|
|
|
optional<double> opacity = sym.get_opt_attr<double>("stroke-opacity");
|
|
|
|
|
if (opacity) strk.set_opacity(*opacity);
|
|
|
|
|
|
|
|
|
|
// stroke-linejoin
|
|
|
|
|
optional<line_join_e> line_join = get_opt_attr<line_join_e>(sym, "stroke-linejoin");
|
|
|
|
|
optional<line_join_e> line_join = sym.get_opt_attr<line_join_e>("stroke-linejoin");
|
|
|
|
|
if (line_join) strk.set_line_join(*line_join);
|
|
|
|
|
|
|
|
|
|
// stroke-linecap
|
|
|
|
|
optional<line_cap_e> line_cap = get_opt_attr<line_cap_e>(sym, "stroke-linecap");
|
|
|
|
|
optional<line_cap_e> line_cap = sym.get_opt_attr<line_cap_e>("stroke-linecap");
|
|
|
|
|
if (line_cap) strk.set_line_cap(*line_cap);
|
|
|
|
|
|
|
|
|
|
// stroke-gamma
|
|
|
|
|
optional<double> gamma = get_opt_attr<double>(sym, "stroke-gamma");
|
|
|
|
|
optional<double> gamma = sym.get_opt_attr<double>("stroke-gamma");
|
|
|
|
|
if (gamma) strk.set_gamma(*gamma);
|
|
|
|
|
|
|
|
|
|
// stroke-gamma-method
|
|
|
|
|
optional<gamma_method_e> gamma_method = get_opt_attr<gamma_method_e>(sym, "stroke-gamma-method");
|
|
|
|
|
optional<gamma_method_e> gamma_method = sym.get_opt_attr<gamma_method_e>("stroke-gamma-method");
|
|
|
|
|
if (gamma_method) strk.set_gamma_method(*gamma_method);
|
|
|
|
|
|
|
|
|
|
// stroke-dashoffset
|
|
|
|
|
optional<double> dash_offset = get_opt_attr<double>(sym, "stroke-dashoffset");
|
|
|
|
|
optional<double> dash_offset = sym.get_opt_attr<double>("stroke-dashoffset");
|
|
|
|
|
if (dash_offset) strk.set_dash_offset(*dash_offset);
|
|
|
|
|
|
|
|
|
|
// stroke-dasharray
|
|
|
|
|
optional<std::string> str = get_opt_attr<std::string>(sym,"stroke-dasharray");
|
|
|
|
|
optional<std::string> str = sym.get_opt_attr<std::string>("stroke-dasharray");
|
|
|
|
|
if (str)
|
|
|
|
|
{
|
|
|
|
|
tokenizer<> tok (*str);
|
|
|
|
@ -1441,15 +1320,8 @@ void map_parser::parse_stroke(stroke & strk, ptree const & sym)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_line_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_line_symbolizer( rule & rule, xml_node const & sym )
|
|
|
|
|
{
|
|
|
|
|
std::stringstream s;
|
|
|
|
|
s << "stroke,stroke-width,stroke-opacity,stroke-linejoin,"
|
|
|
|
|
<< "stroke-linecap,stroke-gamma,stroke-dash-offset,stroke-dasharray,"
|
|
|
|
|
<< "rasterizer,"
|
|
|
|
|
<< "meta-writer,meta-output";
|
|
|
|
|
|
|
|
|
|
ensure_attrs(sym, "LineSymbolizer", s.str());
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
stroke strk;
|
|
|
|
@ -1457,8 +1329,8 @@ void map_parser::parse_line_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
line_symbolizer symbol = line_symbolizer(strk);
|
|
|
|
|
|
|
|
|
|
// rasterizer method
|
|
|
|
|
line_rasterizer_e rasterizer = get_attr<line_rasterizer_e>(sym, "rasterizer", RASTERIZER_FULL);
|
|
|
|
|
//optional<line_rasterizer_e> rasterizer_method = get_opt_attr<line_rasterizer_e>(sym, "full");
|
|
|
|
|
line_rasterizer_e rasterizer = sym.get_attr<line_rasterizer_e>("rasterizer", RASTERIZER_FULL);
|
|
|
|
|
//optional<line_rasterizer_e> rasterizer_method = sym.get_opt_attr<line_rasterizer_e>("full");
|
|
|
|
|
symbol.set_rasterizer(rasterizer);
|
|
|
|
|
|
|
|
|
|
parse_metawriter_in_symbolizer(symbol, sym);
|
|
|
|
@ -1472,23 +1344,22 @@ void map_parser::parse_line_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_polygon_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_polygon_symbolizer( rule & rule, xml_node const & sym )
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(sym, "PolygonSymbolizer", "fill,fill-opacity,gamma,gamma-method,meta-writer,meta-output");
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
polygon_symbolizer poly_sym;
|
|
|
|
|
// fill
|
|
|
|
|
optional<color> fill = get_opt_color_attr(sym, "fill");
|
|
|
|
|
optional<color> fill = sym.get_opt_attr<color>("fill");
|
|
|
|
|
if (fill) poly_sym.set_fill(*fill);
|
|
|
|
|
// fill-opacity
|
|
|
|
|
optional<double> opacity = get_opt_attr<double>(sym, "fill-opacity");
|
|
|
|
|
optional<double> opacity = sym.get_opt_attr<double>("fill-opacity");
|
|
|
|
|
if (opacity) poly_sym.set_opacity(*opacity);
|
|
|
|
|
// gamma
|
|
|
|
|
optional<double> gamma = get_opt_attr<double>(sym, "gamma");
|
|
|
|
|
optional<double> gamma = sym.get_opt_attr<double>("gamma");
|
|
|
|
|
if (gamma) poly_sym.set_gamma(*gamma);
|
|
|
|
|
// gamma method
|
|
|
|
|
optional<gamma_method_e> gamma_method = get_opt_attr<gamma_method_e>(sym, "gamma-method");
|
|
|
|
|
optional<gamma_method_e> gamma_method = sym.get_opt_attr<gamma_method_e>("gamma-method");
|
|
|
|
|
if (gamma_method) poly_sym.set_gamma_method(*gamma_method);
|
|
|
|
|
|
|
|
|
|
parse_metawriter_in_symbolizer(poly_sym, sym);
|
|
|
|
@ -1502,21 +1373,20 @@ void map_parser::parse_polygon_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_building_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_building_symbolizer( rule & rule, xml_node const & sym )
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(sym, "PolygonSymbolizer", "fill,fill-opacity,height,meta-writer,meta-output");
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
building_symbolizer building_sym;
|
|
|
|
|
|
|
|
|
|
// fill
|
|
|
|
|
optional<color> fill = get_opt_color_attr(sym, "fill");
|
|
|
|
|
optional<color> fill = sym.get_opt_attr<color>("fill");
|
|
|
|
|
if (fill) building_sym.set_fill(*fill);
|
|
|
|
|
// fill-opacity
|
|
|
|
|
optional<double> opacity = get_opt_attr<double>(sym, "fill-opacity");
|
|
|
|
|
optional<double> opacity = sym.get_opt_attr<double>("fill-opacity");
|
|
|
|
|
if (opacity) building_sym.set_opacity(*opacity);
|
|
|
|
|
// height
|
|
|
|
|
optional<std::string> height = get_opt_attr<std::string>(sym, "height");
|
|
|
|
|
optional<std::string> height = sym.get_opt_attr<std::string>("height");
|
|
|
|
|
if (height) building_sym.set_height(parse_expr(*height));
|
|
|
|
|
|
|
|
|
|
parse_metawriter_in_symbolizer(building_sym, sym);
|
|
|
|
@ -1529,53 +1399,43 @@ void map_parser::parse_building_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_raster_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
void map_parser::parse_raster_symbolizer( rule & rule, xml_node const & sym )
|
|
|
|
|
{
|
|
|
|
|
// no support for meta-writer,meta-output
|
|
|
|
|
ensure_attrs(sym, "RasterSymbolizer", "mode,scaling,opacity,filter-factor,mesh-size");
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
raster_symbolizer raster_sym;
|
|
|
|
|
|
|
|
|
|
// mode
|
|
|
|
|
optional<std::string> mode = get_opt_attr<std::string>(sym, "mode");
|
|
|
|
|
optional<std::string> mode = sym.get_opt_attr<std::string>("mode");
|
|
|
|
|
if (mode) raster_sym.set_mode(*mode);
|
|
|
|
|
|
|
|
|
|
// scaling
|
|
|
|
|
optional<std::string> scaling = get_opt_attr<std::string>(sym, "scaling");
|
|
|
|
|
optional<std::string> scaling = sym.get_opt_attr<std::string>("scaling");
|
|
|
|
|
if (scaling) raster_sym.set_scaling(*scaling);
|
|
|
|
|
|
|
|
|
|
// opacity
|
|
|
|
|
optional<double> opacity = get_opt_attr<double>(sym, "opacity");
|
|
|
|
|
optional<double> opacity = sym.get_opt_attr<double>("opacity");
|
|
|
|
|
if (opacity) raster_sym.set_opacity(*opacity);
|
|
|
|
|
|
|
|
|
|
// filter factor
|
|
|
|
|
optional<double> filter_factor = get_opt_attr<double>(sym, "filter-factor");
|
|
|
|
|
optional<double> filter_factor = sym.get_opt_attr<double>("filter-factor");
|
|
|
|
|
if (filter_factor) raster_sym.set_filter_factor(*filter_factor);
|
|
|
|
|
|
|
|
|
|
// mesh-size
|
|
|
|
|
optional<unsigned> mesh_size = get_opt_attr<unsigned>(sym, "mesh-size");
|
|
|
|
|
optional<unsigned> mesh_size = sym.get_opt_attr<unsigned>("mesh-size");
|
|
|
|
|
if (mesh_size) raster_sym.set_mesh_size(*mesh_size);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ptree::const_iterator cssIter = sym.begin();
|
|
|
|
|
ptree::const_iterator endCss = sym.end();
|
|
|
|
|
xml_node::const_iterator cssIter = sym.begin();
|
|
|
|
|
xml_node::const_iterator endCss = sym.end();
|
|
|
|
|
|
|
|
|
|
for(; cssIter != endCss; ++cssIter)
|
|
|
|
|
{
|
|
|
|
|
ptree::value_type const& css_tag = *cssIter;
|
|
|
|
|
|
|
|
|
|
if (css_tag.first == "RasterColorizer")
|
|
|
|
|
if (cssIter->is("RasterColorizer"))
|
|
|
|
|
{
|
|
|
|
|
raster_colorizer_ptr colorizer(new raster_colorizer());
|
|
|
|
|
raster_sym.set_colorizer(colorizer);
|
|
|
|
|
parse_raster_colorizer(colorizer, css_tag.second);
|
|
|
|
|
}
|
|
|
|
|
else if (css_tag.first != "<xmlcomment>" &&
|
|
|
|
|
css_tag.first != "<xmlattr>" )
|
|
|
|
|
{
|
|
|
|
|
throw config_error(std::string("Unknown child node. ") +
|
|
|
|
|
"Expected 'RasterColorizer' but got '" + css_tag.first + "'");
|
|
|
|
|
parse_raster_colorizer(colorizer, *cssIter);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//Note: raster_symbolizer doesn't support metawriters
|
|
|
|
@ -1589,14 +1449,13 @@ void map_parser::parse_raster_symbolizer( rule & rule, ptree const & sym )
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc,
|
|
|
|
|
ptree const& node )
|
|
|
|
|
xml_node const& node )
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(node, "RasterColorizer", "default-mode,default-color,epsilon");
|
|
|
|
|
// mode
|
|
|
|
|
colorizer_mode default_mode =
|
|
|
|
|
get_attr<colorizer_mode>(node, "default-mode", COLORIZER_LINEAR);
|
|
|
|
|
node.get_attr<colorizer_mode>("default-mode", COLORIZER_LINEAR);
|
|
|
|
|
|
|
|
|
|
if(default_mode == COLORIZER_INHERIT) {
|
|
|
|
|
throw config_error("RasterColorizer mode must not be INHERIT. ");
|
|
|
|
@ -1604,7 +1463,7 @@ void map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc,
|
|
|
|
|
rc->set_default_mode( default_mode );
|
|
|
|
|
|
|
|
|
|
// default colour
|
|
|
|
|
optional<color> default_color = get_opt_color_attr(node, "default-color");
|
|
|
|
|
optional<color> default_color = node.get_opt_attr<color>("default-color");
|
|
|
|
|
if (default_color)
|
|
|
|
|
{
|
|
|
|
|
rc->set_default_color( *default_color );
|
|
|
|
@ -1612,7 +1471,7 @@ void map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// epsilon
|
|
|
|
|
optional<float> eps = get_opt_attr<float>(node, "epsilon");
|
|
|
|
|
optional<float> eps = node.get_opt_attr<float>("epsilon");
|
|
|
|
|
if (eps)
|
|
|
|
|
{
|
|
|
|
|
if(*eps < 0) {
|
|
|
|
@ -1622,31 +1481,27 @@ void map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ptree::const_iterator stopIter = node.begin();
|
|
|
|
|
ptree::const_iterator endStop = node.end();
|
|
|
|
|
xml_node::const_iterator stopIter = node.begin();
|
|
|
|
|
xml_node::const_iterator endStop = node.end();
|
|
|
|
|
float maximumValue = -std::numeric_limits<float>::max();
|
|
|
|
|
|
|
|
|
|
for(; stopIter != endStop; ++stopIter)
|
|
|
|
|
{
|
|
|
|
|
ptree::value_type const& stop_tag = *stopIter;
|
|
|
|
|
ptree const & stop = stopIter->second;
|
|
|
|
|
|
|
|
|
|
if (stop_tag.first == "stop")
|
|
|
|
|
if (stopIter->is("stop"))
|
|
|
|
|
{
|
|
|
|
|
ensure_attrs(stop_tag.second, "stop", "color,mode,value,label");
|
|
|
|
|
// colour is optional.
|
|
|
|
|
optional<color> stopcolor = get_opt_color_attr(stop, "color");
|
|
|
|
|
optional<color> stopcolor = stopIter->get_opt_attr<color>("color");
|
|
|
|
|
if (!stopcolor) {
|
|
|
|
|
*stopcolor = *default_color;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// mode default to INHERIT
|
|
|
|
|
colorizer_mode mode =
|
|
|
|
|
get_attr<colorizer_mode>(stop, "mode", COLORIZER_INHERIT);
|
|
|
|
|
stopIter->get_attr<colorizer_mode>("mode", COLORIZER_INHERIT);
|
|
|
|
|
|
|
|
|
|
// value is required, and it must be bigger than the previous
|
|
|
|
|
optional<float> value =
|
|
|
|
|
get_opt_attr<float>(stop, "value");
|
|
|
|
|
stopIter->get_opt_attr<float>("value");
|
|
|
|
|
|
|
|
|
|
if(!value) {
|
|
|
|
|
throw config_error("stop tag missing value");
|
|
|
|
@ -1658,7 +1513,7 @@ void map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc,
|
|
|
|
|
maximumValue = *value;
|
|
|
|
|
|
|
|
|
|
optional<std::string> label =
|
|
|
|
|
get_opt_attr<std::string>(stop, "label");
|
|
|
|
|
stopIter->get_opt_attr<std::string>("label");
|
|
|
|
|
|
|
|
|
|
//append the stop
|
|
|
|
|
colorizer_stop tmpStop;
|
|
|
|
@ -1670,12 +1525,6 @@ void map_parser::parse_raster_colorizer(raster_colorizer_ptr const& rc,
|
|
|
|
|
|
|
|
|
|
rc->add_stop(tmpStop);
|
|
|
|
|
}
|
|
|
|
|
else if (stop_tag.first != "<xmlcomment>" &&
|
|
|
|
|
stop_tag.first != "<xmlattr>" )
|
|
|
|
|
{
|
|
|
|
|
throw config_error(std::string("Unknown child node. ") +
|
|
|
|
|
"Expected 'stop' but got '" + stop_tag.first + "'");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (const config_error & ex)
|
|
|
|
@ -1720,44 +1569,4 @@ std::string map_parser::ensure_relative_to_xml( boost::optional<std::string> opt
|
|
|
|
|
return *opt_path;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void map_parser::ensure_attrs(ptree const& sym, std::string name, std::string attrs)
|
|
|
|
|
{
|
|
|
|
|
typedef ptree::key_type::value_type Ch;
|
|
|
|
|
optional<const ptree &> attribs = sym.get_child_optional( boost::property_tree::xml_parser::xmlattr<Ch>() );
|
|
|
|
|
if (attribs)
|
|
|
|
|
{
|
|
|
|
|
std::set<std::string> attr_set;
|
|
|
|
|
boost::split(attr_set, attrs, boost::is_any_of(","));
|
|
|
|
|
std::ostringstream s("");
|
|
|
|
|
s << "### " << name << " properties warning: ";
|
|
|
|
|
int missing = 0;
|
|
|
|
|
for (ptree::const_iterator it = attribs.get().begin(); it != attribs.get().end(); ++it)
|
|
|
|
|
{
|
|
|
|
|
std::string name = it->first;
|
|
|
|
|
bool found = (attr_set.find(name) != attr_set.end());
|
|
|
|
|
if (!found)
|
|
|
|
|
{
|
|
|
|
|
if (missing)
|
|
|
|
|
{
|
|
|
|
|
s << ",";
|
|
|
|
|
}
|
|
|
|
|
s << "'" << name << "'";
|
|
|
|
|
++missing;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (missing) {
|
|
|
|
|
if (missing > 1)
|
|
|
|
|
{
|
|
|
|
|
s << " are";
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
s << " is";
|
|
|
|
|
}
|
|
|
|
|
s << " invalid, acceptable values are:\n'" << attrs << "'\n";
|
|
|
|
|
std::clog << s.str();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // end of namespace mapnik
|
|
|
|
|