Fix missing proj context and cleanup/simplify proj_transform

This commit is contained in:
Artem Pavlenko 2021-01-22 15:23:11 +00:00
parent 6cc353f8a2
commit db9829d702
2 changed files with 11 additions and 27 deletions

View file

@ -38,8 +38,7 @@ template <typename T> class box2d;
class MAPNIK_DECL proj_transform : private util::noncopyable
{
public:
proj_transform(projection const& source,
projection const& dest);
proj_transform(projection const& source, projection const& dest);
~proj_transform();
bool equal() const;
bool is_known() const;
@ -55,14 +54,9 @@ public:
bool backward (box2d<double> & box) const;
bool forward (box2d<double> & box, int points) const;
bool backward (box2d<double> & box, int points) const;
mapnik::projection const& source() const;
mapnik::projection const& dest() const;
private:
PJ_CONTEXT* ctx_ = nullptr;
PJ* transform_ = nullptr;
projection const& source_;
projection const& dest_;
bool is_source_longlat_;
bool is_dest_longlat_;
bool is_source_equal_dest_;

View file

@ -95,19 +95,17 @@ auto envelope_points(box2d<T> const& env, std::size_t num_points)
proj_transform::proj_transform(projection const& source,
projection const& dest)
: source_(source),
dest_(dest),
is_source_longlat_(false),
: is_source_longlat_(false),
is_dest_longlat_(false),
is_source_equal_dest_(false),
wgs84_to_merc_(false),
merc_to_wgs84_(false)
{
is_source_equal_dest_ = (source_ == dest_);
is_source_equal_dest_ = (source == dest);
if (!is_source_equal_dest_)
{
is_source_longlat_ = source_.is_geographic();
is_dest_longlat_ = dest_.is_geographic();
is_source_longlat_ = source.is_geographic();
is_dest_longlat_ = dest.is_geographic();
boost::optional<well_known_srs_e> src_k = source.well_known();
boost::optional<well_known_srs_e> dest_k = dest.well_known();
bool known_trans = false;
@ -127,22 +125,23 @@ proj_transform::proj_transform(projection const& source,
if (!known_trans)
{
#ifdef MAPNIK_USE_PROJ
ctx_ = proj_context_create();
transform_ = proj_create_crs_to_crs(ctx_,
source_.params().c_str(),
dest_.params().c_str(), nullptr);
source.params().c_str(),
dest.params().c_str(), nullptr);
if (transform_ == nullptr)
{
throw std::runtime_error(std::string("Cannot initialize proj_transform for given projections without proj4 support (-DMAPNIK_USE_PROJ): '") + source_.params() + "'->'" + dest_.params() + "'");
throw std::runtime_error(std::string("Cannot initialize proj_transform for given projections without proj4 support (-DMAPNIK_USE_PROJ): '") + source.params() + "'->'" + dest.params() + "'");
}
PJ* transform_gis = proj_normalize_for_visualization(ctx_, transform_);
if (transform_gis == nullptr)
{
throw std::runtime_error(std::string("Cannot initialize proj_transform for given projections without proj4 support (-DMAPNIK_USE_PROJ): '") + source_.params() + "'->'" + dest_.params() + "'");
throw std::runtime_error(std::string("Cannot initialize proj_transform for given projections without proj4 support (-DMAPNIK_USE_PROJ): '") + source.params() + "'->'" + dest.params() + "'");
}
proj_destroy(transform_);
transform_ = transform_gis;
#else
throw std::runtime_error(std::string("Cannot initialize proj_transform for given projections without proj4 support (-DMAPNIK_USE_PROJ): '") + source_.params() + "'->'" + dest_.params() + "'");
throw std::runtime_error(std::string("Cannot initialize proj_transform for given projections without proj4 support (-DMAPNIK_USE_PROJ): '") + source.params() + "'->'" + dest.params() + "'");
#endif
}
}
@ -452,13 +451,4 @@ bool proj_transform::forward(box2d<double>& env, int points) const
return true;
}
mapnik::projection const& proj_transform::source() const
{
return source_;
}
mapnik::projection const& proj_transform::dest() const
{
return dest_;
}
}