Skip to content

Commit 8ba5a61

Browse files
committed
TextSymbolizer, PlacementFinder [WIP] [skip ci]
1 parent a5ee9ef commit 8ba5a61

8 files changed

Lines changed: 181 additions & 142 deletions

demo/python/rundemo.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -291,23 +291,24 @@
291291
# text to label with. Then there is font size in points (I think?), and colour.
292292

293293
# TODO - currently broken: https://github.com/mapnik/mapnik/issues/2324
294-
#popplaces_text_sym = mapnik.TextSymbolizer() #mapnik.Expression("[GEONAME]"),
295294

296-
#finder = mapnik.PlacementFinder()
297-
#finder.face_name = 'DejaVu Sans Book'
298-
#finder.text_size = 10
299-
#finder.halo_fill = mapnik.Color(255,255,200)
300-
#finder.halo_radius = 1.0
301-
#finder.fill = mapnik.Color("black")
302-
#finder.format_expression = "[GEONAME]"
295+
popplaces_text_sym = mapnik.TextSymbolizer() #mapnik.Expression("[GEONAME]"),
303296

304-
# popplaces_text_sym.placement_finder = mapnik.PlacementFinder()
305-
# popplaces_text_sym.placement_finder.face_name = 'DejaVu Sans Book'
306-
# popplaces_text_sym.placement_finder.text_size = 10
307-
# popplaces_text_sym.placement_finder.halo_fill = 'rgba(100%,100%,78.5%,1.0)' #mapnik.Color(R=255,G=255,B=200,A=255)
308-
# popplaces_text_sym.placement_finder.halo_radius = 1.0
309-
# popplaces_text_sym.placement_finder.fill = "black"
310-
# popplaces_text_sym.placement_finder.format_expression = "[GEONAME]"
297+
# finder = mapnik.PlacementFinder()
298+
# finder.face_name = 'DejaVu Sans Book'
299+
# finder.text_size = 10
300+
# finder.halo_fill = mapnik.Color(255,255,200)
301+
# finder.halo_radius = 1.0
302+
# finder.fill = mapnik.Color("black")
303+
# finder.format_expression = "[GEONAME]"
304+
305+
popplaces_text_sym.placement_finder = mapnik.PlacementFinder()
306+
popplaces_text_sym.placement_finder.face_name = 'DejaVu Sans Book'
307+
popplaces_text_sym.placement_finder.text_size = 10
308+
popplaces_text_sym.placement_finder.halo_fill = 'rgba(100%,100%,78.5%,1.0)' #mapnik.Color(R=255,G=255,B=200,A=255)
309+
popplaces_text_sym.placement_finder.halo_radius = 1.0
310+
popplaces_text_sym.placement_finder.fill = "black"
311+
popplaces_text_sym.placement_finder.format_expression = "[GEONAME]"
311312

312313

313314
# We set a "halo" around the text, which looks like an outline if thin enough,
@@ -318,7 +319,7 @@
318319
#popplaces_text_sym.avoid_edges = True
319320
#popplaces_text_sym.minimum_padding = 30
320321

321-
#popplaces_rule.symbolizers.append(popplaces_text_sym)
322+
popplaces_rule.symbolizers.append(popplaces_text_sym)
322323

323324
popplaces_style.rules.append(popplaces_rule)
324325

setup.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ def check_output(args):
8383
"src/mapnik_line_symbolizer.cpp",
8484
"src/mapnik_point_symbolizer.cpp",
8585
"src/mapnik_style.cpp",
86+
"src/mapnik_logger.cpp",
87+
"src/mapnik_placement_finder.cpp",
88+
"src/mapnik_text_symbolizer.cpp",
8689
],
8790
extra_compile_args=extra_comp_args,
8891
extra_link_args=linkflags,

src/mapnik_logger.cpp

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
*
33
* This file is part of Mapnik (c++ mapping toolkit)
44
*
5-
* Copyright (C) 2015 Artem Pavlenko, Jean-Francois Doyon
5+
* Copyright (C) 2024 Artem Pavlenko
66
*
77
* This library is free software; you can redistribute it and/or
88
* modify it under the terms of the GNU Lesser General Public
@@ -20,60 +20,41 @@
2020
*
2121
*****************************************************************************/
2222

23+
//mapnik
2324
#include <mapnik/config.hpp>
24-
25-
26-
#pragma GCC diagnostic push
27-
#include <mapnik/warning_ignore.hpp>
28-
#include <boost/python.hpp>
29-
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
30-
#pragma GCC diagnostic pop
31-
3225
#include <mapnik/debug.hpp>
3326
#include <mapnik/util/singleton.hpp>
34-
#include "mapnik_enumeration.hpp"
3527

