TEST(TileCover, DISABLED_FuzzPoly) { while(1) { std::srand (time(NULL)); std::size_t len = std::rand() % 10000 + 3; Polygon<double> polygon; std::size_t num_rings = 1; num_rings += std::rand() % 5; while (num_rings > 0) { LinearRing<double> ring; for (std::size_t i = 0; i < len; ++i) { double x = std::rand() % 180; double y = std::rand() % 90; ring.push_back({x,y}); } polygon.emplace_back(ring); --num_rings; } std::clog << "."; util::TileCover tc(polygon, 5); while(tc.next()) { }; } }
static Feature::geometry_type convertGeometry(const GeometryTileFeature& geometryTileFeature, const CanonicalTileID& tileID) { const double size = util::EXTENT * std::pow(2, tileID.z); const double x0 = util::EXTENT * tileID.x; const double y0 = util::EXTENT * tileID.y; auto tileCoordinatesToLatLng = [&] (const Point<int16_t>& p) { double y2 = 180 - (p.y + y0) * 360 / size; return Point<double>( (p.x + x0) * 360 / size - 180, 360.0 / M_PI * std::atan(std::exp(y2 * M_PI / 180)) - 90.0 ); }; GeometryCollection geometries = geometryTileFeature.getGeometries(); switch (geometryTileFeature.getType()) { case FeatureType::Unknown: { assert(false); return Point<double>(NAN, NAN); } case FeatureType::Point: { MultiPoint<double> multiPoint; for (const auto& p : geometries.at(0)) { multiPoint.push_back(tileCoordinatesToLatLng(p)); } if (multiPoint.size() == 1) { return multiPoint[0]; } else { return multiPoint; } } case FeatureType::LineString: { MultiLineString<double> multiLineString; for (const auto& g : geometries) { LineString<double> lineString; for (const auto& p : g) { lineString.push_back(tileCoordinatesToLatLng(p)); } multiLineString.push_back(std::move(lineString)); } if (multiLineString.size() == 1) { return multiLineString[0]; } else { return multiLineString; } } case FeatureType::Polygon: { MultiPolygon<double> multiPolygon; for (const auto& pg : classifyRings(geometries)) { Polygon<double> polygon; for (const auto& r : pg) { LinearRing<double> linearRing; for (const auto& p : r) { linearRing.push_back(tileCoordinatesToLatLng(p)); } polygon.push_back(std::move(linearRing)); } multiPolygon.push_back(std::move(polygon)); } if (multiPolygon.size() == 1) { return multiPolygon[0]; } else { return multiPolygon; } } } // Unreachable, but placate GCC. return Point<double>(); }