smarter type handling for Map parameters
This commit is contained in:
parent
aa85a4ff1e
commit
808e820164
3 changed files with 28 additions and 52 deletions
|
@ -377,25 +377,15 @@ void map_parser::parse_map_include(Map & map, xml_node const& node)
|
||||||
{
|
{
|
||||||
if (p.is("Parameter"))
|
if (p.is("Parameter"))
|
||||||
{
|
{
|
||||||
bool is_string = true;
|
std::string val = p.get_text();
|
||||||
boost::optional<std::string> type = p.get_opt_attr<std::string>("type");
|
std::string key = p.get_attr<std::string>("name");
|
||||||
if (type)
|
mapnik::value_bool b;
|
||||||
{
|
mapnik::value_integer i;
|
||||||
if (*type == "int")
|
mapnik::value_double d;
|
||||||
{
|
if (mapnik::util::string2bool(val,b)) params[key] = b;
|
||||||
is_string = false;
|
else if (mapnik::util::string2int(val,i)) params[key] = i;
|
||||||
params[p.get_attr<std::string>("name")] = p.get_value<mapnik::value_integer>();
|
else if (mapnik::util::string2double(val,d)) params[key] = d;
|
||||||
}
|
else params[key] = val;
|
||||||
else if (*type == "float")
|
|
||||||
{
|
|
||||||
is_string = false;
|
|
||||||
params[p.get_attr<std::string>("name")] = p.get_value<mapnik::value_double>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_string)
|
|
||||||
{
|
|
||||||
params[p.get_attr<std::string>("name")] = p.get_text();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -488,36 +488,6 @@ void serialize_datasource( ptree & layer_node, datasource_ptr datasource)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class serialize_type : public util::static_visitor<>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
serialize_type( boost::property_tree::ptree & node):
|
|
||||||
node_(node) {}
|
|
||||||
|
|
||||||
void operator () ( mapnik::value_integer ) const
|
|
||||||
{
|
|
||||||
node_.put("<xmlattr>.type", "int" );
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator () ( mapnik::value_double ) const
|
|
||||||
{
|
|
||||||
node_.put("<xmlattr>.type", "float" );
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator () ( std::string const& ) const
|
|
||||||
{
|
|
||||||
node_.put("<xmlattr>.type", "string" );
|
|
||||||
}
|
|
||||||
|
|
||||||
void operator () ( mapnik::value_null ) const
|
|
||||||
{
|
|
||||||
node_.put("<xmlattr>.type", "string" );
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
boost::property_tree::ptree & node_;
|
|
||||||
};
|
|
||||||
|
|
||||||
void serialize_parameters( ptree & map_node, mapnik::parameters const& params)
|
void serialize_parameters( ptree & map_node, mapnik::parameters const& params)
|
||||||
{
|
{
|
||||||
if (params.size()) {
|
if (params.size()) {
|
||||||
|
@ -531,7 +501,6 @@ void serialize_parameters( ptree & map_node, mapnik::parameters const& params)
|
||||||
boost::property_tree::ptree()))->second;
|
boost::property_tree::ptree()))->second;
|
||||||
param_node.put("<xmlattr>.name", p.first );
|
param_node.put("<xmlattr>.name", p.first );
|
||||||
param_node.put_value( p.second );
|
param_node.put_value( p.second );
|
||||||
util::apply_visitor(serialize_type(param_node),p.second);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,13 +13,30 @@ def setup():
|
||||||
def test_arbitrary_parameters_attached_to_map():
|
def test_arbitrary_parameters_attached_to_map():
|
||||||
m = mapnik.Map(256,256)
|
m = mapnik.Map(256,256)
|
||||||
mapnik.load_map(m,'../data/good_maps/extra_arbitary_map_parameters.xml')
|
mapnik.load_map(m,'../data/good_maps/extra_arbitary_map_parameters.xml')
|
||||||
eq_(len(m.parameters),6)
|
eq_(len(m.parameters),5)
|
||||||
eq_(m.parameters['key'],'value2')
|
eq_(m.parameters['key'],'value2')
|
||||||
eq_(m.parameters['key3'],'value3')
|
eq_(m.parameters['key3'],'value3')
|
||||||
eq_(m.parameters['unicode'],u'iván')
|
eq_(m.parameters['unicode'],u'iván')
|
||||||
eq_(m.parameters['integer'],10)
|
eq_(m.parameters['integer'],10)
|
||||||
eq_(m.parameters['decimal'],.999)
|
eq_(m.parameters['decimal'],.999)
|
||||||
eq_(m.parameters['number-as-string'],u'.9998')
|
m2 = mapnik.Map(256,256)
|
||||||
|
for k,v in m.parameters:
|
||||||
|
m2.parameters.append(mapnik.Parameter(k,v))
|
||||||
|
eq_(len(m2.parameters),5)
|
||||||
|
eq_(m2.parameters['key'],'value2')
|
||||||
|
eq_(m2.parameters['key3'],'value3')
|
||||||
|
eq_(m2.parameters['unicode'],u'iván')
|
||||||
|
eq_(m2.parameters['integer'],10)
|
||||||
|
eq_(m2.parameters['decimal'],.999)
|
||||||
|
map_string = mapnik.save_map_to_string(m)
|
||||||
|
m3 = mapnik.Map(256,256)
|
||||||
|
mapnik.load_map_from_string(m3,map_string)
|
||||||
|
eq_(len(m3.parameters),5)
|
||||||
|
eq_(m3.parameters['key'],'value2')
|
||||||
|
eq_(m3.parameters['key3'],'value3')
|
||||||
|
eq_(m3.parameters['unicode'],u'iván')
|
||||||
|
eq_(m3.parameters['integer'],10)
|
||||||
|
eq_(m3.parameters['decimal'],.999)
|
||||||
|
|
||||||
|
|
||||||
def test_serializing_arbitrary_parameters():
|
def test_serializing_arbitrary_parameters():
|
||||||
|
|
Loading…
Reference in a new issue