diff --git a/src/extractor/scripting_environment.cpp b/src/extractor/scripting_environment.cpp index beca3ba66..3ffe0162c 100644 --- a/src/extractor/scripting_environment.cpp +++ b/src/extractor/scripting_environment.cpp @@ -14,6 +14,7 @@ #include "util/typedefs.hpp" #include +#include #include #include @@ -43,6 +44,11 @@ template double lonToDouble(T const &object) return static_cast(util::toFloating(object.lon)); } +// Luabind does not like memr funs: instead of casting to the function's signature (mem fun ptr) we simply wrap it +auto get_nodes_for_way(const osmium::Way& way) -> decltype(way.nodes()) { + return way.nodes(); +} + // Error handler int luaErrorCallback(lua_State *state) { @@ -134,10 +140,19 @@ void ScriptingEnvironment::InitContext(ScriptingEnvironment::Context &context) &ExtractionWay::set_forward_mode) .property("backward_mode", &ExtractionWay::get_backward_mode, &ExtractionWay::set_backward_mode), + luabind::class_("WayNodeList") + .def(luabind::constructor<>()), + luabind::class_("NodeRef") + .def(luabind::constructor<>()) + // Dear ambitious reader: registering .location() as in: + // .def("location", +[](const osmium::NodeRef& nref){ return nref.location(); }) + // will crash at runtime, since we're not (yet?) using libosnmium's NodeLocationsForWays cache + .def("id", &osmium::NodeRef::ref), luabind::class_("Way") .def("get_value_by_key", &osmium::Way::get_value_by_key) .def("get_value_by_key", &get_value_by_key) - .def("id", &osmium::Way::id), + .def("id", &osmium::Way::id) + .def("get_nodes", get_nodes_for_way, luabind::return_stl_iterator), luabind::class_("EdgeSource") .def_readonly("source_coordinate", &InternalExtractorEdge::source_coordinate) .def_readwrite("weight_data", &InternalExtractorEdge::weight_data),