2022-02-02 17:20:29 +01:00
|
|
|
#include <mapnik/mapnik.hpp>
|
2014-02-10 19:46:48 +01:00
|
|
|
#include <mapnik/map.hpp>
|
|
|
|
#include <mapnik/load_map.hpp>
|
|
|
|
#include <mapnik/agg_renderer.hpp>
|
|
|
|
#include <mapnik/version.hpp>
|
|
|
|
#include <mapnik/debug.hpp>
|
|
|
|
#include <mapnik/image_util.hpp>
|
2014-11-04 21:31:51 +01:00
|
|
|
#include <mapnik/unicode.hpp>
|
2014-02-10 19:46:48 +01:00
|
|
|
#include <mapnik/datasource_cache.hpp>
|
2014-08-22 22:22:12 +02:00
|
|
|
#include <mapnik/font_engine_freetype.hpp>
|
2014-10-22 01:37:27 +02:00
|
|
|
|
2020-11-19 15:30:30 +01:00
|
|
|
#include <mapnik/warning.hpp>
|
|
|
|
MAPNIK_DISABLE_WARNING_PUSH
|
2015-11-08 02:53:09 +01:00
|
|
|
#include <mapnik/warning_ignore.hpp>
|
2014-02-10 19:46:48 +01:00
|
|
|
#include <boost/algorithm/string.hpp>
|
|
|
|
#include <boost/program_options.hpp>
|
2020-11-19 15:30:30 +01:00
|
|
|
MAPNIK_DISABLE_WARNING_POP
|
2014-10-22 01:37:27 +02:00
|
|
|
|
2014-02-10 19:46:48 +01:00
|
|
|
#include <string>
|
|
|
|
|
2022-01-26 20:41:37 +01:00
|
|
|
int main(int argc, char** argv)
|
2014-02-10 19:46:48 +01:00
|
|
|
{
|
|
|
|
namespace po = boost::program_options;
|
|
|
|
|
2022-02-02 17:20:29 +01:00
|
|
|
mapnik::setup();
|
|
|
|
|
2014-02-10 19:46:48 +01:00
|
|
|
bool verbose = false;
|
2016-04-25 16:38:29 +02:00
|
|
|
bool auto_open = false;
|
2014-02-10 19:46:48 +01:00
|
|
|
int return_value = 0;
|
|
|
|
std::string xml_file;
|
|
|
|
std::string img_file;
|
2014-11-04 21:31:51 +01:00
|
|
|
double scale_factor = 1;
|
|
|
|
bool params_as_variables = false;
|
2014-02-10 19:46:48 +01:00
|
|
|
mapnik::logger logger;
|
|
|
|
logger.set_severity(mapnik::logger::error);
|
2019-05-05 18:02:47 +02:00
|
|
|
int map_width = 600;
|
|
|
|
int map_height = 400;
|
2014-02-10 19:46:48 +01:00
|
|
|
|
|
|
|
try
|
|
|
|
{
|
2015-12-06 16:10:43 +01:00
|
|
|
po::options_description desc("mapnik-render utility");
|
2022-01-26 20:41:37 +01:00
|
|
|
// clang-format off
|
2014-02-10 19:46:48 +01:00
|
|
|
desc.add_options()
|
|
|
|
("help,h", "produce usage message")
|
|
|
|
("version,V","print version string")
|
|
|
|
("verbose,v","verbose output")
|
2016-04-25 18:56:40 +02:00
|
|
|
("open","automatically open the file after rendering")
|
2014-02-10 19:46:48 +01:00
|
|
|
("xml",po::value<std::string>(),"xml map to read")
|
|
|
|
("img",po::value<std::string>(),"image to render")
|
2014-11-04 21:31:51 +01:00
|
|
|
("scale-factor",po::value<double>(),"scale factor for rendering")
|
2019-05-05 18:02:47 +02:00
|
|
|
("map-width",po::value<int>(),"map width in pixels")
|
|
|
|
("map-height",po::value<int>(),"map height in pixels")
|
2014-11-04 21:31:51 +01:00
|
|
|
("variables","make map parameters available as render-time variables")
|
2014-02-10 19:46:48 +01:00
|
|
|
;
|
2022-01-26 20:41:37 +01:00
|
|
|
// clang-format on
|
2014-02-10 19:46:48 +01:00
|
|
|
po::positional_options_description p;
|
2022-01-26 20:41:37 +01:00
|
|
|
p.add("xml", 1);
|
|
|
|
p.add("img", 1);
|
2014-02-10 19:46:48 +01:00
|
|
|
po::variables_map vm;
|
|
|
|
po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
|
|
|
|
po::notify(vm);
|
|
|
|
|
|
|
|
if (vm.count("version"))
|
|
|
|
{
|
2022-01-26 20:41:37 +01:00
|
|
|
std::clog << "version " << MAPNIK_VERSION_STRING << std::endl;
|
2014-02-10 19:46:48 +01:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.count("help"))
|
|
|
|
{
|
|
|
|
std::clog << desc << std::endl;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.count("verbose"))
|
|
|
|
{
|
|
|
|
verbose = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.count("open"))
|
|
|
|
{
|
|
|
|
auto_open = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.count("xml"))
|
|
|
|
{
|
2022-01-26 20:41:37 +01:00
|
|
|
xml_file = vm["xml"].as<std::string>();
|
2014-02-10 19:46:48 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::clog << "please provide an xml map as first argument!" << std::endl;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.count("img"))
|
|
|
|
{
|
2022-01-26 20:41:37 +01:00
|
|
|
img_file = vm["img"].as<std::string>();
|
2014-02-10 19:46:48 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::clog << "please provide an img as second argument!" << std::endl;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2014-11-04 21:31:51 +01:00
|
|
|
if (vm.count("scale-factor"))
|
|
|
|
{
|
2022-01-26 20:41:37 +01:00
|
|
|
scale_factor = vm["scale-factor"].as<double>();
|
2014-11-04 21:31:51 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (vm.count("variables"))
|
|
|
|
{
|
|
|
|
params_as_variables = true;
|
|
|
|
}
|
|
|
|
|
2022-01-26 20:41:37 +01:00
|
|
|
if (vm.count("map-width"))
|
|
|
|
{
|
|
|
|
map_width = vm["map-width"].as<int>();
|
2019-05-05 18:02:47 +02:00
|
|
|
}
|
|
|
|
|
2022-01-26 20:41:37 +01:00
|
|
|
if (vm.count("map-height"))
|
|
|
|
{
|
|
|
|
map_height = vm["map-height"].as<int>();
|
2019-05-05 18:02:47 +02:00
|
|
|
}
|
|
|
|
|
2014-02-10 19:46:48 +01:00
|
|
|
mapnik::datasource_cache::instance().register_datasources("./plugins/input/");
|
2022-01-26 20:41:37 +01:00
|
|
|
mapnik::freetype_engine::register_fonts("./fonts", true);
|
|
|
|
mapnik::Map map(map_width, map_height);
|
|
|
|
mapnik::load_map(map, xml_file, true);
|
2014-02-10 19:46:48 +01:00
|
|
|
map.zoom_all();
|
2022-01-26 20:41:37 +01:00
|
|
|
mapnik::image_rgba8 im(map.width(), map.height());
|
|
|
|
mapnik::request req(map.width(), map.height(), map.get_current_extent());
|
2014-11-04 21:31:51 +01:00
|
|
|
req.set_buffer_size(map.buffer_size());
|
|
|
|
mapnik::attributes vars;
|
2014-11-04 23:53:50 +01:00
|
|
|
if (params_as_variables)
|
2014-11-04 21:31:51 +01:00
|
|
|
{
|
2014-11-04 23:53:50 +01:00
|
|
|
mapnik::transcoder tr("utf-8");
|
|
|
|
for (auto const& param : map.get_extra_parameters())
|
2014-11-04 21:31:51 +01:00
|
|
|
{
|
2014-11-04 23:53:50 +01:00
|
|
|
std::string const& name = param.first.substr(1);
|
|
|
|
if (!name.empty())
|
2014-11-04 21:31:51 +01:00
|
|
|
{
|
2014-11-04 23:53:50 +01:00
|
|
|
if (param.second.is<mapnik::value_integer>())
|
|
|
|
{
|
|
|
|
vars[name] = param.second.get<mapnik::value_integer>();
|
|
|
|
}
|
|
|
|
else if (param.second.is<mapnik::value_double>())
|
|
|
|
{
|
|
|
|
vars[name] = param.second.get<mapnik::value_double>();
|
|
|
|
}
|
|
|
|
else if (param.second.is<std::string>())
|
|
|
|
{
|
|
|
|
vars[name] = tr.transcode(param.second.get<std::string>().c_str());
|
|
|
|
}
|
2014-11-04 21:31:51 +01:00
|
|
|
}
|
2015-05-15 17:54:50 +02:00
|
|
|
}
|
2014-11-04 21:31:51 +01:00
|
|
|
}
|
2022-01-26 20:41:37 +01:00
|
|
|
mapnik::agg_renderer<mapnik::image_rgba8> ren(map, req, vars, im, scale_factor, 0, 0);
|
2014-02-10 19:46:48 +01:00
|
|
|
ren.apply();
|
2022-01-26 20:41:37 +01:00
|
|
|
mapnik::save_to_file(im, img_file);
|
2014-02-10 19:46:48 +01:00
|
|
|
if (auto_open)
|
|
|
|
{
|
|
|
|
std::ostringstream s;
|
2014-09-01 02:32:48 +02:00
|
|
|
#ifdef __APPLE__
|
|
|
|
s << "open ";
|
|
|
|
#elif _WIN32
|
|
|
|
s << "start ";
|
2014-02-10 19:46:48 +01:00
|
|
|
#else
|
2014-09-01 02:32:48 +02:00
|
|
|
s << "xdg-open ";
|
2014-02-10 19:46:48 +01:00
|
|
|
#endif
|
2014-09-01 02:32:48 +02:00
|
|
|
s << img_file;
|
2014-02-10 19:46:48 +01:00
|
|
|
int ret = system(s.str().c_str());
|
|
|
|
if (ret != 0)
|
|
|
|
return_value = ret;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
std::clog << "rendered to: " << img_file << "\n";
|
|
|
|
}
|
2022-11-10 16:57:38 +01:00
|
|
|
}
|
|
|
|
catch (std::exception const& ex)
|
2014-02-10 19:46:48 +01:00
|
|
|
{
|
|
|
|
std::clog << "Error " << ex.what() << std::endl;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return return_value;
|
|
|
|
}
|