36-
void export_logger()
28+
//pybind11
29+
#include <pybind11/pybind11.h>
30+
#include <pybind11/stl.h>
31+
32+
namespace py = pybind11;
33+
34+
void export_logger(py::module const& m)
3735
{
3836
using mapnik::logger;
3937
using mapnik::singleton;
4038
using mapnik::CreateStatic;
41-
using namespace boost::python;
4239

43-
class_<singleton<logger,CreateStatic>,boost::noncopyable>("Singleton",no_init)
44-
.def("instance",&singleton<logger,CreateStatic>::instance,
45-
return_value_policy<reference_existing_object>())
46-
.staticmethod("instance")
47-
;
4840

49-
enum_<mapnik::logger::severity_type>("severity_type")
41+
py::enum_<mapnik::logger::severity_type>(m, "severity_type")
5042
.value("Debug", logger::debug)
5143
.value("Warn", logger::warn)
5244
.value("Error", logger::error)
5345
.value("None", logger::none)
5446
;
5547

56-
class_<logger,bases<singleton<logger,CreateStatic> >,
57-
boost::noncopyable>("logger",no_init)
58-
.def("get_severity", &logger::get_severity)
59-
.def("set_severity", &logger::set_severity)
60-
.def("get_object_severity", &logger::get_object_severity)
61-
.def("set_object_severity", &logger::set_object_severity)
62-
.def("clear_object_severity", &logger::clear_object_severity)
63-
.def("get_format", &logger::get_format,return_value_policy<reference_existing_object>())
64-
.def("set_format", &logger::set_format)
65-
.def("str", &logger::str)
66-
.def("use_file", &logger::use_file)
67-
.def("use_console", &logger::use_console)
68-
.staticmethod("get_severity")
69-
.staticmethod("set_severity")
70-
.staticmethod("get_object_severity")
71-
.staticmethod("set_object_severity")
72-
.staticmethod("clear_object_severity")
73-
.staticmethod("get_format")
74-
.staticmethod("set_format")
75-
.staticmethod("str")
76-
.staticmethod("use_file")
77-
.staticmethod("use_console")
48+
py::class_<logger, std::unique_ptr<logger, py::nodelete>>(m, "logger")
49+
.def_static("get_severity", &logger::get_severity)
50+
.def_static("set_severity", &logger::set_severity)
51+
.def_static("get_object_severity", &logger::get_object_severity)
52+
.def_static("set_object_severity", &logger::set_object_severity)
53+
.def_static("clear_object_severity", &logger::clear_object_severity)
54+
.def_static("get_format", &logger::get_format)
55+
.def_static("set_format", &logger::set_format)
56+
.def_static("str", &logger::str)
57+
.def_static("use_file", &logger::use_file)
58+
.def_static("use_console", &logger::use_console)
7859
;
7960
}

src/mapnik_placement_finder.cpp

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,22 @@
2222

2323

2424
#include <mapnik/config.hpp>
25-
26-
27-
#pragma GCC diagnostic push
28-
#include <mapnik/warning_ignore.hpp>
29-
#include <boost/python.hpp>
30-
#include <boost/python/module.hpp>
31-
#include <boost/python/def.hpp>
32-
#pragma GCC diagnostic pop
33-
25+
#include <mapnik/symbolizer.hpp>
26+
#include <mapnik/symbolizer_hash.hpp>
27+
#include <mapnik/symbolizer_utils.hpp>
28+
#include <mapnik/symbolizer_keys.hpp>
29+
#include <mapnik/symbolizer_enumerations.hpp>
3430
#include <mapnik/text/placements/dummy.hpp>
3531
#include <mapnik/text/text_properties.hpp>
3632
#include <mapnik/text/formatting/text.hpp>
3733

34+
//pybind11
35+
#include <pybind11/pybind11.h>
36+
//#include <pybind11/operators.h>
37+
//#include <pybind11/stl.h>
38+
//#include <pybind11/stl_bind.h>
39+
40+
namespace py = pybind11;
3841

3942
namespace
4043
{
@@ -59,7 +62,7 @@ mapnik::symbolizer_base::value_type get_text_size(mapnik::text_placements_dummy
5962
return finder.defaults.format_defaults.text_size;
6063
}
6164

62-
void set_fill(mapnik::text_placements_dummy & finder, mapnik::color const& fill )
65+
void set_fill(mapnik::text_placements_dummy & finder, mapnik::color const& fill)
6366
{
6467
finder.defaults.format_defaults.fill = fill;
6568
}
@@ -102,9 +105,9 @@ std::string get_format_expr(mapnik::text_placements_dummy & finder)
102105

103106
}
104107

