1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands. 4 5 // This file was modified by Oracle on 2017. 6 // Modifications copyright (c) 2017, Oracle and/or its affiliates. 7 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle 8 9 // Use, modification and distribution is subject to the Boost Software License, 10 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 11 // http://www.boost.org/LICENSE_1_0.txt) 12 13 #ifndef BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP 14 #define BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP 15 16 #include <map> 17 #include <string> 18 19 #include <boost/shared_ptr.hpp> 20 21 #include <boost/geometry/srs/projections/dpar.hpp> 22 #include <boost/geometry/srs/projections/factory_key.hpp> 23 #include <boost/geometry/srs/projections/proj4.hpp> 24 #include <boost/geometry/srs/projections/impl/factory_entry.hpp> 25 #include <boost/geometry/srs/projections/proj/aea.hpp> 26 #include <boost/geometry/srs/projections/proj/aeqd.hpp> 27 #include <boost/geometry/srs/projections/proj/airy.hpp> 28 #include <boost/geometry/srs/projections/proj/aitoff.hpp> 29 #include <boost/geometry/srs/projections/proj/august.hpp> 30 #include <boost/geometry/srs/projections/proj/bacon.hpp> 31 #include <boost/geometry/srs/projections/proj/bipc.hpp> 32 #include <boost/geometry/srs/projections/proj/boggs.hpp> 33 #include <boost/geometry/srs/projections/proj/bonne.hpp> 34 #include <boost/geometry/srs/projections/proj/cass.hpp> 35 #include <boost/geometry/srs/projections/proj/cc.hpp> 36 #include <boost/geometry/srs/projections/proj/cea.hpp> 37 #include <boost/geometry/srs/projections/proj/chamb.hpp> 38 #include <boost/geometry/srs/projections/proj/collg.hpp> 39 #include <boost/geometry/srs/projections/proj/crast.hpp> 40 #include <boost/geometry/srs/projections/proj/denoy.hpp> 41 #include <boost/geometry/srs/projections/proj/eck1.hpp> 42 #include <boost/geometry/srs/projections/proj/eck2.hpp> 43 #include <boost/geometry/srs/projections/proj/eck3.hpp> 44 #include <boost/geometry/srs/projections/proj/eck4.hpp> 45 #include <boost/geometry/srs/projections/proj/eck5.hpp> 46 #include <boost/geometry/srs/projections/proj/eqc.hpp> 47 #include <boost/geometry/srs/projections/proj/eqdc.hpp> 48 #include <boost/geometry/srs/projections/proj/etmerc.hpp> 49 #include <boost/geometry/srs/projections/proj/fahey.hpp> 50 #include <boost/geometry/srs/projections/proj/fouc_s.hpp> 51 #include <boost/geometry/srs/projections/proj/gall.hpp> 52 #include <boost/geometry/srs/projections/proj/geocent.hpp> 53 #include <boost/geometry/srs/projections/proj/geos.hpp> 54 #include <boost/geometry/srs/projections/proj/gins8.hpp> 55 #include <boost/geometry/srs/projections/proj/gn_sinu.hpp> 56 #include <boost/geometry/srs/projections/proj/gnom.hpp> 57 #include <boost/geometry/srs/projections/proj/goode.hpp> 58 #include <boost/geometry/srs/projections/proj/gstmerc.hpp> 59 #include <boost/geometry/srs/projections/proj/hammer.hpp> 60 #include <boost/geometry/srs/projections/proj/hatano.hpp> 61 #include <boost/geometry/srs/projections/proj/healpix.hpp> 62 #include <boost/geometry/srs/projections/proj/krovak.hpp> 63 #include <boost/geometry/srs/projections/proj/igh.hpp> 64 #include <boost/geometry/srs/projections/proj/imw_p.hpp> 65 #include <boost/geometry/srs/projections/proj/isea.hpp> 66 #include <boost/geometry/srs/projections/proj/laea.hpp> 67 #include <boost/geometry/srs/projections/proj/labrd.hpp> 68 #include <boost/geometry/srs/projections/proj/lagrng.hpp> 69 #include <boost/geometry/srs/projections/proj/larr.hpp> 70 #include <boost/geometry/srs/projections/proj/lask.hpp> 71 #include <boost/geometry/srs/projections/proj/latlong.hpp> 72 #include <boost/geometry/srs/projections/proj/lcc.hpp> 73 #include <boost/geometry/srs/projections/proj/lcca.hpp> 74 #include <boost/geometry/srs/projections/proj/loxim.hpp> 75 #include <boost/geometry/srs/projections/proj/lsat.hpp> 76 #include <boost/geometry/srs/projections/proj/mbtfpp.hpp> 77 #include <boost/geometry/srs/projections/proj/mbtfpq.hpp> 78 #include <boost/geometry/srs/projections/proj/mbt_fps.hpp> 79 #include <boost/geometry/srs/projections/proj/merc.hpp> 80 #include <boost/geometry/srs/projections/proj/mill.hpp> 81 #include <boost/geometry/srs/projections/proj/mod_ster.hpp> 82 #include <boost/geometry/srs/projections/proj/moll.hpp> 83 #include <boost/geometry/srs/projections/proj/natearth.hpp> 84 #include <boost/geometry/srs/projections/proj/nell.hpp> 85 #include <boost/geometry/srs/projections/proj/nell_h.hpp> 86 #include <boost/geometry/srs/projections/proj/nocol.hpp> 87 #include <boost/geometry/srs/projections/proj/nsper.hpp> 88 #include <boost/geometry/srs/projections/proj/nzmg.hpp> 89 #include <boost/geometry/srs/projections/proj/ob_tran.hpp> 90 #include <boost/geometry/srs/projections/proj/ocea.hpp> 91 #include <boost/geometry/srs/projections/proj/oea.hpp> 92 #include <boost/geometry/srs/projections/proj/omerc.hpp> 93 #include <boost/geometry/srs/projections/proj/ortho.hpp> 94 #include <boost/geometry/srs/projections/proj/qsc.hpp> 95 #include <boost/geometry/srs/projections/proj/poly.hpp> 96 #include <boost/geometry/srs/projections/proj/putp2.hpp> 97 #include <boost/geometry/srs/projections/proj/putp3.hpp> 98 #include <boost/geometry/srs/projections/proj/putp4p.hpp> 99 #include <boost/geometry/srs/projections/proj/putp5.hpp> 100 #include <boost/geometry/srs/projections/proj/putp6.hpp> 101 #include <boost/geometry/srs/projections/proj/robin.hpp> 102 #include <boost/geometry/srs/projections/proj/rouss.hpp> 103 #include <boost/geometry/srs/projections/proj/rpoly.hpp> 104 #include <boost/geometry/srs/projections/proj/sconics.hpp> 105 #include <boost/geometry/srs/projections/proj/somerc.hpp> 106 #include <boost/geometry/srs/projections/proj/stere.hpp> 107 #include <boost/geometry/srs/projections/proj/sterea.hpp> 108 #include <boost/geometry/srs/projections/proj/sts.hpp> 109 #include <boost/geometry/srs/projections/proj/tcc.hpp> 110 #include <boost/geometry/srs/projections/proj/tcea.hpp> 111 #include <boost/geometry/srs/projections/proj/tmerc.hpp> 112 #include <boost/geometry/srs/projections/proj/tpeqd.hpp> 113 #include <boost/geometry/srs/projections/proj/urm5.hpp> 114 #include <boost/geometry/srs/projections/proj/urmfps.hpp> 115 #include <boost/geometry/srs/projections/proj/vandg.hpp> 116 #include <boost/geometry/srs/projections/proj/vandg2.hpp> 117 #include <boost/geometry/srs/projections/proj/vandg4.hpp> 118 #include <boost/geometry/srs/projections/proj/wag2.hpp> 119 #include <boost/geometry/srs/projections/proj/wag3.hpp> 120 #include <boost/geometry/srs/projections/proj/wag7.hpp> 121 #include <boost/geometry/srs/projections/proj/wink1.hpp> 122 #include <boost/geometry/srs/projections/proj/wink2.hpp> 123 124 namespace boost { namespace geometry { namespace projections 125 { 126 127 namespace detail 128 { 129 130 template <typename Params, typename CT, typename ProjParams> 131 class factory 132 { 133 private: 134 typedef detail::factory_entry 135 < 136 Params, 137 CT, 138 ProjParams 139 > entry_base; 140 141 typedef typename factory_key_util<Params>::type key_type; 142 typedef boost::shared_ptr<entry_base> entry_ptr; 143 144 typedef std::map<key_type, entry_ptr> entries_map; 145 146 entries_map m_entries; 147 148 public: 149 factory()150 factory() 151 { 152 detail::aea_init(*this); 153 detail::aeqd_init(*this); 154 detail::airy_init(*this); 155 detail::aitoff_init(*this); 156 detail::august_init(*this); 157 detail::bacon_init(*this); 158 detail::bipc_init(*this); 159 detail::boggs_init(*this); 160 detail::bonne_init(*this); 161 detail::cass_init(*this); 162 detail::cc_init(*this); 163 detail::cea_init(*this); 164 detail::chamb_init(*this); 165 detail::collg_init(*this); 166 detail::crast_init(*this); 167 detail::denoy_init(*this); 168 detail::eck1_init(*this); 169 detail::eck2_init(*this); 170 detail::eck3_init(*this); 171 detail::eck4_init(*this); 172 detail::eck5_init(*this); 173 detail::eqc_init(*this); 174 detail::eqdc_init(*this); 175 detail::etmerc_init(*this); 176 detail::fahey_init(*this); 177 detail::fouc_s_init(*this); 178 detail::gall_init(*this); 179 detail::geocent_init(*this); 180 detail::geos_init(*this); 181 detail::gins8_init(*this); 182 detail::gn_sinu_init(*this); 183 detail::gnom_init(*this); 184 detail::goode_init(*this); 185 detail::gstmerc_init(*this); 186 detail::hammer_init(*this); 187 detail::hatano_init(*this); 188 detail::healpix_init(*this); 189 detail::krovak_init(*this); 190 detail::igh_init(*this); 191 detail::imw_p_init(*this); 192 detail::isea_init(*this); 193 detail::labrd_init(*this); 194 detail::laea_init(*this); 195 detail::lagrng_init(*this); 196 detail::larr_init(*this); 197 detail::lask_init(*this); 198 detail::latlong_init(*this); 199 detail::lcc_init(*this); 200 detail::lcca_init(*this); 201 detail::loxim_init(*this); 202 detail::lsat_init(*this); 203 detail::mbtfpp_init(*this); 204 detail::mbtfpq_init(*this); 205 detail::mbt_fps_init(*this); 206 detail::merc_init(*this); 207 detail::mill_init(*this); 208 detail::mod_ster_init(*this); 209 detail::moll_init(*this); 210 detail::natearth_init(*this); 211 detail::nell_init(*this); 212 detail::nell_h_init(*this); 213 detail::nocol_init(*this); 214 detail::nsper_init(*this); 215 detail::nzmg_init(*this); 216 detail::ob_tran_init(*this); 217 detail::ocea_init(*this); 218 detail::oea_init(*this); 219 detail::omerc_init(*this); 220 detail::ortho_init(*this); 221 detail::qsc_init(*this); 222 detail::poly_init(*this); 223 detail::putp2_init(*this); 224 detail::putp3_init(*this); 225 detail::putp4p_init(*this); 226 detail::putp5_init(*this); 227 detail::putp6_init(*this); 228 detail::robin_init(*this); 229 detail::rouss_init(*this); 230 detail::rpoly_init(*this); 231 detail::sconics_init(*this); 232 detail::somerc_init(*this); 233 detail::stere_init(*this); 234 detail::sterea_init(*this); 235 detail::sts_init(*this); 236 detail::tcc_init(*this); 237 detail::tcea_init(*this); 238 detail::tmerc_init(*this); 239 detail::tpeqd_init(*this); 240 detail::urm5_init(*this); 241 detail::urmfps_init(*this); 242 detail::vandg_init(*this); 243 detail::vandg2_init(*this); 244 detail::vandg4_init(*this); 245 detail::wag2_init(*this); 246 detail::wag3_init(*this); 247 detail::wag7_init(*this); 248 detail::wink1_init(*this); 249 detail::wink2_init(*this); 250 } 251 add_to_factory(key_type const & key,entry_base * entry)252 void add_to_factory(key_type const& key, entry_base* entry) 253 { 254 // The pointer has to be owned before std::map::operator[] in case it thrown an exception. 255 entry_ptr ptr(entry); 256 m_entries[key] = ptr; 257 } 258 create_new(Params const & params,ProjParams const & proj_par) const259 detail::base_v<CT, ProjParams>* create_new(Params const& params, ProjParams const& proj_par) const 260 { 261 typename factory_key_util<Params>::type key = factory_key_util<Params>::get(proj_par); 262 typename entries_map::const_iterator it = m_entries.find(key); 263 if (it != m_entries.end()) 264 { 265 return it->second->create_new(params, proj_par); 266 } 267 268 return 0; 269 } 270 }; 271 272 template <typename T> 273 inline detail::base_v<T, projections::parameters<T> >* create_new(srs::detail::proj4_parameters const & params,projections::parameters<T> const & parameters)274 create_new(srs::detail::proj4_parameters const& params, 275 projections::parameters<T> const& parameters) 276 { 277 static factory<srs::detail::proj4_parameters, T, projections::parameters<T> > const fac; 278 return fac.create_new(params, parameters); 279 } 280 281 template <typename T> 282 inline detail::base_v<T, projections::parameters<T> >* create_new(srs::dpar::parameters<T> const & params,projections::parameters<T> const & parameters)283 create_new(srs::dpar::parameters<T> const& params, 284 projections::parameters<T> const& parameters) 285 { 286 static factory<srs::dpar::parameters<T>, T, projections::parameters<T> > const fac; 287 return fac.create_new(params, parameters); 288 } 289 290 291 } // namespace detail 292 293 }}} // namespace boost::geometry::projections 294 295 #endif // BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP 296