diff options
author | John Firebaugh <john.firebaugh@gmail.com> | 2016-05-26 16:35:55 -0700 |
---|---|---|
committer | John Firebaugh <john.firebaugh@gmail.com> | 2016-06-01 17:36:50 -0700 |
commit | 8985b1311b7d00cf761752bd9291566325ae207a (patch) | |
tree | aa42e0a0f5e0dc592d6dcafdf5ff54013ccc7a25 /src | |
parent | aa1a54c577a95082824f2a5a6bdf4948506fcaa9 (diff) | |
download | qtlocation-mapboxgl-8985b1311b7d00cf761752bd9291566325ae207a.tar.gz |
[core] Use geometry.hpp types for shape annotations
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/annotation/shape_annotation_impl.cpp | 101 | ||||
-rw-r--r-- | src/mbgl/map/map.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/util/geometry.hpp | 3 |
3 files changed, 86 insertions, 23 deletions
diff --git a/src/mbgl/annotation/shape_annotation_impl.cpp b/src/mbgl/annotation/shape_annotation_impl.cpp index 76a237bfc2..a96c4eae72 100644 --- a/src/mbgl/annotation/shape_annotation_impl.cpp +++ b/src/mbgl/annotation/shape_annotation_impl.cpp @@ -80,33 +80,94 @@ void ShapeAnnotationImpl::updateStyle(Style& style) { } } -void ShapeAnnotationImpl::updateTile(const CanonicalTileID& tileID, AnnotationTile& tile) { - static const double baseTolerance = 4; +struct ToGeoJSONVT { + const double tolerance; - if (!shapeTiler) { - const uint64_t maxAmountOfTiles = 1 << maxZoom; - const double tolerance = baseTolerance / (maxAmountOfTiles * util::EXTENT); + ToGeoJSONVT(const double tolerance_) + : tolerance(tolerance_) { + } - geojsonvt::ProjectedRings rings; - for (auto& segment : shape.segments) { - std::vector<geojsonvt::LonLat> points; - for (auto& latLng : segment) { - const double wrappedLongitude = util::wrap(latLng.longitude, -util::LONGITUDE_MAX, util::LONGITUDE_MAX); - const double clampedLatitude = util::clamp(latLng.latitude, -util::LATITUDE_MAX, util::LATITUDE_MAX); - points.push_back(geojsonvt::LonLat(wrappedLongitude, clampedLatitude)); - } + geojsonvt::ProjectedFeature operator()(const LineString<double>& line) const { + geojsonvt::ProjectedRings converted; + converted.push_back(convertPoints(geojsonvt::ProjectedFeatureType::Polygon, line)); + return convertFeature(geojsonvt::ProjectedFeatureType::LineString, converted); + } - if (type == geojsonvt::ProjectedFeatureType::Polygon && - (points.front().lon != points.back().lon || points.front().lat != points.back().lat)) { - points.push_back(geojsonvt::LonLat(points.front().lon, points.front().lat)); + geojsonvt::ProjectedFeature operator()(const Polygon<double>& polygon) const { + geojsonvt::ProjectedRings converted; + for (const auto& ring : polygon) { + converted.push_back(convertPoints(geojsonvt::ProjectedFeatureType::Polygon, ring)); + } + return convertFeature(geojsonvt::ProjectedFeatureType::Polygon, converted); + } + + geojsonvt::ProjectedFeature operator()(const MultiLineString<double>& lines) const { + geojsonvt::ProjectedRings converted; + for (const auto& line : lines) { + converted.push_back(convertPoints(geojsonvt::ProjectedFeatureType::LineString, line)); + } + return convertFeature(geojsonvt::ProjectedFeatureType::LineString, converted); + } + + geojsonvt::ProjectedFeature operator()(const MultiPolygon<double>& polygons) const { + geojsonvt::ProjectedRings converted; + for (const auto& polygon : polygons) { + for (const auto& ring : polygon) { + converted.push_back(convertPoints(geojsonvt::ProjectedFeatureType::Polygon, ring)); } + } + return convertFeature(geojsonvt::ProjectedFeatureType::Polygon, converted); + } + + geojsonvt::ProjectedFeature operator()(const Point<double>&) { + throw std::runtime_error("unsupported shape annotation geometry type"); + } + + geojsonvt::ProjectedFeature operator()(const MultiPoint<double>&) { + throw std::runtime_error("unsupported shape annotation geometry type"); + } + + geojsonvt::ProjectedFeature operator()(const mapbox::geometry::geometry_collection<double>&) { + throw std::runtime_error("unsupported shape annotation geometry type"); + } + +private: + geojsonvt::LonLat convertPoint(const Point<double>& p) const { + return { + util::wrap(p.x, -util::LONGITUDE_MAX, util::LONGITUDE_MAX), + util::clamp(p.y, -util::LATITUDE_MAX, util::LATITUDE_MAX) + }; + } - auto ring = geojsonvt::Convert::projectRing(points, tolerance); - rings.push_back(ring); + geojsonvt::ProjectedRing convertPoints(geojsonvt::ProjectedFeatureType type, const std::vector<Point<double>>& points) const { + std::vector<geojsonvt::LonLat> converted; + + for (const auto& p : points) { + converted.push_back(convertPoint(p)); + } + + if (type == geojsonvt::ProjectedFeatureType::Polygon && points.front() != points.back()) { + converted.push_back(converted.front()); } - std::vector<geojsonvt::ProjectedFeature> features; - features.push_back(geojsonvt::Convert::create(geojsonvt::Tags(), type, rings)); + return geojsonvt::Convert::projectRing(converted, tolerance); + } + + geojsonvt::ProjectedFeature convertFeature(geojsonvt::ProjectedFeatureType type, const geojsonvt::ProjectedRings& rings) const { + return geojsonvt::Convert::create(geojsonvt::Tags(), type, rings); + } +}; + +void ShapeAnnotationImpl::updateTile(const CanonicalTileID& tileID, AnnotationTile& tile) { + static const double baseTolerance = 4; + + if (!shapeTiler) { + const uint64_t maxAmountOfTiles = 1 << maxZoom; + const double tolerance = baseTolerance / (maxAmountOfTiles * util::EXTENT); + + std::vector<geojsonvt::ProjectedFeature> features = { + Geometry<double>::visit(shape.geometry, ToGeoJSONVT(tolerance)) + }; mapbox::geojsonvt::Options options; options.maxZoom = maxZoom; diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index b7b8b584ec..e0a73c2a06 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -481,13 +481,12 @@ void Map::setLatLngZoom(const LatLng& latLng, double zoom, optional<EdgeInsets> } CameraOptions Map::cameraForLatLngBounds(const LatLngBounds& bounds, optional<EdgeInsets> padding) const { - AnnotationSegment segment = { + return cameraForLatLngs({ bounds.northwest(), bounds.southwest(), bounds.southeast(), bounds.northeast(), - }; - return cameraForLatLngs(segment, padding); + }, padding); } CameraOptions Map::cameraForLatLngs(const std::vector<LatLng>& latLngs, optional<EdgeInsets> padding) const { diff --git a/src/mbgl/util/geometry.hpp b/src/mbgl/util/geometry.hpp index f9b91bcb39..6b9c332bf2 100644 --- a/src/mbgl/util/geometry.hpp +++ b/src/mbgl/util/geometry.hpp @@ -26,6 +26,9 @@ using MultiPolygon = mapbox::geometry::multi_polygon<T>; template <class T> using LinearRing = mapbox::geometry::linear_ring<T>; +template <class T> +using Geometry = mapbox::geometry::geometry<T>; + template <class S, class T> Point<S> convertPoint(const Point<T>& p) { return Point<S>(p.x, p.y); |