105-
void export_placement_finder()
108+
void export_placement_finder(py::module const& m)
106109
{
107-
using namespace boost::python;
110+
//using namespace boost::python;
108111
//implicitly_convertible<mapnik::symbolizer_base::value_type, mapnik::value_double>();
109112
/*
110113
text_placements_ptr placement_finder = std::make_shared<text_placements_dummy>();
@@ -117,15 +120,13 @@ void export_placement_finder()
117120
std::make_shared<mapnik::formatting::text_node>(parse_expression("[GEONAME]")));
118121
put<text_placements_ptr>(text_sym, keys::text_placements_, placement_finder);
119122
*/
120-
class_<mapnik::text_placements_dummy, std::shared_ptr<mapnik::text_placements_dummy>, boost::noncopyable>
121-
("PlacementFinder",
122-
"TODO: PlacementFinder docs",
123-
init<>("Default ctor"))
124-
.add_property("face_name", &get_face_name, &set_face_name, "Font face name")
125-
.add_property("text_size", &get_text_size, &set_text_size, "Size of text")
126-
.add_property("fill", &get_fill, &set_fill, "Fill")
127-
.add_property("halo_fill", &get_halo_fill, &set_halo_fill, "Halo fill")
128-
.add_property("halo_radius", &get_halo_radius, &set_halo_radius, "Halo radius")
129-
.add_property("format_expression", &get_format_expr, &set_format_expr, "Format expression")
123+
py::class_<mapnik::text_placements_dummy, std::shared_ptr<mapnik::text_placements_dummy>>(m, "PlacementFinder")
124+
.def(py::init<>(), "Default ctor")
125+
.def_property("face_name", &get_face_name, &set_face_name, "Font face name")
126+
.def_property("text_size", &get_text_size, &set_text_size, "Size of text")
127+
.def_property("fill", &get_fill, &set_fill, "Fill")
128+
.def_property("halo_fill", &get_halo_fill, &set_halo_fill, "Halo fill")
129+
.def_property("halo_radius", &get_halo_radius, &set_halo_radius, "Halo radius")
130+
.def_property("format_expression", &get_format_expr, &set_format_expr, "Format expression")
130131
;
131132
}

src/mapnik_python.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -602,13 +602,16 @@ void export_layer(py::module const&);
602602
void export_map(py::module const&);
603603
void export_projection(py::module&);
604604
void export_proj_transform(py::module const&);
605-
void export_query(py::module const& m);
606-
void export_rule(py::module const& m);
607-
void export_symbolizer(py::module const& m);
608-
void export_polygon_symbolizer(py::module const& m);
609-
void export_line_symbolizer(py::module const& m);
610-
void export_point_symbolizer(py::module const& m);
611-
void export_style(py::module const& m);
605+
void export_query(py::module const&);
606+
void export_rule(py::module const&);
607+
void export_symbolizer(py::module const&);
608+
void export_polygon_symbolizer(py::module const&);
609+
void export_line_symbolizer(py::module const&);
610+
void export_point_symbolizer(py::module const&);
611+
void export_style(py::module const&);
612+
void export_logger(py::module const&);
613+
void export_placement_finder(py::module const&);
614+
void export_text_symbolizer(py::module const&);
612615

613616
using mapnik::load_map;
614617
using mapnik::load_map_string;
@@ -641,6 +644,9 @@ PYBIND11_MODULE(_mapnik, m) {
641644
export_line_symbolizer(m);
642645
export_point_symbolizer(m);
643646
export_style(m);
647+
export_logger(m);
648+
export_placement_finder(m);
649+
export_text_symbolizer(m);
644650

645651
m.def("mapnik_version", &mapnik_version,"Get the Mapnik version number");
646652
m.def("mapnik_version_string", &mapnik_version_string,"Get the Mapnik version string");

src/mapnik_symbolizer.cpp

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
#include <mapnik/group/group_rule.hpp>
3939
#include <mapnik/group/group_symbolizer_properties.hpp>
4040
#include <mapnik/util/variant.hpp>
41-
#include <mapnik/text/placements/dummy.hpp>
4241
#include <mapnik/transform/parse_transform.hpp>
4342
#include <mapnik/transform/transform_processor.hpp>
4443

@@ -64,7 +63,6 @@ using mapnik::polygon_pattern_symbolizer;
6463
using mapnik::raster_symbolizer;
6564
using mapnik::shield_symbolizer;
6665
using mapnik::text_symbolizer;
67-
using mapnik::text_placements_dummy;
6866
using mapnik::building_symbolizer;
6967
using mapnik::markers_symbolizer;
7068
using mapnik::debug_symbolizer;
@@ -174,6 +172,7 @@ void export_symbolizer(py::module const& m)
174172
.def(py::init<point_symbolizer>())
175173
.def(py::init<line_symbolizer>())
176174
.def(py::init<line_pattern_symbolizer>())
175+
.def(py::init<text_symbolizer>())
177176
.def("type_name", symbolizer_type_name)
178177
.def("__hash__", hash_impl)
179178
.def("__getitem__",&getitem_impl)
@@ -227,49 +226,6 @@ void export_symbolizer(py::module const& m)
227226
py::implicitly_convertible<debug_symbolizer,symbolizer>();
228227
}
229228

