#pragma once #include #include #include #include #include #include namespace mbgl { using TileCoordinatePoint = Point; // Has floating point x/y coordinates. // Used for computing the tiles that need to be visible in the viewport. // In mapbox-gl-js, this is named MercatorCoordinate. class TileCoordinate { public: TileCoordinatePoint p; double z; static TileCoordinate fromLatLng(double zoom, const LatLng& latLng) { const double scale = std::pow(2.0, zoom); return { Projection::project(latLng, scale) / util::tileSize, zoom }; } static TileCoordinate fromScreenCoordinate(const TransformState& state, uint8_t zoom, const ScreenCoordinate& screenCoordinate) { return state.screenCoordinateToTileCoordinate(screenCoordinate, zoom); } TileCoordinate zoomTo(double zoom) const { const double scaleDiff = std::pow(2.0, zoom - z); return { p * scaleDiff, zoom }; } static GeometryCoordinate toGeometryCoordinate(const UnwrappedTileID& tileID, const TileCoordinatePoint& point) { const double scale = std::pow(2.0, tileID.canonical.z); auto zoomed = TileCoordinate { point, 0 }.zoomTo(tileID.canonical.z); return { int16_t(util::clamp((zoomed.p.x - tileID.canonical.x - tileID.wrap * scale) * util::EXTENT, std::numeric_limits::min(), std::numeric_limits::max())), int16_t(util::clamp((zoomed.p.y - tileID.canonical.y) * util::EXTENT, std::numeric_limits::min(), std::numeric_limits::max())) }; } }; } // namespace mbgl