mapnik/demo/c++/rundemo.cpp

333 lines
12 KiB
C++
Raw Normal View History

2006-10-03 12:06:38 +02:00
/*****************************************************************************
2011-11-14 04:54:32 +01:00
*
2006-10-03 12:06:38 +02:00
* This file is part of Mapnik (c++ mapping toolkit)
*
* Copyright (C) 2011 Artem Pavlenko
2006-10-03 12:06:38 +02:00
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*****************************************************************************/
2006-05-08 22:29:13 +02:00
#include <mapnik/map.hpp>
2012-07-25 03:35:41 +02:00
#include <mapnik/layer.hpp>
#include <mapnik/rule.hpp>
2013-01-04 03:58:44 +01:00
#include <mapnik/line_symbolizer.hpp>
#include <mapnik/polygon_symbolizer.hpp>
#include <mapnik/text_symbolizer.hpp>
2012-07-25 03:35:41 +02:00
#include <mapnik/feature_type_style.hpp>
#include <mapnik/graphics.hpp>
#include <mapnik/datasource_cache.hpp>
#include <mapnik/font_engine_freetype.hpp>
#include <mapnik/agg_renderer.hpp>
2012-02-12 12:46:07 +01:00
#include <mapnik/expression.hpp>
#include <mapnik/color_factory.hpp>
#include <mapnik/image_util.hpp>
2008-01-08 22:09:16 +01:00
#include <mapnik/config_error.hpp>
#if defined(HAVE_CAIRO)
#include <mapnik/cairo_renderer.hpp>
#include <mapnik/cairo_context.hpp>
#endif
2006-05-08 22:29:13 +02:00
#include <iostream>
2006-05-08 22:29:13 +02:00
int main ( int argc , char** argv)
2011-11-14 04:54:32 +01:00
{
if (argc != 2)
{
std::cout << "usage: ./rundemo <mapnik_install_dir>\nUsually /usr/local\n";
std::cout << "Warning: ./rundemo looks for data in ../data/,\nTherefore must be run from within the demo/c++ folder.\n";
return EXIT_SUCCESS;
}
2011-11-14 04:54:32 +01:00
2007-03-13 23:46:01 +01:00
using namespace mapnik;
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";
2008-01-08 22:09:16 +01:00
try {
std::cout << " running demo ... \n";
std::string mapnik_dir(argv[1]);
std::cout << " looking for 'shape.input' plugin in... " << mapnik_dir << "/lib/mapnik/input/" << "\n";
datasource_cache::instance().register_datasources(mapnik_dir + "/lib/mapnik/input/");
std::cout << " looking for DejaVuSans font in... " << mapnik_dir << "/lib/mapnik/fonts/DejaVuSans.ttf" << "\n";
freetype_engine::register_font(mapnik_dir + "/lib/mapnik/fonts/DejaVuSans.ttf");
2011-11-14 04:54:32 +01:00
2008-01-08 22:09:16 +01:00
Map m(800,600);
m.set_background(parse_color("white"));
m.set_srs(srs_merc);
2008-06-29 12:58:29 +02:00
// create styles
// Provinces (polygon)
feature_type_style provpoly_style;
2011-11-14 04:54:32 +01:00
rule provpoly_rule_on;
2009-12-16 21:02:06 +01:00
provpoly_rule_on.set_filter(parse_expression("[NAME_EN] = 'Ontario'"));
2009-01-14 13:43:26 +01:00
provpoly_rule_on.append(polygon_symbolizer(color(250, 190, 183)));
2008-06-29 12:58:29 +02:00
provpoly_style.add_rule(provpoly_rule_on);
2011-11-14 04:54:32 +01:00
rule provpoly_rule_qc;
provpoly_rule_qc.set_filter(parse_expression("[NOM_FR] = 'Québec'"));
2009-01-14 13:43:26 +01:00
provpoly_rule_qc.append(polygon_symbolizer(color(217, 235, 203)));
2008-06-29 12:58:29 +02:00
provpoly_style.add_rule(provpoly_rule_qc);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
m.insert_style("provinces",provpoly_style);
// Provinces (polyline)
feature_type_style provlines_style;
2011-11-14 04:54:32 +01:00
2009-01-14 13:43:26 +01:00
stroke provlines_stk (color(0,0,0),1.0);
2008-06-29 12:58:29 +02:00
provlines_stk.add_dash(8, 4);
provlines_stk.add_dash(2, 2);
provlines_stk.add_dash(2, 2);
2011-11-14 04:54:32 +01:00
rule provlines_rule;
2008-06-29 12:58:29 +02:00
provlines_rule.append(line_symbolizer(provlines_stk));
provlines_style.add_rule(provlines_rule);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
m.insert_style("provlines",provlines_style);
2011-11-14 04:54:32 +01:00
// Drainage
2008-06-29 12:58:29 +02:00
feature_type_style qcdrain_style;
2011-11-14 04:54:32 +01:00
rule qcdrain_rule;
2009-12-16 21:02:06 +01:00
qcdrain_rule.set_filter(parse_expression("[HYC] = 8"));
2009-01-14 13:43:26 +01:00
qcdrain_rule.append(polygon_symbolizer(color(153, 204, 255)));
2008-06-29 12:58:29 +02:00
qcdrain_style.add_rule(qcdrain_rule);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
m.insert_style("drainage",qcdrain_style);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
// Roads 3 and 4 (The "grey" roads)
2011-11-14 04:54:32 +01:00
feature_type_style roads34_style;
rule roads34_rule;
2009-12-16 21:02:06 +01:00
roads34_rule.set_filter(parse_expression("[CLASS] = 3 or [CLASS] = 4"));
2009-01-14 13:43:26 +01:00
stroke roads34_rule_stk(color(171,158,137),2.0);
2008-06-29 12:58:29 +02:00
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);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
m.insert_style("smallroads",roads34_style);
2011-11-14 04:54:32 +01:00
2006-05-08 22:29:13 +02:00
2008-06-29 12:58:29 +02:00
// Roads 2 (The thin yellow ones)
feature_type_style roads2_style_1;
rule roads2_rule_1;
2009-12-16 21:02:06 +01:00
roads2_rule_1.set_filter(parse_expression("[CLASS] = 2"));
2009-01-14 13:43:26 +01:00
stroke roads2_rule_stk_1(color(171,158,137),4.0);
2008-06-29 12:58:29 +02:00
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);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
m.insert_style("road-border", roads2_style_1);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
feature_type_style roads2_style_2;
rule roads2_rule_2;
2009-12-16 21:02:06 +01:00
roads2_rule_2.set_filter(parse_expression("[CLASS] = 2"));
2009-01-14 13:43:26 +01:00
stroke roads2_rule_stk_2(color(255,250,115),2.0);
2008-06-29 12:58:29 +02:00
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);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
m.insert_style("road-fill", roads2_style_2);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
// Roads 1 (The big orange ones, the highways)
feature_type_style roads1_style_1;
rule roads1_rule_1;
2009-12-16 21:02:06 +01:00
roads1_rule_1.set_filter(parse_expression("[CLASS] = 1"));
2009-01-14 13:43:26 +01:00
stroke roads1_rule_stk_1(color(188,149,28),7.0);
2008-06-29 12:58:29 +02:00
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);
m.insert_style("highway-border", roads1_style_1);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
feature_type_style roads1_style_2;
rule roads1_rule_2;
2009-12-16 21:02:06 +01:00
roads1_rule_2.set_filter(parse_expression("[CLASS] = 1"));
2009-01-14 13:43:26 +01:00
stroke roads1_rule_stk_2(color(242,191,36),5.0);
2008-06-29 12:58:29 +02:00
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);
m.insert_style("highway-fill", roads1_style_2);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
// Populated Places
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
feature_type_style popplaces_style;
rule popplaces_rule;
2011-08-22 22:26:45 +02:00
text_symbolizer popplaces_text_symbolizer(parse_expression("[GEONAME]"),"DejaVu Sans Book",10,color(0,0,0));
2009-01-14 13:43:26 +01:00
popplaces_text_symbolizer.set_halo_fill(color(255,255,200));
2008-06-29 12:58:29 +02:00
popplaces_text_symbolizer.set_halo_radius(1);
popplaces_rule.append(popplaces_text_symbolizer);
popplaces_style.add_rule(popplaces_rule);
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
m.insert_style("popplaces",popplaces_style );
2011-11-14 04:54:32 +01:00
2009-12-16 21:02:06 +01:00
// layers
2008-06-29 12:58:29 +02:00
// Provincial polygons
{
parameters p;
p["type"]="shape";
p["file"]="../data/boundaries";
p["encoding"]="latin1";
2011-11-14 04:54:32 +01:00
layer lyr("Provinces");
lyr.set_datasource(datasource_cache::instance().create(p));
2011-11-14 04:54:32 +01:00
lyr.add_style("provinces");
lyr.set_srs(srs_lcc);
2008-06-29 12:58:29 +02:00
m.addLayer(lyr);
}
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
// Drainage
{
parameters p;
p["type"]="shape";
p["file"]="../data/qcdrainage";
2009-12-16 21:02:06 +01:00
layer lyr("Quebec Hydrography");
lyr.set_datasource(datasource_cache::instance().create(p));
lyr.set_srs(srs_lcc);
2011-11-14 04:54:32 +01:00
lyr.add_style("drainage");
2008-06-29 12:58:29 +02:00
m.addLayer(lyr);
}
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
{
parameters p;
p["type"]="shape";
p["file"]="../data/ontdrainage";
2011-11-14 04:54:32 +01:00
layer lyr("Ontario Hydrography");
lyr.set_datasource(datasource_cache::instance().create(p));
lyr.set_srs(srs_lcc);
2011-11-14 04:54:32 +01:00
lyr.add_style("drainage");
2008-06-29 12:58:29 +02:00
m.addLayer(lyr);
}
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
// Provincial boundaries
{
parameters p;
p["type"]="shape";
p["file"]="../data/boundaries_l";
2011-11-14 04:54:32 +01:00
layer lyr("Provincial borders");
lyr.set_srs(srs_lcc);
lyr.set_datasource(datasource_cache::instance().create(p));
2011-11-14 04:54:32 +01:00
lyr.add_style("provlines");
2008-06-29 12:58:29 +02:00
m.addLayer(lyr);
}
2011-11-14 04:54:32 +01:00
2008-06-29 12:58:29 +02:00
// Roads
{
parameters p;
p["type"]="shape";
2011-11-14 04:54:32 +01:00
p["file"]="../data/roads";
layer lyr("Roads");
lyr.set_srs(srs_lcc);
lyr.set_datasource(datasource_cache::instance().create(p));
2008-06-29 12:58:29 +02:00
lyr.add_style("smallroads");
lyr.add_style("road-border");
lyr.add_style("road-fill");
lyr.add_style("highway-border");
lyr.add_style("highway-fill");
2008-01-08 22:09:16 +01:00
2011-11-14 04:54:32 +01:00
m.addLayer(lyr);
2008-06-29 12:58:29 +02:00
}
// popplaces
{
parameters p;
p["type"]="shape";
p["file"]="../data/popplaces";
p["encoding"] = "latin1";
2009-12-16 21:02:06 +01:00
layer lyr("Populated Places");
lyr.set_srs(srs_lcc);
lyr.set_datasource(datasource_cache::instance().create(p));
2011-11-14 04:54:32 +01:00
lyr.add_style("popplaces");
2008-06-29 12:58:29 +02:00
m.addLayer(lyr);
}
2011-11-14 04:54:32 +01:00
m.zoom_to_box(box2d<double>(-8024477.28459,5445190.38849,-7381388.20071,5662941.44855));
2011-11-14 04:54:32 +01:00
2010-06-25 17:23:35 +02:00
image_32 buf(m.width(),m.height());
2009-12-16 21:02:06 +01:00
agg_renderer<image_32> ren(m,buf);
2008-06-29 12:58:29 +02:00
ren.apply();
2011-11-14 04:54:32 +01:00
save_to_file(buf,"demo.jpg","jpeg");
save_to_file(buf,"demo.png","png");
save_to_file(buf,"demo256.png","png8");
save_to_file(buf,"demo.tif","tiff");
std::cout << "Three maps have been rendered using AGG in the current directory:\n"
2011-11-14 04:54:32 +01:00
"- demo.jpg\n"
"- demo.png\n"
"- demo256.png\n"
2011-11-29 12:13:27 +01:00
"- demo.tif\n"
2011-11-14 04:54:32 +01:00
"Have a look!\n";
2012-02-02 02:38:18 +01:00
2011-11-14 04:54:32 +01:00
#if defined(HAVE_CAIRO)
// save to pdf/svg files
save_to_cairo_file(m,"cairo-demo.pdf");
save_to_cairo_file(m,"cairo-demo.svg");
/* we could also do:
save_to_cairo_file(m,"cairo-demo.png");
but instead let's build up a surface for more flexibility
*/
cairo_surface_ptr image_surface(
cairo_image_surface_create(CAIRO_FORMAT_ARGB32,m.width(),m.height()),
cairo_surface_closer());
double scale_factor = 1.0;
cairo_ptr image_context = (create_context(image_surface));
mapnik::cairo_renderer<cairo_ptr> png_render(m,image_context,scale_factor);
png_render.apply();
// we can now write to png with cairo functionality
cairo_surface_write_to_png(&*image_surface, "cairo-demo.png");
// but we can also benefit from quantization by converting
// to a mapnik image object and then saving that
image_32 im(image_surface);
save_to_file(im, "cairo-demo256.png","png8");
cairo_surface_finish(&*image_surface);
std::cout << "Three maps have been rendered using Cairo in the current directory:\n"
2011-11-14 04:54:32 +01:00
"- cairo-demo.png\n"
"- cairo-demo256.png\n"
"- cairo-demo.pdf\n"
"- cairo-demo.svg\n"
"Have a look!\n";
#endif
2006-05-08 22:29:13 +02:00
}
2008-01-08 22:09:16 +01:00
catch ( const mapnik::config_error & ex )
2006-05-08 22:29:13 +02:00
{
std::cerr << "### Configuration error: " << ex.what() << std::endl;
2008-01-08 22:09:16 +01:00
return EXIT_FAILURE;
2006-05-08 22:29:13 +02:00
}
2008-01-08 22:09:16 +01:00
catch ( const std::exception & ex )
2006-05-08 22:29:13 +02:00
{
std::cerr << "### std::exception: " << ex.what() << std::endl;
2008-01-08 22:09:16 +01:00
return EXIT_FAILURE;
2006-05-08 22:29:13 +02:00
}
2008-01-08 22:09:16 +01:00
catch ( ... )
2006-05-08 22:29:13 +02:00
{
2008-01-08 22:09:16 +01:00
std::cerr << "### Unknown exception." << std::endl;
return EXIT_FAILURE;
2006-05-08 22:29:13 +02:00
}
return EXIT_SUCCESS;
2006-05-08 22:29:13 +02:00
}