230-
// void export_text_symbolizer()
231-
// {
232-
// using namespace boost::python;
233-
// mapnik::enumeration_<mapnik::label_placement_e>("label_placement")
234-
// .value("LINE_PLACEMENT", mapnik::label_placement_enum::LINE_PLACEMENT)
235-
// .value("POINT_PLACEMENT", mapnik::label_placement_enum::POINT_PLACEMENT)
236-
// .value("VERTEX_PLACEMENT", mapnik::label_placement_enum::VERTEX_PLACEMENT)
237-
// .value("INTERIOR_PLACEMENT", mapnik::label_placement_enum::INTERIOR_PLACEMENT);
238-
239-
// mapnik::enumeration_<mapnik::vertical_alignment_e>("vertical_alignment")
240-
// .value("TOP", mapnik::vertical_alignment_enum::V_TOP)
241-
// .value("MIDDLE", mapnik::vertical_alignment_enum::V_MIDDLE)
242-
// .value("BOTTOM", mapnik::vertical_alignment_enum::V_BOTTOM)
243-
// .value("AUTO", mapnik::vertical_alignment_enum::V_AUTO);
244-
245-
// mapnik::enumeration_<mapnik::horizontal_alignment_e>("horizontal_alignment")
246-
// .value("LEFT", mapnik::horizontal_alignment_enum::H_LEFT)
247-
// .value("MIDDLE", mapnik::horizontal_alignment_enum::H_MIDDLE)
248-
// .value("RIGHT", mapnik::horizontal_alignment_enum::H_RIGHT)
249-
// .value("AUTO", mapnik::horizontal_alignment_enum::H_AUTO);
250-
251-
// mapnik::enumeration_<mapnik::justify_alignment_e>("justify_alignment")
252-
// .value("LEFT", mapnik::justify_alignment_enum::J_LEFT)
253-
// .value("MIDDLE", mapnik::justify_alignment_enum::J_MIDDLE)
254-
// .value("RIGHT", mapnik::justify_alignment_enum::J_RIGHT)
255-
// .value("AUTO", mapnik::justify_alignment_enum::J_AUTO);
256-
257-
// mapnik::enumeration_<mapnik::text_transform_e>("text_transform")
258-
// .value("NONE", mapnik::text_transform_enum::NONE)
259-
// .value("UPPERCASE", mapnik::text_transform_enum::UPPERCASE)
260-
// .value("LOWERCASE", mapnik::text_transform_enum::LOWERCASE)
261-
// .value("CAPITALIZE", mapnik::text_transform_enum::CAPITALIZE);
262-
263-
// mapnik::enumeration_<mapnik::halo_rasterizer_e>("halo_rasterizer")
264-
// .value("FULL", mapnik::halo_rasterizer_enum::HALO_RASTERIZER_FULL)
265-
// .value("FAST", mapnik::halo_rasterizer_enum::HALO_RASTERIZER_FAST);
266-
267-
// class_<text_symbolizer>("TextSymbolizer", init<>("Default ctor"))
268-
// .def("__hash__",hash_impl_2<text_symbolizer>)
269-
// .add_property("placement_finder", &get_placement_finder, &set_placement_finder, "Placement finder")
270-
// ;
271-
272-
// }
273229

274230
// void export_shield_symbolizer()
275231
// {

src/mapnik_symbolizer.hpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -232,18 +232,6 @@ std::size_t hash_impl_2(T const& sym)
232232
return mapnik::symbolizer_hash::value<T>(sym);
233233
}
234234

235-
236-
// text symbolizer
237-
// mapnik::text_placements_ptr get_placement_finder(text_symbolizer const& sym)
238-
// {
239-
// return mapnik::get<mapnik::text_placements_ptr>(sym, mapnik::keys::text_placements_);
240-
// }
241-
242-
// void set_placement_finder(text_symbolizer & sym, std::shared_ptr<text_placements_dummy> const& finder)
243-
// {
244-
// mapnik::put<mapnik::text_placements_ptr>(sym, mapnik::keys::text_placements_, finder);
245-
// }
246-
247235
template <typename Value, auto Key>
248236
auto get(symbolizer_base const& sym) -> Value
249237
{

0 commit comments

Comments
 (0)