Use POSIX definition of pi
constant (M_PI) + define tau
in terms of pi
+ better namings + remove deprecated proj4 style definitions
This commit is contained in:
parent
baad6b3819
commit
6099804559
8 changed files with 28 additions and 53 deletions
|
@ -50,7 +50,7 @@ class MAPNIK_DECL layer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
layer(std::string const& name,
|
layer(std::string const& name,
|
||||||
std::string const& srs=MAPNIK_LONGLAT_PROJ);
|
std::string const& srs = MAPNIK_GEOGRAPHIC_PROJ);
|
||||||
// copy
|
// copy
|
||||||
layer(layer const& l);
|
layer(layer const& l);
|
||||||
// move
|
// move
|
||||||
|
|
|
@ -110,8 +110,8 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const unsigned MIN_MAPSIZE=16;
|
static const unsigned MIN_MAPSIZE = 16;
|
||||||
static const unsigned MAX_MAPSIZE=MIN_MAPSIZE<<10;
|
static const unsigned MAX_MAPSIZE = MIN_MAPSIZE << 10;
|
||||||
unsigned width_;
|
unsigned width_;
|
||||||
unsigned height_;
|
unsigned height_;
|
||||||
std::string srs_;
|
std::string srs_;
|
||||||
|
@ -153,7 +153,7 @@ public:
|
||||||
* @param height Initial map height.
|
* @param height Initial map height.
|
||||||
* @param srs Initial map projection.
|
* @param srs Initial map projection.
|
||||||
*/
|
*/
|
||||||
Map(int width, int height, std::string const& srs = MAPNIK_LONGLAT_PROJ);
|
Map(int width, int height, std::string const& srs = MAPNIK_GEOGRAPHIC_PROJ);
|
||||||
|
|
||||||
/*! \brief Copy Constructor.
|
/*! \brief Copy Constructor.
|
||||||
*
|
*
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
|
|
||||||
namespace mapnik { namespace util {
|
namespace mapnik { namespace util {
|
||||||
|
|
||||||
constexpr double pi = 3.1415926535897932384626433832795;
|
constexpr double pi = 3.14159265358979323846;
|
||||||
constexpr double tau = 6.283185307179586476925286766559;
|
constexpr double tau = 2.0 * pi;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
constexpr T const& clamp(T const& v, T const& lo, T const& hi)
|
constexpr T const& clamp(T const& v, T const& lo, T const& hi)
|
||||||
|
@ -38,12 +38,12 @@ constexpr T const& clamp(T const& v, T const& lo, T const& hi)
|
||||||
|
|
||||||
constexpr double degrees(double rad)
|
constexpr double degrees(double rad)
|
||||||
{
|
{
|
||||||
return rad * (360 / tau);
|
return rad * (180.0 / pi);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr double radians(double deg)
|
constexpr double radians(double deg)
|
||||||
{
|
{
|
||||||
return deg * (tau / 360);
|
return deg * (pi / 180);
|
||||||
}
|
}
|
||||||
|
|
||||||
MAPNIK_DECL double normalize_angle(double angle);
|
MAPNIK_DECL double normalize_angle(double angle);
|
||||||
|
|
|
@ -41,7 +41,7 @@ namespace mapnik {
|
||||||
|
|
||||||
enum well_known_srs_enum : std::uint8_t {
|
enum well_known_srs_enum : std::uint8_t {
|
||||||
WGS_84,
|
WGS_84,
|
||||||
G_MERC,
|
WEB_MERC,
|
||||||
well_known_srs_enum_MAX
|
well_known_srs_enum_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -53,8 +53,8 @@ constexpr double MERC_MAX_EXTENT = EARTH_RADIUS * util::pi;
|
||||||
constexpr double MERC_MAX_LATITUDE = 85.0511287798065923778;
|
constexpr double MERC_MAX_LATITUDE = 85.0511287798065923778;
|
||||||
// MERC_MAX_LATITUDE = degrees(2 * atan(exp(pi)) - pi / 2)
|
// MERC_MAX_LATITUDE = degrees(2 * atan(exp(pi)) - pi / 2)
|
||||||
|
|
||||||
extern MAPNIK_DECL std::string const MAPNIK_LONGLAT_PROJ;
|
extern MAPNIK_DECL std::string const MAPNIK_GEOGRAPHIC_PROJ;
|
||||||
extern MAPNIK_DECL std::string const MAPNIK_GMERC_PROJ;
|
extern MAPNIK_DECL std::string const MAPNIK_WEBMERCATOR_PROJ;
|
||||||
|
|
||||||
MAPNIK_DECL boost::optional<bool> is_known_geographic(std::string const& srs);
|
MAPNIK_DECL boost::optional<bool> is_known_geographic(std::string const& srs);
|
||||||
MAPNIK_DECL boost::optional<well_known_srs_e> is_well_known_srs(std::string const& srs);
|
MAPNIK_DECL boost::optional<well_known_srs_e> is_well_known_srs(std::string const& srs);
|
||||||
|
|
|
@ -66,7 +66,7 @@ IMPLEMENT_ENUM( aspect_fix_mode_e, aspect_fix_mode_strings )
|
||||||
Map::Map()
|
Map::Map()
|
||||||
: width_(400),
|
: width_(400),
|
||||||
height_(400),
|
height_(400),
|
||||||
srs_(MAPNIK_LONGLAT_PROJ),
|
srs_(MAPNIK_GEOGRAPHIC_PROJ),
|
||||||
buffer_size_(0),
|
buffer_size_(0),
|
||||||
background_image_comp_op_(src_over),
|
background_image_comp_op_(src_over),
|
||||||
background_image_opacity_(1.0),
|
background_image_opacity_(1.0),
|
||||||
|
|
|
@ -111,12 +111,12 @@ proj_transform::proj_transform(projection const& source,
|
||||||
bool known_trans = false;
|
bool known_trans = false;
|
||||||
if (src_k && dest_k)
|
if (src_k && dest_k)
|
||||||
{
|
{
|
||||||
if (*src_k == WGS_84 && *dest_k == G_MERC)
|
if (*src_k == WGS_84 && *dest_k == WEB_MERC)
|
||||||
{
|
{
|
||||||
wgs84_to_merc_ = true;
|
wgs84_to_merc_ = true;
|
||||||
known_trans = true;
|
known_trans = true;
|
||||||
}
|
}
|
||||||
else if (*src_k == G_MERC && *dest_k == WGS_84)
|
else if (*src_k == WEB_MERC && *dest_k == WGS_84)
|
||||||
{
|
{
|
||||||
merc_to_wgs84_ = true;
|
merc_to_wgs84_ = true;
|
||||||
known_trans = true;
|
known_trans = true;
|
||||||
|
|
|
@ -94,7 +94,6 @@ void projection::init_proj() const
|
||||||
if (!proj_)
|
if (!proj_)
|
||||||
{
|
{
|
||||||
proj_ctx_ = proj_context_create();
|
proj_ctx_ = proj_context_create();
|
||||||
//proj_ = proj_create_crs_to_crs(proj_ctx_, "epsg:4326", params_.c_str(), nullptr);
|
|
||||||
proj_ = proj_create(proj_ctx_, params_.c_str());
|
proj_ = proj_create(proj_ctx_, params_.c_str());
|
||||||
if (!proj_ || !proj_ctx_)
|
if (!proj_ || !proj_ctx_)
|
||||||
{
|
{
|
||||||
|
@ -108,18 +107,10 @@ void projection::init_proj() const
|
||||||
}
|
}
|
||||||
throw proj_init_error(params_);
|
throw proj_init_error(params_);
|
||||||
}
|
}
|
||||||
// determine the type of CRS
|
|
||||||
//PJ* crs = proj_create(proj_ctx_, params_.c_str());
|
|
||||||
//if (crs)
|
|
||||||
//if (proj_)
|
|
||||||
//{
|
|
||||||
//PJ_TYPE type = proj_get_type(crs);
|
|
||||||
PJ_TYPE type = proj_get_type(proj_);
|
PJ_TYPE type = proj_get_type(proj_);
|
||||||
is_geographic_ = (type == PJ_TYPE_GEOGRAPHIC_2D_CRS
|
is_geographic_ = (type == PJ_TYPE_GEOGRAPHIC_2D_CRS
|
||||||
||
|
||
|
||||||
type == PJ_TYPE_GEOGRAPHIC_3D_CRS) ? true : false;
|
type == PJ_TYPE_GEOGRAPHIC_3D_CRS) ? true : false;
|
||||||
//}
|
|
||||||
//proj_destroy(crs);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,28 +36,27 @@ MAPNIK_DISABLE_WARNING_POP
|
||||||
|
|
||||||
namespace mapnik {
|
namespace mapnik {
|
||||||
|
|
||||||
extern std::string const MAPNIK_LONGLAT_PROJ =
|
extern std::string const MAPNIK_GEOGRAPHIC_PROJ =
|
||||||
"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
|
"epsg:4326"; //wgs84
|
||||||
|
|
||||||
extern std::string const MAPNIK_GMERC_PROJ =
|
extern std::string const MAPNIK_WEBMERCATOR_PROJ =
|
||||||
"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0"
|
"epsg:3857"; // webmercator
|
||||||
" +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over";
|
|
||||||
|
|
||||||
static const char * well_known_srs_strings[] = {
|
static const char * well_known_srs_strings[] = {
|
||||||
"mapnik-longlat",
|
MAPNIK_GEOGRAPHIC_PROJ.c_str(),
|
||||||
"mapnik-gmerc",
|
MAPNIK_WEBMERCATOR_PROJ.c_str(),
|
||||||
""
|
""
|
||||||
};
|
};
|
||||||
|
|
||||||
boost::optional<well_known_srs_e> is_well_known_srs(std::string const& srs)
|
boost::optional<well_known_srs_e> is_well_known_srs(std::string const& srs)
|
||||||
{
|
{
|
||||||
if (srs == "epsg:4326" || srs == MAPNIK_LONGLAT_PROJ)
|
if (srs == MAPNIK_GEOGRAPHIC_PROJ)
|
||||||
{
|
{
|
||||||
return boost::optional<well_known_srs_e>(mapnik::WGS_84);
|
return boost::optional<well_known_srs_e>(mapnik::WGS_84);
|
||||||
}
|
}
|
||||||
else if (srs == "epsg:3857" || srs == MAPNIK_GMERC_PROJ)
|
else if (srs == MAPNIK_WEBMERCATOR_PROJ)
|
||||||
{
|
{
|
||||||
return boost::optional<well_known_srs_e>(mapnik::G_MERC);
|
return boost::optional<well_known_srs_e>(mapnik::WEB_MERC);
|
||||||
}
|
}
|
||||||
return boost::optional<well_known_srs_e>();
|
return boost::optional<well_known_srs_e>();
|
||||||
}
|
}
|
||||||
|
@ -65,28 +64,13 @@ boost::optional<well_known_srs_e> is_well_known_srs(std::string const& srs)
|
||||||
boost::optional<bool> is_known_geographic(std::string const& srs)
|
boost::optional<bool> is_known_geographic(std::string const& srs)
|
||||||
{
|
{
|
||||||
std::string trimmed = util::trim_copy(srs);
|
std::string trimmed = util::trim_copy(srs);
|
||||||
if (trimmed == "epsg:3857")
|
if (trimmed == MAPNIK_GEOGRAPHIC_PROJ)
|
||||||
{
|
|
||||||
return boost::optional<bool>(false);
|
|
||||||
}
|
|
||||||
else if (trimmed == "epsg:4326")
|
|
||||||
{
|
{
|
||||||
return boost::optional<bool>(true);
|
return boost::optional<bool>(true);
|
||||||
}
|
}
|
||||||
else if (srs.find("+proj=") != std::string::npos)
|
else if (trimmed == MAPNIK_WEBMERCATOR_PROJ)
|
||||||
{
|
{
|
||||||
if ((srs.find("+proj=longlat") != std::string::npos) ||
|
return boost::optional<bool>(true);
|
||||||
(srs.find("+proj=latlong") != std::string::npos) ||
|
|
||||||
(srs.find("+proj=lonlat") != std::string::npos) ||
|
|
||||||
(srs.find("+proj=latlon") != std::string::npos)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return boost::optional<bool>(true);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return boost::optional<bool>(false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return boost::optional<bool>();
|
return boost::optional<bool>();
|
||||||
}
|
}
|
||||||
|
@ -99,7 +83,7 @@ bool lonlat2merc(double & x, double & y)
|
||||||
auto dx = clamp(x, -180.0, 180.0);
|
auto dx = clamp(x, -180.0, 180.0);
|
||||||
auto dy = clamp(y, -MERC_MAX_LATITUDE, MERC_MAX_LATITUDE);
|
auto dy = clamp(y, -MERC_MAX_LATITUDE, MERC_MAX_LATITUDE);
|
||||||
x = EARTH_RADIUS * radians(dx);
|
x = EARTH_RADIUS * radians(dx);
|
||||||
y = EARTH_RADIUS * std::log(std::tan(radians(90 + dy) / 2));
|
y = EARTH_RADIUS * std::log(std::tan(radians(90.0 + dy) / 2.0));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +111,7 @@ bool merc2lonlat(double & x, double & y)
|
||||||
auto rx = clamp(x / EARTH_RADIUS, -pi, pi);
|
auto rx = clamp(x / EARTH_RADIUS, -pi, pi);
|
||||||
auto ry = clamp(y / EARTH_RADIUS, -pi, pi);
|
auto ry = clamp(y / EARTH_RADIUS, -pi, pi);
|
||||||
x = degrees(rx);
|
x = degrees(rx);
|
||||||
y = degrees(2 * std::atan(std::exp(ry)) - pi / 2);
|
y = degrees(2.0 * std::atan(std::exp(ry)) - pi / 2.0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue