Handle<Value> OSMNodeWrap::wkb(const Arguments& args) { HandleScope scope; std::string wkb { wkb_factory.create_point(wrapped(args.This())) }; #if NODE_VERSION_AT_LEAST(0, 10, 0) return scope.Close(node::Buffer::New(wkb.data(), wkb.size())->handle_); #else return scope.Close(node::Buffer::New(const_cast<char*>(wkb.data()), wkb.size())->handle_); #endif }
v8::Handle<v8::Value> OSMNodeWrap::wkb(const v8::Arguments& args) { v8::HandleScope scope; try { std::string wkb { wkb_factory.create_point(wrapped(args.This())) }; #if NODE_VERSION_AT_LEAST(0, 10, 0) return scope.Close(node::Buffer::New(wkb.data(), wkb.size())->handle_); #else return scope.Close(node::Buffer::New(const_cast<char*>(wkb.data()), wkb.size())->handle_); #endif } catch (std::runtime_error& e) { return ThrowException(v8::Exception::Error(v8::String::New(e.what()))); } }
std::string to_wkb(const OGRGeometry* geometry) { std::string buffer; buffer.resize(geometry->WkbSize()); geometry->exportToWkb(wkbNDR, reinterpret_cast<unsigned char*>(&*buffer.begin())); return buffer; } TEST_CASE("compare WKB point against GDAL/OGR") { osmium::geom::WKBFactory<> wkb_factory{osmium::geom::wkb_type::wkb}; osmium::geom::OGRFactory<> ogr_factory; const osmium::Location loc{3.2, 4.2}; const std::string wkb{wkb_factory.create_point(loc)}; const std::unique_ptr<OGRPoint> geometry = ogr_factory.create_point(loc); REQUIRE(to_wkb(geometry.get()) == wkb); } TEST_CASE("compare WKB linestring against GDAL/OGR") { osmium::geom::WKBFactory<> wkb_factory{osmium::geom::wkb_type::wkb}; osmium::geom::OGRFactory<> ogr_factory; osmium::memory::Buffer buffer{10000}; const auto& wnl = create_test_wnl_okay(buffer); SECTION("linestring") { const std::string wkb{wkb_factory.create_linestring(wnl)}; const std::unique_ptr<OGRLineString> geometry = ogr_factory.create_linestring(wnl); REQUIRE(to_wkb(geometry.get()) == wkb);