141 lines
4.5 KiB
C
141 lines
4.5 KiB
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include "BoundingRegion.h"
|
||
|
|
#include "CesiumGeometry/AxisAlignedBox.h"
|
||
|
|
#include "CesiumGeometry/Rectangle.h"
|
||
|
|
#include "Ellipsoid.h"
|
||
|
|
#include "GeographicProjection.h"
|
||
|
|
#include "WebMercatorProjection.h"
|
||
|
|
|
||
|
|
#include <glm/vec2.hpp>
|
||
|
|
|
||
|
|
#include <variant>
|
||
|
|
|
||
|
|
namespace CesiumGeospatial {
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief A projection.
|
||
|
|
*
|
||
|
|
* This is a `std::variant` of different types of map projections that
|
||
|
|
* can convert between projected map coordinates and Cartographic coordinates.
|
||
|
|
*
|
||
|
|
* @see GeographicProjection
|
||
|
|
* @see WebMercatorProjection
|
||
|
|
*/
|
||
|
|
typedef std::variant<GeographicProjection, WebMercatorProjection> Projection;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Projects a position on the globe using the given {@link Projection}.
|
||
|
|
*
|
||
|
|
* @param projection The projection.
|
||
|
|
* @param position The {@link Cartographic} position.
|
||
|
|
* @return The coordinates of the projected point, in the coordinate system
|
||
|
|
* of the given projection.
|
||
|
|
*/
|
||
|
|
glm::dvec3
|
||
|
|
projectPosition(const Projection& projection, const Cartographic& position);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Unprojects a position from the globe using the given
|
||
|
|
* {@link Projection}.
|
||
|
|
*
|
||
|
|
* @param projection The projection.
|
||
|
|
* @param position The coordinates of the point, in meters.
|
||
|
|
* @return The {@link Cartographic} position.
|
||
|
|
*/
|
||
|
|
Cartographic
|
||
|
|
unprojectPosition(const Projection& projection, const glm::dvec3& position);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Projects a rectangle on the globe by simply projecting its four
|
||
|
|
* corners.
|
||
|
|
*
|
||
|
|
* This is only accurate when the globe rectangle is still a rectangle after
|
||
|
|
* projecting, which is true for {@link WebMercatorProjection} but not
|
||
|
|
* necessarily true for other projections.
|
||
|
|
*
|
||
|
|
* @param projection The projection.
|
||
|
|
* @param rectangle The globe rectangle to be projected.
|
||
|
|
* @return The projected rectangle.
|
||
|
|
*/
|
||
|
|
CesiumGeometry::Rectangle projectRectangleSimple(
|
||
|
|
const Projection& projection,
|
||
|
|
const GlobeRectangle& rectangle);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Unprojects a rectangle to the globe by simply unprojecting its four
|
||
|
|
* corners.
|
||
|
|
*
|
||
|
|
* This is only accurate when the rectangle is still a rectangle after
|
||
|
|
* unprojecting, which is true for {@link WebMercatorProjection} but not
|
||
|
|
* necessarily true for other projections.
|
||
|
|
*
|
||
|
|
* @param projection The projection.
|
||
|
|
* @param rectangle The rectangle to be unprojected.
|
||
|
|
* @return The unprojected rectangle.
|
||
|
|
*/
|
||
|
|
GlobeRectangle unprojectRectangleSimple(
|
||
|
|
const Projection& projection,
|
||
|
|
const CesiumGeometry::Rectangle& rectangle);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Projects a bounding region on the globe by simply projecting its
|
||
|
|
* eight corners.
|
||
|
|
*
|
||
|
|
* This is only accurate when the globe box is still a box after
|
||
|
|
* projecting, which is true for {@link WebMercatorProjection} but not
|
||
|
|
* necessarily true for other projections.
|
||
|
|
*
|
||
|
|
* @param projection The projection.
|
||
|
|
* @param region The bounding region to be projected.
|
||
|
|
* @return The projected box.
|
||
|
|
*/
|
||
|
|
CesiumGeometry::AxisAlignedBox
|
||
|
|
projectRegionSimple(const Projection& projection, const BoundingRegion& region);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Unprojects a box to the globe by simply unprojecting its eight
|
||
|
|
* corners.
|
||
|
|
*
|
||
|
|
* This is only accurate when the box is still a box after
|
||
|
|
* unprojecting, which is true for {@link WebMercatorProjection} but not
|
||
|
|
* necessarily true for other projections.
|
||
|
|
*
|
||
|
|
* @param projection The projection.
|
||
|
|
* @param box The box to be unprojected.
|
||
|
|
* @param ellipsoid The {@link CesiumGeospatial::Ellipsoid}.
|
||
|
|
* @return The unprojected bounding region.
|
||
|
|
*/
|
||
|
|
BoundingRegion unprojectRegionSimple(
|
||
|
|
const Projection& projection,
|
||
|
|
const CesiumGeometry::AxisAlignedBox& box,
|
||
|
|
const CesiumGeospatial::Ellipsoid& ellipsoid CESIUM_DEFAULT_ELLIPSOID);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Computes the approximate real-world size, in meters, of a given
|
||
|
|
* projected rectangle.
|
||
|
|
*
|
||
|
|
* The returned X component corresponds to the size in the projected X
|
||
|
|
* direction, while the returned Y component corresponds to the size in the
|
||
|
|
* projected Y direction.
|
||
|
|
*
|
||
|
|
* @param projection The projection.
|
||
|
|
* @param rectangle The projected rectangle to measure.
|
||
|
|
* @param maxHeight The maximum height of the geometry inside the rectangle.
|
||
|
|
* @param ellipsoid The ellipsoid used to convert longitude and latitude to
|
||
|
|
* ellipsoid-centered coordinates.
|
||
|
|
* @return The approximate size.
|
||
|
|
*/
|
||
|
|
glm::dvec2 computeProjectedRectangleSize(
|
||
|
|
const Projection& projection,
|
||
|
|
const CesiumGeometry::Rectangle& rectangle,
|
||
|
|
double maxHeight,
|
||
|
|
const Ellipsoid& ellipsoid CESIUM_DEFAULT_ELLIPSOID);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Obtains the ellipsoid used by a Projection variant.
|
||
|
|
*/
|
||
|
|
const Ellipsoid& getProjectionEllipsoid(const Projection& projection);
|
||
|
|
|
||
|
|
} // namespace CesiumGeospatial
|