{ mapnik::geometry::polygon<std::int64_t> p0; p0.exterior_ring.add_coord(0,0); p0.exterior_ring.add_coord(0,10); p0.exterior_ring.add_coord(-10,10); p0.exterior_ring.add_coord(-10,0); p0.exterior_ring.add_coord(0,0); std::int32_t x = 0; std::int32_t y = 0; std::string feature_str; protozero::pbf_writer feature_writer(feature_str); vector_tile::Tile_Feature feature; REQUIRE(mapnik::vector_tile_impl::encode_geometry_pbf(p0, feature_writer, x, y)); feature.ParseFromString(feature_str); REQUIRE(feature.type() == vector_tile::Tile_GeomType_POLYGON); // MoveTo, ParameterInteger, ParameterInteger // LineTo, ParameterInteger, ParameterInteger, ParameterInteger, ParameterInteger, ParameterInteger, ParameterInteger // Close // 3 commands + 8 Params = 11 REQUIRE(feature.geometry_size() == 11); // MoveTo(0,0) CHECK(feature.geometry(0) == ((1 << 3) | 1u)); // 9 CHECK(feature.geometry(1) == 0); CHECK(feature.geometry(2) == 0); // LineTo(0,10) CHECK(feature.geometry(3) == ((3 << 3) | 2u)); CHECK(feature.geometry(4) == 0); CHECK(feature.geometry(5) == 20); // LineTo(-10,10)
feature.add_geometry((3 << 3u) | 2u); feature.add_geometry(protozero::encode_zigzag32(1)); feature.add_geometry(protozero::encode_zigzag32(1)); // LineTo(10,10) feature.add_geometry(protozero::encode_zigzag32(8)); feature.add_geometry(protozero::encode_zigzag32(8)); // LineTo(0,10) feature.add_geometry(protozero::encode_zigzag32(-10)); feature.add_geometry(protozero::encode_zigzag32(0)); std::string feature_string = feature.SerializeAsString(); mapnik::vector_tile_impl::GeometryPBF geoms = feature_to_pbf_geometry(feature_string); SECTION("VT Spec v1") { auto geom = mapnik::vector_tile_impl::decode_geometry<double>(geoms, feature.type(), 1, 0.0, 0.0, 1.0, 1.0); std::string wkt0; CHECK( test_utils::to_wkt(wkt0,geom) ); CHECK( wkt0 == "LINESTRING(1 1,2 2,10 10,0 10)"); CHECK( geom.is<mapnik::geometry::line_string<double> >() ); } SECTION("VT Spec v2") { auto geom = mapnik::vector_tile_impl::decode_geometry<double>(geoms, feature.type(), 2, 0.0, 0.0, 1.0, 1.0); std::string wkt0; CHECK( test_utils::to_wkt(wkt0,geom) ); CHECK( wkt0 == "LINESTRING(1 1,2 2,10 10,0 10)"); CHECK( geom.is<mapnik::geometry::line_string<double> >() ); } }