inline void make_polygon(MultiPolygon& mp, int count_x, int count_y, int index, int width_x) { typedef typename bg::point_type<MultiPolygon>::type point_type; for(int j = 0; j < count_x; ++j) { for(int k = 0; k < count_y; ++k) { mp.push_back(MultiPolygon::value_type()); mp.back().outer().push_back(point_type(width_x + j * 10 + 1, k * 10 + 1)); mp.back().outer().push_back(point_type(width_x + j * 10 + width_x, k * 10 + 5 + index)); mp.back().outer().push_back(point_type(width_x + j * 10 + 5 + index, k * 10 + 7)); mp.back().outer().push_back(point_type(width_x + j * 10 + 1, k * 10 + 1)); } } }
inline void holify_multi(MultiPolygon& multi_polygon) { typedef typename bg::point_type<MultiPolygon>::type point_type; typename boost::range_value<MultiPolygon>::type p; bg::exterior_ring(p).push_back(bg::make<point_type>(0, 0)); bg::exterior_ring(p).push_back(bg::make<point_type>(0, 5000)); bg::exterior_ring(p).push_back(bg::make<point_type>(5000, 5000)); bg::exterior_ring(p).push_back(bg::make<point_type>(5000, 0)); bg::exterior_ring(p).push_back(bg::make<point_type>(0, 0)); for (int i = 0; i < multi_polygon.size(); i++) { bg::interior_rings(p).push_back(bg::exterior_ring(multi_polygon[i])); } bg::correct(p); multi_polygon.clear(); multi_polygon.push_back(p); }
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>(); }