Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r51287 - in sandbox/ggl: boost/ggl/algorithms boost/ggl/arithmetic boost/ggl/core boost/ggl/geometries boost/ggl/geometry boost/ggl/geometry/algorithms boost/ggl/geometry/arithmetic boost/ggl/geometry/core boost/ggl/geometry/core/concepts boost/ggl/geometry/geometries boost/ggl/geometry/geometries/adapted boost/ggl/geometry/geometries/register boost/ggl/geometry/io boost/ggl/geometry/io/wkt boost/ggl/geometry/projections boost/ggl/geometry/projections/impl boost/ggl/geometry/projections/proj boost/ggl/geometry/strategies boost/ggl/geometry/strategies/agnostic boost/ggl/geometry/strategies/cartesian boost/ggl/geometry/strategies/geographic boost/ggl/geometry/strategies/spherical boost/ggl/geometry/strategies/transform boost/ggl/geometry/util boost/ggl/io boost/ggl/strategies boost/ggl/util libs/ggl/example libs/ggl/example/contrib libs/ggl/test libs/ggl/test/point_concept_tests
From: barend.gehrels_at_[hidden]
Date: 2009-02-17 06:30:13


Author: barendgehrels
Date: 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
New Revision: 51287
URL: http://svn.boost.org/trac/boost/changeset/51287

Log:
Preview 4
Added:
   sandbox/ggl/boost/ggl/geometry/
   sandbox/ggl/boost/ggl/geometry/algorithms/
   sandbox/ggl/boost/ggl/geometry/algorithms/append.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/area.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/assign.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/buffer.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/centroid.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/clear.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/combine.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/convert.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/convex_hull.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/correct.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/distance.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/envelope.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/foreach.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/intersection.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/intersection_linestring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/intersection_polygon.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/intersection_segment.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/length.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/make.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/num_points.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/overlaps.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/parse.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/selected.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/simplify.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/transform.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/algorithms/within.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/arithmetic/
   sandbox/ggl/boost/ggl/geometry/arithmetic/arithmetic.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/arithmetic/dot_product.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/
   sandbox/ggl/boost/ggl/geometry/core/access.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/concepts/
   sandbox/ggl/boost/ggl/geometry/core/concepts/box_concept.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/concepts/linestring_concept.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/concepts/nsphere_concept.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/concepts/point_concept.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/concepts/polygon_concept.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/concepts/ring_concept.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/concepts/segment_concept.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/coordinate_dimension.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/coordinate_system.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/coordinate_type.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/cs.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/exterior_ring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/interior_rings.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/point_type.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/radian_access.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/radius.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/ring_type.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/tag.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/tags.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/core/topological_dimension.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/boost_array_as_linestring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/boost_array_as_ring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array_cartesian.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array_geographic.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/std_as_linestring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/std_as_ring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple_cartesian.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple_geographic.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/box.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/cartesian2d.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/cartesian3d.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/geometries.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/latlong.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/linear_ring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/linestring.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/nsphere.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/point.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/point_ll.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/point_xy.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/polygon.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/register/
   sandbox/ggl/boost/ggl/geometry/geometries/register/register_box.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/register/register_point.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometries/segment.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/geometry.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/io/
   sandbox/ggl/boost/ggl/geometry/io/wkt/
   sandbox/ggl/boost/ggl/geometry/io/wkt/aswkt.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/io/wkt/fromwkt.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/io/wkt/streamwkt.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/
   sandbox/ggl/boost/ggl/geometry/projections/epsg.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/epsg_traits.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/factory.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/
   sandbox/ggl/boost/ggl/geometry/projections/impl/aasincos.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/adjlon.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/base_dynamic.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/base_static.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/factory_entry.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/function_overloads.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_auth.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_datum_set.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_datums.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_ell_set.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_ellps.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_fwd.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_gauss.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_init.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_inv.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_mlfn.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_msfn.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_param.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_phi2.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_qsfn.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_tsfn.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_units.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/pj_zpoly1.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/proj_mdist.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/proj_util.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/impl/projects.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/parameters.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/
   sandbox/ggl/boost/ggl/geometry/projections/proj/aea.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/aeqd.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/airy.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/aitoff.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/august.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/bacon.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/bipc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/boggs.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/bonne.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/cass.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/cc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/cea.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/chamb.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/collg.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/crast.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/denoy.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/eck1.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/eck2.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/eck3.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/eck4.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/eck5.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/eqc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/eqdc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/fahey.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/fouc_s.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/gall.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/geocent.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/geos.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/gins8.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/gn_sinu.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/gnom.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/goode.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/gstmerc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/hammer.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/hatano.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/imw_p.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/krovak.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/labrd.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/laea.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/lagrng.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/larr.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/lask.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/latlong.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/lcc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/lcca.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/loxim.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/lsat.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/mbt_fps.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/mbtfpp.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/mbtfpq.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/merc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/mill.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/mod_ster.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/moll.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/nell.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/nell_h.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/nocol.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/nsper.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/nzmg.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/ob_tran.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/ocea.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/oea.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/omerc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/ortho.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/poly.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/putp2.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/putp3.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/putp4p.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/putp5.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/putp6.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/robin.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/rouss.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/rpoly.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/sconics.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/somerc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/stere.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/sterea.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/sts.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/tcc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/tcea.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/tmerc.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/tpeqd.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/urm5.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/urmfps.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/vandg.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/vandg2.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/vandg4.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/wag2.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/wag3.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/wag7.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/wink1.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/proj/wink2.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/project_transformer.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/projections/projection.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/
   sandbox/ggl/boost/ggl/geometry/strategies/agnostic/
   sandbox/ggl/boost/ggl/geometry/strategies/agnostic/agn_convex_hull.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/agnostic/agn_simplify.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/agnostic/agn_within.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/cart_area.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/cart_centroid.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/cart_compare.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/cart_distance.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/cart_envelope.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/cart_side.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/cartesian/cart_within.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/distance_result.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/geographic/
   sandbox/ggl/boost/ggl/geometry/strategies/geographic/geo_distance.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/geographic/geo_parse.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/spherical/
   sandbox/ggl/boost/ggl/geometry/strategies/spherical/sph_area.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/spherical/sph_distance.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/spherical/sph_envelope.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/strategies.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/strategy_traits.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/strategy_transform.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/transform/
   sandbox/ggl/boost/ggl/geometry/strategies/transform/inverse_transformer.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/transform/map_transformer.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/strategies/transform/matrix_transformers.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/util/
   sandbox/ggl/boost/ggl/geometry/util/assign_box_corner.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/util/copy.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/util/for_each_coordinate.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/util/graticule.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/util/loop.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/util/math.hpp (contents, props changed)
   sandbox/ggl/boost/ggl/geometry/util/promotion_traits.hpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/01_point_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/01_point_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/02_point_ll_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/02_point_ll_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/03_linestring_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/03_linestring_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/04_polygon_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/04_polygon_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/05_distance_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/05_distance_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/06_transformation_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/06_transformation_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/c01_custom_point_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/c01_custom_point_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/c02_custom_box_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/c02_custom_box_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/c03_custom_linestring_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/c03_custom_linestring_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/c04_a_custom_triangle_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/c04_a_custom_triangle_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/c04_b_custom_triangle_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/c04_b_custom_triangle_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/contrib/
   sandbox/ggl/libs/ggl/example/contrib/readme.txt (contents, props changed)
   sandbox/ggl/libs/ggl/example/doxygen_2.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/doxygen_2.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/doxygen_examples.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/doxygen_examples.sln (contents, props changed)
   sandbox/ggl/libs/ggl/example/doxygen_examples.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/geometry_examples.sln (contents, props changed)
   sandbox/ggl/libs/ggl/example/p01_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/p01_projection_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/p02_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/p02_projfactory_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/p03_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/p03_projmap_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/shapelib_common.hpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/x01_shapelib_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/x01_shapelib_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/example/x02_gd_example.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/example/x02_gd_example.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/access.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/access.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/append.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/append.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/area.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/area.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/arithmetic.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/arithmetic.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/assign.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/assign.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/box.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/box.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/circle.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/circle.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/combine.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/combine.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/common.hpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/compile_test.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/compile_test.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/convert.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/convert.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/convex_hull.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/convex_hull.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/copy.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/copy.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/core.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/core.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/custom_linestring.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/custom_linestring.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/custom_tests.sln (contents, props changed)
   sandbox/ggl/libs/ggl/test/distance.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/distance.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/dot_product.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/dot_product.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/envelope.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/envelope.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/for_each_coordinate.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/for_each_coordinate.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/geometry_tests.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/geometry_tests.sln (contents, props changed)
   sandbox/ggl/libs/ggl/test/geometry_tests.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/intersection_test.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/loop.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/loop.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/make.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/make.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/parse.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/parse.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/parse_dms.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/parse_dms.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/
   sandbox/ggl/libs/ggl/test/point_concept_tests/array_point.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/function_asserting_a_point.hpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/function_requiring_a_point.hpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/point_with_incorrect_coord_count.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/point_without_coord_count.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/point_without_coord_type.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/point_without_getter.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/point_without_setter.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/well_formed_point.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_concept_tests/well_formed_point_traits.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_ll.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/point_ll.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/projection.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/projection.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/projection_epsg.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/projection_epsg.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/projections.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/projections.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/pythagoras.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/pythagoras.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/segment.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/segment.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/selected.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/selected.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/simplify.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/simplify.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/transform.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/transform.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/transformer.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/transformer.vcproj (contents, props changed)
   sandbox/ggl/libs/ggl/test/within_test.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/wkt.cpp (contents, props changed)
   sandbox/ggl/libs/ggl/test/wkt.vcproj (contents, props changed)
Removed:
   sandbox/ggl/boost/ggl/algorithms/
   sandbox/ggl/boost/ggl/arithmetic/
   sandbox/ggl/boost/ggl/core/
   sandbox/ggl/boost/ggl/geometries/
   sandbox/ggl/boost/ggl/io/
   sandbox/ggl/boost/ggl/strategies/
   sandbox/ggl/boost/ggl/util/

Added: sandbox/ggl/boost/ggl/geometry/algorithms/append.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/append.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,200 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_APPEND_HPP
+#define _GEOMETRY_APPEND_HPP
+
+#include <boost/type_traits/remove_const.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/point_type.hpp>
+#include <geometry/core/tags.hpp>
+
+
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class, optional, might be implemented to append a point
+ \details If a geometry type should not use the std "push_back" then it can specialize
+ the "use_std" traits class to false, it should then implement (a.o.) append_point
+ \ingroup traits
+ \par Geometries:
+ - linestring
+ - linear_ring
+ \par Specializations should provide:
+ - run
+ */
+ template <typename G, typename P>
+ struct append_point
+ {
+ };
+ }
+
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace append
+ {
+ template <typename G, typename P, bool STD>
+ struct append_point {};
+
+ template <typename G, typename P>
+ struct append_point<G, P, true>
+ {
+ static inline void run(G& geometry, const P& point, int , int )
+ {
+ typename point_type<G>::type point_to_add;
+ copy_coordinates(point, point_to_add);
+ geometry.push_back(point_to_add);
+ }
+ };
+
+ template <typename G, typename P>
+ struct append_point<G, P, false>
+ {
+ static inline void run(G& geometry, const P& point, int ring_index, int multi_index)
+ {
+ traits::append_point<G, P>::run(geometry, point, ring_index, multi_index);
+ }
+ };
+
+
+ template <typename G, typename R, bool STD>
+ struct append_range
+ {
+ typedef typename boost::range_value<R>::type P;
+
+ static inline void run(G& geometry, const R& range, int ring_index, int multi_index)
+ {
+ for (typename boost::range_const_iterator<R>::type it = boost::begin(range);
+ it != boost::end(range); it++)
+ {
+ append_point<G, P, STD>::run(geometry, *it, ring_index, multi_index);
+ }
+ }
+ };
+
+
+ template <typename P, typename PNT, bool STD>
+ struct point_to_poly
+ {
+ typedef typename ring_type<P>::type R;
+
+ static inline void run(P& polygon, const PNT& point, int ring_index, int multi_index)
+ {
+ if (ring_index == -1)
+ {
+ append_point<R, PNT, STD>::run(exterior_ring(polygon), point, -1, -1);
+ }
+ else if (ring_index < boost::size(interior_rings(polygon)))
+ {
+ append_point<R, PNT, STD>::run(interior_rings(polygon)[ring_index], point, -1, -1);
+ }
+ }
+ };
+
+ template <typename P, typename R, bool STD>
+ struct range_to_poly
+ {
+ typedef typename ring_type<P>::type RING;
+
+ static inline void run(P& polygon, const R& range, int ring_index, int multi_index)
+ {
+ if (ring_index == -1)
+ {
+ append_range<RING, R, STD>::run(exterior_ring(polygon), range, -1, -1);
+ }
+ else if (ring_index < boost::size(interior_rings(polygon)))
+ {
+ append_range<RING, R, STD>::run(interior_rings(polygon)[ring_index], range, -1, -1);
+ }
+ }
+ };
+
+
+ } // namespace append
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ // (ROP = range or point, STD = use std library)
+
+ // Default case (where ROP will be range/array/etc)
+ template <typename TAG_G, typename TAG_ROP, typename G, typename ROP, bool STD>
+ struct append
+ : impl::append::append_range<G, ROP, STD> {};
+
+ // Append a point to any geometry
+ template <typename TAG, typename G, typename P, bool STD>
+ struct append<TAG, point_tag, G, P, STD>
+ : impl::append::append_point<G, P, STD> {};
+
+ // Never possible to append anything to a point/box/n-sphere
+ template <typename TAG_ROP, typename P, typename ROP, bool STD>
+ struct append<point_tag, TAG_ROP, P, ROP, STD> {};
+
+ template <typename TAG_ROP, typename B, typename ROP, bool STD>
+ struct append<box_tag, TAG_ROP, B, ROP, STD> {};
+
+ template <typename TAG_ROP, typename N, typename ROP, bool STD>
+ struct append<nsphere_tag, TAG_ROP, N, ROP, STD> {};
+
+ template <typename P, typename TAG_R, typename R, bool STD>
+ struct append<polygon_tag, TAG_R, P, R, STD>
+ : impl::append::range_to_poly<P, R, STD> {};
+
+ template <typename P, typename PNT, bool STD>
+ struct append<polygon_tag, point_tag, P, PNT, STD>
+ : impl::append::point_to_poly<P, PNT, STD> {};
+
+ // Multi-linestring and multi-polygon might either implement traits or use standard...
+
+ } // namespace dispatch
+ #endif
+
+
+
+
+ /*!
+ \brief Appends one or more points to a linestring, linear-ring, polygon, multi
+ \ingroup access
+ \param geometry a geometry
+ \param range_or_point the point or range to add
+ \param ring_index the index of the ring in case of a polygon: exterior ring (-1, the default) or
+ interior ring index
+ \param multi_index reserved for multi polygons
+ */
+ template <typename G, typename ROP>
+ inline void append(G& geometry, const ROP& range_or_point,
+ int ring_index = -1, int multi_index = 0)
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ dispatch::append
+ <typename tag<G>::type, typename tag<ROP>::type,
+ NCG, ROP, traits::use_std<NCG>::value>
+ ::run(geometry, range_or_point, ring_index, multi_index);
+ }
+
+}
+
+
+#endif // _GEOMETRY_APPEND_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/area.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/area.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,229 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_AREA_HPP
+#define _GEOMETRY_AREA_HPP
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/ring_type.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/nsphere_concept.hpp>
+
+
+#include <geometry/strategies/strategies.hpp>
+
+#include <geometry/util/loop.hpp>
+#include <geometry/util/math.hpp>
+
+/*!
+\defgroup area area calculation
+
+\par Performance
+2776 * 1000 area calculations are done in 0.11 seconds (other libraries: 0.125 seconds, 0.125 seconds, 0.5 seconds)
+
+\par Coordinate systems and strategies
+Area calculation can be done in Cartesian and in spherical/geographic coordinate systems.
+
+\par Geometries
+The area algorithm calculates the surface area of all geometries having a surface:
+box, circle, polygon, multi_polygon. The units are the square of the units used for the points
+defining the surface. If the polygon is defined in meters, the area is in square meters.
+
+\par Example:
+Example showing area calculation of polygons built of xy-points and of latlong-points
+\dontinclude doxygen_examples.cpp
+\skip example_area_polygon()
+\line {
+\until }
+
+*/
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace area
+ {
+ template<typename B>
+ inline typename coordinate_type<B>::type area_box(const B& b)
+ {
+ // Currently only works for Cartesian boxes
+ // Todo: make strategy
+ // Todo: use concept
+ assert_dimension<B, 2>();
+ typedef typename coordinate_type<B>::type T;
+ T dx = get<max_corner, 0>(b) - get<min_corner, 0>(b);
+ T dy = get<max_corner, 1>(b) - get<min_corner, 1>(b);
+ return dx * dy;
+ }
+
+ template<typename C>
+ inline double area_circle(const C& c)
+ {
+ // Currently only works for Cartesian circles
+ // Todo: make strategy
+ // Todo: use concept
+ assert_dimension<C, 2>();
+ typename radius_type<C>::type r = get_radius<0>(c);
+ return geometry::math::pi * r * r;
+ }
+
+ // Area of a linear linear_ring, assuming a closed linear_ring
+ template<typename R, typename S>
+ inline double area_ring(const R& r, const S& strategy)
+ {
+ assert_dimension<R, 2>();
+
+ // A closed linear_ring has at least four points, if not there is no area
+ if (boost::size(r) >= 4)
+ {
+ typename S::state_type state;
+ if (loop(r, strategy, state))
+ {
+ return state.area();
+ }
+ }
+
+ return 0;
+ }
+
+ // Area of a polygon, assuing a closed clockwise polygon (with holes counter clockwise)
+ template<typename Y, typename S>
+ inline double area_polygon(const Y& poly, const S& strategy)
+ {
+ assert_dimension<Y, 2>();
+
+ typedef typename boost::range_const_iterator<typename interior_type<Y>::type>::type IT;
+
+ double a = fabs(area_ring(exterior_ring(poly), strategy));
+
+ for (IT i = boost::begin(interior_rings(poly)); i != boost::end(interior_rings(poly)); i++)
+ {
+ a -= fabs(area_ring(*i, strategy));
+ }
+ return a;
+ }
+
+
+ } // namespace area
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G>
+ struct area {};
+
+
+ template <typename G>
+ struct area<box_tag, G>
+ {
+ inline static double calculate(const G& b)
+ {
+ return impl::area::area_box(b);
+ }
+ };
+
+
+ template <typename G>
+ struct area<nsphere_tag, G>
+ {
+ inline static double calculate(const G& c)
+ {
+ return impl::area::area_circle(c);
+ }
+ };
+
+ template <typename G>
+ struct area<ring_tag, G>
+ {
+
+ inline static double calculate(const G& ring)
+ {
+ typedef typename boost::range_value<G>::type P;
+
+ return impl::area::area_ring(ring,
+ typename strategy_area<typename cs_tag<P>::type, P>::type());
+ }
+
+ template <typename S>
+ inline static double calculate(const G& ring, const S& strategy)
+ {
+ return impl::area::area_ring(ring, strategy);
+ }
+ };
+
+ // Specialization for polygons:
+ template <typename G>
+ struct area<polygon_tag, G>
+ {
+ inline static double calculate(const G& poly)
+ {
+ typedef typename point_type<G>::type P;
+
+ return impl::area::area_polygon(poly, typename strategy_area<
+ typename cs_tag<P>::type, P>::type());
+ }
+ template <typename S>
+ inline static double calculate(const G& poly, const S& strategy)
+ {
+ return impl::area::area_polygon(poly, strategy);
+ }
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Calculate area of a geometry
+ \ingroup area
+ \details The function area returns the area of a polygon, ring, box or circle,
+ using the default area-calculation strategy. Strategies are
+ provided for cartesian ans spherical points
+ The geometries should correct, polygons should be closed and orientated clockwise, holes,
+ if any, must be orientated counter clockwise
+ \param geometry a geometry
+ \return the area
+ */
+ template <typename G>
+ inline double area(const G& geometry)
+ {
+ return dispatch::area<typename tag<G>::type, G>::calculate(geometry);
+ }
+
+ /*!
+ \brief Calculate area of a geometry using a strategy
+ \ingroup area
+ \details This version of area calculation takes a strategy
+ \param geometry a geometry
+ \param strategy the strategy to calculate area. Especially for spherical areas there are
+ some approaches.
+ \return the area
+ */
+ template <typename G, typename S>
+ inline double area(const G& geometry, const S& strategy)
+ {
+ return dispatch::area<typename tag<G>::type, G>::calculate(geometry, strategy);
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_AREA_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/assign.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/assign.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,366 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_ASSIGN_HPP
+#define _GEOMETRY_ASSIGN_HPP
+
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/numeric/conversion/bounds.hpp>
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <geometry/core/tags.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/radius.hpp>
+#include <geometry/core/exterior_ring.hpp>
+
+#include <geometry/algorithms/clear.hpp>
+#include <geometry/algorithms/append.hpp>
+
+
+#include <geometry/util/copy.hpp>
+#include <geometry/util/for_each_coordinate.hpp>
+
+
+/*!
+\defgroup access access: get/set coordinate values, make objects, clear geometries, append point(s)
+\details There are many ways to edit geometries. It is possible to:
+- use the geometries themselves, so access point.x(). This is not done inside the library because it is agnostic
+ to geometry type. However, library users can use this as it is intuitive.
+- use the standard library, so use .push_back(point) or use inserters. This is also avoided inside the library.
+However, library users can use it if they are used to the standard library
+- use the functionality provided in this geometry library. These are the functions in this module.
+
+The library provides the following functions to edit geometries:
+- set to set one coordinate value
+- assign to set two or more coordinate values
+- make to construct and return geometries with specified coordinates.
+- append to append one or more points to a geometry
+- clear to remove all points from a geometry
+
+For getting coordinates it is similar:
+- get to get a coordinate value
+- or use the standard library
+- or use the geometries themselves
+
+*/
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace assign
+ {
+
+ template <typename C>
+ struct assign_operation
+ {
+ inline assign_operation(C value) : m_value(value) {}
+
+ template <typename P, size_t I>
+ inline void run(P& point) const
+ {
+ set<I>(point, m_value);
+ }
+
+ private :
+ C m_value;
+ };
+
+
+ /*!
+ \brief Assigns all coordinates of a specific point to a value
+ \ingroup access
+ \details
+ \param p Point
+ \param value Value which is assigned to all coordinates of point p
+ */
+ template <typename P>
+ inline void assign_value(P& p, const typename coordinate_type<P>::type& value)
+ {
+ for_each_coordinate(p, assign_operation<typename coordinate_type<P>::type>(value));
+ }
+
+
+ template <typename P, typename T, size_t I, size_t D>
+ struct assign_point
+ {
+ typedef typename coordinate_type<P>::type TP;
+
+ static inline void assign(const T values[D], P& point)
+ {
+ set<I>(point, boost::numeric_cast<TP>(values[I]));
+ assign_point<P, T, I + 1, D>::assign(values, point);
+ }
+ };
+
+ template <typename P, typename T, size_t D>
+ struct assign_point<P, T, D, D>
+ {
+ static inline void assign(const T values[D], P& point) {}
+ };
+
+
+
+ template <typename B, size_t C, size_t I, size_t D>
+ struct initialize
+ {
+ typedef typename coordinate_type<B>::type T;
+
+ static inline void init(B& box, const T& value)
+ {
+ set<C, I>(box, value);
+ initialize<B, C, I + 1, D>::init(box, value);
+ }
+ };
+
+ template <typename B, size_t C, size_t D>
+ struct initialize<B, C, D, D>
+ {
+ typedef typename coordinate_type<B>::type T;
+ static inline void init(B& box, const T& value) {}
+ };
+
+
+
+ } // namespace assign
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G>
+ struct assignment {};
+
+
+ template <typename P>
+ struct assignment<point_tag, P>
+ {
+ template <typename T>
+ static inline void assign(P& point, const T& coor1, const T& coor2)
+ {
+ assert_dimension<P, 2>();
+
+ typedef typename coordinate_type<P>::type TP;
+ set<0>(point, boost::numeric_cast<TP>(coor1));
+ set<1>(point, boost::numeric_cast<TP>(coor2));
+ }
+
+ template <typename T>
+ static inline void assign(P& point, const T& coor1, const T& coor2, const T& coor3)
+ {
+ assert_dimension<P, 3>();
+
+ typedef typename coordinate_type<P>::type TP;
+ set<0>(point, boost::numeric_cast<TP>(coor1));
+ set<1>(point, boost::numeric_cast<TP>(coor2));
+ set<2>(point, boost::numeric_cast<TP>(coor3));
+ }
+
+ static inline void assign_zero(P& point)
+ {
+ typedef typename coordinate_type<P>::type T;
+ impl::assign::assign_value(point, 0);
+ }
+
+ };
+
+ template <typename B>
+ struct assignment<box_tag, B>
+ {
+ typedef typename point_type<B>::type P;
+
+ // Here we assign 4 coordinates to a box.
+ // -> Most logical is: x1,y1,x2,y2
+ // In case the user reverses x1/x2 or y1/y2, we could reverse them (THAT IS NOT IMPLEMENTED)
+
+ // Note also comment in util/assign_box_corner ->
+ // ("Most logical is LOWER, UPPER and sub-order LEFT, RIGHT")
+ // (That is assigning 4 points from a box. So lower-left, lower-right, upper-left, upper-right)
+ template <typename T>
+ static inline void assign(B& box, const T& x1, const T& y1, const T& x2, const T& y2)
+ {
+ assert_dimension<B, 2>();
+
+ typedef typename coordinate_type<P>::type TB;
+ set<min_corner, 0>(box, boost::numeric_cast<TB>(x1));
+ set<min_corner, 1>(box, boost::numeric_cast<TB>(y1));
+ set<max_corner, 0>(box, boost::numeric_cast<TB>(x2));
+ set<max_corner, 1>(box, boost::numeric_cast<TB>(y2));
+ }
+
+
+ static inline void assign_inverse(B& box)
+ {
+ typedef typename coordinate_type<P>::type T;
+ static const size_t N = dimension<P>::value;
+ impl::assign::initialize<B, min_corner, 0, N>::init(box, boost::numeric::bounds<T>::highest());
+ impl::assign::initialize<B, max_corner, 0, N>::init(box, boost::numeric::bounds<T>::lowest());
+ }
+
+ static inline void assign_zero(B& box)
+ {
+ typedef typename coordinate_type<P>::type T;
+ static const size_t N = dimension<P>::value;
+ impl::assign::initialize<B, min_corner, 0, N>::init(box, T());
+ impl::assign::initialize<B, max_corner, 0, N>::init(box, T());
+ }
+
+ };
+
+
+ template <typename S>
+ struct assignment<nsphere_tag, S>
+ {
+ typedef typename point_type<S>::type P;
+
+ /// 2-value version for an n-sphere is valid for circle and sets the center
+ template <typename T>
+ static inline void assign(S& sphercle, const T& coor1, const T& coor2)
+ {
+ assert_dimension<S, 2>();
+
+ typedef typename coordinate_type<S>::type TS;
+
+ set<0>(sphercle, boost::numeric_cast<TS>(coor1));
+ set<1>(sphercle, boost::numeric_cast<TS>(coor2));
+ }
+
+
+ /// 3-value version for an n-sphere is sets the center of a sphere OR the center + radius of a circle
+ template <typename T>
+ static inline void assign(S& sphercle, const T& coor1, const T& coor2, const T& coor3_or_radius)
+ {
+ typedef typename coordinate_type<S>::type TS;
+ typedef typename coordinate_type<S>::type TR;
+ typedef typename radius_type<S>::type R;
+
+ set<0>(sphercle, boost::numeric_cast<TS>(coor1));
+ set<1>(sphercle, boost::numeric_cast<TS>(coor2));
+ switch(dimension<S>::value)
+ {
+ case 2 :
+ set_radius<0>(sphercle, boost::numeric_cast<R>(coor3_or_radius));
+ break;
+ case 3 :
+ set<2>(sphercle, boost::numeric_cast<TS>(coor3_or_radius));
+ break;
+ }
+ }
+
+ /// 4-value version for an n-sphere is valid for a sphere and sets the center and the radius
+ template <typename T>
+ static inline void assign(S& sphercle, const T& coor1, const T& coor2, const T& coor3, const T& radius)
+ {
+ assert_dimension<S, 3>();
+
+ typedef typename coordinate_type<S>::type TS;
+ typedef typename coordinate_type<S>::type TR;
+ typedef typename radius_type<S>::type R;
+
+ set<0>(sphercle, boost::numeric_cast<TS>(coor1));
+ set<1>(sphercle, boost::numeric_cast<TS>(coor2));
+ set<2>(sphercle, boost::numeric_cast<TS>(coor3));
+ set_radius<0>(sphercle, boost::numeric_cast<R>(radius));
+ }
+
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+
+
+
+
+
+ /*!
+ \brief assign two values to a 2D point
+ \ingroup access
+ */
+ template <typename G, typename T>
+ inline void assign(G& geometry, const T& coor1, const T& coor2)
+ {
+ dispatch::assignment<typename tag<G>::type, G>::assign(geometry, coor1, coor2);
+ }
+
+
+ /*!
+ \brief assign three values to a 3D point or the center + radius to a circle
+ \ingroup access
+ */
+ template <typename G, typename T>
+ inline void assign(G& geometry, const T& coor1, const T& coor2, const T& coor3)
+ {
+ dispatch::assignment<typename tag<G>::type, G>::assign(geometry, coor1, coor2, coor3);
+ }
+
+ /*!
+ \brief assign center + radius to a sphere
+ \ingroup access
+ */
+ template <typename G, typename T>
+ inline void assign(G& geometry, const T& coor1, const T& coor2, const T& coor3, const T& coor4)
+ {
+ dispatch::assignment<typename tag<G>::type, G>::assign(geometry, coor1, coor2, coor3, coor4);
+ }
+
+ /*!
+ \brief assign a range of points to a linestring, ring or polygon
+ \note The point-type of the range might be different from the point-type of the geometry
+ \ingroup access
+ */
+ template <typename G, typename R>
+ inline void assign(G& geometry, const R& range)
+ {
+ clear(geometry);
+ append(geometry, range, -1, 0);
+ }
+
+
+ /*!
+ \brief assign to a box inverse infinite
+ \details The assign_inverse function initialize a 2D or 3D box with large coordinates, the
+ min corner is very large, the max corner is very small. This is a convenient starting point to
+ collect the minimum bounding box of a geometry.
+ \ingroup access
+ */
+ template <typename G>
+ inline void assign_inverse(G& geometry)
+ {
+ dispatch::assignment<typename tag<G>::type, G>::assign_inverse(geometry);
+ }
+
+
+ /*!
+ \brief assign zero values to a box, point
+ \ingroup access
+ \details The assign_zero function initializes a 2D or 3D point or box with coordinates of zero
+ \tparam G the geometry type
+ */
+ template <typename G>
+ inline void assign_zero(G& geometry)
+ {
+ dispatch::assignment<typename tag<G>::type, G>::assign_zero(geometry);
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_ASSIGN_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/buffer.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/buffer.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,154 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_BUFFER_HPP
+#define _GEOMETRY_BUFFER_HPP
+
+// Buffer functions
+// Was before: "grow" but then only for box
+// Now "buffer", but still only implemented for a box...
+
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/box_concept.hpp>
+
+#include <geometry/arithmetic/arithmetic.hpp>
+
+#include <geometry/util/assign_box_corner.hpp>
+#include <geometry/util/promotion_traits.hpp>
+
+
+/*!
+\defgroup buffer buffer calculation
+\par Source description:
+- OGC: Returns a geometric object that represents all Points whose distance
+ from this geometric object is less than or equal to distance. Calculations are in the spatial reference system of
+ this geometric object. Because of the limitations of linear interpolation, there will often be some relatively
+ small error in this distance, but it should be near the resolution of the coordinates used
+\see http://en.wikipedia.org/wiki/Buffer_(GIS)
+*/
+namespace geometry
+{
+
+
+
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace buffer
+ {
+
+ template <typename BOX_IN, typename BOX_OUT, typename T, size_t C, size_t D, size_t N>
+ struct box_loop
+ {
+ typedef typename coordinate_type<BOX_OUT>::type BT;
+
+ static inline void buffer(const BOX_IN& box_in, const T& distance, BOX_OUT& box_out)
+ {
+ set<C, D>(box_out, boost::numeric_cast<BT>(get<C, D>(box_in) + distance));
+ box_loop<BOX_IN, BOX_OUT, T, C, D + 1, N>::buffer(box_in, distance, box_out);
+ }
+ };
+
+ template <typename BOX_IN, typename BOX_OUT, typename T, size_t C, size_t N>
+ struct box_loop<BOX_IN, BOX_OUT, T, C, N, N>
+ {
+ static inline void buffer(const BOX_IN&, const T&, BOX_OUT&) {}
+ };
+
+
+ // Extends a box with the same amount in all directions
+ template<typename BOX_IN, typename BOX_OUT, typename T>
+ inline void buffer_box(const BOX_IN& box_in, const T& distance, BOX_OUT& box_out)
+ {
+ assert_dimension_equal<BOX_IN, BOX_OUT>();
+
+ static const size_t N = dimension<BOX_IN>::value;
+
+ box_loop<BOX_IN, BOX_OUT, T, min_corner, 0, N>::buffer(box_in, -distance, box_out);
+ box_loop<BOX_IN, BOX_OUT, T, max_corner, 0, N>::buffer(box_in, +distance, box_out);
+ }
+
+
+
+ } // namespace buffer
+ } // namespace impl
+ #endif
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG_IN, typename TAG_OUT, typename G_IN, typename T, typename G_OUT>
+ struct buffer {};
+
+
+ template <typename BOX_IN, typename T, typename BOX_OUT>
+ struct buffer<box_tag, box_tag, BOX_IN, T, BOX_OUT>
+ {
+ static inline void calculate(const BOX_IN& box_in, const T& distance, const T& chord_length, BOX_IN& box_out)
+ {
+ impl::buffer::buffer_box(box_in, distance, box_out);
+ }
+ };
+
+ // Many things to do. Point is easy, other geometries require self intersections
+ // For point, note that it should output as a polygon (like the rest). Buffers
+ // of a set of geometries are often lateron combined using a "dissolve" operation.
+ // Two points close to each other get a combined kidney shaped buffer then.
+
+
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Calculate buffer (= new geometry) around specified distance of geometry
+ \ingroup buffer
+ \param geometry_in input geometry
+ \param distance the distance used in buffer
+ \param chord_length length of the chord's in the generated arcs around points or bends
+ \param geometry_out buffered geometry
+ \note Currently only implemented for box, the trivial case, but still useful
+ \par Use case:
+ BOX + distance -> BOX: it is allowed that "geometry_out" the same object as "geometry_in"
+ */
+ template <typename G_IN, typename G_OUT, typename T>
+ inline void buffer(const G_IN& geometry_in, G_OUT& geometry_out, const T& distance, const T& chord_length = -1)
+ {
+ dispatch::buffer<typename tag<G_IN>::type,
+ typename tag<G_OUT>::type,
+ G_IN, T, G_OUT>::calculate(geometry_in, distance, chord_length, geometry_out);
+ }
+
+
+ /*!
+ \brief Calculate and return buffer (= new geometry) around specified distance of geometry
+ \ingroup buffer
+ \param geometry input geometry
+ \param distance the distance used in buffer
+ \param chord_length length of the chord's in the generated arcs around points or bends
+ \return the buffered geometry
+ \note See also: buffer
+ */
+ template <typename G_OUT, typename G_IN, typename T>
+ G_OUT make_buffer(const G_IN& geometry, const T& distance, const T& chord_length = -1)
+ {
+ G_OUT out;
+ dispatch::buffer<typename tag<G_IN>::type,
+ typename tag<G_OUT>::type,
+ G_IN, T, G_OUT>::calculate(geometry, distance, chord_length, out);
+ return out;
+ }
+
+};
+
+#endif // _GEOMETRY_BUFFER_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/centroid.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/centroid.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,271 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_CENTROID_HPP
+#define _GEOMETRY_CENTROID_HPP
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/cs.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/util/copy.hpp>
+#include <geometry/util/loop.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+/*!
+\defgroup centroid centroid calculation
+\par Source descriptions:
+- OGC description: The mathematical centroid for this Surface as a Point. The result is not guaranteed to be on this Surface.
+- From Wikipedia: Informally, it is the "average" of all points
+\see http://en.wikipedia.org/wiki/Centroid
+\note The "centroid" functions are taking a non const reference to the centroid. The "make_centroid" functions
+ return the centroid, the type has to be specified.
+
+\note There are versions where the centroid calculation strategy can be specified
+\par Geometries:
+- RING: \image html centroid_ring.png
+- BOX: the centroid of a 2D or 3D box is the center of the box
+- CIRCLE: the centroid of a circle or a sphere is its center
+- POLYGON \image html centroid_polygon.png
+- POINT, LINESTRING, SEGMENT: trying to calculate the centroid will result in a compilation error
+*/
+
+namespace geometry
+{
+ // Move elsewhere?
+ class centroid_exception : public std::exception
+ {
+ public:
+ centroid_exception() {}
+ virtual const char *what() const throw()
+ {
+ return "centroid calculation exception";
+ }
+ };
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+
+
+ namespace centroid
+ {
+
+ /*!
+ \brief Generic function which checks if enough points are present
+ */
+ template<typename P, typename R>
+ inline bool ring_ok(const R& ring, P& c)
+ {
+ size_t n = boost::size(ring);
+ if (n == 1)
+ {
+ // Take over the first point in a "coordinate neutral way"
+ copy_coordinates(ring.front(), c);
+ return false;
+ }
+ else if (n <= 0)
+ {
+ throw centroid_exception();
+ }
+ return true;
+ }
+
+
+ /*!
+ \brief Calculate the centroid of a ring.
+ */
+ template<typename P, typename R, typename S>
+ inline void centroid_ring(const R& ring, P& c, const S& strategy)
+ {
+ if (ring_ok(ring, c))
+ {
+ typename S::state_type state;
+ loop(ring, strategy, state);
+ state.centroid(c);
+ }
+ }
+
+ /*!
+ \brief Centroid of a polygon.
+ \note Because outer ring is clockwise, inners are counter clockwise,
+ triangle approach is OK and works for polygons with rings.
+ */
+ template<typename P, typename Y, typename S>
+ inline void centroid_polygon(const Y& poly, P& c, const S& strategy)
+ {
+ if (ring_ok(exterior_ring(poly), c))
+ {
+ typename S::state_type state;
+ loop(exterior_ring(poly), strategy, state);
+ typedef typename boost::range_const_iterator<typename interior_type<Y>::type>::type IT;
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ loop(*it, strategy, state);
+ }
+ state.centroid(c);
+ }
+ }
+
+
+ /*!
+ \brief Calculate centroid (==center) of a box
+ \todo Implement strategy
+ */
+ template<typename P, typename B>
+ inline void centroid_box(const B& box, P& c)
+ {
+ // TODO: adapt using strategies
+ assert_dimension<B, 2>();
+ set<0>(c, (get<min_corner, 0>(box) + get<max_corner, 0>(box)) / 2);
+ set<1>(c, (get<min_corner, 1>(box) + get<max_corner, 1>(box)) / 2);
+ }
+
+
+ } // namespace centroid
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G, typename P>
+ struct centroid {};
+
+
+ template <typename B, typename P>
+ struct centroid<box_tag, B, P>
+ {
+ inline static void calculate(const B& b, P& c)
+ {
+ impl::centroid::centroid_box<P>(b, c);
+ }
+ };
+
+
+
+ template <typename R, typename P>
+ struct centroid<ring_tag, R, P>
+ {
+
+ inline static void calculate(const R& ring, P& c)
+ {
+ impl::centroid::centroid_ring(ring, c,
+ typename strategy_centroid<typename cs_tag<P>::type,
+ P, typename boost::range_value<R>::type>::type());
+ }
+ };
+
+ template <typename Y, typename P>
+ struct centroid<polygon_tag, Y, P>
+ {
+ inline static void calculate(const Y& poly, P& c)
+ {
+ impl::centroid::centroid_polygon(poly, c,
+ typename strategy_centroid<typename cs_tag<P>::type,
+ P, typename point_type<Y>::type>::type());
+ }
+
+
+ template<typename S>
+ inline static void calculate(const Y& poly, P& c, const S& strategy)
+ {
+ impl::centroid::centroid_polygon(poly, c, strategy);
+ }
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+
+ /*!
+ \brief Calculate centroid
+ \ingroup centroid
+ \details The function centroid calculates the centroid of a geometry using the default strategy.
+ A polygon should be closed and orientated clockwise, holes, if any, must be orientated
+ counter clockwise
+ \param geometry a geometry (e.g. closed ring or polygon)
+ \param c reference to point which will contain the centroid
+ \exception centroid_exception if calculation is not successful, e.g. because polygon didn't contain points
+ \par Example:
+ Example showing centroid calculation
+ \dontinclude doxygen_examples.cpp
+ \skip example_centroid_polygon
+ \line {
+ \until }
+ */
+ template<typename G, typename P>
+ inline void centroid(const G& geometry, P& c)
+ {
+ dispatch::centroid<typename tag<G>::type, G, P>::calculate(geometry, c);
+ }
+
+ /*!
+ \brief Calculate centroid using a specified strategy
+ \ingroup centroid
+ \param geometry the geometry to calculate centroid from
+ \param c reference to point which will contain the centroid
+ \param strategy Calculation strategy for centroid
+ \exception centroid_exception if calculation is not successful, e.g. because polygon didn't contain points
+ */
+ template<typename G, typename P, typename S>
+ inline void centroid(const G& geometry, P& c, const S& strategy)
+ {
+ dispatch::centroid<typename tag<G>::type, G, P>::calculate(geometry, c, strategy);
+ }
+
+
+ // Versions returning a centroid
+
+ /*!
+ \brief Calculate and return centroid
+ \ingroup centroid
+ \param geometry the geometry to calculate centroid from
+ \return the centroid
+ \exception centroid_exception if calculation is not successful, e.g. because polygon didn't contain points
+ */
+ template<typename P, typename G>
+ inline P make_centroid(const G& geometry)
+ {
+ P c;
+ dispatch::centroid<typename tag<G>::type, G, P>::calculate(geometry, c);
+ return c;
+ }
+
+ /*!
+ \brief Calculate and return centroid
+ \ingroup centroid
+ \param geometry the geometry to calculate centroid from
+ \param strategy Calculation strategy for centroid
+ \return the centroid
+ \exception centroid_exception if calculation is not successful, e.g. because polygon didn't contain points
+ */
+ template<typename P, typename G, typename S>
+ inline P make_centroid(const G& geometry, const S& strategy)
+ {
+ P c;
+ dispatch::centroid<typename tag<G>::type, G, P>::calculate(geometry, c, strategy);
+ return c;
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_CENTROID_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/clear.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/clear.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,133 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_CLEAR_HPP
+#define _GEOMETRY_CLEAR_HPP
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+
+
+namespace geometry
+{
+
+ // This traits is currently NOT defined in ../core/ but here, just because it default
+ // does not have to be implemented
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class, optional, might be implemented to clear a geometry
+ \details If a geometry type should not use the std ".clear()" then it can specialize
+ the "use_std" traits class to false, it should then implement (a.o.) clear
+ \ingroup traits
+ \par Geometries:
+ - linestring
+ - linear_ring
+ \par Specializations should provide:
+ - run
+ */
+ template <typename G>
+ struct clear
+ {
+ };
+ }
+
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ template <typename G>
+ struct use_std_clear
+ {
+ static inline void run(G& geometry)
+ {
+ geometry.clear();
+ }
+ };
+
+ template <typename G>
+ struct use_traits_clear
+ {
+ static inline void run(G& geometry)
+ {
+ traits::clear<G>::run(geometry);
+ }
+ };
+
+
+ template <typename P>
+ struct polygon_clear
+ {
+ static inline void run(P& polygon)
+ {
+ interior_rings(polygon).clear();
+ exterior_ring(polygon).clear();
+ }
+ };
+
+
+ } // namespace impl
+ #endif
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, bool STD, typename G>
+ struct clear {};
+
+
+ // True (default for all geometry types, unless otherwise implemented in traits)
+ // uses std::clear
+ template <typename TAG, typename G>
+ struct clear<TAG, true, G> : impl::use_std_clear<G> {};
+
+
+ // If any geometry specializes use_std<G> to false, specialize to use the traits clear.
+ template <typename TAG, typename G>
+ struct clear<TAG, false, G> : impl::use_traits_clear<G> {};
+
+
+ // Point/box/nsphere/segment do not have clear. So specialize to do nothing.
+ template <typename G> struct clear<point_tag, true, G> {};
+ template <typename G> struct clear<box_tag, true, G> {};
+ template <typename G> struct clear<segment_tag, true, G> {};
+ template <typename G> struct clear<nsphere_tag, true, G> {};
+
+
+ // Polygon can (indirectly) use std for clear
+ template <typename P>
+ struct clear<polygon_tag, true, P> : impl::polygon_clear<P> {};
+
+
+ } // namespace dispatch
+ #endif
+
+
+
+ /*!
+ \brief Clears a linestring, linear ring or polygon (exterior+interiors) or multi*
+ \details Generic function to clear a geometry
+ \ingroup access
+ \note points and boxes cannot be cleared, instead they can be set to zero by "assign_zero"
+ */
+ template <typename G>
+ inline void clear(G& geometry)
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ dispatch::clear<typename tag<G>::type, traits::use_std<NCG>::value, NCG>::run(geometry);
+ }
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/algorithms/combine.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/combine.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,170 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_COMBINE_HPP
+#define _GEOMETRY_COMBINE_HPP
+
+
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/box_concept.hpp>
+
+#include <geometry/arithmetic/arithmetic.hpp>
+
+#include <geometry/util/assign_box_corner.hpp>
+#include <geometry/util/promotion_traits.hpp>
+
+/*!
+\defgroup combine combine: add a geometry to a bounding box
+\par Geometries:
+- BOX + BOX -> BOX: the box will be combined with the other box \image html combine_box_box.png
+- BOX + POINT -> BOX: the box will combined with the point \image html combine_box_point.png
+\note Previously called "grow"
+*/
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace combine
+ {
+
+ template <typename B, typename P, size_t D, size_t N>
+ struct point_loop
+ {
+ static inline void check(B& box, const P& source)
+ {
+ typedef typename coordinate_type<P>::type T;
+ const T& coordinate = get<D>(source);
+
+ if (coordinate < get<min_corner, D>(box))
+ {
+ set<min_corner, D>(box, coordinate);
+ }
+ if (coordinate > get<max_corner, D>(box))
+ {
+ set<max_corner, D>(box, coordinate);
+ }
+
+ point_loop<B, P, D + 1, N>::check(box, source);
+ }
+ };
+
+ template <typename B, typename P, size_t N>
+ struct point_loop<B, P, N, N>
+ {
+ static inline void check(B&, const P&) {}
+ };
+
+
+ template <typename B1, typename B2, size_t C, size_t D, size_t N>
+ struct box_loop
+ {
+ typedef typename select_coordinate_type<B1, B2>::type T;
+
+ static inline void run(B1& box, const B2& source)
+ {
+ T coordinate = get<C, D>(source);
+
+ if (coordinate < get<min_corner, D>(box))
+ {
+ set<min_corner, D>(box, coordinate);
+ }
+ if (coordinate > get<max_corner, D>(box))
+ {
+ set<max_corner, D>(box, coordinate);
+ }
+
+ box_loop<B1, B2, C, D + 1, N>::run(box, source);
+ }
+ };
+
+ template <typename B1, typename B2, size_t C, size_t N>
+ struct box_loop<B1, B2, C, N, N>
+ {
+ static inline void run(B1&, const B2&) {}
+ };
+
+
+ // Changes a box b such that it also contains point p
+ template<typename B, typename P>
+ inline void combine_box_with_point(B& b, const P& p)
+ {
+ point_loop<B, P, 0, dimension<P>::value>::check(b, p);
+ }
+
+ // Changes a box such that the other box is also contained by the box
+ template<typename B1, typename B2>
+ inline void combine_box_with_box(B1& b, const B2& other)
+ {
+ typedef typename point_type<B2>::type P;
+ box_loop<B1, B2, min_corner, 0, dimension<P>::value>::run(b, other);
+ box_loop<B1, B2, max_corner, 0, dimension<P>::value>::run(b, other);
+ }
+
+
+
+ } // namespace combine
+ } // namespace impl
+ #endif
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename B, typename G>
+ struct combine
+ {
+ };
+
+
+ // Box + point -> new box containing also point
+ // Currently implemented for boxes of same type
+ template <typename B, typename P>
+ struct combine<point_tag, B, P>
+ {
+ static inline void calculate(B& box_out, const P& point)
+ {
+ impl::combine::combine_box_with_point(box_out, point);
+ }
+ };
+
+ // Box + box -> new box just containing two input boxes
+ template <typename B, typename B_IN>
+ struct combine<box_tag, B, B_IN>
+ {
+ static inline void calculate(B& box_out, const B_IN& box)
+ {
+ impl::combine::combine_box_with_box(box_out, box);
+ }
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Combines a box with another geometry (box, point)
+ \ingroup combine
+ \tparam B type of first geometry
+ \tparam G type of second geometry
+ \tparam G3 type of output geometry
+ \param box box to combine another geometry with, might be changed
+ \param geometry other geometry
+ */
+ template <typename B, typename G>
+ inline void combine(B& box, const G& geometry)
+ {
+ dispatch::combine<typename tag<G>::type, B, G>::calculate(box, geometry);
+ }
+
+};
+
+#endif // _GEOMETRY_COMBINE_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/convert.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/convert.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,158 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_CONVERT_HPP
+#define _GEOMETRY_CONVERT_HPP
+
+#include <cmath>
+#include <iterator>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/cs.hpp>
+
+#include <geometry/geometries/segment.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+#include <geometry/algorithms/append.hpp>
+#include <geometry/algorithms/foreach.hpp>
+
+
+/*!
+\defgroup convert convert geometries from one type to another
+\details Convert from one geometry type to another type, for example from BOX to POLYGON
+*/
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace convert
+ {
+
+ template <typename P, typename B, size_t C, size_t D, size_t N>
+ struct point_to_box
+ {
+ static inline void loop(const P& point, B& box)
+ {
+ typedef typename coordinate_type<B>::type T;
+ set<C, D>(box, boost::numeric_cast<T>(get<D>(point)));
+ point_to_box<P, B, C, D + 1, N>::loop(point, box);
+ }
+ };
+
+ template <typename P, typename B, size_t C, size_t N>
+ struct point_to_box<P, B, C, N, N>
+ {
+ static inline void loop(const P& point, B& box)
+ {}
+ };
+
+
+ } // namespace convert
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG1, typename TAG2, typename G1, typename G2>
+ struct convert
+ {
+ };
+
+ template <typename TAG, typename G1, typename G2>
+ struct convert<TAG, TAG, G1, G2>
+ {
+ // Same geometry type -> copy coordinates from G1 to G2
+ };
+
+ template <typename TAG, typename G>
+ struct convert<TAG, TAG, G, G>
+ {
+ // Same geometry -> can be copied
+ };
+
+
+ // Partial specializations
+ template <typename B, typename R>
+ struct convert<box_tag, ring_tag, B, R>
+ {
+ inline static void calculate(const B& box, R& ring)
+ {
+ // go from box to ring -> add coordinates in correct order
+ // only valid for 2D
+ assert_dimension<B, 2>();
+
+ ring.clear();
+ typename point_type<B>::type p;
+
+ assign(p, get<min_corner, 0>(box), get<min_corner, 1>(box));
+ geometry::append(ring, p);
+
+ assign(p, get<min_corner, 0>(box), get<max_corner, 1>(box));
+ geometry::append(ring, p);
+
+ assign(p, get<max_corner, 0>(box), get<max_corner, 1>(box));
+ geometry::append(ring, p);
+
+ assign(p, get<max_corner, 0>(box), get<min_corner, 1>(box));
+ geometry::append(ring, p);
+
+ assign(p, get<min_corner, 0>(box), get<min_corner, 1>(box));
+ geometry::append(ring, p);
+ }
+ };
+
+ template <typename P, typename B>
+ struct convert<point_tag, box_tag, P, B>
+ {
+ inline static void calculate(const P& point, B& box)
+ {
+ // go from point to box -> box with volume of zero, 2D or 3D
+ static const size_t N = dimension<P>::value;
+ impl::convert::point_to_box<P, B, min_corner, 0, N>::loop(point, box);
+ impl::convert::point_to_box<P, B, max_corner, 0, N>::loop(point, box);
+ }
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+
+
+
+
+ /*!
+ \brief Converts one geometry to another geometry
+ \details The convert algorithm converts one geometry, e.g. a BOX, to another geometry, e.g. a RING. This only
+ if it is possible and applicable.
+ \ingroup convert
+ \tparam G1 first geometry type
+ \tparam G2 second geometry type
+ \param geometry1 first geometry
+ \param geometry2 second geometry
+ */
+ template <typename G1, typename G2>
+ inline void convert(const G1& geometry1, G2& geometry2)
+ {
+ dispatch::convert<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2);
+ }
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_CONVERT_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/convex_hull.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/convex_hull.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,113 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_CONVEX_HULL_HPP
+#define _GEOMETRY_CONVEX_HULL_HPP
+
+#include <boost/concept/requires.hpp>
+
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/cs.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+
+/*!
+\defgroup convex_hull convex hull calculation
+\par Source descriptions:
+- OGC description: Returns a geometric object that represents the convex hull of this geometric
+ object. Convex hulls, being dependent on straight lines, can be accurately represented in linear interpolations
+ for any geometry restricted to linear interpolations.
+\see http://en.wikipedia.org/wiki/Convex_hull
+
+\par Performance
+2776 counties of US are "hulled" in 0.52 seconds (other libraries: 2.8 seconds, 2.4 seconds, 3.4 seconds, 1.1 seconds)
+
+\note The convex hull is always a ring, holes are not possible. Therefore it is modelled as an output iterator.
+This gives the most flexibility, the user can decide what to do with it.
+\par Geometries:
+In the images below the convex hull is painted in red.
+- POINT: will not compile
+- POLYGON: will deliver a polygon without holes \image html convexhull_polygon_polygon.png
+*/
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace convex_hull
+ {
+ template <typename R, typename O_IT>
+ struct convex_hull_range
+ {
+ static inline O_IT calculate(const R& range, O_IT out)
+ {
+ typedef typename point_type<R>::type P;
+ typedef typename strategy_convex_hull<typename cs_tag<P>::type, P>::type strategy;
+ strategy s(range);
+ s.get(out);
+ return out;
+ }
+ };
+ }
+
+ }
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG, typename G, typename O_IT>
+ struct convex_hull {};
+
+
+ template <typename L, typename O_IT>
+ struct convex_hull<linestring_tag, L, O_IT> : impl::convex_hull::convex_hull_range<L, O_IT> {};
+
+
+ template <typename R, typename O_IT>
+ struct convex_hull<ring_tag, R, O_IT> : impl::convex_hull::convex_hull_range<R, O_IT> {};
+
+
+ template <typename P, typename O_IT>
+ struct convex_hull<polygon_tag, P, O_IT>
+ {
+ static inline O_IT calculate(const P& poly, O_IT out)
+ {
+ // Checking outer ring is sufficient for convex hull of polygon, holes are not relevant
+ typedef typename ring_type<P>::type R;
+ return impl::convex_hull::convex_hull_range<R, O_IT>::calculate(exterior_ring(poly), out);
+ }
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+ /*!
+ \brief Calculate the convex hull of a geometry
+ \ingroup convex_hull
+ \param geometry the geometry to calculate convex hull from
+ \param out an output iterator outputing points of the convex hull
+ \return the output iterator
+ */
+ template<typename G, typename O_IT>
+ inline O_IT convex_hull(const G& geometry, O_IT out)
+ {
+ return dispatch::convex_hull<typename tag<G>::type, G, O_IT>::calculate(geometry, out);
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_CONVEX_HULL_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/correct.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/correct.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,156 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_CORRECT_HPP
+#define _GEOMETRY_CORRECT_HPP
+
+#include <algorithm>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/cs.hpp>
+#include <geometry/core/ring_type.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/algorithms/area.hpp>
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace correct
+ {
+ // correct an box: make min/max are correct
+ template <typename B>
+ inline void correct_box(B& b)
+ {
+ // Currently only for Cartesian coordinates
+ // TODO: adapt using strategies
+ // TODO: adapt using traits
+ typedef typename coordinate_type<B>::type T;
+ if (get<min_corner, 0>(b) > get<max_corner, 0>(b))
+ {
+ T max_value = get<min_corner, 0>(b);
+ T min_value = get<max_corner, 0>(b);
+ set<min_corner, 0>(b, min_value);
+ set<max_corner, 0>(b, max_value);
+ }
+ if (get<min_corner, 1>(b) > get<max_corner, 1>(b))
+ {
+ T max_value = get<min_corner, 1>(b);
+ T min_value = get<max_corner, 1>(b);
+ set<min_corner, 1>(b, min_value);
+ set<max_corner, 1>(b, max_value);
+ }
+ }
+
+ // close a linear_ring, if not closed
+ template <typename R>
+ inline void ensure_closed_ring(R& r)
+ {
+ if (boost::size(r) > 2)
+ {
+ // check if closed, if not, close it
+ if (r.front() != r.back())
+ {
+ r.push_back(r.front());
+ }
+ }
+ }
+
+
+ // correct a polygon: normalizes all rings, sets outer linear_ring clockwise, sets all
+ // inner rings counter clockwise
+ template <typename Y>
+ inline void correct_polygon(Y& poly)
+ {
+ typename ring_type<Y>::type& outer = exterior_ring(poly);
+ ensure_closed_ring(outer);
+
+ typedef typename point_type<Y>::type P;
+ typename strategy_area<typename cs_tag<P>::type, P>::type strategy;
+
+ if (impl::area::area_ring(outer, strategy) < 0)
+ {
+ std::reverse(boost::begin(outer), boost::end(outer));
+ }
+
+ typedef typename boost::range_iterator<typename interior_type<Y>::type>::type IT;
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ ensure_closed_ring(*it);
+ if (impl::area::area_ring(*it, strategy) > 0)
+ {
+ std::reverse(boost::begin(*it), boost::end(*it));
+ }
+ }
+ }
+
+
+ }
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG, typename G>
+ struct correct {};
+
+
+ template <typename B>
+ struct correct<box_tag, B>
+ {
+ static inline void calculate(B& box)
+ {
+ impl::correct::correct_box(box);
+ }
+ };
+
+ template <typename R>
+ struct correct<ring_tag, R>
+ {
+ static inline void calculate(R& ring)
+ {
+ impl::correct::ensure_closed_ring(ring);
+ }
+ };
+
+ template <typename P>
+ struct correct<polygon_tag, P>
+ {
+ static inline void calculate(P& poly)
+ {
+ impl::correct::correct_polygon(poly);
+ }
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+
+ template <typename G>
+ inline void correct(G& geometry)
+ {
+ dispatch::correct<typename tag<G>::type, G>::calculate(geometry);
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_CORRECT_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/distance.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/distance.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,289 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_DISTANCE_HPP
+#define _GEOMETRY_DISTANCE_HPP
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/cs.hpp>
+
+#include <geometry/geometries/segment.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+#include <geometry/strategies/distance_result.hpp>
+#include <geometry/util/promotion_traits.hpp>
+
+
+/*!
+\defgroup distance distance calculation
+The distance algorithm returns the distance between two geometries.
+\par Coordinate systems and strategies:
+With help of strategies the distance function returns the appropriate distance.
+If the input is in cartesian coordinates, the Euclidian distance (Pythagoras) is calculated.
+If the input is in spherical coordinates (either degree or radian), the distance over the sphere is returned.
+If the input is in geographic coordinates, distance is calculated over the globe and returned in meters.
+
+\par Distance result:
+Depending on calculation type the distance result is either a structure, convertable
+to a double, or a double value. In case of Pythagoras it makes sense to not draw the square root in the
+strategy itself. Taking a square root is relative expensive and is not necessary when comparing distances.
+
+\par Geometries:
+Currently implemented, for both cartesian and spherical/geographic:
+- POINT - POINT
+- POINT - SEGMENT and v.v.
+- POINT - LINESTRING and v.v.
+
+Not yet implemented:
+- POINT - RING etc, note that it will return a zero if the point is anywhere within the ring
+
+\par Example:
+Example showing distance calculation of two points, in xy and in latlong coordinates
+\dontinclude doxygen_examples.cpp
+\skip example_distance_point_point
+\line {
+\until }
+*/
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace distance
+ {
+ template <typename P1, typename P2, typename S>
+ inline typename S::return_type point_to_point(const P1& p1, const P2& p2, const S& strategy)
+ {
+ return strategy(p1, p2);
+ }
+
+ template<typename P, typename SEG, typename STR>
+ inline typename STR::return_type point_to_segment(const P& point, const SEG& segment, const STR& strategy)
+ {
+ return strategy(point, segment);
+ }
+
+ template<typename P, typename SEG>
+ inline typename distance_result<P, SEG>::type point_to_segment(const P& point, const SEG& segment)
+ {
+ typename strategy_distance_segment<
+ typename cs_tag<P>::type,
+ typename cs_tag<SEG>::type,
+ P, SEG>::type strategy;
+ return strategy(point, segment);
+ }
+
+ template<typename P, typename L, typename S>
+ inline typename S::return_type point_to_linestring(const P& point, const L& linestring, const S& strategy)
+ {
+ typedef typename select_coordinate_type<P, typename boost::range_value<L>::type>::type T;
+ typedef typename S::return_type RET;
+
+ if (boost::begin(linestring) == boost::end(linestring))
+ {
+ return RET(0);
+ }
+
+ // line of one point: return point square_distance
+ typedef typename boost::range_const_iterator<L>::type IT;
+ IT it = boost::begin(linestring);
+ IT prev = it++;
+ if (it == boost::end(linestring))
+ {
+ typename S::distance_strategy_type pp;
+ return pp(point, *boost::begin(linestring));
+ }
+
+ typedef segment<const typename point_type<L>::type> CS;
+
+ // start with first segment distance
+ S f2;
+ RET d = f2(point, CS(*prev, *it));
+
+ // check if other segments are closer
+ prev = it++;
+ while(it != boost::end(linestring))
+ {
+ RET ds = f2(point, CS(*prev, *it));
+ if (close_to_zero(ds))
+ {
+ return RET(0);
+ }
+ else if (ds < d)
+ {
+ d = ds;
+ }
+ prev = it++;
+ }
+ return d;
+ }
+
+ template<typename P, typename L>
+ inline typename distance_result<P, L>::type point_to_linestring(const P& point, const L& linestring)
+ {
+ typedef typename point_type<L>::type LP;
+ typedef segment<const LP> SEG; // helper geometry
+ typedef typename strategy_distance_segment<
+ typename cs_tag<P>::type,
+ typename cs_tag<LP>::type,
+ P, SEG>::type STRATEGY;
+
+ STRATEGY strategy;
+ return point_to_linestring(point, linestring, strategy);
+ }
+
+
+
+ } // namespace distance
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG1, typename TAG2, typename G1, typename G2>
+ struct distance
+ {
+ };
+
+ template <typename P1, typename P2>
+ struct distance<point_tag, point_tag, P1, P2>
+ {
+ template <typename S>
+ static inline typename S::return_type calculate(const P1& p1, const P2& p2, const S& strategy)
+ {
+ return impl::distance::point_to_point(p1, p2, strategy);
+ }
+
+ static inline typename distance_result<P1, P2>::type
+ calculate(const P1& p1, const P2& p2)
+ {
+ return impl::distance::point_to_point(p1, p2,
+ typename strategy_distance<
+ typename cs_tag<P1>::type,
+ typename cs_tag<P2>::type,
+ P1, P2>::type());
+ }
+ };
+
+ template <typename P, typename L>
+ struct distance<point_tag, linestring_tag, P, L>
+ {
+ template<typename S>
+ static inline typename S::return_type calculate(const P& point, const L& linestring, const S& strategy)
+ {
+ return impl::distance::point_to_linestring(point, linestring, strategy);
+ }
+ static inline typename distance_result<P, L>::type calculate(const P& point, const L& linestring)
+ {
+ return impl::distance::point_to_linestring(point, linestring);
+ }
+ };
+
+ template <typename L, typename P>
+ struct distance<linestring_tag, point_tag, L, P>
+ {
+ template<typename S>
+ static inline typename S::return_type calculate(const L& linestring, const P& point, const S& strategy)
+ {
+ return impl::distance::point_to_linestring(point, linestring, strategy);
+ }
+ static inline typename distance_result<P, L>::type calculate(const L& linestring, const P& point)
+ {
+ return impl::distance::point_to_linestring(point, linestring);
+ }
+ };
+
+ template <typename P, typename SEG>
+ struct distance<point_tag, segment_tag, P, SEG>
+ {
+ template<typename STR>
+ static inline typename STR::return_type calculate(const P& point, const SEG& segment, const STR& strategy)
+ {
+ return impl::distance::point_to_segment(point, segment, strategy);
+ }
+ static inline typename distance_result<P, SEG>::type calculate(const P& point, const SEG& segment)
+ {
+ return impl::distance::point_to_segment(point, segment);
+ }
+ };
+
+ template <typename SEG, typename P>
+ struct distance<segment_tag, point_tag, SEG, P>
+ {
+ template<typename STR>
+ static inline typename STR::return_type calculate(const SEG& segment, const P& point, const STR& strategy)
+ {
+ return impl::distance::point_to_segment(point, segment, strategy);
+ }
+ static inline typename distance_result<P, SEG>::type calculate(const SEG& segment, const P& point)
+ {
+ return impl::distance::point_to_segment(point, segment);
+ }
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Calculate distance between two geometries
+ \ingroup distance
+ \details The default strategy is used, belonging to the corresponding coordinate system of the geometries
+ \tparam G1 first geometry type
+ \tparam G2 second geometry type
+ \param geometry1 first geometry
+ \param geometry2 second geometry
+ \return the distance (either a double or a distance result, convertable to double)
+ */
+ template <typename G1, typename G2>
+ inline typename distance_result<G1, G2>::type
+ distance(const G1& geometry1, const G2& geometry2)
+ {
+ return dispatch::distance<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2);
+ }
+
+ /*!
+ \brief Calculate distance between two geometries with a specified strategy
+ \ingroup distance
+ \tparam G1 first geometry type
+ \tparam G2 second geometry type
+ \tparam S point-point-distance strategy type
+ \param geometry1 first geometry
+ \param geometry2 second geometry
+ \param strategy strategy to calculate distance between two points
+ \return the distance (either a double or a distance result, convertable to double)
+ \par Example:
+ Example showing distance calculation of two lat long points, using the accurate Vincenty approximation
+ \dontinclude doxygen_examples.cpp
+ \skip example_distance_point_point_strategy
+ \line {
+ \until }
+ */
+ template <typename G1, typename G2, typename S>
+ inline typename S::return_type distance(const G1& geometry1, const G2& geometry2, const S& strategy)
+ {
+ return dispatch::distance<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2, strategy);
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_DISTANCE_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/envelope.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/envelope.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,317 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_ENVELOPE_HPP
+#define _GEOMETRY_ENVELOPE_HPP
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <boost/numeric/conversion/cast.hpp>
+
+
+#include <geometry/core/cs.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/box_concept.hpp>
+#include <geometry/core/concepts/nsphere_concept.hpp>
+#include <geometry/core/concepts/linestring_concept.hpp>
+#include <geometry/core/concepts/ring_concept.hpp>
+#include <geometry/core/concepts/polygon_concept.hpp>
+
+#include <geometry/core/exterior_ring.hpp>
+
+#include <geometry/algorithms/convert.hpp>
+
+
+
+#include <geometry/strategies/strategies.hpp>
+
+
+/*!
+\defgroup envelope envelope calculation
+\par Source descriptions:
+- OGC: Envelope (): Geometry - The minimum bounding box for this Geometry,
+ returned as a Geometry. The polygon is defined by the corner points of the bounding
+ box [(MINX, MINY), (MAXX, MINY), (MAXX, MAXY), (MINX, MAXY), (MINX, MINY)].
+
+\note Implemented in the Geometry library: The minimum bounding box, always as a box, having min <= max
+
+The envelope algorithm calculates the bounding box, or envelope, of a geometry. There are two versions:
+- envelope, taking a reference to a box as second parameter
+- make_envelope, returning a newly constructed box (type as a template parameter in the function call)
+- either of them has an optional strategy
+
+\par Geometries:
+- POINT: a box with zero area, the maximum and the minimum point of the box are
+set to the point itself.
+- LINESTRING, RING or RANGE is the smallest box that contains all points of the specified
+point sequence.
+If the linestring is empty, the envelope is the inverse infinite box, that is, the minimum point is very
+large (max infinite) and the maximum point is very small (min infinite).
+- POLYGON, the envelope of the outer ring
+ \image html envelope_polygon.png
+
+\par Example:
+Example showing envelope calculation
+\dontinclude doxygen_examples.cpp
+\skip example_envelope_linestring
+\line {
+\until }
+
+
+*/
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace envelope
+ {
+
+ /// Calculate envelope of an n-sphere, circle or sphere (currently only for Cartesian 2D points)
+ template<typename B, typename S>
+ inline void envelope_nsphere(const S& s, B& mbr)
+ {
+ assert_dimension<S, 2>;
+ assert_dimension<B, 2>;
+
+ typename radius_type<S>::type r = get_radius<0>(s);
+ set<min_corner, 0>(mbr, get<0>(s) - r);
+ set<min_corner, 1>(mbr, get<1>(s) - r);
+ set<max_corner, 0>(mbr, get<0>(s) + r);
+ set<max_corner, 1>(mbr, get<1>(s) + r);
+ }
+
+ /// Calculate envelope of an 2D or 3D point
+ template<typename B, typename P>
+ inline void envelope_point(const P& p, B& b)
+ {
+ // Envelope of a point is an empty box, a box with zero volume, located at the point.
+ // We just user the convert algorithm here
+ geometry::convert(p, b);
+ }
+
+ /// Version with state iterating through range (also used in multi*)
+ template<typename R, typename S>
+ inline void envelope_range_state(const R& range, const S& strategy, typename S::state_type& state)
+ {
+ typedef typename boost::range_const_iterator<R>::type IT;
+ for (IT it = boost::begin(range); it != boost::end(range); it++)
+ {
+ strategy(*it, state);
+ }
+ }
+
+
+ /// Version with strategy, calling state
+ template<typename B, typename R, typename S>
+ inline void envelope_range_strategy(const R& range, B& mbr, const S& strategy)
+ {
+ typename S::state_type state(mbr);
+ envelope_range_state(range, strategy, state);
+ }
+
+
+ /// Generic range dispatching struct
+ template <typename R, typename B>
+ struct envelope_range
+ {
+ /// Calculate envelope of range using a strategy
+ template<typename S>
+ static inline void calculate(const R& range, B& b, const S& strategy)
+ {
+ envelope_range_strategy(range, b, strategy);
+ }
+
+
+ /// Calculate envelope of range
+ static inline void calculate(const R& range, B& b)
+ {
+ typedef typename point_type<B>::type PB;
+ typedef typename point_type<R>::type PR;
+ typename strategy_envelope<
+ typename cs_tag<PR>::type,
+ typename cs_tag<PB>::type, PR, B>::type strategy;
+
+ calculate (range, b, strategy);
+ }
+ };
+
+
+
+ } // namespace envelope
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG1, typename TAG2, typename G, typename B>
+ struct envelope {};
+
+ template <typename P, typename B>
+ struct envelope<point_tag, box_tag, P, B>
+ {
+ /*!
+ \brief Calculate envelope of a point
+ \details The envelope of a point is a box containing just the point itself. It is provided
+ for consistence, on itself it is not useful.
+ */
+ static inline void calculate(const P& p, B& b)
+ {
+ impl::envelope::envelope_point(p, b);
+ }
+ private :
+ BOOST_CONCEPT_ASSERT((ConstPoint<P>));
+ BOOST_CONCEPT_ASSERT((Box<B>));
+ };
+
+
+ template <typename S, typename B>
+ struct envelope<nsphere_tag, box_tag, S, B>
+ {
+
+ /// Calculate envelope of a n-sphere
+ static inline void calculate(const S& n, B& b)
+ {
+ impl::envelope::envelope_nsphere(n, b);
+ }
+ private :
+ BOOST_CONCEPT_ASSERT((ConstNsphere<S>));
+ BOOST_CONCEPT_ASSERT((Box<B>));
+ };
+
+
+
+ template <typename L, typename B>
+ struct envelope<linestring_tag, box_tag, L, B> : impl::envelope::envelope_range<L, B>
+ {
+ private :
+ BOOST_CONCEPT_ASSERT((ConstLinestring<L>));
+ BOOST_CONCEPT_ASSERT((Box<B>));
+ };
+
+
+ template <typename R, typename B>
+ struct envelope<ring_tag, box_tag, R, B> : impl::envelope::envelope_range<R, B>
+ {
+ private :
+ BOOST_CONCEPT_ASSERT((ConstRing<R>));
+ BOOST_CONCEPT_ASSERT((Box<B>));
+ };
+
+
+
+ template <typename P, typename B>
+ struct envelope<polygon_tag, box_tag, P, B>
+ {
+
+ template<typename S>
+ static inline void calculate(const P& poly, B& b, const S& strategy)
+ {
+ // For polygon inspecting outer linear_ring is sufficient
+ impl::envelope::envelope_range_strategy(exterior_ring(poly), b, strategy);
+ }
+
+ static inline void calculate(const P& poly, B& b)
+ {
+ typedef typename point_type<B>::type PB;
+ typedef typename point_type<P>::type PP;
+ typename strategy_envelope<typename cs_tag<PP>::type,
+ typename cs_tag<PB>::type, PP, B>::type strategy;
+
+ calculate(poly, b, strategy);
+ }
+
+ private :
+ BOOST_CONCEPT_ASSERT((ConstPolygon<P>));
+ BOOST_CONCEPT_ASSERT((Box<B>));
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+
+ /*!
+ \brief Calculate envelope of a geometry
+ \ingroup envelope
+ \param geometry the geometry
+ \param box the box receiving the envelope
+ \par Example:
+ Example showing envelope calculation, using point_ll latlong points
+ \dontinclude doxygen_examples.cpp
+ \skip example_envelope_polygon
+ \line {
+ \until }
+ */
+ template<typename G, typename B>
+ inline void envelope(const G& geometry, B& box)
+ {
+ dispatch::envelope<typename tag<G>::type,
+ typename tag<B>::type, G, B>::calculate(geometry, box);
+ }
+
+
+ /*!
+ \brief Calculate envelope of a geometry, using a specified strategy
+ \ingroup envelope
+ \param geometry the geometry
+ \param box the box receiving the envelope
+ \param strategy strategy to be used
+ */
+ template<typename G, typename B, typename S>
+ inline void envelope(const G& geometry, B& box, const S& strategy)
+ {
+ dispatch::envelope<typename tag<G>::type,
+ typename tag<B>::type, G, B>::calculate(geometry, box, strategy);
+ }
+
+
+
+ /*!
+ \brief Calculate and return envelope of a geometry
+ \ingroup envelope
+ \param geometry the geometry
+ */
+ template<typename B, typename G>
+ inline B make_envelope(const G& geometry)
+ {
+ B box;
+ dispatch::envelope<typename tag<G>::type,
+ typename tag<B>::type, G, B>::calculate(geometry, box);
+ return box;
+ }
+
+ /*!
+ \brief Calculate and return envelope of a geometry
+ \ingroup envelope
+ \param geometry the geometry
+ \param strategy the strategy to be used
+ */
+ template<typename B, typename G, typename S>
+ inline B make_envelope(const G& geometry, const S& strategy)
+ {
+ B box;
+ dispatch::envelope<typename tag<G>::type,
+ typename tag<B>::type, G, B>::calculate(geometry, box, strategy);
+ return box;
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_ENVELOPE_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/foreach.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/foreach.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,239 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_FOREACH_HPP
+#define _GEOMETRY_FOREACH_HPP
+
+/*!
+\defgroup loop loops and for-each functionality
+There are several algorithms provided which walk through the points or segments
+of linestrings and polygons. They are called for_each_point, for_each_segment, after
+the standard library, and \b loop which is more adapted and of which the functor
+could break out if necessary.
+Of the for_each algorithms there is a \b const and a non-const version provided.
+*/
+
+
+#include <algorithm>
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/geometries/segment.hpp>
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace for_each
+ {
+
+ template <typename P, typename F>
+ struct fe_point
+ {
+ static inline F for_each_const_point(const P& p, F f)
+ {
+ f(p);
+ return (f);
+ }
+ static inline F for_each_point(P& p, F f)
+ {
+ f(p);
+ return (f);
+ }
+ };
+
+
+ template <typename R, typename F>
+ struct fe_range
+ {
+ static inline F for_each_const_point(const R& range, F f)
+ {
+ return (std::for_each(boost::begin(range), boost::end(range), f));
+ }
+
+ static inline F for_each_point(R& range, F f)
+ {
+ return (std::for_each(boost::begin(range), boost::end(range), f));
+ }
+
+ static inline F for_each_const_segment(const R& range, F f)
+ {
+ typedef typename boost::range_const_iterator<R>::type IT;
+ IT it = boost::begin(range);
+ IT previous = it++;
+ while(it != boost::end(range))
+ {
+ segment<typename point_type<R>::type> s(*previous, *it);
+ f(s);
+ previous = it++;
+ }
+
+ return (f);
+ }
+
+ static inline F for_each_segment(R& range, F f)
+ {
+ typedef typename boost::range_iterator<R>::type IT;
+ IT it = boost::begin(range);
+ IT previous = it++;
+ while(it != boost::end(range))
+ {
+ segment<typename point_type<R>::type> s(*previous, *it);
+ f(s);
+ previous = it++;
+ }
+
+ return (f);
+ }
+ };
+
+
+ template <typename P, typename F>
+ struct fe_polygon
+ {
+ static inline F for_each_const_point(const P& poly, F f)
+ {
+ typedef typename ring_type<P>::type R;
+ typedef typename boost::range_const_iterator<typename interior_type<P>::type>::type IT;
+ f = fe_range<R, F>::for_each_const_point(exterior_ring(poly), f);
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ f = fe_range<R, F>::for_each_const_point(*it, f);
+ }
+ return (f);
+ }
+ static inline F for_each_point(P& poly, F f)
+ {
+ typedef typename ring_type<P>::type R;
+ typedef typename boost::range_iterator<typename interior_type<P>::type>::type IT;
+ f = fe_range<R, F>::for_each_point(exterior_ring(poly), f);
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ f = fe_range<R, F>::for_each_point(*it, f);
+ }
+ return (f);
+ }
+
+ static inline F for_each_const_segment(const P& poly, F f)
+ {
+ typedef typename ring_type<P>::type R;
+ typedef typename boost::range_const_iterator<typename interior_type<P>::type>::type IT;
+ f = fe_range<R, F>::for_each_const_segment(exterior_ring(poly), f);
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ f = fe_range<R, F>::for_each_const_segment(*it, f);
+ }
+ return (f);
+ }
+ static inline F for_each_segment(P& poly, F f)
+ {
+ typedef typename ring_type<P>::type R;
+ typedef typename boost::range_iterator<typename interior_type<P>::type>::type IT;
+ f = fe_range<R, F>::for_each_segment(exterior_ring(poly), f);
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ f = fe_range<R, F>::for_each_segment(*it, f);
+ }
+ return (f);
+ }
+ };
+
+
+ } // namespace for_each
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G, typename F>
+ struct for_each {};
+
+ template <typename P, typename F>
+ struct for_each<point_tag, P, F> : impl::for_each::fe_point<P, F> {};
+
+ template <typename L, typename F>
+ struct for_each<linestring_tag, L, F> : impl::for_each::fe_range<L, F> {};
+
+ template <typename R, typename F>
+ struct for_each<ring_tag, R, F> : impl::for_each::fe_range<R, F> {};
+
+ template <typename P, typename F>
+ struct for_each<polygon_tag, P, F> : impl::for_each::fe_polygon<P, F> {};
+
+ } // namespace dispatch
+ #endif
+
+
+
+ /*!
+ \brief Calls functor for geometry
+ \ingroup loop
+ \param geometry geometry to loop through
+ \param f functor to use
+ \details Calls the functor the specified \b const geometry
+ */
+ template<typename G, typename F>
+ inline F for_each_point(const G& geometry, F f)
+ {
+ return (dispatch::for_each<typename tag<G>::type, G, F>::for_each_const_point(geometry, f));
+ }
+
+ /*!
+ \brief Calls functor for geometry
+ \ingroup loop
+ \param geometry geometry to loop through
+ \param f functor to use
+ \details Calls the functor for the specified geometry
+ */
+ template<typename G, typename F>
+ inline F for_each_point(G& geometry, F f)
+ {
+ return (dispatch::for_each<typename tag<G>::type, G, F>::for_each_point(geometry, f));
+ }
+
+ /*!
+ \brief Calls functor for segments on linestrings, rings, polygons, ...
+ \ingroup loop
+ \param geometry geometry to loop through
+ \param f functor to use
+ \details Calls the functor all \b const segments of the specified \b const geometry
+ */
+ template<typename G, typename F>
+ inline F for_each_segment(const G& geometry, F f)
+ {
+ return (dispatch::for_each<typename tag<G>::type, G, F>::for_each_const_segment(geometry, f));
+ }
+
+
+ /*!
+ \brief Calls functor for segments on linestrings, rings, polygons, ...
+ \ingroup loop
+ \param geometry geometry to loop through
+ \param f functor to use
+ \details Calls the functor all segments of the specified geometry
+ */
+ template<typename G, typename F>
+ inline F for_each_segment(G& geometry, F f)
+ {
+ return (dispatch::for_each<typename tag<G>::type, G, F>::for_each_segment(geometry, f));
+ }
+
+}
+
+#endif // _GEOMETRY_FOREACH_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/intersection.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/intersection.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,133 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_INTERSECTION_HPP
+#define _GEOMETRY_INTERSECTION_HPP
+
+#include <geometry/algorithms/intersection_segment.hpp>
+#include <geometry/algorithms/intersection_linestring.hpp>
+#include <geometry/algorithms/intersection_polygon.hpp>
+
+// Helper container and helper geometry
+#include <vector>
+#include <geometry/geometries/segment.hpp>
+
+
+/*!
+\defgroup intersection intersection (AND operation) and clipping
+\details The intersection of two geometries A and B is the geometry containing all points of A also belonging to B,
+but no other elements. The so-called clip is an intersection of a geometry with a box.
+\par Source description:
+- OGC: Returns a geometric object that represents the Point set intersection of this geometric object with another Geometry.
+\see http://en.wikipedia.org/wiki/Intersection_(set_theory)
+\note Any intersection can result in no geometry at all
+
+\note Used strategies still have to be modelled. Working only for cartesian
+\par Geometries:
+The intersection result is painted with a red outline.
+- clip: POLYGON + BOX -> output iterator of polygons
+ \image html clip_polygon.png
+- clip: LINESTRING + BOX -> output iterator of linestrings
+ \image html clip_linestring.png
+\note There are some difficulties to model an intersection in the template world. The intersection of two segments can
+result into nothing, into a point, into another segment. At compiletime the result type is not known. An output iterator
+iterating points is appropriate here.
+ \image html clip_segment_segment.png
+An intersection of two linestrings can result into nothing, one or more points, one or more segments or one or more
+linestrings. So an output iterator will NOT do here.
+So the output might be changed into a unified algorithm where the output is a multi-geometry.
+For the current clip-only operations the output iterator will do.
+
+\par Example:
+Example showing clipping of linestring with box
+\dontinclude doxygen_examples.cpp
+\skip example_intersection_linestring1
+\line {
+\until }
+\par Example:
+Example showing clipping of vector, outputting vectors, with box
+\dontinclude doxygen_examples.cpp
+\skip example_intersection_linestring2
+\line {
+\until }
+\par Example:
+Example showing clipping of polygon with box
+\dontinclude doxygen_examples.cpp
+\skip example_intersection_polygon1
+\line {
+\until }
+*/
+
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG1, typename TAG2, typename G1, typename G2>
+ struct intersection {};
+
+ template <typename B, typename L>
+ struct intersection<box_tag, linestring_tag, B, L>
+ {
+ template<typename O_IT>
+ static inline O_IT calculate(const B& box, const L& linestring, O_IT out)
+ {
+ typedef typename point_type<L>::type P;
+ typedef segment<P> S;
+ strategy::intersection::liang_barsky<B, S> strategy;
+
+ return (impl::intersection::clip_linestring_with_box(box, linestring, out, strategy));
+ }
+ };
+
+ template <typename B, typename P>
+ struct intersection<box_tag, polygon_tag, B, P>
+ {
+ template<typename O_IT>
+ static inline O_IT calculate(const B& box, const P& poly, O_IT out)
+ {
+ return impl::intersection::poly_weiler_atherton(box, poly, out);
+ }
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+
+
+
+ /*!
+ \brief Intersects two geometries which each other
+ \ingroup intersection
+ \details A sequence of points is intersected (clipped) by the specified box
+ and the resulting linestring, or pieces of linestrings, are sent to the specified output operator.
+ \tparam G1 first geometry type
+ \tparam G2 second geometry type
+ \tparam O_IT output iterator
+ \param geometry1 first geometry (currently only a BOX)
+ \param geometry2 second geometry (range, linestring, polygon)
+ \param out the output iterator, outputting linestrings or polygons
+ \return the output iterator
+ \note For linestrings: the default clipping strategy, Liang-Barsky, is used. The algorithm is currently only
+ implemented for 2D xy points. It could be generic for most ll cases, but not across the 180
+ meridian so that issue is still on the todo-list.
+ */
+ template <typename G1, typename G2, typename O_IT>
+ inline O_IT intersection(const G1& geometry1, const G2& geometry2, O_IT out)
+ {
+ return dispatch::intersection<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2, out);
+ }
+
+}
+
+#endif //_GEOMETRY_INTERSECTION_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/intersection_linestring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/intersection_linestring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,228 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_INTERSECTION_LINESTRING_HPP
+#define _GEOMETRY_INTERSECTION_LINESTRING_HPP
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+
+#include <geometry/algorithms/clear.hpp>
+#include <geometry/algorithms/append.hpp>
+
+
+#include <geometry/geometries/segment.hpp>
+
+
+namespace geometry
+{
+ namespace strategy
+ {
+ namespace intersection
+ {
+ /*!
+ \brief Strategy: line clipping algorithm after Liang Barsky
+ \ingroup intersection
+ \details The Liang-Barsky line clipping algorithm clips a line with a clipping box.
+ It is slightly adapted in the sense that it returns which points are clipped
+ \tparam B box type of clipping box
+ \tparam S segment type of segments to be clipped
+ \note The algorithm is currently only implemented for 2D Cartesian points
+ \author Barend Gehrels, and the following recourses
+ - A tutorial: http://www.skytopia.com/project/articles/compsci/clipping.html
+ - a German applet (link broken): http://ls7-www.cs.uni-dortmund.de/students/projectgroups/acit/lineclip.shtml
+ */
+ template<typename B, typename S>
+ class liang_barsky
+ {
+ private :
+ inline bool check_edge(const double& p, const double& q, double &t1, double &t2) const
+ {
+ bool visible = true;
+
+ if(p < 0)
+ {
+ double r = q / p;
+ if(r > t2) visible = false;
+ else if(r > t1) t1 = r;
+ }
+ else if(p > 0)
+ {
+ double r = q / p;
+ if(r < t1) visible = false;
+ else if(r < t2) t2 = r;
+ }
+ else
+ {
+ if(q < 0) visible = false;
+ }
+
+ return visible;
+ }
+
+ public :
+ bool clip_segment(const B& b, S& s, bool& sp1_clipped, bool& sp2_clipped) const
+ {
+ typedef typename select_coordinate_type<B, S>::type T;
+
+ double t1 = 0;
+ double t2 = 1;
+
+ T dx = get<1, 0>(s) - get<0, 0>(s);
+ T dy = get<1, 1>(s) - get<0, 1>(s);
+
+ T p1 = -dx;
+ T p2 = dx;
+ T p3 = -dy;
+ T p4 = dy;
+
+ T q1 = get<0, 0>(s) - get<min_corner, 0>(b);
+ T q2 = get<max_corner, 0>(b) - get<0, 0>(s);
+ T q3 = get<0, 1>(s) - get<min_corner, 1>(b);
+ T q4 = get<max_corner, 1>(b) - get<0, 1>(s);
+
+ if(check_edge(p1, q1, t1, t2) // left
+ && check_edge(p2, q2, t1, t2) // right
+ && check_edge(p3, q3, t1, t2) // bottom
+ && check_edge(p4, q4, t1, t2) // top
+ )
+ {
+ sp1_clipped = t1 > 0;
+ sp2_clipped = t2 < 1;
+
+ // Todo, maybe: round coordinates in case of integer? define some round_traits<> or so?
+ // Take boost-round of Fernando
+ if (sp2_clipped)
+ {
+ set<1, 0>(s, get<0, 0>(s) + t2 * dx);
+ set<1, 1>(s, get<0, 1>(s) + t2 * dy);
+ }
+
+ if(sp1_clipped)
+ {
+ set<0, 0>(s, get<0, 0>(s) + t1 * dx);
+ set<0, 1>(s, get<0, 1>(s) + t1 * dy);
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ template<typename L, typename O_IT>
+ inline void add(L& line_out, O_IT out) const
+ {
+ if (! boost::empty(line_out))
+ {
+ *out = line_out;
+ out++;
+ geometry::clear(line_out);
+ }
+ }
+ };
+ }
+ }
+
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace intersection
+ {
+
+
+ /*!
+ \brief Clips a linestring, or pair of iterators, with a box
+ \details A linestring, defined by an iterator pair, is intersected (clipped) by the specified box
+ and the resulting linestring, or pieces of linestrings, are sent to the specified output operator.
+ \tparam C container type, for example a vector of points, matching the output-iterator type,
+ the points should also match the input-iterator type
+ \tparam B box type
+ \tparam IT in iterator type
+ \tparam O_IT output iterator type, which outputs linestrings
+ \tparam S strategy, a clipping strategy which should implement the methods "clip_segment" and "add"
+ */
+ template <typename L, typename B, typename O_IT, typename S>
+ O_IT clip_linestring_with_box(const B& b, const L& linestring, O_IT out, const S& strategy)
+ {
+ if (boost::begin(linestring) == boost::end(linestring))
+ {
+ return (out);
+ }
+ typedef typename point_type<L>::type P;
+ typedef segment<P> SEG;
+
+ L line_out;
+
+ typename boost::range_const_iterator<L>::type vertex = boost::begin(linestring);
+ typename boost::range_const_iterator<L>::type previous = vertex++;
+ while(vertex != boost::end(linestring))
+ {
+ P p1 = *previous;
+ P p2 = *vertex;
+
+ // Clip the segment. Five situations:
+ // 1. Segment is invisible, finish line if any (shouldn't occur)
+ // 2. Segment is completely visible. Add (p1)-p2 to line
+ // 3. Point 1 is invisible (clipped), point 2 is visible. Start new line from p1-p2...
+ // 4. Point 1 is visible, point 2 is invisible (clipped). End the line with ...p2
+ // 5. Point 1 and point 2 are both invisible (clipped). Start/finish an independant line p1-p2
+ //
+ // This results in:
+ // a. if p1 is clipped, start new line
+ // b. if segment is partly or completely visible, add the segment
+ // c. if p2 is clipped, end the line
+
+ bool c1, c2;
+ SEG s(p1, p2);
+ if (! strategy.clip_segment(b, s, c1, c2))
+ {
+ strategy.add(line_out, out);
+ }
+ else
+ {
+ // a. If necessary, finish the line and add a start a new one
+ if (c1)
+ {
+ strategy.add(line_out, out);
+ }
+
+ // b. Add p1 only if it is the first point, then add p2
+ if (boost::empty(line_out))
+ {
+ geometry::append(line_out, p1);
+ }
+ geometry::append(line_out, p2);
+
+ // c. If c2 is clipped, finish the line
+ if (c2)
+ {
+ strategy.add(line_out, out);
+ }
+ }
+ previous = vertex++;
+ }
+ // Add last part
+ strategy.add(line_out, out);
+ return (out);
+ }
+
+
+
+ } // namespace intersection
+ } // namespace impl
+ #endif
+
+
+
+} // namespace
+
+
+#endif //_GEOMETRY_INTERSECTION_LINESTRING_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/intersection_polygon.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/intersection_polygon.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,934 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_INTERSECTION_POLYGON_HPP
+#define _GEOMETRY_INTERSECTION_POLYGON_HPP
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/cs.hpp>
+
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/algorithms/area.hpp>
+#include <geometry/algorithms/append.hpp>
+#include <geometry/algorithms/clear.hpp>
+#include <geometry/algorithms/distance.hpp>
+#include <geometry/algorithms/within.hpp>
+
+
+
+#include <geometry/algorithms/intersection_segment.hpp>
+
+#include <geometry/algorithms/make.hpp>
+#include <geometry/util/assign_box_corner.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+// Helper geometries
+#include <geometry/geometries/point_xy.hpp>
+#include <geometry/geometries/segment.hpp>
+#include <geometry/geometries/linear_ring.hpp>
+
+
+#include <exception>
+
+
+//#define GL_DEBUG_INTERSECT_POLYGON
+
+
+namespace geometry
+{
+ // Move elsewhere?
+ class intersection_exception : public std::exception
+ {
+ public:
+ intersection_exception(const std::string& text)
+ : m_text(text)
+ {}
+ virtual ~intersection_exception() throw()
+ {}
+
+ virtual const char *what() const throw()
+ {
+ return m_text.c_str();
+ }
+ private :
+ std::string m_text;
+ };
+
+
+
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace intersection
+ {
+
+
+ //------------------------------------------------------------------------------------------------------------------------
+ // Weiler-Atherton approach to clip a polygon within a rectangle
+ // Can be relatively easily extended to clip polygon-polygon
+ // (Somewhat combined with "segment-code" idea of Cohen-Sutherland to see which segment needs clipping)
+
+ // Keep bitwise.
+ // See, e.g., http://www.sunshine2k.de/stuff/Java/CohenSutherland/CohenSutherland.html
+ const char cohen_sutherland_top = 1; // 0001
+ const char cohen_sutherland_bottom = 2; // 0010
+ const char cohen_sutherland_right = 4; // 0100
+ const char cohen_sutherland_left = 8; // 1000
+
+
+ const int ring_not_assigned = -99;
+
+
+ enum clip_polygon_type {clip_intersect, clip_box_within_ring,
+ clip_ring_within_box, clip_disjoint};
+
+
+
+ // Extend point type with "tag" information
+ // Weiler-Atherton:
+ // "The new vertices are tagged to indicate they are intersection vertices." --> intersection_id > 0
+ // and
+ // "Repeat steps "b" to "e" until the starting point has been reached." --> is_visited
+ template<typename P>
+ struct weiler_atherton_point : public P
+ {
+ typedef typename distance_result<P, P>::type DIST;
+
+ public :
+ inline weiler_atherton_point()
+ : outside(false)
+ , ring_index(ring_not_assigned)
+ , intersection_id(-1)
+ , is_visited(false)
+ {
+ // Init with zero
+ this->template set<0>(0);
+ this->template set<1>(0);
+ }
+
+ // Constructor with point
+ inline weiler_atherton_point(const P& p)
+ : P(p)
+ , outside(false)
+ , ring_index(ring_not_assigned)
+ , intersection_id(-1)
+ , vertex_index(-1)
+ , distance(0)
+ , is_visited(false)
+ {}
+
+ // Constructor with coordinates
+ // Note that "geometry::coordinate_type" cannot be used here, because traits definitions
+ // are declared below.
+ template <typename T>
+ inline weiler_atherton_point(const T& x, const T& y)
+ : outside(false)
+ , ring_index(ring_not_assigned)
+ , intersection_id(-1)
+ , vertex_index(-1)
+ , distance(0)
+ , is_visited(false)
+ {
+ this->template set<0>(x);
+ this->template set<1>(y);
+ }
+
+ // Constructor with point, Cohen-Sutherland code and linear_ring-index
+ inline weiler_atherton_point(const P& p, bool os, int r)
+ : P(p)
+ , outside(os)
+ , ring_index(r)
+ , intersection_id(-1)
+ , vertex_index(-1)
+ , distance(0)
+ , is_visited(false)
+ {}
+
+ inline weiler_atherton_point(const P& p, int si, double d)
+ : P(p)
+ , outside(false)
+ , ring_index(ring_not_assigned)
+ , intersection_id(-1)
+ , vertex_index(si)
+ , distance(d)
+ , is_visited(false)
+ {}
+
+
+ // Operator to sort on "start vertex", then on distance
+ inline bool operator<(const weiler_atherton_point& other) const
+ {
+ if (other.vertex_index == this->vertex_index)
+ {
+ // Compare on (possibly squared) distance
+ return this->distance < other.distance;
+ }
+ return this->vertex_index < other.vertex_index;
+ }
+
+ int ring_index;
+ int vertex_index;
+ bool outside;
+
+ bool is_visited;
+
+ // For intersections:
+ int intersection_id; // 1-based intersection ID
+ DIST distance; // distance to corresponding startpoing of segment
+
+ };
+
+
+ }
+ } // namespace impl (closing to adapt to traits)
+
+
+ // NOTE: the DOXYGEN_NO_IMPL still applies here
+
+
+ // Adapt the weiler atherton point to the concept
+ namespace traits
+ {
+ template <typename P>
+ struct coordinate_type<geometry::impl::intersection::weiler_atherton_point<P> >
+ { typedef typename geometry::coordinate_type<P>::type type; };
+
+ template <typename P>
+ struct coordinate_system<geometry::impl::intersection::weiler_atherton_point<P> >
+ { typedef cs::cartesian type; };
+
+ template <typename P>
+ struct dimension<geometry::impl::intersection::weiler_atherton_point<P> >: boost::mpl::int_<2> {};
+
+ template <typename P>
+ struct tag<geometry::impl::intersection::weiler_atherton_point<P> >
+ { typedef point_tag type; };
+
+ template <typename P>
+ struct access<geometry::impl::intersection::weiler_atherton_point<P> >
+ {
+ template <int I>
+ static typename coordinate_type<P>::type get(const geometry::impl::intersection::weiler_atherton_point<P>& p)
+ { return p.template get<I>(); }
+
+ template <int I>
+ static void set(geometry::impl::intersection::weiler_atherton_point<P>& p, const typename coordinate_type<P>::type& value)
+ { p.template set<I>(value); }
+ };
+
+ }
+
+ // Continuation of namespace impl
+ namespace impl
+ {
+ namespace intersection
+ {
+
+ // Small structure to keep two indices and an ID
+ struct intersection_indices
+ {
+ inline intersection_indices(int an_id)
+ : id(an_id)
+ , subject_index(-1)
+ , clip_index(-1)
+ {}
+
+ int id;
+ int subject_index;
+ int clip_index;
+ };
+ typedef std::vector<intersection_indices> intersection_index_vector;
+
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ template<typename P>
+ inline std::ostream& operator<< (std::ostream &stream, const weiler_atherton_point<P>& p)
+ {
+ stream << "(" << std::setw(4) << std::setprecision(3) << get<0>(p)
+ << " , " << std::setw(4) << std::setprecision(3) << get<1>(p) << ") "
+ << "; ri=";
+ if (p.ring_index == ring_not_assigned)
+ {
+ stream << " -";
+ }
+ else
+ {
+ stream << std::setw(3) << p.ring_index;
+ }
+ stream << "; vi=" << std::setw(3) << p.vertex_index;
+ stream << "; id=" << std::setw(3) << p.intersection_id;
+ stream << "; dist=" << std::setw(4) << std::setprecision(2) << double(p.distance);
+ if (p.outside)
+ {
+ stream << "; outside";
+ }
+ if (p.is_visited)
+ {
+ stream << "; visited";
+ }
+ return stream;
+ }
+#endif
+
+
+ template<typename B, typename P>
+ inline void _cs_clip_code(const B& b, const P& p,
+ char& code, bool& is_inside,
+ char& code_and, char& code_or, bool& has_inside, bool& disjoint)
+ {
+ code = 0;
+
+ // Note: border has to be included because of boundary cases
+ // Therefore we need a second variable to see if it is inside (including on boundary)
+
+ // Compare left/right.
+ if (get<0>(p) <= get<min_corner, 0>(b)) code = cohen_sutherland_left;
+ else if (get<0>(p) >= get<max_corner, 0>(b)) code = cohen_sutherland_right;
+
+ // Compare top/bottom
+ if (get<1>(p) <= get<min_corner, 1>(b)) code |= cohen_sutherland_bottom;
+ else if (get<1>(p) >= get<max_corner, 1>(b)) code |= cohen_sutherland_top;
+
+ code_and &= code;
+ code_or |= code;
+
+ // Check if point is lying inside clip, or on boundary
+ is_inside = geometry::within(p, b);
+ if (is_inside)
+ {
+ has_inside = true;
+ disjoint = false;
+ }
+ }
+
+
+ template<typename I>
+ inline bool on_same_ring(I& it, int ring_index)
+ {
+ return ring_index == ring_not_assigned
+ || it->ring_index == ring_not_assigned
+ || it->ring_index == ring_index;
+ }
+
+ // Iterate along the container. If on end, or on other ring, goto first element of same ring
+ template<typename I>
+ inline void traverse_along(I& it, const I& begin, const I& end)
+ {
+ int ri_1 = it->ring_index;
+ it++;
+ if (it == end || ! on_same_ring(it, ri_1))
+ {
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ if (it == end) std::cout << "GOTO BEGIN " << *begin << std::endl;
+ else std::cout << "FIND RING " << "RI:" << ri_1 << std::endl;
+#endif
+ it = begin;
+ if (! on_same_ring(it, ri_1))
+ {
+ for (I tit = begin; tit != end; tit++)
+ {
+ //std::cout << "evaluate " << *tit << " RI:" << ri_1 << std::endl;
+ if (tit->ring_index == ri_1)
+ {
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << "TAKE " << *tit << std::endl;
+#endif
+
+ it = tit;
+ return;
+ }
+ }
+
+ throw intersection_exception("internal error - no correct point on interator found");
+ }
+ }
+ }
+
+ // Traverse to an unvisited intersection point on the subject polygon.
+ template<typename W>
+ void traverse_to_intersection(W& subject, W& clip, intersection_index_vector& indices, typename W::iterator& it)
+ {
+ for (intersection_index_vector::iterator iit = indices.begin(); iit != indices.end(); iit++)
+ {
+ typename W::iterator next = subject.begin() + iit->subject_index;
+ // Check both for being visited - we don't know which one was taken
+ if (! next->is_visited && ! clip[iit->clip_index].is_visited)
+ {
+ it = next;
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << "Start with " << *it << std::endl;
+#endif
+ return;
+ }
+ }
+ }
+
+ template<typename W>
+ void traverse_to_after_id(W& subject, W& clip,
+ intersection_index_vector& indices, bool on_subject, int id, typename W::iterator& it)
+ {
+ for (intersection_index_vector::iterator iit = indices.begin(); iit != indices.end(); iit++)
+ {
+ if (iit->id == id)
+ {
+ if (on_subject)
+ {
+ it = subject.begin() + iit->subject_index;
+ traverse_along(it, subject.begin(), subject.end());
+ }
+ else
+ {
+ it = clip.begin() + iit->clip_index;
+ traverse_along(it, clip.begin(), clip.end());
+ }
+ return;
+ }
+ }
+ throw intersection_exception("internal error - intersection ID not found");
+ }
+
+ template<typename W>
+ void traverse_next(W& subject, W& clip,
+ intersection_index_vector& indices, bool& on_subject, typename W::iterator& it)
+ {
+ // 1. Go to next point
+ typename W::iterator next = it;
+ if (on_subject)
+ {
+ traverse_along(next, subject.begin(), subject.end());
+ }
+ else
+ {
+ traverse_along(next, clip.begin(), clip.end());
+ }
+
+ // 2. If current was not an intersection point,
+ // or next is an intersection point, we take this next point (but only on subject)
+ // or we are on the subject polygon and next is inside the clip
+ if (it->intersection_id <= 0
+ || (on_subject && next->intersection_id > 0)
+ || (on_subject && ! next->outside))
+ {
+ it = next;
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ if (it->intersection_id <= 0)
+ std::cout << "Take next " << *it << std::endl;
+ else if (on_subject && next->intersection_id > 0) std::cout << "next (sub) " << *it << std::endl;
+ else if (on_subject && ! next->outside) std::cout << "next (ins) " << *it << std::endl;
+ else
+ std::cout << "other " << *it << std::endl;
+#endif
+ }
+ else
+ {
+ // we are on subject or on clip, on intersection, next is not an intersection,
+ // navigate to the corresponding ID on the other polygon
+ traverse_to_after_id(subject, clip, indices, !on_subject, it->intersection_id, next);
+
+ // It may never be outside polygon
+ if (!on_subject && next->outside)
+ {
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << "return because of " << *next << std::endl;
+#endif
+ return;
+ }
+
+ on_subject = ! on_subject;
+ it = next;
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << "trav->" << (on_subject ? "subj " : "clip ") << *it << std::endl;
+#endif
+ }
+ }
+
+
+ template<typename S1, typename S2, typename WAP>
+ void segment_weiler_atherton_intersect(
+ const S1& subject, int subject_index, std::vector<WAP>& subject_points,
+ const S2& clip, int clip_index, std::vector<WAP>& clip_points,
+ int& id, intersection_index_vector& indices)
+ {
+ BOOST_CONCEPT_ASSERT( (Point<WAP>) );
+ BOOST_CONCEPT_ASSERT( (ConstSegment<S1>) );
+ BOOST_CONCEPT_ASSERT( (ConstSegment<S1>) );
+
+
+ std::vector<WAP> ip;
+ intersection_result r = intersection_segment<WAP>(subject, clip, std::back_inserter(ip));
+
+ // If there are two intersection points (== overlap), discard:
+ // 1) it can be in opposite direction, they share their border there
+ // but do not intersect -> return
+ // 2) it can be in same direction, it is OK but the intersection points are calculated
+ // before/after overlap (see figure)
+
+ if (ip.size() != 1)
+ {
+ return;
+ }
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << " CHECK : " << subject.first << "-" << subject.second
+ << " x " << clip.first << "-" << clip.second << std::endl;
+#endif
+
+
+ // If segment of subject intersects clip, and intersection point is on the clip,
+ // we examine further
+ if (r.is_type == is_intersect)
+ {
+ connection_type c = r.get_connection_type();
+ if (c != is_connect_no)
+ {
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << "CONNECT: " << subject.first << "-" << subject.second
+ << " x " << clip.first << "-" << clip.second << std::endl;
+#endif
+
+ //typedef typename cs_tag<typename S2::point_type>::type PTAG;// doesn't work... todo
+ typedef typename strategy_side<cartesian_tag, typename S2::point_type>::type SIDE;
+
+
+ switch(c)
+ {
+ // If it connects at at one end, always consider the subject-point:
+ // only continue if it is RIGHT of the clip
+ case is_connect_s1p1 :
+ if (SIDE::side(clip, subject.second) >= 0) return;
+ break;
+ case is_connect_s1p2 :
+ if (SIDE::side(clip, subject.second) >= 0) return;
+ break;
+ case is_connect_s2p1 :
+ case is_connect_s2p2 :
+ // Consider both points, at least one must be right of the clip
+ if (SIDE::side(clip, subject.first) >= 0 && SIDE::side(clip, subject.second) >= 0)
+ {
+ return;
+ }
+ break;
+ }
+ }
+
+ }
+
+ // Add intersection points, if any
+ for (typename std::vector<WAP>::iterator it = ip.begin(); it != ip.end(); it++)
+ {
+ // Tag the point(s) with unique id
+ it->intersection_id = ++id;
+ // Add it to intersection
+ indices.push_back(intersection_indices(id));
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << "-> INTERSECTION: " << id << " " << *it << std::endl;
+#endif
+
+ // Assign index, calc squared distance and store for addition to subject and to clip lateron
+ typedef typename point_type<S1>::type PS1;
+ typedef typename strategy_distance<
+ typename cs_tag<WAP>::type,
+ typename cs_tag<PS1>::type,
+ WAP, PS1>::type STRATEGY;
+
+ STRATEGY strategy;
+
+ it->vertex_index = subject_index;
+ it->distance = strategy(subject.first, *it);
+ subject_points.push_back(*it);
+
+ it->vertex_index = clip_index;
+ it->distance = strategy(clip.first, *it);
+ clip_points.push_back(*it);
+ }
+ }
+
+
+ template<typename B, typename R, typename WAP, typename WAR>
+ clip_polygon_type ring_weiler_atherton_intersect(const B& b, const R& in, int ring_index,
+ WAR& subject, std::vector<WAP>& clip, // todo, change to WAR
+ int& id, intersection_index_vector& indices)
+ {
+ // Some book keeping variables
+ char code_and = cohen_sutherland_left
+ | cohen_sutherland_right
+ | cohen_sutherland_top
+ | cohen_sutherland_bottom;
+ char code_or = 0;
+ bool has_inside = false;
+ bool is_disjoint = true;
+
+ // Define the 4 points defining the box
+ typedef typename boost::range_value<R>::type P;
+ P lower_left, upper_left, lower_right, upper_right;
+ assign_box_corners(b, lower_left, lower_right, upper_left, upper_right);
+
+ bool first = true;
+ char code_previous = 0;
+ //R::const_iterator last = in.end() - 1;
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ int point_index = 0;
+#endif
+
+ size_t subject_original_size = subject.size();
+
+ typename R::const_iterator it = in.begin();
+ typename R::const_iterator prev = it++;
+ while(it != in.end())
+ {
+ bool is_inside;
+ if (first)
+ {
+ // Add first point of polygon to subject vector
+ _cs_clip_code(b, *prev, code_previous, is_inside, code_and, code_or,
+ has_inside, is_disjoint);
+ subject.push_back(WAP(*prev, !is_inside, ring_index));
+ first = false;
+ }
+
+ char code_current;
+ _cs_clip_code(b, *it, code_current, is_inside, code_and, code_or,
+ has_inside, is_disjoint);
+
+ segment<const P> ss(*prev, *it);
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << ring_index << "." << point_index++
+ << " SGMNT: " << ss.first << "-" << ss.second
+ << " cs " << int(code_previous) << "," << int(code_current) << std::endl;
+#endif
+
+
+ // If both segments are not in same Cohen-Suth. segment, check for intersections
+ // Todo: check more efficient (if they are lying on same side -> no intersection possible)
+ if (code_previous != code_current)
+ {
+ // Intersections are first stored in a vector, then sorted, then added, see Weiler-Atherton:
+ // "If care is taken in placement of intersections where the subject and clip polygon
+ // contours are identical in the x-y plane, no degenerate polygons will be produced by
+ // the clipping process."
+ std::vector<WAP> ips;
+
+ // Clip all four sides of box
+ segment_weiler_atherton_intersect(ss, -1, ips,
+ segment<const P>(lower_left, upper_left),
+ 0, clip, id, indices);
+ segment_weiler_atherton_intersect(ss, -1, ips,
+ segment<const P>(upper_left, upper_right),
+ 1, clip, id, indices);
+ segment_weiler_atherton_intersect(ss, -1, ips,
+ segment<const P>(upper_right, lower_right),
+ 2, clip, id, indices);
+ segment_weiler_atherton_intersect(ss, -1, ips,
+ segment<const P>(lower_right, lower_left),
+ 3, clip, id, indices);
+
+ // Add all found intersection points to subject polygon, after sorting
+ // on distance from first point. There might be up to 4 intersection points
+ // in rectangular clips, and much more on polygon clips. However, often there are zero or one
+ // intersections, sorting is not a big issue here
+ std::sort(ips.begin(), ips.end());
+ for (typename std::vector<WAP>::const_iterator pit = ips.begin(); pit != ips.end(); pit++)
+ {
+ indices[pit->intersection_id - 1].subject_index = int(subject.size());
+ subject.push_back(*pit);
+
+ is_disjoint = false;
+ }
+ }
+
+ // After intersections, add endpoint of segment to subject vector
+ subject.push_back(WAP(*it, !is_inside, ring_index));
+
+ code_previous = code_current;
+ prev = it++;
+ }
+
+ // If all points are inside clip-box, output is original (for outer)
+ // or should be added completely (for inner)
+ if (code_or == 0)
+ {
+ // Remove from subject
+ subject.erase(subject.begin() + subject_original_size, subject.end());
+ return clip_ring_within_box;
+ }
+
+ // Special case: if no points are inside, the clip box might be inside the polygon
+ // -> output clip box and quit
+ if (! has_inside)
+ {
+ // Take any point of clip and check if it is within the linear_ring
+ typename point_type<B>::type p;
+ assign_box_corner<min_corner, min_corner>(b, p);
+ if (geometry::within(p, in))
+ {
+ return clip_box_within_ring;
+ }
+ // If clip points are not in the linear_ring, but not all on same side,
+ // there might still be an intersection
+ // TODO: can be checked more efficiently further
+ }
+
+
+ // Discard disjoint outer/inner rings
+ if (is_disjoint)
+ {
+ // Remove from subject
+ subject.erase(subject.begin() + subject_original_size, subject.end());
+ return clip_disjoint;
+ }
+
+ // Some points are inside, some are outside, clipping should go on
+ return clip_intersect;
+ }
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ template <typename RING>
+ void wa_debug_ring(const std::string& title, const RING& ring)
+ {
+ std::cout << title << ": (" << ring.size() << " points)" << std::endl;
+ for (int i = 0; i < ring.size(); i++)
+ {
+ std::cout << ring[i] << std::endl;
+ }
+ }
+ void wa_debug_clip_result(const std::string& title, clip_polygon_type type)
+ {
+ std::cout << title << ": ";
+ switch(type)
+ {
+ case clip_box_within_ring : std::cout << "clip within ring"; break;
+ case clip_ring_within_box : std::cout << "ring within clip"; break;
+ case clip_disjoint : std::cout << "clip disjoint ring"; break;
+ case clip_intersect : std::cout << "clip intersects ring"; break;
+ }
+ std::cout << std::endl;
+
+ }
+
+#endif
+
+
+
+ template<typename B, typename POLY, typename O_IT>
+ O_IT poly_weiler_atherton(const B& b, const POLY& in, O_IT output)
+ {
+ typedef weiler_atherton_point<typename point_type<POLY>::type> wap;
+ typedef linear_ring<wap> wa_ring;
+
+ // Weiler-Atherton:
+ // "A link is established between each pair of new vertices, permitting travel between two
+ // polygons wherever they intersect on the x-y plane."
+ // We keep this link in an index-vector
+ intersection_index_vector indices;
+
+ int id = 0;
+
+ // 1: Create a processed copy of the polygon (called, after Weiler-Atherton, the "subject"),
+ // which has all points of original AND all intersection points on correct positions.
+ // Create also a processed copy of the clipping box, called, the "clip", also with all found intersection points.
+ // The copy is
+ // Check the Cohen-Suth.segment
+ // - to avoid unnecessary intersections (in a BOX, two consecutive inside points doesn't need to be checked)
+ // - to choose the path, lateron
+ wa_ring subject, clip;
+
+
+ // For outerring and all rings
+ // TODO: check result code of function, if no intersections -> add to output iterator and quit
+ int ring_index = -1;
+
+ clip_polygon_type outer_result =
+ ring_weiler_atherton_intersect(b, exterior_ring(in), ring_index++, subject, clip, id, indices);
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ wa_debug_clip_result("exterior_ring", outer_result);
+#endif
+
+ switch(outer_result)
+ {
+ case clip_box_within_ring :
+ {
+ // If outer polygon completely contains the clipbox, return the clipbox as clip
+ POLY out;
+ typedef typename point_type<POLY>::type P;
+ geometry::append(exterior_ring(out), make<P>(get<min_corner, 0>(b), get<min_corner, 1>(b)));
+ geometry::append(exterior_ring(out), make<P>(get<min_corner, 0>(b), get<max_corner, 1>(b)));
+ geometry::append(exterior_ring(out), make<P>(get<max_corner, 0>(b), get<max_corner, 1>(b)));
+ geometry::append(exterior_ring(out), make<P>(get<max_corner, 0>(b), get<min_corner, 1>(b)));
+ geometry::append(exterior_ring(out), make<P>(get<min_corner, 0>(b), get<min_corner, 1>(b)));
+
+ // TODO: all innerrings must be evaluated:
+ // - completely within clipbox -> add as innerring
+ // - intersecting clipbox -> discard poly above and do complete process
+ // - completely outside clipbox (but clipbox still inside exterior ring) -> return
+
+
+ *output = out;
+ output++;
+
+ return output;
+ }
+ case clip_ring_within_box :
+ // Put input polygon to output vector (this assignment includes all inner rings)
+ *output = in;
+ return output;
+ case clip_disjoint :
+ // Put nothing to output vector, it is completely outside clipping box
+ return output;
+ }
+
+ std::vector<int> within_inner_rings;
+
+ typedef typename boost::range_const_iterator<typename interior_type<POLY>::type>::type IIT;
+
+ for (IIT it = boost::begin(interior_rings(in));
+ it != boost::end(interior_rings(in)); it++, ring_index++)
+ {
+ clip_polygon_type inner_result =
+ ring_weiler_atherton_intersect(b, *it, ring_index, subject, clip, id, indices);
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ wa_debug_clip_result("inner", inner_result);
+#endif
+
+ switch(inner_result)
+ {
+ case clip_ring_within_box :
+ // if innerring completly inside box, add lateron as innerring
+ within_inner_rings.push_back(ring_index);
+ break;
+ }
+ }
+
+
+ // If there are clip intersection points, build up the clip polyon. Add all corner points,
+ // then sort on segment-index and distance, then the clip is OK
+ typename point_type<B>::type lower_left, upper_left, lower_right, upper_right;
+ assign_box_corners(b, lower_left, lower_right, upper_left, upper_right);
+
+ clip.push_back(wap(lower_left, 0, 0.0));
+ clip.push_back(wap(upper_left, 1, 0.0));
+ clip.push_back(wap(upper_right, 2, 0.0));
+ clip.push_back(wap(lower_right, 3, 0.0));
+ clip.push_back(wap(lower_left, 4, 0.0));
+
+ std::sort(clip.begin(), clip.end());
+
+ // Update the id's of clip intersection points, now we have it
+ for (unsigned int j = 0; j < clip.size(); j++)
+ {
+ if (clip[j].intersection_id > 0)
+ {
+ indices[clip[j].intersection_id - 1].clip_index = j;
+ }
+ }
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << std::endl << "indices of intersections:" << std::endl;
+ for (intersection_index_vector::const_iterator it = indices.begin(); it != indices.end(); it++)
+ {
+ std::cout
+ << "subj:" << it->subject_index << " " << subject[it->subject_index] << std::endl
+ << "clip:" << it->clip_index << " " << clip[it->clip_index] << std::endl;
+ }
+
+ wa_debug_ring("SUBJECT", subject);
+ wa_debug_ring("CLIP", clip);
+
+#endif
+
+ // 4. build output polygon or polygons, start with an intersected point
+ // "4. The actual clipping is now performed
+ // a) An intersection vertex is removed from the first intersection list to be used as a
+ // starting point. If the list is exhausted, the clipping is complete; Go to step 5.
+ POLY out;
+ typename wa_ring::iterator it = subject.begin();
+ traverse_to_intersection(subject, clip, indices, it);
+ bool on_subject = true;
+ while(! it->is_visited)
+ {
+ // Add the point, but only if it differs from previous point
+ typedef typename point_type<POLY>::type P;
+ P p = make<P>(it->x(), it->y());
+ if (boost::empty(exterior_ring(out)) || ! (exterior_ring(out).back() == p))
+ {
+ geometry::append(exterior_ring(out), p);
+ }
+
+ it->is_visited = true;
+
+ traverse_next(subject, clip, indices, on_subject, it);
+
+ if (it->is_visited)
+ {
+ // Close (if not closed)
+ typename ring_type<POLY>::type outer_ring = exterior_ring(out);
+ if (! boost::empty(outer_ring) && ! (outer_ring.front() == outer_ring.back()))
+ {
+ geometry::append(outer_ring, outer_ring.front());
+ }
+
+ // Add all innerrings which are inside this polygon
+ for (unsigned int i = 0; i < within_inner_rings.size(); i++)
+ {
+
+ typedef typename boost::range_const_iterator<typename interior_type<POLY>::type>::type IIT;
+ IIT it = boost::begin(interior_rings(in)) + within_inner_rings[i];
+ // TODO: make more efficient, check using "envelope" of exterior first
+ if (geometry::within(it->front(), outer_ring))
+ {
+ // ASSUMPTION OF STD::CONTAINER HERE which is probably always the case
+ interior_rings(out).push_back(*it);
+ }
+ }
+
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ //std::cout << "out: " << make_as_wkt(out) << std::endl;
+#endif
+
+ *output = out;
+ output++;
+
+ clear(out);
+
+ // Go to first unvisited intersection point, if any
+ // Else the iterator will result is_visited and it will stop
+ traverse_to_intersection(subject, clip, indices, it);
+ on_subject = true;
+ }
+ }
+
+
+#ifdef GL_DEBUG_INTERSECT_POLYGON
+ std::cout << std::endl << "AFTER PROCESSING:" << std::endl;
+ wa_debug_ring("SUBJECT", subject);
+ wa_debug_ring("CLIP", clip);
+#endif
+ return output;
+
+ }
+
+
+ }
+ } // namespace impl
+ #endif
+
+
+} // namespace
+
+
+#endif //_GEOMETRY_INTERSECTION_POLYGON_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/intersection_segment.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/intersection_segment.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,252 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_INTERSECTION_SEGMENT_HPP
+#define _GEOMETRY_INTERSECTION_SEGMENT_HPP
+
+#include <limits>
+#include <vector>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/concepts/segment_concept.hpp>
+
+#include <geometry/util/math.hpp>
+#include <geometry/util/promotion_traits.hpp>
+
+
+namespace geometry
+{
+
+
+
+ /*!
+ \brief Enumeration containing intersection types
+ */
+ enum intersection_type {is_intersect_no,
+ is_intersect,
+ is_parallel,
+ is_collinear_no, is_collinear_one, is_collinear_connect, is_collinear_overlap,
+ is_collinear_overlap_opposite, is_collinear_connect_opposite};
+
+ /*!
+ \brief Enumeration containing connection types of intersected segments
+ */
+ enum connection_type { is_connect_no,
+ is_connect_s1p1, is_connect_s1p2,
+ is_connect_s2p1, is_connect_s2p2
+ };
+
+ /*!
+ \brief Encapsulates the result of a segment intersection.
+ \details The class contains the intersection type and two parameters
+ ra and rb, indicating how the two segments connect (if they connect).
+ This connection type can be examined with the method connection_type.
+ */
+ struct intersection_result
+ {
+ intersection_result()
+ : is_type(is_intersect_no)
+ , ra(0)
+ , rb(0)
+ {}
+
+ intersection_type is_type;
+ double ra;
+ double rb;
+
+ inline connection_type get_connection_type()
+ {
+ if (is_type == is_intersect)
+ {
+ if (equals(rb, 0.0)) return is_connect_s2p1;
+ if (equals(rb, 1.0)) return is_connect_s2p2;
+ if (equals(ra, 0.0)) return is_connect_s1p1;
+ if (equals(ra, 1.0)) return is_connect_s1p2;
+ }
+ return is_connect_no;
+ }
+
+ };
+
+
+
+
+ /*!
+ \brief Calculate zero, one or two intersections of two linesegments, using Cramer's rule.
+ \ingroup intersection
+ \details Two intersections are returned if segments are on same line and (partially) overlap.
+ One intersection is returned if segments intersect
+ Intersection points is vector of points, might be yet another pointtype then points making up segment
+ \tparam P type of outputted intersection point(s). Must be specified, cannot be deducted
+ from parameters. Type might be different from segment points.
+ \tparam S1 first segment type
+ \tparam S2 second segment type
+ \tparam O_IT output iterator
+ \param s1 first segment
+ \param s2 second segment
+ \param out output iterator
+ \return the intersection result, a struct containing the intersection type, and two calculated
+ values which can be examined further if necessary
+ \note <b>The algorithm is currently only implemented for 2D Cartesian points. It
+ will be redesigned to work with strategies.</b> Algorithms to calculate segment intersections
+ on a sphere are available, see http://williams.best.vwh.net/avform.htm.
+ \par Example:
+ Example showing intersection of two segments
+ \dontinclude doxygen_examples.cpp
+ \skip example_intersection_segment1
+ \line {
+ \until }
+ */
+ template <typename P, typename S1, typename S2, typename O_IT>
+ inline intersection_result intersection_segment(const S1& s1, const S2& s2, O_IT out)
+ {
+ BOOST_CONCEPT_ASSERT( (Point<P>) );
+
+ BOOST_CONCEPT_ASSERT( (ConstSegment<S1>) );
+ BOOST_CONCEPT_ASSERT( (ConstSegment<S2>) );
+
+ intersection_result result;
+
+ typedef typename select_coordinate_type<S1, S2>::type T;
+
+ T dx1 = get<1, 0>(s1) - get<0, 0>(s1);
+ T dx2 = get<1, 0>(s2) - get<0, 0>(s2);
+ T dy1 = get<1, 1>(s1) - get<0, 1>(s1);
+ T dy2 = get<1, 1>(s2) - get<0, 1>(s2);
+
+ T wx = get<0, 0>(s1) - get<0, 0>(s2);
+ T wy = get<0, 1>(s1) - get<0, 1>(s2);
+
+ // Calculate determinants - Cramers rule
+ T d = (dy2 * dx1) - (dx2 * dy1);
+ T a = (dx2 * wy) - (dy2 * wx);
+ T b = (dx1 * wy) - (dy1 * wx);
+
+ if(equals(d, 0))
+ {
+ if(equals(a, 0) && equals(b, 0))
+ {
+ bool vertical = equals(dx2, 0);
+
+ // Maybe change this by boost::minmax construct(s)
+
+ if (! vertical
+ && (std::min(get<0, 0>(s1), get<1, 0>(s1)) > std::max(get<0, 0>(s2), get<1, 0>(s2))
+ || std::min(get<0, 0>(s2), get<1, 0>(s2)) > std::max(get<0, 0>(s1), get<1, 0>(s1))))
+ {
+ // No overlap, segments are not connected
+ result.is_type = is_collinear_no;
+ return result;
+ }
+ else if (vertical
+ && (std::min(get<0, 1>(s1), get<1, 1>(s1)) > std::max(get<0, 1>(s2), get<1, 1>(s2))
+ || std::min(get<0, 1>(s2), get<1, 1>(s2)) > std::max(get<0, 1>(s1), get<1, 1>(s1))))
+ {
+ // No overlap, vertical segments are not connected
+ result.is_type = is_collinear_no;
+ return result;
+ }
+ else
+ {
+ // Partial or full overlap, calculate ratio in x-direction, for vertical lines in y-direction
+ // Adapted from http://www.geometryalgorithms.com/Archive/algorithm_0104/algorithm_0104B.htm
+ // Copyright 2001, softSurfer (www.softsurfer.com)
+ // This code may be freely used and modified for any purpose
+ // providing that this copyright notice is included with it.
+ // SoftSurfer makes no warranty for this code, and cannot be held
+ // liable for any real or imagined damage resulting from its use.
+ // Users of this code must verify correctness for their application.
+
+ // Segments of single point, with overlap
+ if (equals(dx1, 0) && equals(dy1, 0))
+ {
+ // Take point on first segment
+ // TODO: copy constructor only works for points with same type. Change.
+ P p(s1.first);
+ *out = p;
+ out++;
+ result.is_type = is_collinear_one;
+ return result;
+ }
+ if (equals(dx2, 0) && equals(dy2, 0))
+ {
+ P p(s2.first);
+ *out = p;
+ out++;
+ result.is_type = is_collinear_one;
+ return result;
+ }
+
+ result.ra = vertical
+ ? wy / dy2
+ : wx / dx2;
+ result.rb = vertical
+ ? (get<1, 1>(s1) - get<0, 1>(s2)) / dy2
+ : (get<1, 0>(s1) - get<0, 0>(s2)) / dx2;
+
+ result.is_type = is_collinear_overlap;
+ // Make sure a<b and a>= 0 and b<=1
+ if (result.ra > result.rb)
+ {
+ std::swap(result.ra, result.rb);
+ result.is_type = is_collinear_overlap_opposite;
+ }
+ if (result.ra < 0.0) result.ra = 0.0;
+ if (result.rb > 1.0) result.rb = 1.0;
+
+ // Calculate first intersection point
+ *out = P(get<0, 0>(s2) + result.ra * dx2, get<0, 1>(s2) + result.ra * dy2);
+ out++;
+
+ if (equals(result.ra, result.rb))
+ {
+ // Intersect with overlap at one point, segments connect
+ // They might connect in opposite direction and give different result (TODO)
+ result.is_type = is_collinear_connect;
+ return result;
+ }
+
+ // Calculate second intersection point
+ *out = P(get<0, 0>(s2) + result.rb * dx2, get<0, 1>(s2) + result.rb * dy2);
+ out++;
+ return result;
+ }
+ }
+
+ // Segments are parallel
+ result.is_type = is_parallel;
+ return result;
+ }
+
+ // Segments do intersect. Determinant d is nonzero.
+ result.ra = double(a) / double(d);
+ result.rb = double(b) / double(d);
+
+ // Check if intersection is on segment
+ if(result.ra >= 0.0 && result.ra <= 1.0
+ && result.rb >= 0.0 && result.rb <= 1.0)
+ {
+ // This is the normal case. All above are exceptions. Calculate intersection point.
+ *out = P(get<0, 0>(s1) + result.ra * dx1, get<0, 1>(s1) + result.ra * dy1);
+ out++;
+
+ result.is_type = is_intersect;
+ return result;
+ }
+
+ result.is_type = is_intersect_no;
+ return result;
+ }
+
+
+} // namespace
+
+
+#endif //_GEOMETRY_INTERSECTION_SEGMENT_HPP
+
+

Added: sandbox/ggl/boost/ggl/geometry/algorithms/length.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/length.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,151 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_LENGTH_HPP
+#define _GEOMETRY_LENGTH_HPP
+
+#include <iterator>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/cs.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+
+/*!
+\defgroup length length calculation
+The length algorithm is implemented for the linestring and the multi_linestring geometry and results
+in the length of the linestring. If the points of a linestring have coordinates expressed in kilometers,
+the length of the line is expressed in kilometers as well.
+\par Example:
+Example showing length calculation
+\dontinclude doxygen_examples.cpp
+\skip example_length_linestring_iterators1
+\line {
+\until }
+*/
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace length
+ {
+
+ /*!
+ \brief Internal, calculates length of a linestring using iterator pairs and specified strategy
+ \note for_each could be used here, now that point_type is changed by boost range iterator
+ */
+ template<typename R, typename S>
+ inline double length_range(const R& range, const S& strategy)
+ {
+ double sum = 0.0;
+
+ typedef typename boost::range_const_iterator<R>::type IT;
+ IT it = boost::begin(range);
+ if (it != boost::end(range))
+ {
+ IT previous = it++;
+ while(it != boost::end(range))
+ {
+ // Add point-point distance using the return type belonging to strategy
+ sum += strategy(*previous, *it);
+ previous = it++;
+ }
+ }
+ return sum;
+ }
+
+
+ }
+ } // namespace impl
+ #endif
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G>
+ struct length
+ {
+ };
+
+ // Partial specializations
+ template <typename G>
+ struct length<linestring_tag, G>
+ {
+
+ inline static double calculate(const G& range)
+ {
+ typedef typename boost::range_value<G>::type P;
+ typedef typename cs_tag<P>::type TAG;
+ return impl::length::length_range(range,
+ typename strategy_distance<TAG, TAG, P, P>::type());
+ }
+
+ template<typename S>
+ inline static double calculate(const G& range, const S& strategy)
+ {
+ return impl::length::length_range(range, strategy);
+ }
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Calculate length of a geometry
+ \ingroup length
+ \details The function length returns the length of a geometry, using the default distance-calculation-strategy
+ \param geometry the geometry, being a geometry::linestring, vector, iterator pair, or any other boost compatible range
+ \return the length
+ Example showing length calculation on a vector
+ \dontinclude doxygen_examples.cpp
+ \skip example_length_linestring_iterators2
+ \line {
+ \until }
+ */
+ template<typename G>
+ inline double length(const G& geometry)
+ {
+ return dispatch::length<typename tag<G>::type, G>::calculate(geometry);
+ }
+
+ /*!
+ \brief Calculate length of a geometry
+ \ingroup length
+ \details The function length returns the length of a geometry, using specified strategy
+ \param geometry the geometry, being a geometry::linestring, vector, iterator pair, or any other boost compatible range
+ \param strategy strategy to be used for distance calculations.
+ \return the length
+ \par Example:
+ Example showing length calculation using iterators and the Vincenty strategy
+ \dontinclude doxygen_examples.cpp
+ \skip example_length_linestring_iterators3
+ \line {
+ \until }
+ */
+ template<typename G, typename S>
+ inline double length(const G& geometry, const S& strategy)
+ {
+ return dispatch::length<typename tag<G>::type, G>::calculate(geometry, strategy);
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_LENGTH_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/make.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/make.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,100 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_MAKE_HPP
+#define _GEOMETRY_MAKE_HPP
+
+
+#include <geometry/algorithms/assign.hpp>
+
+namespace geometry
+{
+
+ /*!
+ \brief Make a geometry
+ \ingroup access
+ \details The Geometry Library uses concepts for all its geometries. Therefore it does not rely
+ on constructors. The "make" functions are object generators creating geometries. There are overloads
+ with two, three, four or six values, which are implemented depending on the geometry specified.
+ \tparam G the geometry type
+ \tparam T the coordinate type
+ \return the geometry
+ */
+ template <typename G, typename T>
+ inline G make(const T& coor1, const T& coor2)
+ {
+ G geometry;
+ dispatch::assignment<typename tag<G>::type, G>::assign(geometry, coor1, coor2);
+ return geometry;
+ }
+
+
+ /*!
+ \brief Make a geometry
+ \ingroup access
+ \return a 3D point, a circle
+ */
+ template <typename G, typename T>
+ inline G make(const T& coor1, const T& coor2, const T& coor3)
+ {
+ G geometry;
+ dispatch::assignment<typename tag<G>::type, G>::assign(geometry, coor1, coor2, coor3);
+ return geometry;
+ }
+
+ template <typename G, typename T>
+ inline G make(const T& coor1, const T& coor2, const T& coor3, const T& coor4)
+ {
+ G geometry;
+ dispatch::assignment<typename tag<G>::type, G>::assign(geometry, coor1, coor2, coor3, coor4);
+ return geometry;
+ }
+
+ template <typename G, typename R>
+ inline G make(const R& range)
+ {
+ G geometry;
+ append(geometry, range);
+ return geometry;
+ }
+
+
+ /*!
+ \brief Create a box with inverse infinite coordinates
+ \ingroup access
+ \details The make_inverse function initialize a 2D or 3D box with large coordinates, the
+ min corner is very large, the max corner is very small
+ \tparam G the geometry type
+ \return the box
+ */
+ template <typename G>
+ inline G make_inverse()
+ {
+ G geometry;
+ dispatch::assignment<typename tag<G>::type, G>::assign_inverse(geometry);
+ return geometry;
+ }
+
+ /*!
+ \brief Create a geometry with "zero" coordinates
+ \ingroup access
+ \details The make_zero function initializes a 2D or 3D point or box with coordinates of zero
+ \tparam G the geometry type
+ \return the geometry
+ */
+ template <typename G>
+ inline G make_zero()
+ {
+ G geometry;
+ dispatch::assignment<typename tag<G>::type, G>::assign_zero(geometry);
+ return geometry;
+ }
+
+};
+
+#endif // _GEOMETRY_MAKE_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/num_points.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/num_points.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,116 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_NUM_POINTS_HPP
+#define _GEOMETRY_NUM_POINTS_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ template <typename R>
+ struct range_number_of_points
+ {
+ static inline size_t get(const R& range)
+ {
+ return boost::size(range);
+ }
+ };
+
+ template <typename G, size_t D>
+ struct other_number_of_points
+ {
+ static inline size_t get(const G& geometry)
+ {
+ return D;
+ }
+ };
+
+
+ template <typename P>
+ struct polygon_number_of_points
+ {
+ static inline size_t get(const P& poly)
+ {
+ size_t n = boost::size(exterior_ring(poly));
+ typedef typename boost::range_const_iterator<typename interior_type<P>::type>::type IT;
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ n += boost::size(*it);
+ }
+
+ return n;
+ }
+ };
+
+
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G>
+ struct num_points {};
+
+ template <typename G>
+ struct num_points<point_tag, G> : impl::other_number_of_points<G, 1> {};
+
+ template <typename G>
+ struct num_points<box_tag, G> : impl::other_number_of_points<G, 4> {};
+
+ template <typename G>
+ struct num_points<segment_tag, G> : impl::other_number_of_points<G, 2> {};
+
+ template <typename G>
+ struct num_points<nsphere_tag, G> : impl::other_number_of_points<G, 1> {};
+
+ template <typename G>
+ struct num_points<linestring_tag, G> : impl::range_number_of_points<G> {};
+
+ template <typename G>
+ struct num_points<ring_tag, G> : impl::range_number_of_points<G> {};
+
+ template <typename G>
+ struct num_points<polygon_tag, G> : impl::polygon_number_of_points<G> {};
+
+ } // namespace dispatch
+ #endif
+
+
+
+ /*!
+ \brief get number of points
+ \ingroup access
+ \tparam G geometry type
+ \param geometry the geometry to get number of points from
+ \return number of points
+ \note For linestrings/rings also boost::size or .size() could be used, however,
+ for polygons this is less obvious. So this function is provided. Besides that
+ it is described by OGC (numPoints)
+ */
+ template <typename G>
+ inline size_t num_points(G& geometry)
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ return dispatch::num_points<typename tag<G>::type, NCG>::get(geometry);
+ }
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/algorithms/overlaps.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/overlaps.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,53 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_OVERLAPS_HPP
+#define _GEOMETRY_OVERLAPS_HPP
+
+
+/*!
+\defgroup overlap overlap detection
+\par Source descriptions:
+- Egenhofer: Two objects overlap if they have common interior faces and the bounding faces have common parts
+with the opposite interior faces.
+
+\note Implemented in scratch the Generic Geometry library. Will be reworked internally to support more geometries
+but function call will stay as it is now.
+\see http://docs.codehaus.org/display/GEOTDOC/02+Geometry+Relationships#02GeometryRelationships-Overlaps
+ where is stated that "inside" is not an "overlap", this is probably true and should then be implemented as such.
+
+*/
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief Determines overlap between two geometries
+ \details parameters are now boxes but in the future will be geometries
+ \ingroup overlap
+ \return true if there is overlap
+ */
+ template <typename B>
+ bool overlaps(const B& b1, const B& b2)
+ {
+ return !(
+ get<max_corner, 0>(b1) <= get<min_corner, 0>(b2) ||
+ get<min_corner, 0>(b1) >= get<max_corner, 0>(b2) ||
+ get<max_corner, 1>(b1) <= get<min_corner, 1>(b2) ||
+ get<min_corner, 1>(b1) >= get<max_corner, 1>(b2)
+ );
+
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_OVERLAPS_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/parse.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/parse.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,114 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_PARSE_HPP
+#define _GEOMETRY_PARSE_HPP
+
+#include <string>
+
+#include <boost/concept/requires.hpp>
+
+#include <geometry/core/tags.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+
+
+
+
+/*!
+\defgroup parse parse and assign string values
+*/
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G>
+ struct parsing {};
+
+
+ template <typename P>
+ struct parsing<point_tag, P>
+ {
+ template <typename S>
+ static inline void parse(P& point, const std::string& coor1, const std::string& coor2, const S& strategy)
+ {
+ assert_dimension<P, 2>();
+ dms_result r1 = strategy(coor1.c_str());
+ dms_result r2 = strategy(coor2.c_str());
+ if (r1.axis() == 0) set<0>(point, r1); else set<1>(point, r1);
+ if (r2.axis() == 0) set<0>(point, r2); else set<1>(point, r2);
+ }
+
+
+ static inline void parse(P& point, const std::string& coor1, const std::string& coor2)
+ {
+ // strategy-parser corresponding to degree/radian
+ typename strategy_parse<typename cs_tag<P>::type,
+ typename coordinate_system<P>::type>::type strategy;
+ parse(point, coor1, coor2, strategy);
+ }
+
+
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+
+
+ /*!
+ \brief parse two strings to a spherical/geographic point, using W/E/N/S
+ \ingroup parse
+ */
+ template <typename G>
+ inline void parse(G& geometry, const std::string& coor1, const std::string& coor2)
+ {
+ dispatch::parsing<typename tag<G>::type, G>::parse(geometry, coor1, coor2);
+ }
+
+ /*!
+ \brief parse two strings to a spherical/geographic point, using a specified strategy
+ \details user can use N/E/S/O or N/O/Z/W or other formats
+ \ingroup parse
+ */
+ template <typename G, typename S>
+ inline void parse(G& geometry, const std::string& coor1, const std::string& coor2, const S& strategy)
+ {
+ dispatch::parsing<typename tag<G>::type, G>::parse(geometry, coor1, coor2, strategy);
+ }
+
+ // There will be a parsing function with three arguments (ANGLE,ANGLE,RADIUS)
+
+ template <typename G>
+ inline G parse(const std::string& coor1, const std::string& coor2)
+ {
+ G geometry;
+ dispatch::parsing<typename tag<G>::type, G>::parse(geometry, coor1, coor2);
+ return geometry;
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_PARSE_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/selected.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/selected.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,265 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_SELECTED_HPP
+#define _GEOMETRY_SELECTED_HPP
+
+#include <cmath> // fabs
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/topological_dimension.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/nsphere_concept.hpp>
+
+#include <geometry/algorithms/within.hpp>
+
+
+/*!
+\defgroup selected selection: check if a geometry is "selected" by a point
+
+Checks if one geometry is selected by a point lying within or in the neighborhood of that geometry
+
+\par Geometries:
+- POINT: checks if points are CLOSE TO each other (< search_radius)
+- LINESTRING: checks if selection point is CLOSE TO linestring (< search_radius)
+- RING: checks if selection point is INSIDE the ring, search radius is ignored
+- POLYGON: checks if selection point is INSIDE the polygon, but not inside any of its holes
+
+*/
+
+
+namespace geometry
+{
+ /*!
+ \ingroup impl
+ */
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace selected
+ {
+
+ /*!
+ \details Checks, per dimension, if d[I] not larger than search distance. If true for all
+ dimensions then returns true. If larger stops immediately and returns false.
+ Calculate during this process the sum, which is only valid if returning true
+ */
+ template <typename P1, typename P2, typename T, size_t D, size_t N>
+ struct differences_loop
+ {
+ static inline bool close(const P1& p1, const P2& p2, const T& distance, T& sum)
+ {
+ typedef typename select_coordinate_type<P1, P2>::type PT;
+ typedef typename select_type_traits<PT, T>::type T2;
+ T d = std::abs(boost::numeric_cast<PT>(get<D>(p1)) - boost::numeric_cast<PT>(get<D>(p2)));
+ if (d > distance)
+ {
+ return false;
+ }
+ sum += d * d;
+ return differences_loop<P1, P2, T, D + 1, N>::close(p1, p2, distance, sum);
+ }
+ };
+
+ template <typename P1, typename P2, typename T, size_t N>
+ struct differences_loop<P1, P2, T, N, N>
+ {
+ static inline bool close(const P1&, const P2&, const T&, T&)
+ {
+ return true;
+ }
+ };
+
+
+ template <typename S, typename P, typename T, size_t D, size_t N>
+ struct outside_loop
+ {
+ static inline bool outside(const S& seg, const P& point, const T& distance)
+ {
+ typedef typename select_coordinate_type<S, P>::type PT;
+ PT v = boost::numeric_cast<PT>(get<D>(point));
+
+ PT s1 = get<0, D>(seg);
+ PT s2 = get<1, D>(seg);
+ // Out of reach if left/bottom or right/top of both points making up the segment
+ // I know and currently accept that these comparisons/calculations are done twice per point
+ if ((v < s1 - distance && v < s2 - distance) || (v > s1 + distance && v > s2 + distance))
+ {
+ return true;
+ }
+ return outside_loop<S, P, T, D + 1, N>::outside(seg, point, distance);
+ }
+ };
+
+ template <typename S, typename P, typename T, size_t N>
+ struct outside_loop<S, P, T, N, N>
+ {
+ static inline bool outside(const S&, const P&, const T&)
+ {
+ return false;
+ }
+ };
+
+
+ template <typename P, typename SP, typename T>
+ struct close_to_point
+ {
+ inline static bool calculate(const P& point, const P& selection_point, const T& search_radius)
+ {
+ assert_dimension_equal<P, SP>();
+ static const size_t N = dimension<P>::value;
+ T sum = 0;
+ if (differences_loop<P, SP, T, 0, N>::close(point, selection_point, search_radius, sum))
+ {
+ return sum <= search_radius * search_radius;
+ }
+ return false;
+ }
+ };
+
+ template <typename S, typename P, typename T>
+ struct close_to_segment
+ {
+ inline static bool calculate(const S& seg, const P& selection_point, const T& search_radius)
+ {
+ assert_dimension_equal<S, P>();
+ static const size_t N = dimension<P>::value;
+ if (! outside_loop<S, P, T, 0, N>::outside(seg, selection_point, search_radius))
+ {
+ // Not outside, calculate dot product/square distance to segment.
+ // Call corresponding strategy
+ typedef typename strategy_distance_segment<
+ typename cs_tag<P>::type,
+ typename cs_tag<S>::type, P, S>::type STRATEGY;
+
+ typedef typename STRATEGY::return_type R;
+ STRATEGY strategy;
+ R result = strategy(selection_point, seg);
+ return result < search_radius;
+ }
+
+ return false;
+ }
+ };
+
+
+ template <typename R, typename P, typename T>
+ struct close_to_range
+ {
+ inline static bool calculate(const R& range, const P& selection_point, const T& search_radius)
+ {
+ assert_dimension_equal<R, P>();
+
+ size_t n = boost::size(range);
+ if (n == 0)
+ {
+ // Line with zero points, never close
+ return false;
+ }
+
+ typedef typename point_type<R>::type PR;
+ typedef typename boost::range_const_iterator<R>::type IT;
+ IT it = boost::begin(range);
+
+ if (n == 1)
+ {
+ // Line with one point ==> close to point
+ return close_to_point<P, PR, T>::calculate(*it, selection_point, search_radius);
+ }
+
+ IT previous = it++;
+ while(it != boost::end(range))
+ {
+ typedef segment<const PR> S;
+ S s(*previous, *it);
+ if (close_to_segment<S, P, T>::calculate(s, selection_point, search_radius))
+ {
+ return true;
+ }
+ previous = it++;
+ }
+
+ return false;
+ }
+ };
+
+
+ template <typename TAG, typename G, typename P, typename T>
+ struct use_within
+ {
+ inline static bool calculate(const G& geometry, const P& selection_point, const T& search_radius)
+ {
+ // Note the reversion, point-in-poly -> first point, then poly
+ // Selected-at-point -> first geometry, then point
+ return dispatch::within<point_tag, TAG, P, G>::calculate(selection_point, geometry);
+ }
+ };
+
+ } // namespace selected
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ /*!
+ \tparam TD topological dimension
+ */
+ template <typename TAG, typename G, size_t TD, typename P, typename T>
+ struct selected
+ {
+ };
+
+ template <typename P, typename SP, typename T>
+ struct selected<point_tag, P, 0, SP, T> : impl::selected::close_to_point<P, SP, T> { };
+
+ // SEGMENT, TODO HERE (close_to_segment)
+
+ template <typename L, typename P, typename T>
+ struct selected<linestring_tag, L, 1, P, T> : impl::selected::close_to_range<L, P, T> { };
+
+ template <typename TAG, typename G, typename P, typename T>
+ struct selected<TAG, G, 2, P, T> : impl::selected::use_within<TAG, G, P, T> { };
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Checks if one geometry is selected by a point lying within or in the neighborhood of that geometry
+ \ingroup selected
+ \tparam G type of geometry to check
+ \tparam P type of point to check
+ \tparam T type of search radius
+ \param geometry geometry which might be located in the neighborhood
+ \param selection_point point to select the geometry
+ \param search_radius for points/linestrings: defines radius of "neighborhood" to find things in
+ \return true if point is within or close to the other geometry
+
+ */
+ template<typename G, typename P, typename T>
+ inline bool selected(const G& geometry, const P& selection_point, const T& search_radius)
+ {
+ return dispatch::selected<typename tag<G>::type, G,
+ topological_dimension<G>::value,
+ P, T>::calculate(geometry, selection_point, search_radius);
+ }
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_SELECTED_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/simplify.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/simplify.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,300 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_SIMPLIFY_HPP
+#define _GEOMETRY_SIMPLIFY_HPP
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/cs.hpp>
+#include <geometry/core/ring_type.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/algorithms/distance.hpp>
+#include <geometry/strategies/agnostic/agn_simplify.hpp>
+
+
+/*!
+\defgroup simplify simplification (generalization)
+\par Source description:
+- Wikipedia: given a 'curve' composed of line segments to find a curve not too dissimilar but that has fewer points
+
+\see http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
+
+\par Performance
+Performance is measured on simplification of a collection of rings, such that 10% of the points is kept.
+- 2776 counties of US are simplified in 0.8 seconds (2.5 seconds or 11.5 seconds in 2 other libraries)
+- 3918 zipcode areas of the Netherlands are simplified in 0.03 seconds (0.1 seconds or 0.45 seconds in 2 other libraries)
+
+
+\par Geometries
+- LINESTRING:
+ \image html simplify_linestring.png
+- POLYGON: simplifying a valid simple polygon (which never intersects itself) might result in an invalid polygon,
+where the simplified rings intersect themselves or one of the other outer or inner rings.
+Efficient simplification of a ring/polygon is still an "Open Problem"
+(http://maven.smith.edu/~orourke/TOPP/P24.html#Problem.24)
+
+*/
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace simplify
+ {
+
+ template<typename R, typename O_IT, typename S>
+ inline void simplify_range_strategy(const R& range, O_IT out, double max_distance, const S& strategy)
+ {
+ if (boost::begin(range) == boost::end(range) || max_distance < 0)
+ {
+ std::copy(boost::begin(range), boost::end(range), out);
+ return;
+ }
+ typename boost::range_const_iterator<R>::type it = boost::begin(range) + 1;
+ if (it == boost::end(range) || it + 1 == boost::end(range))
+ {
+ std::copy(boost::begin(range), boost::end(range), out);
+ return;
+ }
+
+ strategy.simplify(range, out, max_distance);
+ }
+
+ template<typename R, typename O_IT>
+ inline void simplify_range(const R& range, O_IT out, double max_distance)
+ {
+ // Define default strategy
+ typedef typename point_type<R>::type P;
+ typedef typename cs_tag<P>::type TAG;
+ typedef typename strategy_distance_segment<TAG, TAG, P, segment<const P> >::type S;
+
+ strategy::simplify::douglas_peucker<R, O_IT, S> douglas;
+
+ simplify_range_strategy(range, out, max_distance, douglas);
+ }
+
+
+
+ template<typename R, typename O_IT, typename S>
+ inline void simplify_ring(const R& r_in, O_IT out, double max_distance, const S& strategy)
+ {
+ // Call do_container for a ring
+
+ // The first/last point (the closing point of the ring) should maybe be excluded because it
+ // lies on a line with second/one but last. Here it is never excluded.
+
+ // Note also that, especially if max_distance is too large, the output ring might be self intersecting
+ // while the input ring is not, although chances are low in normal polygons
+
+ // Finally the inputring might have 4 points (=correct), the output < 4(=wrong)
+ if (boost::size(r_in) <= 4 || max_distance < 0)
+ {
+ std::copy(boost::begin(r_in), boost::end(r_in), out);
+ }
+ else
+ {
+ simplify_range_strategy(r_in, out, max_distance, strategy);
+ }
+ }
+
+ template<typename Y, typename S>
+ inline void simplify_polygon(const Y& poly_in, Y& poly_out, double max_distance, const S& strategy)
+ {
+ poly_out.clear();
+
+ // Note that if there are inner rings, and distance is too large, they might intersect with the
+ // outer ring in the output, while it didn't in the input.
+ simplify_ring(exterior_ring(poly_in), std::back_inserter(exterior_ring(poly_out)), max_distance, strategy);
+
+ interior_rings(poly_out).resize(boost::size(interior_rings(poly_in)));
+ typedef typename boost::range_const_iterator<typename interior_type<Y>::type>::type CIT;
+ typedef typename boost::range_iterator<typename interior_type<Y>::type>::type IT;
+
+ CIT it_in = boost::begin(interior_rings(poly_in));
+ IT it_out = boost::begin(interior_rings(poly_out));
+
+ for (; it_in != boost::end(interior_rings(poly_in)); it_in++, it_out++)
+ {
+ simplify_ring(*it_in, std::back_inserter(*it_out), max_distance, strategy);
+ }
+ }
+
+ template<typename Y>
+ inline void simplify_polygon(const Y& poly_in, Y& poly_out, double max_distance)
+ {
+ // Define default strategy
+ typedef typename ring_type<Y>::type R;
+ typedef std::back_insert_iterator<R> O_IT;
+
+ typedef typename point_type<Y>::type P;
+ typedef typename cs_tag<P>::type TAG;
+ typedef typename strategy_distance_segment<TAG, TAG, P, segment<const P> >::type S;
+
+ strategy::simplify::douglas_peucker<R, O_IT, S> douglas;
+
+ simplify_polygon(poly_in, poly_out, max_distance, douglas);
+ }
+
+
+
+
+ } // namespace simplify
+
+ } // namespace impl
+ #endif // DOXYGEN_NO_IMPL
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G>
+ struct simplify
+ {
+ };
+
+ // Partial specializations
+ template <typename R>
+ struct simplify<linestring_tag, R>
+ {
+
+
+ template<typename O_IT, typename S>
+ inline static void calculate(const R& range, O_IT out, double max_distance, const S& strategy)
+ {
+ strategy.simplify(range, out, max_distance);
+ }
+
+ template<typename O_IT>
+ inline static void calculate(const R& range, O_IT out, double max_distance)
+ {
+ // Define default strategy
+ typedef typename point_type<R>::type P;
+ typedef typename cs_tag<P>::type TAG;
+ typedef typename strategy_distance_segment<TAG, TAG, P, segment<const P> >::type S;
+
+ strategy::simplify::douglas_peucker<R, O_IT, S> douglas;
+
+ impl::simplify::simplify_range_strategy(range, out, max_distance, douglas);
+ }
+
+ };
+
+ template <typename P>
+ struct simplify<polygon_tag, P>
+ {
+ /// Simplify a polygon, using a strategy
+ template<typename S>
+ inline static void calculate(const P& poly_in, P& poly_out, double max_distance, const S& strategy)
+ {
+ impl::simplify::simplify_polygon(poly_in, poly_out, max_distance, strategy);
+ }
+
+ /// Simplify a polygon
+ inline static void calculate(const P& poly_in, P& poly_out, double max_distance)
+ {
+ impl::simplify::simplify_polygon(poly_in, poly_out, max_distance);
+ }
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+
+
+ // Model 1, using output iterator
+
+ /*!
+ \brief Simplify a geometry
+ \ingroup simplify
+ \details The simplify algorithm removes points, keeping the shape as much as possible.
+ This version of simplify uses an output iterator
+ \param geometry the geometry to be simplified, being a geometry::linestring, vector, iterator pair, or any other boost compatible range
+ \param out output iterator, outputs all simplified points
+ \param max_distance distance (in units of input coordinates) of a vertex to other segments to be removed
+ \par Example:
+ The simplify algorithm can be used as following:
+ \dontinclude doxygen_examples.cpp
+ \skip example_simplify_linestring1
+ \line {
+ \until }
+ */
+ template<typename G, typename O>
+ inline void simplify(const G& geometry, O out, double max_distance)
+ {
+ dispatch::simplify<typename tag<G>::type, G>::calculate(geometry, out, max_distance);
+ }
+
+ /*!
+ \brief Simplify a geometry
+ \ingroup simplify
+ \details The simplify algorithm removes points, keeping the shape as much as possible.
+ This version of simplify uses an output iterator and a simplify strategy
+ \param geometry the geometry to be simplified, being a geometry::linestring, vector, iterator pair, or any other boost compatible range
+ \param out output iterator, outputs all simplified points
+ \param max_distance distance (in units of input coordinates) of a vertex to other segments to be removed
+ \param strategy simplify strategy to be used for simplification, might include point-distance strategy
+ \par Example:
+ The simplify algorithm with strategy can be used as following:
+ \dontinclude doxygen_examples.cpp
+ \skip example_simplify_linestring2
+ \line {
+ \until }
+ */
+ template<typename G, typename O, typename S>
+ inline void simplify(const G& geometry, O out, double max_distance, const S& strategy)
+ {
+ dispatch::simplify<typename tag<G>::type, G>::calculate(geometry, out, max_distance, strategy);
+ }
+
+
+
+ // Model 2, where output is same type as input
+
+ /*!
+ \brief Simplify a geometry
+ \ingroup simplify
+ \details This version of simplify simplifies a geometry using the default strategy (Douglas Peucker),
+ where the output is of the same geometry type as the input.
+ \param geometry input geometry, to be simplified
+ \param out output geometry, simplified version of the input geometry
+ \param max_distance distance (in units of input coordinates) of a vertex to other segments to be removed
+ */
+ template<typename G>
+ inline void simplify(const G& geometry, G& out, double max_distance)
+ {
+ dispatch::simplify<typename tag<G>::type, G>::calculate(geometry, out, max_distance);
+ }
+
+
+
+ /*!
+ \brief Simplify a geometry
+ \ingroup simplify
+ \details This version of simplify simplifies a geometry using a specified strategy
+ where the output is of the same geometry type as the input.
+ \param geometry input geometry, to be simplified
+ \param out output geometry, simplified version of the input geometry
+ \param max_distance distance (in units of input coordinates) of a vertex to other segments to be removed
+ \param strategy simplify strategy to be used for simplification, might include point-distance strategy
+ */
+ template<typename G, typename S>
+ inline void simplify(const G& geometry, G& out, double max_distance, const S& strategy)
+ {
+ dispatch::simplify<typename tag<G>::type, G>::calculate(geometry, out, max_distance, strategy);
+ }
+
+} // namespace geometry
+
+#endif // _GEOMETRY_SIMPLIFY_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/transform.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/transform.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,262 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_TRANSFORM_HPP
+#define _GEOMETRY_TRANSFORM_HPP
+
+#include <cmath>
+#include <iterator>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/cs.hpp>
+#include <geometry/core/ring_type.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/geometries/segment.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+#include <geometry/algorithms/clear.hpp>
+
+
+/*!
+\defgroup transform transformations
+\brief Transforms from one geometry to another geometry, optionally using a strategy
+\details The transform algorithm automatically transforms from one coordinate system to another coordinate system.
+If the coordinate system of both geometries are the same, the geometry is copied. All point(s of the geometry)
+are transformed.
+
+There is a version without a strategy, transforming automatically, and there is a version with a strategy.
+
+This function has a lot of appliances, for example
+- transform from spherical coordinates to cartesian coordinates, and back
+- transform from geographic coordinates to cartesian coordinates (projections) and back
+- transform from degree to radian, and back
+- transform from and to cartesian coordinates (mapping, translations, etc)
+
+The automatic transformations look to the coordinate system family, and dimensions, of the point type and by this
+apply the strategy (internally bounded by traits classes).
+
+\par Examples:
+The example below shows automatic transformations to go from one coordinate system to another one:
+\dontinclude doxygen_2.cpp
+\skip example_for_transform()
+\skipline XYZ
+\until endl;
+
+The next example takes another approach and transforms from Cartesian to Cartesian:
+\skipline XY
+\until endl;
+See also \link p03_projmap_example.cpp the projmap example \endlink
+where this last one plus a transformation using a projection are used.
+
+\note Not every possibility is yet worked out, e.g. polar coordinate system is ignored until now
+\note This "transform" is broader then geodetic datum transformations, those are currently not worked out
+
+*/
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace transform
+ {
+ template <typename P1, typename P2, typename S>
+ inline bool transform_point(const P1& p1, P2& p2, const S& strategy)
+ {
+ return strategy(p1, p2);
+ }
+
+ template <typename P_OUT, typename O_IT, typename R, typename S>
+ inline bool transform_range_out(const R& range, O_IT out, const S& strategy)
+ {
+ P_OUT p_out;
+ for(typename boost::range_const_iterator<R>::type it = boost::begin(range);
+ it != boost::end(range); it++)
+ {
+ if (! transform_point(*it, p_out, strategy))
+ {
+ return false;
+ }
+ *out = p_out;
+ out++;
+ }
+ return true;
+ }
+
+ template <typename P1, typename P2, typename S>
+ inline bool transform_polygon(const P1& poly1, P2& poly2, const S& strategy)
+ {
+ typedef typename interior_type<P1>::type IR1;
+ typedef typename interior_type<P2>::type IR2;
+ typedef typename ring_type<P1>::type R1;
+ typedef typename ring_type<P2>::type R2;
+
+ typedef typename point_type<P2>::type POINT2;
+
+ geometry::clear(poly2);
+
+ if (! transform_range_out<POINT2>(exterior_ring(poly1), std::back_inserter(exterior_ring(poly2)), strategy))
+ {
+ return false;
+ }
+
+ interior_rings(poly2).resize(boost::size(interior_rings(poly1)));
+
+ typename boost::range_const_iterator<IR1>::type it1 = boost::begin(interior_rings(poly1));
+ typename boost::range_iterator<IR2>::type it2 = boost::begin(interior_rings(poly2));
+ for ( ; it1 != boost::end(interior_rings(poly1)); it1++, it2++)
+ {
+ if (! transform_range_out<POINT2>(*it1, std::back_inserter(*it2), strategy))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ template <typename P1, typename P2>
+ struct select_strategy
+ {
+ typedef typename strategy_transform<
+ typename cs_tag<P1>::type,
+ typename cs_tag<P2>::type,
+ typename coordinate_system<P1>::type,
+ typename coordinate_system<P2>::type,
+ dimension<P1>::value,
+ dimension<P2>::value,
+ P1, P2>::type type;
+ };
+
+
+
+
+ template <typename R1, typename R2>
+ struct transform_range
+ {
+ template <typename S>
+ inline static bool calculate(const R1& range1, R2& range2, const S& strategy)
+ {
+ typedef typename point_type<R2>::type P2;
+ clear(range2);
+ return transform_range_out<P2>(range1, std::back_inserter(range2), strategy);
+ }
+
+ inline static bool calculate(const R1& range1, R2& range2)
+ {
+ typename select_strategy<typename point_type<R1>::type,
+ typename point_type<R2>::type>::type strategy;
+ return calculate(range1, range2, strategy);
+ }
+ };
+
+ } // namespace transform
+
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG1, typename TAG2, typename G1, typename G2>
+ struct transform {};
+
+
+ template <typename P1, typename P2>
+ struct transform<point_tag, point_tag, P1, P2>
+ {
+ template <typename S>
+ inline static bool calculate(const P1& p1, P2& p2, const S& strategy)
+ {
+ return impl::transform::transform_point(p1, p2, strategy);
+ }
+
+ inline static bool calculate(const P1& p1, P2& p2)
+ {
+ typename impl::transform::select_strategy<P1, P2>::type strategy;
+ return calculate(p1, p2, strategy);
+ }
+ };
+
+
+ template <typename L1, typename L2>
+ struct transform<linestring_tag, linestring_tag, L1, L2> : impl::transform::transform_range<L1, L2> {};
+
+
+ template <typename R1, typename R2>
+ struct transform<ring_tag, ring_tag, R1, R2> : impl::transform::transform_range<R1, R2> {};
+
+ template <typename P1, typename P2>
+ struct transform<polygon_tag, polygon_tag, P1, P2>
+ {
+ template <typename S>
+ inline static bool calculate(const P1& p1, P2& p2, const S& strategy)
+ {
+ return impl::transform::transform_polygon(p1, p2, strategy);
+ }
+
+ inline static bool calculate(const P1& p1, P2& p2)
+ {
+ typename impl::transform::select_strategy<
+ typename point_type<P1>::type,
+ typename point_type<P2>::type>::type strategy;
+ return calculate(p1, p2, strategy);
+ }
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+
+
+
+ /*!
+ \brief Transforms from one geometry to another geometry using a strategy
+ \ingroup transform
+ \tparam G1 first geometry type
+ \tparam G2 second geometry type
+ \tparam S strategy
+ \param geometry1 first geometry
+ \param geometry2 second geometry
+ \param strategy the strategy to be used for transformation
+ */
+ template <typename G1, typename G2, typename S>
+ inline bool transform(const G1& geometry1, G2& geometry2, const S& strategy)
+ {
+ return dispatch::transform<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2, strategy);
+ }
+
+ /*!
+ \brief Transforms from one geometry to another geometry using a strategy
+ \ingroup transform
+ \tparam G1 first geometry type
+ \tparam G2 second geometry type
+ \param geometry1 first geometry
+ \param geometry2 second geometry
+ \return true if the transformation could be done
+ */
+ template <typename G1, typename G2>
+ inline bool transform(const G1& geometry1, G2& geometry2)
+ {
+ return dispatch::transform<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2);
+ }
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_TRANSFORM_HPP

Added: sandbox/ggl/boost/ggl/geometry/algorithms/within.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/algorithms/within.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,355 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_WITHIN_HPP
+#define _GEOMETRY_WITHIN_HPP
+
+#include <boost/concept/requires.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/nsphere_concept.hpp>
+
+#include <geometry/core/cs.hpp>
+
+#include <geometry/algorithms/distance.hpp>
+#include <geometry/algorithms/make.hpp>
+
+#include <geometry/util/loop.hpp>
+
+
+#include <geometry/strategies/strategies.hpp>
+
+
+/*!
+\defgroup within within: examine if one geometry is within another geometry (a.o. point in polygon)
+
+\par Source descriptions:
+- OGC: Returns 1 (TRUE) if this geometric object is "spatially within" another Geometry.
+
+\par Performance
+2776 within determinations using bounding box and polygon are done in 0.09 seconds (other libraries: 0.14 seconds, 3.0 seconds, 3.8)
+
+\par Example:
+The within algorithm is used as following:
+\dontinclude doxygen_examples.cpp
+\skip example_within
+\line {
+\until }
+\par Geometries:
+- POINT + POLYGON: The well-known point-in-polygon, returning true if a point falls within a polygon (and not
+ within one of its holes) \image html within_polygon.png
+- POINT + RING: returns true if point is completely within a ring \image html within_ring.png
+*/
+
+
+namespace geometry
+{
+ /*!
+ \ingroup impl
+ */
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace within
+ {
+
+ // Within, should return true if one geometry falls completely within another geometry
+ // Geometries can lie in something with an area, so in an box, circle, linear_ring,polygon
+
+ //-------------------------------------------------------------------------------------------------------
+ // Implementation for boxes. Supports boxes in 2 or 3 dimensions, in Euclidian system
+ // Todo: implement as strategy
+ //-------------------------------------------------------------------------------------------------------
+ template <typename P, typename B, size_t D, size_t N>
+ struct point_in_box
+ {
+ static bool inside(const P& p, const B& b)
+ {
+ if (get<D>(p) <= get<min_corner, D>(b) || get<D>(p) >= get<max_corner, D>(b))
+ {
+ return false;
+ }
+
+ return point_in_box<P, B, D + 1, N>::inside(p, b);
+ }
+ };
+
+ template <typename P, typename B, size_t N>
+ struct point_in_box<P, B, N, N>
+ {
+ static bool inside(const P& p, const B& b)
+ {
+ return true;
+ }
+ };
+
+
+ //-------------------------------------------------------------------------------------------------------
+ // Implementation for n-spheres. Supports circles or spheres, in 2 or 3 dimensions, in Euclidian system
+ // Circle center might be of other point-type as geometry
+ // Todo: implement as strategy
+ //-------------------------------------------------------------------------------------------------------
+ template<typename P, typename C>
+ inline bool point_in_circle(const P& p, const C& c)
+ {
+ assert_dimension<C, 2>();
+ typedef typename point_type<C>::type PC;
+
+ typedef typename strategy_distance<typename cs_tag<P>::type,
+ typename cs_tag<PC>::type,
+ P, PC>::type S;
+ typedef typename S::return_type RET;
+
+ P center = geometry::make<P>(get<0>(c), get<1>(c));
+ S distance;
+ RET r = distance(p, center);
+ RET rad = make_distance_result<RET>(get_radius<0>(c));
+ return r < rad;
+ }
+ /// 2D version
+ template<typename T, typename C>
+ inline bool point_in_circle(const T& coor1, const T& coor2, const C& c)
+ {
+ typedef typename point_type<C>::type P;
+ P p = geometry::make<P>(coor1, coor2);
+ return point_in_circle(p, c);
+ }
+
+
+ template<typename B, typename C>
+ inline bool box_in_circle(const B& b, const C& c)
+ {
+ typedef typename point_type<B>::type P;
+
+ // Currently only implemented for 2d geometries
+ assert_dimension<P, 2>();
+ assert_dimension<C, 2>();
+
+ // Box: all four points must lie within circle
+
+ // Check points lower-left and upper-right, then lower-right and upper-left
+ return point_in_circle(get<min_corner, 0>(b), get<min_corner, 1>(b), c)
+ && point_in_circle(get<max_corner, 0>(b), get<max_corner, 1>(b), c)
+ && point_in_circle(get<min_corner, 0>(b), get<max_corner, 1>(b), c)
+ && point_in_circle(get<max_corner, 0>(b), get<min_corner, 1>(b), c);
+ }
+
+
+ // Generic "range-in-circle", true if all points within circle
+ template<typename R, typename C>
+ inline bool range_in_circle(const R& range, const C& c)
+ {
+ assert_dimension<R, 2>();
+ assert_dimension<C, 2>();
+ for (typename boost::range_const_iterator<R>::type it = boost::begin(range);
+ it != boost::end(range); it++)
+ {
+ if (! point_in_circle(*it, c))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ template<typename Y, typename C>
+ inline bool polygon_in_circle(const Y& poly, const C& c)
+ {
+ return range_in_circle(exterior_ring(poly), c);
+ }
+
+
+
+
+ template<typename P, typename R, typename S>
+ inline bool point_in_ring(const P& p, const R& r, const S& strategy)
+ {
+ if (boost::size(r) < 4)
+ {
+ return false;
+ }
+
+ typename S::state_type state(p);
+ if (loop(r, strategy, state))
+ {
+ return state.within();
+ }
+ return false;
+ }
+
+ // Polygon: in exterior ring, and if so, not within interior ring(s)
+ template<typename P, typename Y, typename S>
+ inline bool point_in_polygon(const P& p, const Y& poly, const S& strategy)
+ {
+ if (point_in_ring(p, exterior_ring(poly), strategy))
+ {
+ typedef typename boost::range_const_iterator<typename interior_type<Y>::type>::type IT;
+ for (IT i = boost::begin(interior_rings(poly)); i != boost::end(interior_rings(poly)); i++)
+ {
+ if (point_in_ring(p, *i, strategy))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+
+
+
+
+
+ } // namespace within
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ template <typename TAG1, typename TAG2, typename G1, typename G2>
+ struct within {};
+
+
+ template <typename P, typename B>
+ struct within<point_tag, box_tag, P, B>
+ {
+ inline static bool calculate(const P& p, const B& b)
+ {
+ assert_dimension_equal<P, B>();
+ return impl::within::point_in_box<P, B,
+ 0, dimension<P>::value>::inside(p, b);
+ }
+ };
+
+ template <typename P, typename C>
+ struct within<point_tag, nsphere_tag, P, C>
+ {
+ inline static bool calculate(const P& p, const C& c)
+ {
+ return impl::within::point_in_circle(p, c);
+ }
+ };
+
+ template <typename B, typename C>
+ struct within<box_tag, nsphere_tag, B, C>
+ {
+ inline static bool calculate(const B& b, const C& c)
+ {
+ return impl::within::box_in_circle(b, c);
+ }
+ };
+
+ template <typename R, typename C>
+ struct within<linestring_tag, nsphere_tag, R, C>
+ {
+ inline static bool calculate(const R& ln, const C& c)
+ {
+ return impl::within::range_in_circle(ln, c);
+ }
+ };
+
+ template <typename R, typename C>
+ struct within<ring_tag, nsphere_tag, R, C>
+ {
+ inline static bool calculate(const R& r, const C& c)
+ {
+ return impl::within::range_in_circle(r, c);
+ }
+ };
+
+ template <typename Y, typename C>
+ struct within<polygon_tag, nsphere_tag, Y, C>
+ {
+ inline static bool calculate(const Y& poly, const C& c)
+ {
+ return impl::within::polygon_in_circle(poly, c);
+ }
+ };
+
+ template <typename P, typename R>
+ struct within<point_tag, ring_tag, P, R>
+ {
+ inline static bool calculate(const P& p, const R& r)
+ {
+ typedef typename boost::range_value<R>::type PS;
+ return impl::within::point_in_ring(p, r,
+ typename strategy_within<
+ typename cs_tag<P>::type, typename cs_tag<PS>::type,
+ P, PS>::type());
+ }
+ };
+
+ template <typename P, typename Y>
+ struct within<point_tag, polygon_tag, P, Y>
+ {
+ inline static bool calculate(const P& point, const Y& poly)
+ {
+ typedef typename point_type<Y>::type PS;
+ return impl::within::point_in_polygon(point, poly,
+ typename strategy_within<
+ typename cs_tag<P>::type, typename cs_tag<PS>::type,
+ P, PS>::type());
+ }
+
+ template<typename S>
+ inline static bool calculate(const P& point, const Y& poly, const S& strategy)
+ {
+ return impl::within::point_in_polygon(point, poly, strategy);
+ }
+ };
+
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Within check
+ \ingroup within
+ \param geometry1 geometry which might be within the second geometry
+ \param geometry2 geometry which might contain the first geometry
+ \return true if geometry1 is completely contained within geometry2, else false
+ \note The default strategy is used for within detection
+ */
+ template<typename G1, typename G2>
+ inline bool within(const G1& geometry1, const G2& geometry2)
+ {
+ return dispatch::within<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2);
+ }
+
+ /*!
+ \brief Within check using a strategy
+ \ingroup within
+ \param geometry1 geometry which might be within the second geometry
+ \param geometry2 geometry which might contain the first geometry
+ \param strategy strategy to be used
+ \return true if geometry1 is completely contained within geometry2, else false
+ */
+ template<typename G1, typename G2, typename S>
+ inline bool within(const G1& geometry1, const G2& geometry2, const S& strategy)
+ {
+ return dispatch::within<typename tag<G1>::type,
+ typename tag<G2>::type, G1, G2>::calculate(geometry1, geometry2, strategy);
+ }
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_WITHIN_HPP

Added: sandbox/ggl/boost/ggl/geometry/arithmetic/arithmetic.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/arithmetic/arithmetic.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,179 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ARITHMETIC_HPP
+#define _GEOMETRY_ARITHMETIC_HPP
+
+
+#include <functional>
+
+#include <boost/call_traits.hpp>
+#include <boost/concept/requires.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/util/for_each_coordinate.hpp>
+
+
+/*!
+\defgroup arithmetic arithmetic: arithmetic operations on points
+*/
+
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ template <typename P>
+ struct param
+ {
+ typedef typename boost::call_traits
+ <typename coordinate_type<P>::type>
+ ::param_type type;
+ };
+
+
+ template <typename C, template <typename> class Function>
+ struct value_operation
+ {
+ C m_value;
+ value_operation(C value): m_value(value) {}
+
+ template <typename P, int I>
+ void run(P& point) const
+ { set<I>(point, Function<C>()(get<I>(point), m_value)); }
+ };
+
+ template <typename PS, template <typename> class Function>
+ struct point_operation
+ {
+ typedef typename coordinate_type<PS>::type T;
+ const PS& m_source_point;
+ point_operation(const PS& point): m_source_point(point) {}
+
+ template <typename PD, int I>
+ void run(PD& dest_point) const
+ {
+ set<I>(dest_point, Function<T>()(get<I>(dest_point), get<I>(m_source_point)));
+ }
+ };
+
+ } // namespace impl
+ #endif
+
+
+ /*!
+ \brief Adds a value to each coordinate of a point
+ \ingroup arithmetic
+ \details
+ \param p point
+ \param value value to add
+ */
+ template <typename P>
+ BOOST_CONCEPT_REQUIRES(((Point<P>)),
+ (void)) add_value(P& p, typename impl::param<P>::type value)
+ { for_each_coordinate(p, impl::value_operation<typename coordinate_type<P>::type, std::plus>(value)); }
+
+ /*!
+ \brief Adds a point to another
+ \ingroup arithmetic
+ \details The coordinates of the second point will be added to those of the first point. The second point is not modified.
+ \param p1 first point
+ \param p2 second point
+ */
+ template <typename P1, typename P2>
+ BOOST_CONCEPT_REQUIRES(((Point<P1>)) ((ConstPoint<P2>)),
+ (void)) add_point(P1& p1, const P2& p2)
+ { for_each_coordinate(p1, impl::point_operation<P2, std::plus>(p2)); }
+
+
+
+ /*!
+ \brief Subtracts a value to each coordinate of a point
+ \ingroup arithmetic
+ \details
+ \param p point
+ \param value value to subtract
+ */
+ template <typename P>
+ BOOST_CONCEPT_REQUIRES(((Point<P>)),
+ (void)) subtract_value(P& p, typename impl::param<P>::type value)
+ { for_each_coordinate(p, impl::value_operation<typename coordinate_type<P>::type, std::minus>(value)); }
+
+ /*!
+ \brief Subtracts a point to another
+ \ingroup arithmetic
+ \details The coordinates of the second point will be subtracted to those of the first point. The second point is not modified.
+ \param p1 first point
+ \param p2 second point
+ */
+ template <typename P1, typename P2>
+ BOOST_CONCEPT_REQUIRES(((Point<P1>)) ((ConstPoint<P2>)),
+ (void)) subtract_point(P1& p1, const P2& p2)
+ { for_each_coordinate(p1, impl::point_operation<P2, std::minus>(p2)); }
+
+
+
+ /*!
+ \brief Multiplies each coordinate of a point by a value
+ \ingroup arithmetic
+ \details
+ \param p point
+ \param value value to multiply by
+ */
+ template <typename P>
+ BOOST_CONCEPT_REQUIRES(((Point<P>)),
+ (void)) multiply_value(P& p, typename impl::param<P>::type value)
+ { for_each_coordinate(p, impl::value_operation<typename coordinate_type<P>::type, std::multiplies>(value)); }
+
+ /*!
+ \brief Multiplies a point by another
+ \ingroup arithmetic
+ \details The coordinates of the second point will be multiplied by those of the first point. The second point is not modified.
+ \param p1 first point
+ \param p2 second point
+ \note This is *not* a dot, cross or wedge product. It is a mere field-by-field multiplication.
+ */
+ template <typename P1, typename P2>
+ BOOST_CONCEPT_REQUIRES(((Point<P1>)) ((ConstPoint<P2>)),
+ (void)) multiply_point(P1& p1, const P2& p2)
+ { for_each_coordinate(p1, impl::point_operation<P2, std::multiplies>(p2)); }
+
+
+
+ /*!
+ \brief Divides each coordinate of a point by a value
+ \ingroup arithmetic
+ \details
+ \param p point
+ \param value value to divide by
+ */
+ template <typename P>
+ BOOST_CONCEPT_REQUIRES(((Point<P>)),
+ (void)) divide_value(P& p, typename impl::param<P>::type value)
+ { for_each_coordinate(p, impl::value_operation<typename coordinate_type<P>::type, std::divides>(value)); }
+
+ /*!
+ \brief Divides a point by another
+ \ingroup arithmetic
+ \details The coordinates of the second point will be divided by those of the first point. The second point is not modified.
+ \param p1 first point
+ \param p2 second point
+ */
+ template <typename P1, typename P2>
+ BOOST_CONCEPT_REQUIRES(((Point<P1>)) ((ConstPoint<P2>)),
+ (void)) divide_point(P1& p1, const P2& p2)
+ { for_each_coordinate(p1, impl::point_operation<P2, std::divides>(p2)); }
+
+
+} // namespace geometry
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/arithmetic/dot_product.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/arithmetic/dot_product.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,67 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_DOT_PRODUCT_HPP
+#define _GEOMETRY_DOT_PRODUCT_HPP
+
+
+#include <boost/concept/requires.hpp>
+#include <geometry/core/concepts/point_concept.hpp>
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ template <int I, int N>
+ struct dot_product_maker
+ {
+ template <typename P1, typename P2>
+ static typename coordinate_type<P1>::type
+ run(const P1& p1, const P2& p2)
+ {
+ return get<I>(p1)*get<I>(p2)
+ + dot_product_maker<I+1, N>::run(p1, p2);
+ }
+ };
+
+ template <int N>
+ struct dot_product_maker<N, N>
+ {
+ template <typename P1, typename P2>
+ static typename coordinate_type<P1>::type
+ run(const P1& p1, const P2& p2)
+ {
+ return get<N>(p1)*get<N>(p2);
+ }
+ };
+
+ } // namespace impl
+ #endif
+
+
+ /*!
+ \brief Computes the dot product of 2 points
+ \ingroup arithmetic
+ \param p1 first point
+ \param p2 second point
+ \return the dot product
+ */
+ template <typename P1, typename P2>
+ BOOST_CONCEPT_REQUIRES(((ConstPoint<P1>)) ((ConstPoint<P2>)),
+ (typename coordinate_type<P1>::type)) dot_product(const P1& p1, const P2& p2)
+ {
+ return impl::dot_product_maker<0, dimension<P1>::value - 1>::run(p1, p2);
+ }
+
+} // namespace geometry
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/access.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/access.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,270 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ACCESS_HPP
+#define _GEOMETRY_ACCESS_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+// #include <boost/mpl/bool.hpp>
+
+#include <geometry/core/coordinate_type.hpp>
+#include <geometry/core/point_type.hpp>
+#include <geometry/core/tag.hpp>
+
+
+
+namespace geometry
+{
+ static const int min_corner = 0;
+ static const int max_corner = 1;
+
+
+ namespace traits
+ {
+ /*!
+ \brief Traits class which gives access (get,set) to points
+ \ingroup traits
+ \par Geometries:
+ - point
+ - n-sphere (circle,sphere) for their center
+ \par Specializations should provide:
+ - static inline T get<I>(const G&)
+ - static inline void set<I>(G&, const T&)
+ \tparam G geometry
+ */
+ template <typename G>
+ struct access {};
+
+
+
+ /*!
+ \brief Traits class defining "get" and "set" to get and set point coordinate values
+ \tparam G geometry (box, segment)
+ \tparam I index (min_corner/max_corner for box, 0/1 for segment)
+ \tparam D dimension
+ \par Geometries:
+ - box
+ - segment
+ \par Specializations should provide:
+ - static inline T get(const G&)
+ - static inline void set(G&, const T&)
+ \ingroup traits
+ */
+ template <typename G, size_t I, size_t D>
+ struct indexed_access {};
+
+
+
+
+ /*!
+ \brief Traits class, optional, indicating that the std-library should be used
+ \details The default geometry (linestring, ring, multi*) follow std:: for
+ its modifying operations (push_back, clear, size, resize, reserve, etc)
+ If they NOT follow the std:: library they should specialize this traits
+ class
+ \ingroup traits
+ \par Geometries:
+ - linestring
+ - linear_ring
+ \par Specializations should provide:
+ - value (defaults to true)
+ */
+ template <typename G>
+ struct use_std
+ {
+ static const bool value = true;
+ };
+
+ }
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+ template <typename TAG, typename G, typename T, size_t D>
+ struct access
+ {
+ //static inline T get(const G& ) {}
+ //static inline void set(G& g, const T& value) {}
+ };
+
+ template <typename TAG, typename G, typename T, size_t I, size_t D>
+ struct indexed_access
+ {
+ //static inline T get(const G& ) {}
+ //static inline void set(G& g, const T& value) {}
+ };
+
+
+
+ template <typename P, typename T, size_t D>
+ struct access<point_tag, P, T, D>
+ {
+ static inline T get(const P& p)
+ {
+ return traits::access<P>::template get<D>(p);
+ }
+ static inline void set(P& p, const T& value)
+ {
+ traits::access<P>::template set<D>(p, value);
+ }
+ };
+
+
+ template <typename S, typename T, size_t D>
+ struct access<nsphere_tag, S, T, D>
+ {
+ static inline T get(const S& s)
+ {
+ return traits::access<S>::template get<D>(s);
+ }
+ static inline void set(S& s, const T& value)
+ {
+ traits::access<S>::template set<D>(s, value);
+ }
+ };
+
+
+ template <typename B, typename T, size_t I, size_t D>
+ struct indexed_access<box_tag, B, T, I, D>
+ {
+ static inline T get(const B& b)
+ {
+ return traits::indexed_access<B, I, D>::get(b);
+ }
+ static inline void set(B& b, const T& value)
+ {
+ traits::indexed_access<B, I, D>::set(b, value);
+ }
+ };
+
+ template <typename S, typename T, size_t I, size_t D>
+ struct indexed_access<segment_tag, S, T, I, D>
+ {
+ static inline T get(const S& segment)
+ {
+ return traits::indexed_access<S, I, D>::get(segment);
+ }
+ static inline void set(S& segment, const T& value)
+ {
+ traits::indexed_access<S, I, D>::set(segment, value);
+ }
+ };
+
+
+ } // namespace core_dispatch
+ #endif
+
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ // Two dummy tags to distinguish get/set variants below.
+ // They don't have to be specified by the user. The functions are distinguished
+ // by template signature also, but for e.g. GCC this is not enough. So give them
+ // a different signature.
+ struct signature_getset_dimension {};
+ struct signature_getset_index_dimension {};
+ } // namespace impl
+ #endif
+
+
+ /*!
+ \brief get a coordinate value of a point / nsphere
+ \return coordinate value
+ \ingroup access
+ \tparam D dimension
+ \tparam G geometry
+ \param geometry geometry to get coordinate value from
+ \param dummy does not have to be specified
+ */
+ template <size_t D, typename G>
+ inline typename coordinate_type<G>::type get(const G& geometry
+ , impl::signature_getset_dimension* dummy = NULL
+ )
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ return core_dispatch::access<typename tag<G>::type, NCG,
+ typename coordinate_type<NCG>::type, D>::get(geometry);
+ };
+
+
+ /*!
+ \brief assign coordinate value to a point / sphere
+ \ingroup access
+ \tparam D dimension
+ \tparam G geometry
+ \param geometry geometry to assign coordinate to
+ \param value coordinate value to assign
+ \param dummy does not have to be specified
+ */
+ template <size_t D, typename G>
+ inline void set(G& geometry, const typename coordinate_type<G>::type& value
+ , impl::signature_getset_dimension* dummy = NULL
+ )
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ core_dispatch::access<typename tag<G>::type, NCG,
+ typename coordinate_type<NCG>::type, D>::set(geometry, value);
+ }
+
+
+ // Note: doxygen needs a construct to distinguish get/set (like the gcc compiler)
+
+
+ /*!
+ \brief get a coordinate value of a box / segment
+ \return coordinate value
+ \ingroup access
+ \tparam I index, for boxes: min_corner or max_corner. For segment: 0 / 1
+ \tparam D dimension
+ \tparam G geometry
+ \param geometry geometry to get coordinate value from
+ \param dummy does not have to be specified
+ */
+ template <size_t I, size_t D, typename G>
+ inline typename coordinate_type<G>::type get(const G& geometry
+ , impl::signature_getset_index_dimension* dummy = NULL
+ )
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ return core_dispatch::indexed_access<typename tag<G>::type, NCG,
+ typename coordinate_type<NCG>::type, I, D>::get(geometry);
+ };
+
+ /*!
+ \brief assign a coordinate value of a box / segment
+ \ingroup access
+ \tparam I index, for boxes: min_corner or max_corner. For segment: 0 / 1
+ \tparam D dimension
+ \tparam G geometry
+ \param geometry geometry to assign coordinate to
+ \param value coordinate value to assign
+ \param dummy does not have to be specified
+ */
+ template <size_t I, size_t D, typename G>
+ inline void set(G& geometry, const typename coordinate_type<G>::type& value
+ , impl::signature_getset_index_dimension* dummy = NULL
+ )
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ core_dispatch::indexed_access<typename tag<G>::type, NCG,
+ typename coordinate_type<NCG>::type, I, D>::set(geometry, value);
+ }
+
+
+
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/concepts/box_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/concepts/box_concept.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,109 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_BOX_CONCEPT_HPP
+#define _GEOMETRY_BOX_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/point_type.hpp>
+
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief Checks box concept, using Boost Concept Check Library and metafunctions
+ \ingroup concepts
+ */
+ template <typename B>
+ struct Box
+ {
+ private :
+ typedef typename point_type<B>::type P;
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <size_t C, size_t D, size_t N>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ B* b;
+ geometry::set<C, D>(*b, geometry::get<C, D>(*b));
+ dimension_checker<C, D + 1, N>::check();
+ }
+ };
+
+ template <size_t C, size_t N>
+ struct dimension_checker<C, N, N>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the Box concept
+ BOOST_CONCEPT_USAGE(Box)
+ {
+ static const size_t N = dimension<B>::value;
+ dimension_checker<min_corner, 0, N>::check();
+ dimension_checker<max_corner, 0, N>::check();
+ }
+ };
+
+
+ /*!
+ \brief Checks Box concept (const version)
+ \ingroup concepts
+ \details The ConstBox concept check the same as the Box concept,
+ but does not check write access.
+ */
+ template <typename B>
+ struct ConstBox
+ {
+ private :
+ typedef typename point_type<B>::type P;
+ typedef typename coordinate_type<B>::type T;
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <size_t C, size_t D, size_t N>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ const B* b = 0;
+ T coord(geometry::get<C, D>(*b));
+ (void)sizeof(coord); // To avoid "unused variable" warnings
+ dimension_checker<C, D + 1, N>::check();
+ }
+ };
+
+ template <size_t C, size_t N>
+ struct dimension_checker<C, N, N>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the ConstBox concept
+ BOOST_CONCEPT_USAGE(ConstBox)
+ {
+ static const size_t N = dimension<B>::value;
+ dimension_checker<min_corner, 0, N>::check();
+ dimension_checker<max_corner, 0, N>::check();
+ }
+ };
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/concepts/linestring_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/concepts/linestring_concept.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,84 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding L.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_LINESTRING_CONCEPT_HPP
+#define _GEOMETRY_LINESTRING_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+#include <boost/range/concepts.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/point_type.hpp>
+
+#include <geometry/algorithms/clear.hpp>
+#include <geometry/algorithms/append.hpp>
+
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief Checks linestring concept, using Boost Concept Check Library and metafunctions
+ \ingroup concepts
+ */
+ template <typename L>
+ struct Linestring
+ {
+ private :
+ typedef typename point_type<L>::type P;
+
+ BOOST_CONCEPT_ASSERT( (Point<P>) );
+ BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<L>) );
+
+ public :
+ /// BCCL macro to check the Linestring concept
+ BOOST_CONCEPT_USAGE(Linestring)
+ {
+
+ // Check if it can be modified
+ L* ls;
+ clear(*ls);
+ append(*ls, P());
+ }
+ };
+
+
+ /*!
+ \brief Checks Linestring concept (const version)
+ \ingroup concepts
+ \details The ConstLinestring concept check the same as the Linestring concept,
+ but does not check write access.
+ */
+ template <typename L>
+ struct ConstLinestring
+ {
+ private :
+ typedef typename point_type<L>::type P;
+
+ BOOST_CONCEPT_ASSERT( (ConstPoint<P>) );
+ BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<L>) );
+
+
+ public :
+ /// BCCL macro to check the ConstLinestring concept
+ BOOST_CONCEPT_USAGE(ConstLinestring)
+ {
+ }
+ };
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/concepts/nsphere_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/concepts/nsphere_concept.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,122 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding S.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_NSPHERE_CONCEPT_HPP
+#define _GEOMETRY_NSPHERE_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/radius.hpp>
+
+
+
+namespace geometry
+{
+ /*!
+ \brief Checks Nsphere concept (const version)
+ \ingroup concepts
+ \details The ConstNsphere concept check the same as the Nsphere concept,
+ but does not check write access.
+ */
+ template <typename S>
+ struct ConstNsphere
+ {
+ private :
+ typedef typename point_type<S>::type P;
+ typedef typename radius_type<S>::type R;
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <size_t D, size_t N>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ typedef typename coordinate_type<S>::type T;
+ const S* s = 0;
+ T coord(geometry::get<D>(*s));
+ (void)sizeof(coord); // To avoid "unused variable" warnings
+ dimension_checker<D + 1, N>::check();
+ }
+ };
+
+ template <size_t N>
+ struct dimension_checker<N, N>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the ConstNsphere concept
+ BOOST_CONCEPT_USAGE(ConstNsphere)
+ {
+ static const size_t N = dimension<S>::value;
+ dimension_checker<0, N>::check();
+ dimension_checker<0, N>::check();
+
+ // Check radius access
+ const S* s = 0;
+ R coord(geometry::get_radius<0>(*s));
+ (void)sizeof(coord); // To avoid "unused variable" warnings
+ }
+ };
+
+
+ /*!
+ \brief Checks nsphere concept, using Boost Concept Check Library and metafunctions
+ \ingroup concepts
+ */
+ template <typename S>
+ struct Nsphere
+ {
+ private :
+ BOOST_CONCEPT_ASSERT((ConstNsphere<S>));
+
+ typedef typename point_type<S>::type P;
+ typedef typename radius_type<S>::type R;
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <size_t D, size_t N>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ S* s;
+ geometry::set<D>(*s, geometry::get<D>(*s));
+ dimension_checker<D + 1, N>::check();
+ }
+ };
+
+ template <size_t N>
+ struct dimension_checker<N, N>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the Nsphere concept
+ BOOST_CONCEPT_USAGE(Nsphere)
+ {
+ static const size_t N = dimension<S>::value;
+ dimension_checker<0, N>::check();
+ dimension_checker<0, N>::check();
+
+ // Check radius access
+ S* s = 0;
+ set_radius<0>(*s, get_radius<0>(*s));
+
+ }
+ };
+
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/concepts/point_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/concepts/point_concept.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,144 @@
+// Generic Geometry Library Point concept
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_POINT_CONCEPT_HPP
+#define _GEOMETRY_POINT_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/coordinate_dimension.hpp>
+#include <geometry/core/coordinate_system.hpp>
+
+
+/*!
+\defgroup concepts concept checking
+Concepts are used to check if pointtypes provide required implementation. Concept checking
+is done using BCCL (Boost Concept Check Library) and MPL (Meta Programming Library)
+*/
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief Checks point concept, using Boost Concept Check Library and metafunctions
+ \ingroup concepts
+ \details The concept is separated into 4 metafunctions:
+ - \ref geometry::traits::coordinate_type "coordinate_type": provides the type of the coordinates of a point
+ - \ref geometry::traits::coordinate_system "coordinate system": provides the coordinate system in which the point is placed
+ - \ref geometry::traits::dimension "dimension": provides the number of coordinates of a point
+ - \ref geometry::traits::access "access": provides access to the coordinates of a point
+
+ In MPL, a metafunction that provides a type must expose is as "type"
+ and a metafunction that provides a value must expose it as "value", so
+ here the same convention are used: coordinate_type<P>::type and
+ dimension<P>::value provide the type and number of coordinates. This
+ makes them compatible with any MPL and Fusion algorithm and
+ metafunction.
+
+ \par Example:
+ First example, using an own pointtype, for example a legacy point, defining the necessary
+ properties outside the pointtype in a traits class
+ \dontinclude doxygen_examples.cpp
+ \skip example_point_1
+ \until //:\\
+ \par Example:
+ Second example, deriving a pointtype from boost::tuple. It defines the necessary properties
+ itself, so a separate traits class is not necessary.
+ \dontinclude doxygen_examples.cpp
+ \skip example_own_point2
+ \line {
+ \until //:\\
+ */
+ template <typename X>
+ struct Point
+ {
+ private :
+ typedef typename coordinate_type<X>::type ctype;
+ typedef typename coordinate_system<X>::type csystem;
+ enum { ccount = dimension<X>::value };
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <typename P, size_t I, size_t Count>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ P* p;
+ geometry::set<I>(*p, geometry::get<I>(*p));
+ dimension_checker<P, I+1, Count>::check();
+ }
+ };
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <typename P, size_t Count>
+ struct dimension_checker<P, Count, Count>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the Point concept
+ BOOST_CONCEPT_USAGE(Point)
+ {
+ dimension_checker<X, 0, ccount>::check();
+ }
+ };
+
+
+ /*!
+ \brief Checks point concept (const version)
+ \ingroup concepts
+ \details The ConstPoint concept check the same as the Point concept,
+ but does not check write access.
+ */
+ template <typename X>
+ struct ConstPoint
+ {
+ private :
+ typedef typename coordinate_type<X>::type ctype;
+ typedef typename coordinate_system<X>::type csystem;
+ enum { ccount = dimension<X>::value };
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <typename P, size_t I, size_t Count>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ const P* p = 0;
+ ctype coord(geometry::get<I>(*p));
+ (void)sizeof(coord); // To avoid "unused variable" warnings
+ dimension_checker<P, I+1, Count>::check();
+ }
+ };
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <typename P, size_t Count>
+ struct dimension_checker<P, Count, Count>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the ConstPoint concept
+ BOOST_CONCEPT_USAGE(ConstPoint)
+ {
+ dimension_checker<X, 0, ccount>::check();
+ }
+ };
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/concepts/polygon_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/concepts/polygon_concept.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,122 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding P.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_POLYGON_CONCEPT_HPP
+#define _GEOMETRY_POLYGON_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+#include <boost/range/concepts.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/ring_concept.hpp>
+
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/point_type.hpp>
+#include <geometry/core/ring_type.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+
+#include <geometry/algorithms/clear.hpp>
+#include <geometry/algorithms/append.hpp>
+
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ template <typename P>
+ struct PolygonChecker
+ {
+ typedef typename point_type<P>::type PNT;
+ typedef typename ring_type<P>::type R;
+ typedef typename interior_type<P>::type I;
+
+ BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<I>) );
+
+ void constraints()
+ {
+
+ P* poly;
+ R& e = exterior_ring(*poly);
+ const R& ce = exterior_ring(*poly);
+
+ I& i = interior_rings(*poly);
+ const I& ci = interior_rings(*poly);
+ }
+
+ };
+ }
+ #endif // DOXYGEN_NO_IMPL
+
+ /*!
+ \brief Checks polygon concept, using Boost Concept Check Library and metafunctions
+ \ingroup concepts
+ */
+ template <typename P>
+ struct Polygon : impl::PolygonChecker<P>
+ {
+ private :
+ typedef typename point_type<P>::type PNT;
+ typedef typename ring_type<P>::type R;
+ typedef typename interior_type<P>::type I;
+
+ BOOST_CONCEPT_ASSERT( (Point<PNT>) );
+ BOOST_CONCEPT_ASSERT( (Ring<R>) );
+
+
+ public :
+ /// BCCL macro to check the Polygon concept
+ BOOST_CONCEPT_USAGE(Polygon)
+ {
+ // Check if it can be modified
+ P* poly;
+ clear(*poly);
+ append(*poly, PNT());
+
+ this->constraints();
+
+ }
+ };
+
+
+ /*!
+ \brief Checks Polygon concept (const version)
+ \ingroup concepts
+ \details The ConstPolygon concept check the same as the Polygon concept,
+ but does not check write access.
+ */
+ template <typename P>
+ struct ConstPolygon : impl::PolygonChecker<P>
+ {
+ private :
+ typedef typename point_type<P>::type PNT;
+ typedef typename ring_type<P>::type R;
+ typedef typename interior_type<P>::type I;
+
+ BOOST_CONCEPT_ASSERT( (ConstPoint<PNT>) );
+ BOOST_CONCEPT_ASSERT( (ConstRing<R>) );
+
+
+ public :
+ /// BCCL macro to check the ConstPolygon concept
+ BOOST_CONCEPT_USAGE(ConstPolygon)
+ {
+ this->constraints();
+ }
+ };
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/concepts/ring_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/concepts/ring_concept.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,83 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding R.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_LINEAR_RING_CONCEPT_HPP
+#define _GEOMETRY_LINEAR_RING_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+#include <boost/range/concepts.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/point_type.hpp>
+
+#include <geometry/algorithms/clear.hpp>
+#include <geometry/algorithms/append.hpp>
+
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief Checks linestring concept, using Boost Concept Check Library and metafunctions
+ \ingroup concepts
+ */
+ template <typename R>
+ struct Ring
+ {
+ private :
+ typedef typename point_type<R>::type P;
+
+ BOOST_CONCEPT_ASSERT( (Point<P>) );
+ BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<R>) );
+
+
+ public :
+ /// BCCL macro to check the Ring concept
+ BOOST_CONCEPT_USAGE(Ring)
+ {
+ // Check if it can be modified
+ R* ls;
+ clear(*ls);
+ append(*ls, P());
+ }
+ };
+
+
+ /*!
+ \brief Checks Ring concept (const version)
+ \ingroup concepts
+ \details The ConstLinearRing concept check the same as the Ring concept,
+ but does not check write access.
+ */
+ template <typename R>
+ struct ConstRing
+ {
+ private :
+ typedef typename point_type<R>::type P;
+
+ BOOST_CONCEPT_ASSERT( (ConstPoint<P>) );
+ BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<R>) );
+
+ public :
+ /// BCCL macro to check the ConstLinearRing concept
+ BOOST_CONCEPT_USAGE(ConstRing)
+ {
+ }
+ };
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/concepts/segment_concept.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/concepts/segment_concept.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,118 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding S.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_SEGMENT_CONCEPT_HPP
+#define _GEOMETRY_SEGMENT_CONCEPT_HPP
+
+
+#include <boost/concept_check.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/point_type.hpp>
+
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief Checks segment concept, using Boost Concept Check Library and metafunctions
+ \ingroup concepts
+ */
+ template <typename S>
+ struct Segment
+ {
+ private :
+ typedef typename point_type<S>::type P;
+
+ BOOST_CONCEPT_ASSERT( (Point<P>) );
+
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <size_t C, size_t D, size_t N>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ S* s;
+ geometry::set<C, D>(*s, geometry::get<C, D>(*s));
+ dimension_checker<C, D + 1, N>::check();
+ }
+ };
+
+ template <size_t C, size_t N>
+ struct dimension_checker<C, N, N>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the Segment concept
+ BOOST_CONCEPT_USAGE(Segment)
+ {
+ static const size_t N = dimension<P>::value;
+ dimension_checker<0, 0, N>::check();
+ dimension_checker<1, 0, N>::check();
+ }
+ };
+
+
+ /*!
+ \brief Checks Segment concept (const version)
+ \ingroup concepts
+ \details The ConstSegment concept check the same as the Segment concept,
+ but does not check write access.
+ */
+ template <typename S>
+ struct ConstSegment
+ {
+ private :
+ typedef typename point_type<S>::type P;
+ typedef typename coordinate_type<S>::type T;
+
+ BOOST_CONCEPT_ASSERT( (ConstPoint<P>) );
+
+
+ /// Internal structure to check if access is OK for all dimensions
+ template <size_t C, size_t D, size_t N>
+ struct dimension_checker
+ {
+ static void check()
+ {
+ const S* s = 0;
+ T coord(geometry::get<C, D>(*s));
+ (void)sizeof(coord); // To avoid "unused variable" warnings
+ dimension_checker<C, D + 1, N>::check();
+ }
+ };
+
+ template <size_t C, size_t N>
+ struct dimension_checker<C, N, N>
+ {
+ static void check() {}
+ };
+
+ public :
+ /// BCCL macro to check the ConstSegment concept
+ BOOST_CONCEPT_USAGE(ConstSegment)
+ {
+ static const size_t N = dimension<P>::value;
+ dimension_checker<0, 0, N>::check();
+ dimension_checker<1, 0, N>::check();
+ }
+ };
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/coordinate_dimension.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/coordinate_dimension.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,109 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_COORDINATE_DIMENSION_HPP
+#define _GEOMETRY_COORDINATE_DIMENSION_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/mpl/equal_to.hpp>
+
+#include <geometry/core/point_type.hpp>
+
+
+namespace geometry
+{
+
+ namespace traits
+ {
+ /*!
+ \brief Traits class indicating the number of dimensions of a point
+ \par Geometries:
+ - point
+ \par Specializations should provide:
+ - value (should be derived from boost::mpl::int_<D>
+ \ingroup traits
+ */
+ template <typename P>
+ struct dimension {};
+
+ } // namespace traits
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+ // Base class derive from its own specialization of point-tag
+ template <typename TAG, typename G>
+ struct dimension : dimension<point_tag, typename point_type<TAG, G>::type> { };
+
+ template <typename P>
+ struct dimension<point_tag, P> : traits::dimension<P> {};
+
+ } // namespace core_dispatch
+ #endif
+
+
+
+
+ /*!
+ \brief Meta-function which defines coordinate dimensions, i.e. the number of axes of any geometry
+ \ingroup core
+ */
+ template <typename G>
+ struct dimension : core_dispatch::dimension<typename tag<G>::type,
+ typename boost::remove_const<G>::type>
+ { };
+
+
+
+
+
+ /*!
+ \brief assert_dimension, enables compile-time checking if coordinate dimensions are as expected
+ \ingroup utility
+ */
+ template <typename G, size_t D>
+ inline void assert_dimension()
+ {
+ BOOST_STATIC_ASSERT((boost::mpl::equal_to<
+ geometry::dimension<G>,
+ boost::mpl::int_<D> >::type::value));
+ }
+
+ /*!
+ \brief assert_dimension, enables compile-time checking if coordinate dimensions are as expected
+ \ingroup utility
+ */
+ template <typename G, size_t D>
+ inline void assert_dimension_max()
+ {
+ BOOST_STATIC_ASSERT(( dimension<G>::value <= D ));
+ }
+
+
+ /*!
+ \brief assert_dimension_equal, enables compile-time checking if coordinate dimensions of two geometries are equal
+ \ingroup utility
+ */
+ template <typename G1, typename G2>
+ inline void assert_dimension_equal()
+ {
+ BOOST_STATIC_ASSERT(( dimension<G1>::value == dimension<G2>::value ));
+ }
+
+
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/coordinate_system.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/coordinate_system.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,78 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_COORDINATE_SYSTEM_HPP
+#define _GEOMETRY_COORDINATE_SYSTEM_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+#include <geometry/core/point_type.hpp>
+
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class defining the coordinate system of a point, important for strategy selection
+ \ingroup traits
+ \par Geometries:
+ - point
+ \par Specializations should provide:
+ - typedef CS type; (cs::cartesian, cs::spherical, etc)
+ */
+ template <typename P>
+ struct coordinate_system {};
+
+ } // namespace traits
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+ template <typename TAG, typename G>
+ struct coordinate_system
+ {
+ typedef typename point_type<TAG, G>::type P;
+
+ // Call its own specialization on point-tag
+ typedef typename coordinate_system<point_tag, P>::type type;
+ };
+
+
+ template <typename P>
+ struct coordinate_system<point_tag, P>
+ {
+ typedef typename traits::coordinate_system<P>::type type;
+ };
+
+
+ } // namespace core_dispatch
+ #endif
+
+
+ /*!
+ \brief Meta-function which defines coordinate system for any geometry
+ \ingroup core
+ */
+ template <typename G>
+ struct coordinate_system
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ typedef typename core_dispatch::coordinate_system<typename tag<G>::type, NCG>::type type;
+ };
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/coordinate_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/coordinate_type.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,76 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_COORDINATE_TYPE_HPP
+#define _GEOMETRY_COORDINATE_TYPE_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+#include <geometry/core/point_type.hpp>
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class which indicate the coordinate type (double,float,...) of a point
+ \ingroup traits
+ \par Geometries:
+ - point
+ \par Specializations should provide:
+ - typedef T type; (double,float,int,etc)
+ */
+ template <typename P>
+ struct coordinate_type {};
+
+
+ } // namespace traits
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+ template <typename TAG, typename G>
+ struct coordinate_type
+ {
+ typedef typename point_type<TAG, G>::type P;
+
+ // Call its own specialization on point-tag
+ typedef typename coordinate_type<point_tag, P>::type type;
+ };
+
+
+ template <typename P>
+ struct coordinate_type<point_tag, P>
+ {
+ typedef typename traits::coordinate_type<P>::type type;
+ };
+
+ } // namespace core_dispatch
+ #endif
+
+ /*!
+ \brief Meta-function which defines coordinate type (int, float, double, etc) of any geometry
+ \ingroup core
+ */
+ template <typename G>
+ struct coordinate_type
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ typedef typename core_dispatch::coordinate_type<typename tag<G>::type, NCG>::type type;
+ };
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/cs.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/cs.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,231 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_CS_HPP
+#define _GEOMETRY_CS_HPP
+
+#include <boost/type_traits.hpp>
+
+#include <geometry/core/tags.hpp>
+#include <geometry/core/coordinate_system.hpp>
+
+/*!
+\defgroup cs coordinate systems
+\brief Defines coordinate systems
+\details Coordinate systems are essential for any point in the Generic Geometry Library. Many
+ algorithms such as distance or transform use coordinate systems to select the strategy to use.
+*/
+
+namespace geometry
+{
+
+ /*!
+ \brief Unit of plan angles: degrees
+ \ingroup utility
+ */
+ class degree {};
+
+
+ /*!
+ \brief Unit of plan angles: radians
+ \ingroup utility
+ */
+ class radian {};
+
+
+ namespace cs
+ {
+ /*!
+ \brief Cartesian coordinate system
+ \details Defines the Cartesian or rectangular coordinate system where points are defined in 2 or 3 (or more)
+ dimensions and usually (but not always) known as x,y,z
+ \see http://en.wikipedia.org/wiki/Cartesian_coordinate_system
+ \ingroup cs
+ */
+ struct cartesian
+ {};
+
+
+
+ /*!
+ \brief EPSG Cartesian coordinate system
+ \details EPSG (European Petrol Survey Group) has a standard list of projections,
+ each having a code
+ \see
+ \ingroup cs
+ \tparam C the EPSG code
+ */
+ template<size_t C>
+ struct epsg
+ {
+ static const size_t epsg_code = C;
+ };
+
+
+ /*!
+ \brief Geographic coordinate system, in degree or in radian
+ \details Defines the geographic coordinate system where points are defined in two angles and usually
+ known as lat,long or lo,la or phi,lambda
+ \see http://en.wikipedia.org/wiki/Geographic_coordinate_system
+ \ingroup cs
+ */
+ template<typename D>
+ struct geographic
+ {
+ typedef D units;
+ };
+
+ /*!
+ \brief Earth Centered, Earth Fixed
+ \details Defines a Cartesian coordinate system x,y,z with the center of the earth as its origin,
+ going through the Greenwich
+ \see http://en.wikipedia.org/wiki/ECEF
+ \see http://en.wikipedia.org/wiki/Geodetic_system
+ \note Also known as "Geocentric", but geocentric is also an astronomic coordinate system
+ \ingroup cs
+ */
+ struct ecef
+ {
+ };
+
+ /*!
+ \brief Spherical coordinate system, in degree or in radian
+ \details Defines the spherical coordinate system where points are defined in two angles
+ and an optional radius usually known as r, theta, phi
+ \par Coordinates:
+ - coordinate 0:
+ 0 <= phi < 2pi is the angle between the positive x-axis and the line from the origin to the P projected onto the xy-plane.
+ - coordinate 1:
+ 0 <= theta <= pi is the angle between the positive z-axis and the line formed between the origin and P.
+ - coordinate 2 (if specified):
+ r >= 0 is the distance from the origin to a given point P.
+
+ \see http://en.wikipedia.org/wiki/Spherical_coordinates
+ \ingroup cs
+ */
+ template<typename D>
+ struct spherical
+ {
+ typedef D units;
+ };
+
+ /*!
+ \brief Polar coordinate system
+ \details Defines the polar coordinate system "in which each point on a plane is determined by an angle and a distance"
+ \see http://en.wikipedia.org/wiki/Polar_coordinates
+ \ingroup cs
+ */
+ template<typename D>
+ struct polar
+ {
+ typedef D units;
+ };
+
+
+ namespace celestial
+ {
+ /*!
+ \brief Ecliptic (celestial) coordinate system
+ \details Defines the astronomical ecliptic coordinate system "that uses the ecliptic for its fundamental plane"
+ It uses Beta and Lambda as its latitude and longitude.
+ \see http://en.wikipedia.org/wiki/Ecliptic_coordinate_system
+ \ingroup cs
+ */
+ template<typename D>
+ struct ecliptic
+ {};
+
+
+ // More celestial coordinate systems could be defined
+ }
+
+ }
+
+ namespace traits
+ {
+ /*!
+ \brief Traits class defining coordinate system tag, bound to coordinate system
+ \ingroup traits
+ \tparam CS coordinate system
+ */
+ template <typename CS>
+ struct cs_tag
+ {
+ };
+
+
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+
+ template<typename DR>
+ struct cs_tag<cs::geographic<DR> >
+ {
+ typedef geographic_tag type;
+ };
+
+ template<typename DR>
+ struct cs_tag<cs::spherical<DR> >
+ {
+ typedef spherical_tag type;
+ };
+
+
+ template<>
+ struct cs_tag<cs::cartesian>
+ {
+ typedef cartesian_tag type;
+ };
+
+ template<>
+ struct cs_tag<cs::ecef>
+ {
+ typedef cartesian_tag type;
+ };
+
+ template <size_t C>
+ struct cs_tag<cs::epsg<C> >
+ {
+ typedef cartesian_tag type;
+ };
+
+ #endif
+
+ }
+
+ /*!
+ \brief Meta-function returning coordinate system tag (cs family) of any geometry
+ \ingroup core
+ */
+ template <typename G>
+ struct cs_tag
+ {
+ typedef typename traits::cs_tag<typename geometry::coordinate_system<G>::type>::type type;
+ };
+
+
+ /*!
+ \brief Meta-function to verify if a coordinate system is radian
+ \ingroup core
+ */
+ template <typename CS>
+ struct is_radian : boost::true_type {};
+
+
+ #ifndef DOXYGEN_NO_SPECIALIZATIONS
+
+ // Specialization for any degree coordinate systems
+ template <template<typename> class CS>
+ struct is_radian< CS<degree> > : boost::false_type {};
+
+ #endif
+
+
+
+} // namespace geometry
+
+
+#endif //_GEOMETRY_CS_HPP

Added: sandbox/ggl/boost/ggl/geometry/core/exterior_ring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/exterior_ring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,100 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_EXTERIOR_RING_HPP
+#define _GEOMETRY_EXTERIOR_RING_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+
+#include <geometry/core/tag.hpp>
+#include <geometry/core/tags.hpp>
+#include <geometry/core/ring_type.hpp>
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+
+ /*!
+ \brief Traits class defining access to exterior_ring of a polygon
+ \details Should define const and non const access
+ \ingroup traits
+ \tparam G geometry
+ \par Geometries:
+ - polygon
+ \par Specializations should provide:
+ - static inline RING& get(POLY& )
+ - static inline const RING& get(const POLY& )
+ */
+ template <typename P>
+ struct exterior_ring {};
+
+ } // namespace traits
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+ template <typename TAG, typename G> struct exterior_ring {};
+
+ template <typename P>
+ struct exterior_ring<polygon_tag, P>
+ {
+ static inline typename ring_type<polygon_tag, P>::type& get(P& polygon)
+ {
+ return traits::exterior_ring<P>::get(polygon);
+ }
+
+ static inline const typename ring_type<polygon_tag, P>::type& get(const P& polygon)
+ {
+ return traits::exterior_ring<P>::get(polygon);
+ }
+ };
+
+
+ } // namespace core_dispatch
+ #endif
+
+
+ /*!
+ \brief Function to get the exterior_ring ring of a polygon
+ \ingroup access
+ \note OGC compliance: instead of ExteriorRing
+ \tparam P polygon type
+ \param polygon the polygon to get the exterior ring from
+ \return a reference to the exterior ring
+ */
+ template <typename P>
+ inline typename ring_type<P>::type& exterior_ring(P& polygon)
+ {
+ return core_dispatch::exterior_ring<typename tag<P>::type, P>::get(polygon);
+ }
+
+ /*!
+ \brief Function to get the exterior ring of a polygon (const version)
+ \ingroup access
+ \note OGC compliance: instead of ExteriorRing
+ \tparam P polygon type
+ \param polygon the polygon to get the exterior ring from
+ \return a const reference to the exterior ring
+ */
+ template <typename P>
+ inline const typename ring_type<P>::type& exterior_ring(const P& polygon)
+ {
+ return core_dispatch::exterior_ring<typename tag<P>::type, P>::get(polygon);
+ }
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/interior_rings.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/interior_rings.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,162 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_INTERIOR_RINGS_HPP
+#define _GEOMETRY_INTERIOR_RINGS_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+
+#include <geometry/core/tag.hpp>
+#include <geometry/core/tags.hpp>
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class indicating interior container type of a polygon
+ \details defines inner container type, so the container containing the interior rings
+ \ingroup traits
+ \par Geometries:
+ - polygon
+ \par Specializations should provide:
+ - typedef CONTAINER<RING<P> > type (e.g. std::vector<linear_ring<P> >)
+ \tparam G geometry
+ */
+ template <typename G>
+ struct interior_type { };
+
+
+ /*!
+ \brief Traits class defining access to interior_rings of a polygon
+ \details defines access (const and non const) to interior ring
+ \ingroup traits
+ \par Geometries:
+ - polygon
+ \par Specializations should provide:
+ - static inline INTERIOR& get(POLY&)
+ - static inline const INTERIOR& get(const POLY&)
+ \tparam G geometry
+ */
+ template <typename G>
+ struct interior_rings
+ {
+ };
+
+
+ } // namespace traits
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+ template <typename TAG, typename G> struct interior_type {};
+
+ template <typename P>
+ struct interior_type<polygon_tag, P>
+ {
+ typedef typename traits::interior_type<P>::type type;
+ };
+
+
+
+ template <typename TAG, typename G> struct interior_rings {};
+
+ template <typename P>
+ struct interior_rings<polygon_tag, P>
+ {
+ static inline typename interior_type<polygon_tag, P>::type& get(P& polygon)
+ {
+ return traits::interior_rings<P>::get(polygon);
+ }
+
+ static inline const typename interior_type<polygon_tag, P>::type& get(const P& polygon)
+ {
+ return traits::interior_rings<P>::get(polygon);
+ }
+ };
+
+
+
+ } // namespace core_dispatch
+ #endif
+
+
+
+
+ /*!
+ \brief Meta-function defining container type of inner rings of (multi)polygon geometriy
+ \details the interior rings should be organized as a container (std::vector, std::deque, boost::array) with
+ boost range support. This meta function defines the type of that container.
+ \ingroup core
+ */
+ template <typename G>
+ struct interior_type
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ typedef typename core_dispatch::interior_type<typename tag<G>::type, NCG>::type type;
+ };
+
+
+
+ /*!
+ \brief Function to get the interior rings of a polygon (non const version)
+ \ingroup access
+ \note OGC compliance: instead of InteriorRingN
+ \tparam P polygon type
+ \param polygon the polygon to get the interior rings from
+ \return a reference to the interior rings
+ */
+ template <typename P>
+ inline typename interior_type<P>::type& interior_rings(P& polygon)
+ {
+ return core_dispatch::interior_rings<typename tag<P>::type, P>::get(polygon);
+ }
+
+
+ /*!
+ \brief Function to get the interior rings of a polygon (const version)
+ \ingroup access
+ \note OGC compliance: instead of InteriorRingN
+ \tparam P polygon type
+ \param polygon the polygon to get the interior rings from
+ \return a const reference to the interior rings
+ */
+ template <typename P>
+ inline const typename interior_type<P>::type& interior_rings(const P& polygon)
+ {
+ return core_dispatch::interior_rings<typename tag<P>::type, P>::get(polygon);
+ }
+
+
+
+ /*!
+ \brief Function to get the number of interior rings of a polygon
+ \ingroup access
+ \note Defined by OGC as "numInteriorRing". To be consistent with "numPoints"
+ letter "s" is appended
+ \tparam P polygon type
+ \param polygon the polygon
+ \return the nubmer of interior rings
+ */
+ template <typename P>
+ inline size_t num_interior_rings(const P& polygon)
+ {
+ return boost::size(interior_rings(polygon));
+ }
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/point_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/point_type.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,106 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_POINT_TYPE_HPP
+#define _GEOMETRY_POINT_TYPE_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/tag.hpp>
+#include <geometry/core/tags.hpp>
+#include <geometry/core/ring_type.hpp>
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class indicating the type of contained points
+ \ingroup traits
+ \par Geometries:
+ - all geometries except point
+ \par Specializations should provide:
+ - typedef P type (where P should fulfil the Point concept)
+ \tparam G geometry
+ */
+ template <typename G>
+ struct point_type {};
+
+ } // namespace traits
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+
+
+ template <typename TAG, typename G>
+ struct point_type
+ {
+ // Default: call traits to get point type
+ typedef typename boost::remove_const<typename traits::point_type<G>::type>::type type;
+ };
+
+ // Specialization for point: the point itself
+ template <typename P>
+ struct point_type<point_tag, P>
+ {
+ typedef P type;
+ };
+
+ // Specializations for linestring/linear ring, via boost::range
+ template <typename R>
+ struct point_type<linestring_tag, R>
+ {
+ typedef typename boost::range_value<R>::type type;
+ };
+
+ template <typename R>
+ struct point_type<ring_tag, R>
+ {
+ typedef typename boost::range_value<R>::type type;
+ };
+
+
+ // Specialization for polygon: the point-type is the point-type of its rinsg
+ template <typename P>
+ struct point_type<polygon_tag, P>
+ {
+ typedef typename ring_type<polygon_tag, P>::type R;
+ typedef typename point_type<ring_tag, R>::type type;
+ };
+
+ } // namespace core_dispatch
+ #endif
+
+
+ /*!
+ \brief Meta-function which defines point type of any geometry
+ \ingroup core
+ */
+ template <typename G>
+ struct point_type
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ typedef typename core_dispatch::point_type<typename tag<G>::type, NCG>::type type;
+ };
+
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/radian_access.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/radian_access.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,104 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_RADIAN_ACCESS_HPP
+#define _GEOMETRY_RADIAN_ACCESS_HPP
+
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/cs.hpp>
+
+#include <geometry/util/math.hpp>
+
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ template <size_t D, typename G, typename DR>
+ struct radian_access
+ {
+ };
+
+ template <size_t D, typename G, template<typename> class CS>
+ struct radian_access<D, G, CS<radian> >
+ {
+ typedef typename coordinate_type<G>::type T;
+
+ static inline T get(const G& geometry)
+ {
+ return geometry::get<D>(geometry);
+ }
+
+ static inline void set(G& geometry, const typename coordinate_type<G>::type& radians)
+ {
+ geometry::set<D>(geometry, radians);
+ }
+
+ };
+
+ template <size_t D, typename G, template<typename> class CS>
+ struct radian_access<D, G, CS<degree> >
+ {
+ typedef typename coordinate_type<G>::type T;
+
+ static inline T get(const G& geometry)
+ {
+ return geometry::get<D>(geometry) * math::d2r;
+ }
+
+ static inline void set(G& geometry, const typename coordinate_type<G>::type& radians)
+ {
+ geometry::set<D>(geometry, radians * math::r2d);
+ }
+
+ };
+
+ } // namespace impl
+ #endif
+
+
+ /*!
+ \brief get a coordinate value of a point, result is in RADIAN
+ \details also if coordinate system was in degree, result is in radian
+ \return coordinate value
+ \ingroup access
+ \tparam D dimension
+ \tparam G geometry
+ \param geometry geometry to get coordinate value from
+ */
+ template <size_t D, typename G>
+ inline typename coordinate_type<G>::type get_as_radian(const G& geometry)
+ {
+ return impl::radian_access<D, G, typename coordinate_system<G>::type>::get(geometry);
+ };
+
+
+ /*!
+ \brief assign coordinate value (which is in radian) to a point
+ \details if coordinate system of point is in degree, will be converted to degree
+ \ingroup access
+ \tparam D dimension
+ \tparam G geometry
+ \param geometry geometry to assign coordinate to
+ \param radians coordinate value to assign
+ */
+ template <size_t D, typename G>
+ inline void set_from_radian(G& geometry, const typename coordinate_type<G>::type& radians)
+ {
+ impl::radian_access<D, G, typename coordinate_system<G>::type>::set(geometry, radians);
+ }
+
+
+}
+
+
+#endif // _GEOMETRY_RADIAN_ACCESS_HPP

Added: sandbox/ggl/boost/ggl/geometry/core/radius.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/radius.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,159 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_RADIUS_HPP
+#define _GEOMETRY_RADIUS_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+
+#include <geometry/core/tag.hpp>
+
+
+namespace geometry
+{
+
+ namespace traits
+ {
+ /*!
+ \brief Traits class to get/set radius of a circle/sphere/(ellipse)
+ \details the radius access meta-functions give read/write access to the radius of a circle or a sphere,
+ or to the major/minor axis or an ellipse, or to one of the 3 equatorial radii of an ellipsoid.
+
+ It should be specialized per geometry, in namespace core_dispatch. Those specializations should
+ forward the call via traits to the geometry class, which could be specified by the user.
+
+ There is a corresponding generic radius_get and radius_set function
+ \par Geometries:
+ - n-sphere (circle,sphere)
+ - upcoming ellipse
+ \par Specializations should provide:
+ - inline static T get(const G& geometry)
+ - inline static void set(G& geometry, const T& radius)
+ \ingroup traits
+ */
+ template <typename G, typename T, size_t D>
+ struct radius_access {};
+
+
+ /*!
+ \brief Traits class indicating the type (double,float,...) of the radius of a circle or a sphere
+ \par Geometries:
+ - n-sphere (circle,sphere)
+ - upcoming ellipse
+ \par Specializations should provide:
+ - typedef T type (double,float,int,etc)
+ \ingroup traits
+ */
+ template <typename G>
+ struct radius_type {};
+
+ }
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+
+ template <typename TAG, typename G>
+ struct radius_type
+ {
+ //typedef core_dispatch_specialization_required type;
+ };
+
+
+ /*!
+ \brief radius access meta-functions, used by concept n-sphere and upcoming ellipse.
+ */
+ template <typename TAG, typename G, typename T, size_t D>
+ struct radius_access
+ {
+ //static inline T get(const G& ) {}
+ //static inline void set(G& g, const T& value) {}
+ };
+
+
+
+ template <typename S>
+ struct radius_type<nsphere_tag, S>
+ {
+ typedef typename traits::radius_type<S>::type type;
+ };
+
+
+
+ template <typename S, typename T, size_t D>
+ struct radius_access<nsphere_tag, S, T, D>
+ {
+ BOOST_STATIC_ASSERT((D == 0));
+ static inline T get(const S& s)
+ {
+ return traits::radius_access<S, T, D>::get(s);
+ }
+ static inline void set(S& s, const T& radius)
+ {
+ traits::radius_access<S, T, D>::set(s, radius);
+ }
+ };
+
+ } // namespace core_dispatch
+ #endif
+
+
+
+ template <typename G>
+ struct radius_type
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ typedef typename core_dispatch::radius_type<
+ typename tag<G>::type, NCG>::type type;
+ };
+
+
+ /*!
+ \brief Function to get radius
+ \return radius of a circle / sphere / ellipse
+ \ingroup access
+ \param geometry the geometry to get the radius from
+ \tparam I index, for circle/sphere always zero, for ellipse major/minor axis,
+ for ellipsoid one of the 3 equatorial radii
+ */
+ template <size_t I, typename G>
+ inline typename radius_type<G>::type get_radius(const G& geometry)
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ return core_dispatch::radius_access<typename tag<G>::type, NCG,
+ typename radius_type<G>::type, I>::get(geometry);
+ };
+
+
+ /*!
+ \brief Function to set the radius of a circle / sphere / (ellipse)
+ \ingroup access
+ \tparam I index, for circle/sphere always zero, for ellipse major/minor axis,
+ for ellipsoid one of the 3 equatorial radii
+ \param geometry the geometry to change
+ \param radius the radius to set
+ */
+ template <size_t I, typename G>
+ inline void set_radius(G& geometry, const typename radius_type<G>::type& radius)
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ core_dispatch::radius_access<typename tag<G>::type, G,
+ typename radius_type<G>::type, I>::set(geometry, radius);
+ }
+
+
+
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/ring_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/ring_type.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,90 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_RING_TYPE_HPP
+#define _GEOMETRY_RING_TYPE_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+
+
+#include <geometry/core/tag.hpp>
+#include <geometry/core/tags.hpp>
+
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class to indicate ring-type of a polygon's exterior ring/interior rings
+ \ingroup traits
+ \par Geometries:
+ - polygon
+ \par Specializations should provide:
+ - typedef XXX type (e.g. linear_ring<P>)
+ \tparam G geometry
+ */
+ template <typename G>
+ struct ring_type
+ {
+ // should define type
+ };
+
+
+
+ } // namespace traits
+
+
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+
+
+ template <typename TAG, typename G> struct ring_type {};
+
+ // Specialization for polygon
+ template <typename P>
+ struct ring_type<polygon_tag, P>
+ {
+ typedef typename traits::ring_type<P>::type type;
+ };
+
+
+
+
+ } // namespace core_dispatch
+ #endif
+
+
+ /*!
+ \brief Meta-function which defines ring type of (multi)polygon geometry
+ \details a polygon contains one exterior ring and zero or more interior rings (holes).
+ The type of those rings is assumed to be equal. This meta function retrieves the type
+ of such rings.
+ \ingroup core
+ */
+ template <typename G>
+ struct ring_type
+ {
+ typedef typename boost::remove_const<G>::type NCG;
+ typedef typename core_dispatch::ring_type<typename tag<G>::type, NCG>::type type;
+ };
+
+
+
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/tag.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/tag.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,65 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_TAG_HPP
+#define _GEOMETRY_TAG_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+
+#include <geometry/core/tags.hpp>
+
+/*!
+\defgroup core core: meta-functions for geometry types
+*/
+
+namespace geometry
+{
+
+ namespace traits
+ {
+
+ /*!
+ \brief Traits class to attach a tag to a geometry
+ \details All geometries should implement a traits::tag<G>::type metafunction to indicate their
+ own geometry type.
+ \ingroup traits
+ \par Geometries:
+ - all geometries
+ \par Specializations should provide:
+ - typedef XXX_tag type; (point_tag, box_tag, ...)
+ \tparam G geometry
+ */
+ template <typename G>
+ struct tag
+ {
+ typedef geometry_not_recognized_tag type;
+ };
+
+ }
+
+
+ /*!
+ \brief Meta-function to get the tag of any geometry type
+ \details All geometries tell their geometry type (point, linestring, polygon, etc) by implementing
+ a tag traits class. This meta-function uses that traits class to retrieve the tag.
+ If the input type is not a geometry at all, a geometry_not_recognized_tag will be returned.
+ \tparam G geometry
+ \ingroup core
+ */
+ template <typename G>
+ struct tag
+ {
+ typedef typename traits::tag<typename boost::remove_const<G>::type>::type type;
+ };
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/core/tags.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/tags.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,83 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_TAGS_HPP
+#define _GEOMETRY_TAGS_HPP
+
+
+/*!
+\defgroup traits traits: adapt geometries
+\brief Traits classes are small classes or structs to adapt geometries
+such that they are recognized by the Generic Geometry Library
+*/
+
+
+namespace geometry
+{
+
+
+
+ // Tags defining strategies linked to coordinate systems
+
+ /// Tag indicating Cartesian coordinate system family (cartesian,epsg)
+ struct cartesian_tag {};
+
+
+ /// Tag indicating Geographic coordinate system family (geographic)
+ struct geographic_tag {};
+
+ /// Tag indicating Spherical coordinate system family (spherical,celestial,...)
+ struct spherical_tag {};
+
+
+ // Tags defining geometry types
+
+
+ /// "default" tag
+ struct geometry_not_recognized_tag {};
+
+ /// OGC Point identifying tag
+ struct point_tag {};
+
+ /// OGC Linestring identifying tag
+ struct linestring_tag {};
+
+ /// OGC Polygon identifying tag
+ struct polygon_tag {};
+
+ /// OGC Multi point identifying tag
+ struct multi_point_tag {};
+
+ /// OGC Multi linestring identifying tag
+ struct multi_linestring_tag {};
+
+ /// OGC Multi polygon identifying tag
+ struct multi_polygon_tag {};
+
+ /// OGC Geometry Collection identifying tag
+ struct geometry_collection_tag {};
+
+
+
+ /// Convenience (linear) ring identifying tag
+ struct ring_tag {};
+
+ /// Convenience 2D or 3D box (mbr) identifying tag
+ struct box_tag {};
+
+ /// Convenience 2D (circle) or 3D (sphere) n-sphere identifying tag
+ struct nsphere_tag {};
+
+ /// Convenience segment (2-points) identifying tag
+ struct segment_tag {};
+
+
+
+} // namespace geometry
+
+#endif // _GEOMETRY_TAGS_HPP

Added: sandbox/ggl/boost/ggl/geometry/core/topological_dimension.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/core/topological_dimension.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,66 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_TOPOLOGICAL_DIMENSION_HPP
+#define _GEOMETRY_TOPOLOGICAL_DIMENSION_HPP
+
+
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/mpl/int.hpp>
+
+#include <geometry/core/tag.hpp>
+#include <geometry/core/tags.hpp>
+
+
+namespace geometry
+{
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace core_dispatch
+ {
+ template <typename TAG, typename G>
+ struct top_dim {};
+
+ template <typename G> struct top_dim<point_tag, G> : boost::mpl::int_<0> {};
+ template <typename G> struct top_dim<linestring_tag, G> : boost::mpl::int_<1> {};
+ template <typename G> struct top_dim<segment_tag, G> : boost::mpl::int_<1> {};
+ template <typename G> struct top_dim<ring_tag, G> : boost::mpl::int_<2> {};
+ template <typename G> struct top_dim<box_tag, G> : boost::mpl::int_<2> {};
+ template <typename G> struct top_dim<polygon_tag, G> : boost::mpl::int_<2> {};
+
+ // check, sphere=3?
+ template <typename G> struct top_dim<nsphere_tag, G> : boost::mpl::int_<2> {};
+
+
+
+ } // namespace core_dispatch
+ #endif
+
+
+
+
+ /*!
+ \brief Meta-function returning gives the topological dimension of a geometry
+ \details The topological dimension defines a point as 0-dimensional, a linestring as 1-dimensional,
+ and a ring or polygon as 2-dimensional.
+ \see http://www.math.okstate.edu/mathdept/dynamics/lecnotes/node36.html
+ \ingroup core
+ */
+ template <typename G>
+ struct topological_dimension
+ : core_dispatch::top_dim
+ < typename tag<G>::type , typename boost::remove_const<G>::type >
+ { };
+
+
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/boost_array_as_linestring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/boost_array_as_linestring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,40 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_BOOST_ARRAY_AS_LINESTRING_HPP
+#define _GEOMETRY_ADAPTED_BOOST_ARRAY_AS_LINESTRING_HPP
+
+
+#ifdef _GEOMETRY_ADAPTED_BOOST_ARRAY_RANGE_TAG_DEFINED
+#error Include only one headerfile to register tag for adapted boost::array
+#endif
+
+#define _GEOMETRY_ADAPTED_BOOST_ARRAY_RANGE_TAG_DEFINED
+
+
+#include <boost/array.hpp>
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ template <typename T, size_t N>
+ struct tag< boost::array<T, N> >
+ {
+ typedef linestring_tag type;
+ };
+
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/boost_array_as_ring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/boost_array_as_ring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,40 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_BOOST_ARRAY_AS_RING_HPP
+#define _GEOMETRY_ADAPTED_BOOST_ARRAY_AS_RING_HPP
+
+
+#ifdef _GEOMETRY_ADAPTED_BOOST_ARRAY_RANGE_TAG_DEFINED
+#error Include only one headerfile to register tag for adapted boost::array
+#endif
+
+#define _GEOMETRY_ADAPTED_BOOST_ARRAY_RANGE_TAG_DEFINED
+
+
+#include <boost/array.hpp>
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ template <typename T, size_t N>
+ struct tag< boost::array<T, N> >
+ {
+ typedef ring_tag type;
+ };
+
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,70 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_C_ARRAY_HPP
+#define _GEOMETRY_ADAPTED_C_ARRAY_HPP
+
+#include <boost/type_traits/is_arithmetic.hpp>
+
+#include <geometry/core/cs.hpp>
+#include <geometry/core/tags.hpp>
+#include <geometry/core/coordinate_type.hpp>
+#include <geometry/core/coordinate_dimension.hpp>
+#include <geometry/core/access.hpp>
+
+
+
+
+namespace geometry
+{
+
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ // Create class and specialization to indicate the tag
+ // for normal cases and the case that the type of the c-array is arithmetic
+ template <bool> struct c_array_tag { typedef geometry_not_recognized_tag type; };
+ template <> struct c_array_tag<true> { typedef point_tag type; };
+ }
+ #endif
+
+ // Assign the point-tag, preventing arrays of points getting a point-tag
+ template <typename T, size_t N>
+ struct tag<T[N]> : impl::c_array_tag<boost::is_arithmetic<T>::value> {};
+
+ template <typename T, size_t N>
+ struct coordinate_type<T[N]> { typedef T type; };
+
+ template <typename T, size_t N>
+ struct dimension<T[N]>: boost::mpl::int_<N> {};
+
+ template <typename T, size_t N>
+ struct access<T[N]>
+ {
+ template <size_t I>
+ static inline T get(const T p[N]) { return p[I]; }
+
+ template <size_t I>
+ static inline void set(T p[N], const T& value) { p[I] = value; }
+ };
+
+
+ // The library user has
+ // 1) either to specify the coordinate system
+ // 2) or include <geometry/geometries/adapted/c_array__at_.hpp> where @=cartesian,geographic,...
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array_cartesian.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array_cartesian.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,37 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_C_ARRAY_CARTESIAN_HPP
+#define _GEOMETRY_ADAPTED_C_ARRAY_CARTESIAN_HPP
+
+#ifdef _GEOMETRY_ADAPTED_C_ARRAY_COORDINATE_SYSTEM_DEFINED
+#error Include only one headerfile to register coordinate coordinate_system for adapted c array
+#endif
+
+#define _GEOMETRY_ADAPTED_C_ARRAY_COORDINATE_SYSTEM_DEFINED
+
+
+#include <geometry/geometries/adapted/c_array.hpp>
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename T, int N>
+ struct coordinate_system<T[N]>
+ { typedef cs::cartesian type; };
+
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array_geographic.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/c_array_geographic.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,35 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_C_ARRAY_GEOGRAPHIC_HPP
+#define _GEOMETRY_ADAPTED_C_ARRAY_GEOGRAPHIC_HPP
+
+#ifdef _GEOMETRY_ADAPTED_C_ARRAY_COORDINATE_SYSTEM_DEFINED
+#error Include only one headerfile to register coordinate coordinate_system for adapted c array
+#endif
+
+#define _GEOMETRY_ADAPTED_C_ARRAY_COORDINATE_SYSTEM_DEFINED
+
+#include <geometry/geometries/adapted/c_array.hpp>
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename T, int N>
+ struct coordinate_system<T[N]>
+ { typedef cs::geographic type; };
+
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/std_as_linestring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/std_as_linestring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,61 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_STD_AS_LINESTRING_HPP
+#define _GEOMETRY_ADAPTED_STD_AS_LINESTRING_HPP
+
+
+#ifdef _GEOMETRY_ADAPTED_STD_RANGE_TAG_DEFINED
+#error Include only one headerfile to register tag for adapted std:: containers or iterator pair
+#endif
+
+#define _GEOMETRY_ADAPTED_STD_RANGE_TAG_DEFINED
+
+
+#include <vector>
+#include <deque>
+#include <list>
+#include <utility>
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace util
+ {
+ struct std_as_linestring
+ {
+ typedef linestring_tag type;
+ };
+
+ }
+ #endif
+
+
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ // specialization for an iterator pair (read only)
+ template <typename P> struct tag< std::pair<P, P> > : util::std_as_linestring {};
+
+ // Indicate that std::library is not used to add things to std::pair.
+ // Don't implement anything else -> adding points or clearing not possible
+ template <typename P> struct use_std< std::pair<P, P> > : boost::mpl::false_ {};
+
+ // specializations for a std:: containers: vector, deque, list
+ template <typename P> struct tag< std::vector<P> > : util::std_as_linestring {};
+ template <typename P> struct tag< std::deque<P> > : util::std_as_linestring {};
+ template <typename P> struct tag< std::list<P> > : util::std_as_linestring {};
+
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/std_as_ring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/std_as_ring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,43 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_STD_AS_RING_HPP
+#define _GEOMETRY_ADAPTED_STD_AS_RING_HPP
+
+
+#ifdef _GEOMETRY_ADAPTED_STD_RANGE_TAG_DEFINED
+#error Include only one headerfile to register tag for adapted std:: containers or iterator pair
+#endif
+
+#define _GEOMETRY_ADAPTED_STD_RANGE_TAG_DEFINED
+
+
+#include <vector>
+#include <deque>
+#include <list>
+#include <utility>
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ // specialization for an iterator pair
+ template <typename T> struct tag< std::pair<T, T> > { typedef ring_tag type; };
+
+ // specialization for a std:: containers: vector, deque, list
+ template <typename T> struct tag< std::vector<T> > { typedef ring_tag type; };
+ template <typename T> struct tag< std::deque<T> > { typedef ring_tag type; };
+ template <typename T> struct tag< std::list<T> > { typedef ring_tag type; };
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,60 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_TUPLE_HPP
+#define _GEOMETRY_ADAPTED_TUPLE_HPP
+
+
+#include <boost/tuple/tuple.hpp>
+
+#include <geometry/core/tags.hpp>
+
+#include <geometry/core/coordinate_type.hpp>
+#include <geometry/core/coordinate_dimension.hpp>
+#include <geometry/core/point_type.hpp>
+
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename T>
+ struct coordinate_type<boost::tuple<T, T> >
+ { typedef T type; };
+
+ template <typename T>
+ struct dimension<boost::tuple<T, T> > : boost::mpl::int_<2> {};
+
+ template <typename T>
+ struct access<boost::tuple<T, T> >
+ {
+ template <int I>
+ static inline T get(const boost::tuple<T, T>& p) { return p.get<I>(); }
+
+ template <int I>
+ static inline void set(boost::tuple<T, T>& p, const T& value) { p.get<I>() = value; }
+ };
+
+
+ template <typename T>
+ struct tag<boost::tuple<T, T> >
+ { typedef point_tag type; };
+
+
+ // The library user has
+ // 1) either to specify the coordinate system
+ // 2) or include <geometry/geometries/adapted/tuple__at_.hpp> where @=cartesian,geographic,...
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple_cartesian.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple_cartesian.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,37 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_TUPLE_CARTESIAN_HPP
+#define _GEOMETRY_ADAPTED_TUPLE_CARTESIAN_HPP
+
+#ifdef _GEOMETRY_ADAPTED_TUPLE_COORDINATE_SYSTEM_DEFINED
+#error Include only one headerfile to register coordinate coordinate_system for adapted tuple
+#endif
+
+#define _GEOMETRY_ADAPTED_TUPLE_COORDINATE_SYSTEM_DEFINED
+
+
+#include <geometry/geometries/adapted/tuple.hpp>
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename T>
+ struct coordinate_system<boost::tuple<T, T> >
+ { typedef cs::cartesian type; };
+
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple_geographic.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/adapted/tuple_geographic.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,37 @@
+// Generic Geometry Library
+//
+// Copyright Bruno Lalande 2008, 2009
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_ADAPTED_TUPLE_GEOGRAPHIC_HPP
+#define _GEOMETRY_ADAPTED_TUPLE_GEOGRAPHIC_HPP
+
+#ifdef _GEOMETRY_ADAPTED_TUPLE_COORDINATE_SYSTEM_DEFINED
+#error Include only one headerfile to register coordinate coordinate_system for adapted tuple
+#endif
+
+#define _GEOMETRY_ADAPTED_TUPLE_COORDINATE_SYSTEM_DEFINED
+
+
+#include <geometry/geometries/adapted/tuple.hpp>
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename T>
+ struct coordinate_system<boost::tuple<T, T> >
+ { typedef cs::geographic type; };
+
+ }
+ #endif
+}
+
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/geometries/box.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/box.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,106 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_BOX_HPP
+#define _GEOMETRY_BOX_HPP
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+
+#include <geometry/algorithms/assign.hpp>
+#include <geometry/util/copy.hpp>
+
+namespace geometry
+{
+
+ /*!
+ \brief Class box: defines a box made of two describing points
+ \ingroup Geometry
+ \details Box is always described by a min_corner() and a max_corner() point. If another
+ rectangle is used, use linear_ring or polygon.
+ \note Boxes are for selections and for calculating the envelope of geometries. Not all algorithms
+ are implemented for box. Boxes are also used in Spatial Indexes.
+ \tparam P point type. The box takes a point type as template parameter.
+ The point type can be any point type.
+ It can be 2D but can also be 3D or more dimensional.
+ The box can also take a latlong point type as template parameter.
+ */
+
+ template<typename P>
+ class box
+ {
+ BOOST_CONCEPT_ASSERT((Point<P>));
+
+ public :
+ inline box()
+ {}
+
+ /*!
+ \brief Constructor taking the minimum corner point and the maximum corner point
+ */
+ inline box(const P& min_corner, const P& max_corner)
+ {
+ copy_coordinates(min_corner, m_min_corner);
+ copy_coordinates(max_corner, m_max_corner);
+ }
+
+
+ inline const P& min_corner() const { return m_min_corner; }
+ inline const P& max_corner() const { return m_max_corner; }
+
+ inline P& min_corner() { return m_min_corner; }
+ inline P& max_corner() { return m_max_corner; }
+
+ private :
+ P m_min_corner, m_max_corner;
+ };
+
+
+
+ // Traits specializations for box above
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ template <typename P>
+ struct tag< box<P> > { typedef box_tag type; };
+
+ template <typename P>
+ struct point_type<box<P> > { typedef P type; };
+
+
+ template <typename P, size_t C, size_t D>
+ struct indexed_access<box<P>, C, D>
+ {
+ typedef box<P> B;
+
+ static inline typename geometry::coordinate_type<B>::type get(const B& b)
+ {
+ return C == min_corner ? geometry::get<D>(b.min_corner()) : geometry::get<D>(b.max_corner());
+ }
+
+ static inline void set(B& b, const typename geometry::coordinate_type<B>::type& value)
+ {
+ if (C == min_corner)
+ {
+ geometry::set<D>(b.min_corner(), value);
+ }
+ else
+ {
+ geometry::set<D>(b.max_corner(), value);
+ }
+ }
+ };
+
+ }
+ #endif
+
+
+};
+
+#endif // _GEOMETRY_BOX_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/cartesian2d.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/cartesian2d.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,29 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_CARTESIAN2D_HPP
+#define _GEOMETRY_CARTESIAN2D_HPP
+
+// Predeclare common Cartesian 2D points for convenience
+
+#include <geometry/geometries/geometries.hpp>
+
+namespace geometry
+{
+ typedef point_xy<double, cs::cartesian> point_2d;
+ typedef linestring<point_2d> linestring_2d;
+ typedef linear_ring<point_2d> ring_2d;
+ typedef polygon<point_2d> polygon_2d;
+ typedef box<point_2d> box_2d;
+ typedef segment<point_2d> segment_2d;
+
+ typedef nsphere<point_2d, double> circle;
+}
+
+
+#endif // _GEOMETRY_CARTESIAN2D_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/cartesian3d.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/cartesian3d.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,28 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_CARTESIAN3D_HPP
+#define _GEOMETRY_CARTESIAN3D_HPP
+
+// Predeclare common Cartesian 3D points for convenience
+
+#include <geometry/geometries/geometries.hpp>
+
+namespace geometry
+{
+ typedef point<double, 3, cs::cartesian> point_3d;
+ typedef linestring<point_3d> linestring_3d;
+ typedef linear_ring<point_3d> ring_3d;
+ typedef polygon<point_3d> polygon_3d;
+ typedef box<point_3d> box_3d;
+
+ typedef nsphere<point_3d, double> sphere;
+}
+
+
+#endif // _GEOMETRY_CARTESIAN3D_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/geometries.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/geometries.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,29 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_GEOMETRIES_HPP
+#define _GEOMETRY_GEOMETRIES_HPP
+
+
+#include <geometry/geometries/adapted/c_array.hpp>
+#include <geometry/geometries/adapted/tuple.hpp>
+
+#include <geometry/geometries/point.hpp>
+#include <geometry/geometries/point_ll.hpp>
+#include <geometry/geometries/point_xy.hpp>
+#include <geometry/geometries/linestring.hpp>
+#include <geometry/geometries/linear_ring.hpp>
+#include <geometry/geometries/polygon.hpp>
+
+
+#include <geometry/geometries/box.hpp>
+#include <geometry/geometries/nsphere.hpp>
+#include <geometry/geometries/segment.hpp>
+
+
+#endif // _GEOMETRY_GEOMETRIES_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/latlong.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/latlong.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,34 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_LATLONG_HPP
+#define _GEOMETRY_LATLONG_HPP
+
+// Predeclare common Cartesian 3D points for convenience
+
+#include <geometry/geometries/geometries.hpp>
+
+namespace geometry
+{
+ typedef point_ll<double, cs::geographic<degree> > point_ll_deg;
+ typedef linestring<point_ll_deg> linestring_ll_deg;
+ typedef linear_ring<point_ll_deg> ring_ll_deg;
+ typedef polygon<point_ll_deg> polygon_ll_deg;
+ typedef box<point_ll_deg> box_ll_deg;
+ typedef segment<point_ll_deg> segment_ll_deg;
+
+ typedef point_ll<double, cs::geographic<radian> > point_ll_rad;
+ typedef linestring<point_ll_rad> linestring_ll_rad;
+ typedef linear_ring<point_ll_rad> ring_ll_rad;
+ typedef polygon<point_ll_rad> polygon_ll_rad;
+ typedef box<point_ll_rad> box_ll_rad;
+ typedef segment<point_ll_rad> segment_ll_rad;
+}
+
+
+#endif // _GEOMETRY_LATLONG_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/linear_ring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/linear_ring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,56 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_LINEAR_RING_HPP
+#define _GEOMETRY_LINEAR_RING_HPP
+
+#include <vector>
+
+#include <boost/concept/assert.hpp>
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief A linear_ring (linear linear_ring) is a closed line which should not be selfintersecting
+ \ingroup Geometry
+ \tparam P point type
+ \tparam V optional container type, for example std::vector, std::list, std::deque
+ \tparam A optional container-allocator-type
+ */
+ template<typename P,
+ template<typename,typename> class V = std::vector,
+ template<typename> class A = std::allocator>
+ class linear_ring : public V<P, A<P> >
+ {
+ BOOST_CONCEPT_ASSERT((Point<P>));
+ };
+
+
+
+
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename P, template<typename,typename> class V, template<typename> class A>
+ struct tag< linear_ring<P, V, A> >
+ {
+ typedef ring_tag type;
+ };
+
+
+ }
+ #endif
+
+
+} // namespace geometry
+
+
+#endif //_GEOMETRY_LINEAR_RING_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/linestring.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/linestring.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,57 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_LINESTRING_HPP
+#define _GEOMETRY_LINESTRING_HPP
+
+#include <vector>
+
+#include <boost/concept/assert.hpp>
+#include <boost/range/functions.hpp>
+
+
+namespace geometry
+{
+
+
+ /*!
+ \brief A linestring (named so by OGC) is a collection (default a vector) of points.
+ \ingroup Geometry
+ \tparam P point type
+ \tparam V optional container type, for example std::vector, std::list, std::deque
+ \tparam A optional container-allocator-type
+ (see http://accu.org/index.php/journals/427#ftn.d0e249 )
+ \par Concepts:
+ All algorithms work on ranges, based on a container with point types fulfilling
+ the point concepts. They will take linestring, but also vector, std::pair, or other containers.
+ */
+ template<typename P,
+ template<typename,typename> class V = std::vector,
+ template<typename> class A = std::allocator>
+ class linestring : public V<P, A<P> >
+ {
+ BOOST_CONCEPT_ASSERT((Point<P>));
+ };
+
+
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename P, template<typename,typename> class V, template<typename> class A>
+ struct tag< linestring<P, V, A> >
+ {
+ typedef linestring_tag type;
+ };
+ }
+ #endif
+
+
+} // namespace geometry
+
+
+#endif //_GEOMETRY_LINESTRING_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/nsphere.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/nsphere.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,122 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_NSPHERE_HPP
+#define _GEOMETRY_NSPHERE_HPP
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/nsphere_concept.hpp>
+
+#include <geometry/algorithms/assign.hpp>
+#include <geometry/util/copy.hpp>
+
+namespace geometry
+{
+ /*!
+ \brief Class nsphere: defines a circle or a sphere: a point with radius
+ \ingroup Geometry
+ \details The name nsphere is quite funny but the best description of the class. It can be a circle (2D),
+ a sphere (3D), or higher (hypersphere) or lower. According to Wikipedia this name is the most appropriate.
+ It was mentioned on the Boost list.
+ An alternative is the more fancy name "sphercle" but that might be a bit too much an invention.
+ \note Circle is currently used for selections, for example polygon_in_circle. Currently not all
+ algorithms are implemented for n-spheres.
+ \tparam P point type of the center
+ \tparam T number type of the radius
+ */
+ template <typename P, typename T>
+ class nsphere
+ {
+ BOOST_CONCEPT_ASSERT((Point<P>));
+
+ public :
+ typedef T radius_type;
+ typedef typename coordinate_type<P>::type coordinate_type;
+
+ nsphere()
+ : m_radius(0)
+ {
+ impl::assign::assign_value(m_center, coordinate_type());
+ }
+
+ nsphere(const P& center, const T& radius)
+ : m_radius(radius)
+ {
+ copy_coordinates(center, m_center);
+ }
+
+ inline const P& center() const { return m_center; }
+ inline const T& radius() const { return m_radius; }
+
+ inline void radius(const T& r) { m_radius = r; }
+ inline P& center() { return m_center; }
+
+ private :
+ P m_center;
+ T m_radius;
+ };
+
+
+
+ // Traits specializations for n-sphere above
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ template <typename P, typename T>
+ struct tag< nsphere<P, T> > { typedef nsphere_tag type; };
+
+ template <typename P, typename T>
+ struct point_type<nsphere<P, T> > { typedef P type; };
+
+ template <typename P, typename T>
+ struct radius_type<nsphere<P, T> > { typedef T type; };
+
+ template <typename P, typename T>
+ struct access<nsphere<P, T> >
+ {
+ typedef nsphere<P, T> S;
+
+ template <size_t D>
+ static inline typename geometry::coordinate_type<S>::type get(const S& s)
+ {
+ return geometry::get<D>(s.center());
+ }
+
+ template <size_t D>
+ static inline void set(S& s, const typename geometry::coordinate_type<S>::type& value)
+ {
+ geometry::set<D>(s.center(), value);
+ }
+ };
+
+
+ template <typename P, typename T>
+ struct radius_access<nsphere<P, T>, T, 0>
+ {
+ typedef nsphere<P, T> S;
+
+ static inline T get(const S& s)
+ {
+ return s.radius();
+ }
+
+ static inline void set(S& s, const T& value)
+ {
+ s.radius(value);
+ }
+ };
+
+
+ }
+ #endif
+
+
+}
+
+#endif // _GEOMETRY_NSPHERE_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/point.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/point.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,135 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_POINT_HPP
+#define _GEOMETRY_POINT_HPP
+
+
+#include <boost/mpl/int.hpp>
+#include <boost/static_assert.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/coordinate_type.hpp>
+#include <geometry/core/coordinate_system.hpp>
+#include <geometry/core/coordinate_dimension.hpp>
+
+#include <geometry/util/math.hpp>
+
+namespace geometry
+{
+
+
+ /*!
+ \brief Basic point class, having coordinates dfined in a neutral way
+ \ingroup Geometry
+ \tparam T numeric type, for example double, float, int
+ \tparam D number of coordinates, for example 2
+ \tparam C coordinate system, for example cs::cartesian
+ */
+ template<typename T, size_t D, typename C>
+ class point
+ {
+ public :
+ // Concept typedefs and members
+ typedef T coordinate_type;
+ typedef C coordinate_system;
+ static const size_t coordinate_count = D;
+
+
+ /// Default constructor, no initialization at all
+ inline point()
+ {}
+
+
+ /// Compile time access to coordinate values
+ template <size_t K>
+ inline const T& get() const
+ {
+ BOOST_STATIC_ASSERT(K < D);
+ return m_values[K];
+ }
+
+ template <size_t K>
+ inline void set(T value)
+ {
+ BOOST_STATIC_ASSERT(K < D);
+ m_values[K] = value;
+ }
+
+
+ /// Examine if point is equal to other point
+ inline bool operator==(const point& other) const
+ {
+ for (register size_t i = 0; i < D; i++)
+ {
+ if (! equals(m_values[i], other.m_values[i]))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /// Examine if points are NOT equal
+ inline bool operator!=(const point& other) const
+ {
+ return ! operator==(other);
+ }
+
+ /// Constructs with one, or optionally two or three values
+ inline point(const T& v0, const T& v1 = 0, const T& v2 = 0)
+ {
+ if (D >= 1) m_values[0] = v0;
+ if (D >= 2) m_values[1] = v1;
+ if (D >= 3) m_values[2] = v2;
+ }
+
+ private :
+ T m_values[D];
+ };
+
+
+
+ // Adapt the point to the concept
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ template <typename T, size_t D, typename C>
+ struct tag<point<T, D, C> > { typedef point_tag type; };
+
+ template<typename T, size_t D, typename C>
+ struct coordinate_type<point<T, D, C> > { typedef T type; };
+
+ template<typename T, size_t D, typename C>
+ struct coordinate_system<point<T, D, C> > { typedef C type; };
+
+ template<typename T, size_t D, typename C>
+ struct dimension<point<T, D, C> >: boost::mpl::int_<D> {};
+
+ template<typename T, size_t D, typename C>
+ struct access<point<T, D, C> >
+ {
+ template <size_t I>
+ static inline T get(const point<T, D, C>& p)
+ { return p.template get<I>(); }
+
+ template <size_t I>
+ static inline void set(point<T, D, C>& p, const T& value)
+ { p.template set<I>(value); }
+ };
+
+ }
+ #endif
+
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_POINT_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/point_ll.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/point_ll.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,114 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_POINT_LL_HPP
+#define _GEOMETRY_POINT_LL_HPP
+
+#include <string>
+#include <sstream>
+
+#include <boost/numeric/conversion/cast.hpp>
+
+#include <geometry/core/cs.hpp>
+
+#include <geometry/geometries/point.hpp>
+#include <geometry/arithmetic/arithmetic.hpp>
+
+#include <geometry/util/graticule.hpp>
+#include <geometry/util/copy.hpp>
+
+namespace geometry
+{
+
+ /*!
+ \brief Point using spherical coordinates \a lat and \a lon, on Earth
+ \ingroup Geometry
+ \details The point_ll class implements a point with lat and lon functions. It can be constructed
+ using latitude and longitude classes. The latlong class can be defined in degrees or in radians.
+ There is a conversion method from degree to radian, and from radian to degree.
+ \tparam D degree/radian enumeration
+ \tparam T coordinate type, double (the default) or float (it might be int as well)
+ \note There is NO constructor with two values to avoid exchanging lat and long
+ \note Construction with latitude and longitude can be done in both orders, so lat/long and long/lat
+ \par Example:
+ Example showing how the point_ll class can be constructed. Note that it can also be constructed using
+ decimal degrees (43.123).
+ \dontinclude doxygen_examples.cpp
+ \skip example_point_ll_construct
+ \line {
+ \until }
+ */
+ template <typename T = double, typename C = cs::geographic<degree> >
+ class point_ll : public point<T, 2, C>
+ {
+ public :
+
+ /// Default constructor, does not initialize anything
+ inline point_ll() : point<T, 2, C>() {}
+
+ /// Constructor with longitude/latitude
+ inline point_ll(const longitude<T>& lo, const latitude<T>& la) : point<T, 2, C>(lo, la) {}
+
+ /// Constructor with latitude/longitude
+ inline point_ll(const latitude<T>& la, const longitude<T>& lo) : point<T, 2, C>(lo, la) {}
+
+ /// Get longitude
+ inline const T& lon() const { return this->template get<0>(); }
+ /// Get latitude
+ inline const T& lat() const { return this->template get<1>(); }
+
+ /// Set longitude
+ inline void lon(const T& v) { this->template set<0>(v); }
+ /// Set latitude
+ inline void lat(const T& v) { this->template set<1>(v); }
+
+ /// Get longitude
+ /// Set
+ inline void lon(const dms<east, T>& v) { this->template set<0>(v.as_value()); }
+ inline void lon(const dms<west, T>& v) { this->template set<0>(v.as_value()); }
+
+ inline void lat(const dms<north, T>& v) { this->template set<1>(v.as_value()); }
+ inline void lat(const dms<south, T>& v) { this->template set<1>(v.as_value()); }
+ };
+
+
+ // Adapt the point_ll to the concept
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename T, typename C>
+ struct tag<point_ll<T, C> > { typedef point_tag type; };
+
+ template<typename T, typename C>
+ struct coordinate_type<point_ll<T, C> > { typedef T type; };
+
+ template<typename T, typename C>
+ struct coordinate_system<point_ll<T, C> > { typedef C type; };
+
+ template<typename T, typename C>
+ struct dimension<point_ll<T, C> >: boost::mpl::int_<2> {};
+
+ template<typename T, typename C>
+ struct access<point_ll<T, C> >
+ {
+ template <size_t I>
+ static inline T get(const point_ll<T, C>& p)
+ { return p.template get<I>(); }
+
+ template <size_t I>
+ static inline void set(point_ll<T, C>& p, const T& value)
+ { p.template set<I>(value); }
+ };
+
+ }
+ #endif
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_POINT_LL_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/point_xy.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/point_xy.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,93 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_POINT_XY_HPP
+#define _GEOMETRY_POINT_XY_HPP
+
+#include <geometry/geometries/point.hpp>
+#include <geometry/core/cs.hpp>
+
+namespace geometry
+{
+
+
+ /*!
+ \brief 2D point in Cartesian coordinate system
+ \ingroup Geometry
+ \tparam T numeric type, arguments can be, for example, double, float, int
+ */
+ template<typename T, typename C = cs::cartesian>
+ class point_xy : public point<T, 2, C>
+ {
+ public :
+ /// Default constructor, does not initialize anything
+ inline point_xy() : point<T, 2, C>() {}
+ /// Constructor with x/y values
+ inline point_xy(const T& x, const T& y) : point<T, 2, C>(x, y) {}
+
+ /// Get x-value
+ inline const T& x() const
+ { return this->template get<0>(); }
+
+ /// Get y-value
+ inline const T& y() const
+ { return this->template get<1>(); }
+
+ /// Set x-value
+ inline void x(const T& v)
+ { this->template set<0>(v); }
+
+ /// Set y-value
+ inline void y(const T& v)
+ { this->template set<1>(v); }
+
+ /// Compare two points
+ inline bool operator<(const point_xy& other) const
+ {
+ return equals(x(), other.x()) ? y() < other.y() : x() < other.x();
+ }
+ };
+
+
+ // Adapt the point_xy to the concept
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+ template <typename T, typename C>
+ struct tag<point_xy<T, C> > { typedef point_tag type; };
+
+ template<typename T, typename C>
+ struct coordinate_type<point_xy<T, C> > { typedef T type; };
+
+ template<typename T, typename C>
+ struct coordinate_system<point_xy<T, C> > { typedef C type; };
+
+
+ template<typename T, typename C>
+ struct dimension<point_xy<T, C> >: boost::mpl::int_<2> {};
+
+ template<typename T, typename C>
+ struct access<point_xy<T, C> >
+ {
+ template <size_t I>
+ static inline T get(const point_xy<T, C>& p)
+ { return p.template get<I>(); }
+
+ template <size_t I>
+ static inline void set(point_xy<T, C>& p, const T& value)
+ { p.template set<I>(value); }
+ };
+
+ }
+ #endif
+
+
+} // namespace geometry
+
+
+#endif // _GEOMETRY_POINT_XY_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/polygon.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/polygon.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,150 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_POLYGON_HPP
+#define _GEOMETRY_POLYGON_HPP
+
+#include <vector>
+
+#include <boost/concept/assert.hpp>
+
+#include <geometry/core/point_type.hpp>
+#include <geometry/core/ring_type.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/geometries/linear_ring.hpp>
+
+
+namespace geometry
+{
+
+ /*!
+ \brief The \b polygon contains an outer ring and zero or more inner rings.
+ \ingroup Geometry
+ \tparam P point type
+ \tparam VR optional container type for inner rings, for example std::vector, std::list, std::deque
+ \tparam VP optional container type for points, for example std::vector, std::list, std::deque
+ \tparam AR container-allocator-type
+ \tparam AP container-allocator-type
+ \note The container collecting the points in the rings can be different from the
+ container collecting the inner rings. They all default to vector.
+ */
+ template<typename P,
+ template<typename,typename> class VP = std::vector,
+ template<typename,typename> class VR = std::vector,
+ template<typename> class AP = std::allocator,
+ template<typename> class AR = std::allocator>
+ class polygon
+ {
+ BOOST_CONCEPT_ASSERT((Point<P>));
+
+ public :
+ // Member types
+ typedef P point_type;
+ typedef linear_ring<P, VP, AP> ring_type;
+ typedef VR<ring_type , AR<ring_type > > inner_container_type;
+
+ inline const ring_type& outer() const { return m_outer; }
+ inline const inner_container_type & inners() const { return m_inners; }
+
+ inline ring_type& outer() { return m_outer; }
+ inline inner_container_type & inners() { return m_inners; }
+
+ /// Utility method, clears outer and inner rings
+ inline void clear()
+ {
+ m_outer.clear();
+ m_inners.clear();
+ }
+
+ private :
+ ring_type m_outer;
+ inner_container_type m_inners;
+ };
+
+
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ template<typename P,
+ template<typename,typename> class VP, template<typename,typename> class VR,
+ template<typename> class AP, template<typename> class AR>
+ struct tag< polygon<P, VP, VR, AP, AR> >
+ {
+ typedef polygon_tag type;
+ };
+
+
+ template<typename P,
+ template<typename,typename> class VP, template<typename,typename> class VR,
+ template<typename> class AP, template<typename> class AR>
+ struct ring_type< polygon<P, VP, VR, AP, AR> >
+ {
+ typedef typename polygon<P, VP, VR, AP, AR>::ring_type type;
+ };
+
+
+ template<typename P,
+ template<typename,typename> class VP, template<typename,typename> class VR,
+ template<typename> class AP, template<typename> class AR>
+ struct interior_type< polygon<P, VP, VR, AP, AR> >
+ {
+ typedef typename polygon<P, VP, VR, AP, AR>::inner_container_type type;
+ };
+
+
+ template<typename P,
+ template<typename,typename> class VP, template<typename,typename> class VR,
+ template<typename> class AP, template<typename> class AR>
+ struct exterior_ring< polygon<P, VP, VR, AP, AR> >
+ {
+ typedef polygon<P, VP, VR, AP, AR> POLY;
+ static inline typename POLY::ring_type& get(POLY& polygon)
+ {
+ return polygon.outer();
+ }
+
+ static inline const typename POLY::ring_type& get(const POLY& polygon)
+ {
+ return polygon.outer();
+ }
+ };
+
+
+ template<typename P,
+ template<typename,typename> class VP, template<typename,typename> class VR,
+ template<typename> class AP, template<typename> class AR>
+ struct interior_rings< polygon<P, VP, VR, AP, AR> >
+ {
+ typedef polygon<P, VP, VR, AP, AR> POLY;
+
+ static inline typename POLY::inner_container_type& get(POLY& polygon)
+ {
+ return polygon.inners();
+ }
+
+ static inline const typename POLY::inner_container_type& get(const POLY& polygon)
+ {
+ return polygon.inners();
+ }
+ };
+
+
+ }
+ #endif
+
+
+} // namespace geometry
+
+
+#endif //_GEOMETRY_POLYGON_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/register/register_box.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/register/register_box.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,106 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_BOX_REGISTER_HPP
+#define _GEOMETRY_BOX_REGISTER_HPP
+
+
+#ifndef DOXYGEN_NO_SPECIALIZATIONS
+
+// box based on point
+#define GEOMETRY_DETAIL_SPECIALIZE_BOX_ACCESS(Box, Point, MinCorner, MaxCorner) \
+template <size_t C, size_t D> \
+struct indexed_access<Box, C, D> \
+{ \
+ static inline typename coordinate_type<Point>::type get(const Box& b) \
+ { \
+ return C == min_corner ? geometry::get<D>(b. MinCorner) : geometry::get<D>(b. MaxCorner); \
+ } \
+ static inline void set(Box& b, const typename coordinate_type<Point>::type& value) \
+ { \
+ if (C == min_corner) geometry::set<D>(b. MinCorner, value); else geometry::set<D>(b. MaxCorner, value); \
+ } \
+};
+
+
+#define GEOMETRY_DETAIL_SPECIALIZE_BOX_ACCESS_TEMPLATIZED(Box, Point, MinCorner, MaxCorner) \
+template <typename Point, size_t C, size_t D> \
+struct indexed_access<Box<Point>, C, D> \
+{ \
+ static inline typename coordinate_type<Point>::type get(const Box<Point>& b) \
+ { \
+ return C == min_corner ? geometry::get<D>(b. MinCorner) : geometry::get<D>(b. MaxCorner); \
+ } \
+ static inline void set(Box<Point>& b, const typename coordinate_type<Point>::type& value) \
+ { \
+ if (C == min_corner) geometry::set<D>(b. MinCorner, value); else geometry::set<D>(b. MaxCorner, value); \
+ } \
+};
+
+
+#define GEOMETRY_DETAIL_SPECIALIZE_BOX_ACCESS_4VALUES(Box, Point, Left, Bottom, Right, Top) \
+template <size_t C, size_t D> \
+struct indexed_access<Box, C, D> \
+{ \
+ static inline typename coordinate_type<Point>::type get(const Box& b) \
+ { \
+ return C == min_corner && D == 0 ? b. Left \
+ : C == min_corner && D == 1 ? b. Bottom \
+ : C == max_corner && D == 0 ? b. Right \
+ : C == max_corner && D == 1 ? b. Top \
+ : 0; \
+ } \
+ static inline void set(Box& b, const typename coordinate_type<Point>::type& value) \
+ { \
+ if (C == min_corner && D == 0) b. Left = value; \
+ else if (C == min_corner && D == 1) b. Bottom = value; \
+ else if (C == max_corner && D == 0) b. Right = value; \
+ else if (C == max_corner && D == 1) b. Top = value; \
+ } \
+};
+
+
+
+#define GEOMETRY_DETAIL_SPECIALIZE_BOX_TRAITS(Box, PointType) \
+ template<> struct tag<Box > { typedef box_tag type; }; \
+ template<> struct point_type<Box > { typedef PointType type; };
+
+#define GEOMETRY_DETAIL_SPECIALIZE_BOX_TRAITS_TEMPLATIZED(Box, PointType) \
+ template<typename PointType> struct tag<Box<PointType> > { typedef box_tag type; }; \
+ template<typename PointType> struct point_type<Box<PointType> > { typedef PointType type; };
+
+#endif // DOXYGEN_NO_SPECIALIZATIONS
+
+
+
+#define GEOMETRY_REGISTER_BOX(Box, PointType, MinCorner, MaxCorner) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_BOX_TRAITS(Box, PointType) \
+ GEOMETRY_DETAIL_SPECIALIZE_BOX_ACCESS(Box, PointType, MinCorner, MaxCorner) \
+}}
+
+
+#define GEOMETRY_REGISTER_BOX_TEMPLATIZED(Box, PointType, MinCorner, MaxCorner) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_BOX_TRAITS_TEMPLATIZED(Box, PointType) \
+ GEOMETRY_DETAIL_SPECIALIZE_BOX_ACCESS_TEMPLATIZED(Box, PointType, MinCorner, MaxCorner) \
+}}
+
+#define GEOMETRY_REGISTER_BOX_2D_4VALUES(Box, PointType, Left, Bottom, Right, Top) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_BOX_TRAITS(Box, PointType) \
+ GEOMETRY_DETAIL_SPECIALIZE_BOX_ACCESS_4VALUES(Box, PointType, Left, Bottom, Right, Top) \
+}}
+
+
+
+// CONST versions are for boxes probably not that common. Leave this for the moment.
+
+
+#endif // _GEOMETRY_BOX_REGISTER_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/register/register_point.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/register/register_point.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,154 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef _GEOMETRY_POINT_REGISTER_HPP
+#define _GEOMETRY_POINT_REGISTER_HPP
+
+
+
+// This file implements a "macro party", nevertheless very useful for registration of custom geometry types
+
+#ifndef DOXYGEN_NO_SPECIALIZATIONS
+
+// Starting point, specialize basic traits necessary to register a point
+// (the 'accessor' is technically not specialization but definition, specialized in another macro)
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, Dim, CoordinateType, CoordinateSystem) \
+ template<> struct tag<Point> { typedef point_tag type; }; \
+ template<> struct dimension<Point> : boost::mpl::int_<Dim> {}; \
+ template<> struct coordinate_type<Point> { typedef CoordinateType type; }; \
+ template<> struct coordinate_system<Point> { typedef CoordinateSystem type; }; \
+ template<int I> struct Point##accessor {};
+
+
+// Non Const version
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, CoordinateType) \
+ template<> struct access<Point> { \
+ template <int I> \
+ static inline CoordinateType get(const Point& p) { return Point##accessor<I>::get(p); } \
+ template <int I> \
+ static inline void set(Point& p, const CoordinateType& value) { Point##accessor<I>::set(p, value); } \
+ };
+
+// Const version
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, CoordinateType) \
+ template<> struct access<Point> { \
+ template <int I> \
+ static inline CoordinateType get(const Point& p) { return Point##accessor<I>::get(p); } \
+ };
+
+
+
+
+// Specialize the point-specific-accessor class, declared below, per dimension
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR(Point, Dim, CoordinateType, Get, Set) \
+ template<> struct Point##accessor< Dim > \
+ { \
+ static inline CoordinateType get(const Point& p) { return p. Get; } \
+ static inline void set(Point& p, const CoordinateType& value) { p. Set = value; } \
+ };
+
+
+// Const version
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_CONST(Point, Dim, CoordinateType, Get) \
+ template<> struct Point##accessor< Dim > \
+ { \
+ static inline CoordinateType get(const Point& p) { return p. Get; } \
+ };
+
+
+// Get/set version
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_GET_SET(Point, Dim, CoordinateType, Get, Set) \
+ template<> struct Point##accessor< Dim > \
+ { \
+ static inline CoordinateType get(const Point& p) { return p. Get (); } \
+ static inline void set(Point& p, const CoordinateType& value) { p. Set ( value ); } \
+ };
+
+
+
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_2D(Point, CoordinateType, Get0, Get1, Set0, Set1) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR(Point, 0, CoordinateType, Get0, Set0) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR(Point, 1, CoordinateType, Get1, Set1)
+
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_3D(Point, CoordinateType, Get0, Get1, Get2, Set0, Set1, Set2) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR(Point, 0, CoordinateType, Get0, Set0) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR(Point, 1, CoordinateType, Get1, Set1) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR(Point, 2, CoordinateType, Get2, Set2)
+
+// Const versions
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST_2D(Point, CoordinateType, Get0, Get1) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_CONST(Point, 0, CoordinateType, Get0) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_CONST(Point, 1, CoordinateType, Get1)
+
+#define GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST_3D(Point, CoordinateType, Get0, Get1, Get2) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_CONST(Point, 0, CoordinateType, Get0) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_CONST(Point, 1, CoordinateType, Get1) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_CONST(Point, 2, CoordinateType, Get2)
+
+#endif // DOXYGEN_NO_SPECIALIZATIONS
+
+
+
+// Library user macro to register a custom 2D point
+#define GEOMETRY_REGISTER_POINT_2D(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, CoordinateType) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_2D(Point, CoordinateType, Field0, Field1, Field0, Field1) \
+}}
+
+// Library user macro to register a custom 3D point
+#define GEOMETRY_REGISTER_POINT_3D(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, CoordinateType) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_3D(Point, CoordinateType, Field0, Field1, Field2, Field0, Field1, Field2) \
+}}
+
+
+
+// Library user macro to register a custom 2D point (CONST version)
+#define GEOMETRY_REGISTER_POINT_2D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, CoordinateType) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST_2D(Point, CoordinateType, Field0, Field1) \
+}}
+
+// Library user macro to register a custom 3D point (CONST version)
+#define GEOMETRY_REGISTER_POINT_3D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, CoordinateType) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST_3D(Point, CoordinateType, Field0, Field1, Field2) \
+}}
+
+
+// Library user macro to register a custom 2D point (having separate get/set methods)
+#define GEOMETRY_REGISTER_POINT_2D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Set0, Set1) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, CoordinateType) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
+}}
+
+
+// Library user macro to register a custom 3D point (having separate get/set methods)
+#define GEOMETRY_REGISTER_POINT_3D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Get2, Set0, Set1, Set2) \
+namespace geometry { namespace traits { \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, CoordinateType) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
+ GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESSOR_GET_SET(Point, 2, CoordinateType, Get2, Set2) \
+}}
+
+
+#endif // _GEOMETRY_POINT_REGISTER_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometries/segment.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometries/segment.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,96 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_SEGMENT_HPP
+#define _GEOMETRY_SEGMENT_HPP
+
+#include <boost/mpl/if.hpp>
+#include <boost/type_traits/is_const.hpp>
+#include <boost/concept/assert.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+
+namespace geometry
+{
+
+ /*!
+ \brief Class segment: small containing two (templatized) point references
+ \ingroup Geometry
+ \details From Wikipedia: In geometry, a line segment is a part of a line that is bounded
+ by two distinct end points, and contains every point on the line between its end points
+ \note The structure is like std::pair, and can often be used interchangeable.
+ So points are public available. We cannot derive from std::pair<P&, P&> because of reference
+ assignments. Points are not const and might be changed by the algorithm
+ (used in intersection_linestring)
+ \tparam P point type of the segment
+ */
+ template<typename P>
+ struct segment
+ {
+ private :
+ BOOST_CONCEPT_ASSERT((typename boost::mpl::if_<
+ boost::is_const<P>,
+ ConstPoint<P>,
+ Point<P>
+ >
+ ));
+
+ public :
+ typedef P point_type;
+ P& first;
+ P& second;
+ inline segment(P& p1, P& p2)
+ : first(p1), second(p2)
+ {}
+ };
+
+
+ // Traits specializations for segment above
+ #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
+ namespace traits
+ {
+
+ template <typename P>
+ struct tag< segment<P> > { typedef segment_tag type; };
+
+ template <typename P>
+ struct point_type<segment<P> > { typedef P type; };
+
+ template <typename P, size_t I, size_t D>
+ struct indexed_access<segment<P>, I, D>
+ {
+ typedef segment<P> S;
+ typedef typename geometry::coordinate_type<S>::type T;
+
+ static inline T get(const S& s)
+ {
+ return I == 0 ? geometry::get<D>(s.first) : geometry::get<D>(s.second);
+ }
+
+ static inline void set(S& s, const T& value)
+ {
+ if (I == 0)
+ {
+ geometry::set<D>(s.first, value);
+ }
+ else
+ {
+ geometry::set<D>(s.second, value);
+ }
+ }
+ };
+
+ }
+ #endif
+
+
+} // namespace geometry
+
+
+#endif //_GEOMETRY_SEGMENT_HPP

Added: sandbox/ggl/boost/ggl/geometry/geometry.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/geometry.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,72 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_GEOMETRY_HPP
+#define _GEOMETRY_GEOMETRY_HPP
+
+// Shortcut to include all header files
+
+
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/concepts/ring_concept.hpp>
+#include <geometry/core/concepts/linestring_concept.hpp>
+#include <geometry/core/concepts/polygon_concept.hpp>
+
+#include <geometry/core/concepts/box_concept.hpp>
+#include <geometry/core/concepts/nsphere_concept.hpp>
+#include <geometry/core/concepts/segment_concept.hpp>
+
+#include <geometry/core/cs.hpp>
+#include <geometry/core/tag.hpp>
+#include <geometry/core/tags.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/radian_access.hpp>
+#include <geometry/core/topological_dimension.hpp>
+
+
+#include <geometry/arithmetic/arithmetic.hpp>
+#include <geometry/arithmetic/dot_product.hpp>
+
+#include <geometry/strategies/strategies.hpp>
+
+#include <geometry/algorithms/append.hpp>
+#include <geometry/algorithms/area.hpp>
+#include <geometry/algorithms/assign.hpp>
+#include <geometry/algorithms/buffer.hpp>
+#include <geometry/algorithms/centroid.hpp>
+#include <geometry/algorithms/clear.hpp>
+#include <geometry/algorithms/convert.hpp>
+#include <geometry/algorithms/convex_hull.hpp>
+#include <geometry/algorithms/correct.hpp>
+#include <geometry/algorithms/distance.hpp>
+#include <geometry/algorithms/envelope.hpp>
+#include <geometry/algorithms/foreach.hpp>
+#include <geometry/algorithms/intersection.hpp>
+#include <geometry/algorithms/length.hpp>
+#include <geometry/algorithms/make.hpp>
+#include <geometry/algorithms/num_points.hpp>
+#include <geometry/algorithms/parse.hpp>
+#include <geometry/algorithms/selected.hpp>
+#include <geometry/algorithms/simplify.hpp>
+#include <geometry/algorithms/transform.hpp>
+#include <geometry/algorithms/within.hpp>
+
+
+#include <geometry/io/wkt/aswkt.hpp>
+#include <geometry/io/wkt/fromwkt.hpp>
+
+#include <geometry/util/for_each_coordinate.hpp>
+#include <geometry/util/copy.hpp>
+#include <geometry/util/loop.hpp>
+#include <geometry/util/promotion_traits.hpp>
+#include <geometry/util/math.hpp>
+
+
+#endif // _GEOMETRY_GEOMETRY_HPP

Added: sandbox/ggl/boost/ggl/geometry/io/wkt/aswkt.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/io/wkt/aswkt.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,298 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_ASWKT_HPP
+#define _GEOMETRY_ASWKT_HPP
+
+#include <iostream>
+#include <string>
+
+#include <boost/concept/assert.hpp>
+
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+#include <geometry/core/ring_type.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/geometries/linear_ring.hpp>
+#include <geometry/algorithms/convert.hpp>
+
+
+
+/*!
+\defgroup wkt wkt: parse and stream WKT (Well-Known Text)
+The wkt classes stream the specified geometry as \ref OGC Well Known Text (\ref WKT). It is defined for OGC geometries.
+It is therefore not defined for all geometries (e.g. not for circle)
+\note The implementation is independant from point type, point_xy and point_ll are supported,
+as well as points with more than two coordinates.
+
+*/
+
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace wkt
+ {
+ template <typename P, int I, int Count>
+ struct dump_coordinate
+ {
+ template <typename CH, typename TR>
+ inline static void dump(std::basic_ostream<CH, TR>& os, const P& p)
+ {
+ os << (I > 0 ? " " : "") << get<I>(p);
+ dump_coordinate<P, I + 1, Count>::dump(os, p);
+ }
+ };
+
+ template <typename P, int Count>
+ struct dump_coordinate<P, Count, Count>
+ {
+ template <typename CH, typename TR>
+ inline static void dump(std::basic_ostream<CH, TR>&, const P&)
+ {}
+ };
+
+
+
+ /*!
+ \brief Stream points as \ref WKT
+ */
+ template <typename P>
+ struct wkt_point
+ {
+ template <typename CH, typename TR>
+ inline static void stream(std::basic_ostream<CH, TR>& os, const P& p)
+ {
+ os << "POINT(";
+ dump_coordinate<P, 0, dimension<P>::value>::dump(os, p);
+ os << ")";
+ }
+
+ private :
+ BOOST_CONCEPT_ASSERT( (ConstPoint<P>) );
+ };
+
+
+ /*!
+ \brief Stream ranges as WKT
+ \note CRTP is used to stream prefix/postfix, enabling derived classes to override this
+ */
+ template <typename R, typename C>
+ struct wkt_range
+ {
+ template <typename CH, typename TR>
+ inline static void stream(std::basic_ostream<CH, TR>& os, const R& range)
+ {
+ os << C::prefix();
+
+ bool first = true;
+ typedef typename boost::range_const_iterator<R>::type IT;
+ for (IT it = boost::begin(range); it != boost::end(range); it++)
+ {
+ os << (first ? "" : ",");
+ dump_coordinate<P, 0, dimension<P>::value>::dump(os, *it);
+ first = false;
+ }
+
+ os << C::postfix();
+ }
+
+ private :
+ typedef typename boost::range_value<R>::type P;
+ BOOST_CONCEPT_ASSERT( (ConstPoint<P>) );
+ };
+
+ template <typename R>
+ struct wkt_poly_ring : wkt_range<R, wkt_poly_ring<R> >
+ {
+ inline static const char* prefix() { return "("; }
+ inline static const char* postfix() { return ")"; }
+ };
+
+ template <typename P>
+ struct wkt_poly
+ {
+ template <typename CH, typename TR>
+ inline static void stream(std::basic_ostream<CH, TR>& os, const P& poly)
+ {
+ os << "POLYGON(";
+
+ typedef typename ring_type<P>::type R;
+ wkt_poly_ring<R>::stream(os, exterior_ring(poly));
+
+ typedef typename boost::range_const_iterator<typename interior_type<P>::type>::type IT;
+ for (IT it = boost::begin(interior_rings(poly)); it != boost::end(interior_rings(poly)); it++)
+ {
+ os << ",";
+ wkt_poly_ring<R>::stream(os, *it);
+ }
+
+ os << ")";
+ }
+
+ private :
+ BOOST_CONCEPT_ASSERT( (ConstPoint<typename point_type<P>::type>) );
+ };
+
+ template <typename B>
+ struct wkt_box
+ {
+ typedef typename point_type<B>::type P;
+ template <typename CH, typename TR>
+ inline static void stream(std::basic_ostream<CH, TR>& os, const B& box)
+ {
+ // Convert to linear ring, then stream
+ typedef linear_ring<P> R;
+ R ring;
+ geometry::convert(box, ring);
+ os << "POLYGON(";
+ wkt_poly_ring<R>::stream(os, ring);
+ os << ")";
+ }
+
+ private :
+ BOOST_CONCEPT_ASSERT( (ConstPoint<P>) );
+
+ inline wkt_box()
+ {
+ // Only streaming of boxes with two dimensions is support, otherwise it is a polyhedron!
+ //assert_dimension<B, 2>();
+ }
+ };
+
+
+ } // namespace wkt
+ } // namespace impl
+ #endif
+
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+
+ /*!
+ \brief Dispatching base struct for WKT streaming, specialized below per geometry type
+ \details Specializations should implement a static method "stream" to stream a geometry
+ The static method should have the signatur:
+
+ template <typename CH, typename TR>
+ inline static void stream(std::basic_ostream<CH, TR>& os, const G& geometry)
+ */
+ template <typename T, typename G>
+ struct wkt {};
+
+
+ /*!
+ \brief Specialization to stream point as WKT
+ */
+ template <typename P>
+ struct wkt<point_tag, P> : public impl::wkt::wkt_point<P> {};
+
+
+ /*!
+ \brief Specialization to stream linestring as WKT
+ */
+ template <typename R>
+ struct wkt<linestring_tag, R> : public impl::wkt::wkt_range<R, wkt<linestring_tag, R> >
+ {
+ inline static const char* prefix() { return "LINESTRING("; }
+ inline static const char* postfix() { return ")"; }
+ };
+
+ /*!
+ \brief Specialization to stream a ring as WKT
+ \details A "linear_ring" does not exist in WKT.
+ A linear ring is equivalent to a polygon without inner rings
+ It is therefore streamed as a polygon
+ */
+ template <typename B>
+ struct wkt<box_tag, B> : public impl::wkt::wkt_box<B> {};
+
+ /*!
+ \brief Specialization to stream a ring as WKT
+ \details A "linear_ring" does not exist in WKT.
+ A linear ring is equivalent to a polygon without inner rings
+ It is therefore streamed as a polygon
+ */
+ template <typename R>
+ struct wkt<ring_tag, R> : public impl::wkt::wkt_range<R, wkt<ring_tag, R> >
+ {
+ // Note, double parentheses are intentional, indicating WKT ring begin/end
+ inline static const char* prefix() { return "POLYGON(("; }
+ inline static const char* postfix() { return "))"; }
+ };
+
+ /*!
+ \brief Specialization to stream polygon as WKT
+ */
+ template <typename P>
+ struct wkt<polygon_tag, P> : public impl::wkt::wkt_poly<P> {};
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Generic geometry template manipulator class, takes corresponding output class from traits class
+ \ingroup wkt
+ \details Stream manipulator, streams geometry classes as \ref WKT streams
+ \par Example:
+ Small example showing how to use the wkt class
+ \dontinclude doxygen_examples.cpp
+ \skip example_as_wkt_point
+ \line {
+ \until }
+ \note the template parameter must be specified. If that is inconvient, users might use streamwkt
+ which streams geometries as manipulators, or the object generator make_wkt
+ */
+ template <typename G>
+ class wkt
+ {
+ public :
+ inline wkt(const G& g) : m_geometry(g) {}
+
+ template <typename CH, typename TR>
+ inline friend std::basic_ostream<CH, TR>& operator<<(std::basic_ostream<CH, TR>& os, const wkt& m)
+ {
+ dispatch::wkt<typename tag<G>::type, G>::stream(os, m.m_geometry);
+ os.flush();
+ return os;
+ }
+
+ private :
+ const G& m_geometry;
+ };
+
+
+ /*!
+ \brief Object generator to conveniently stream objects without including streamwkt
+ \ingroup wkt
+ \par Example:
+ Small example showing how to use the make_wkt helper function
+ \dontinclude doxygen_examples.cpp
+ \skip example_as_wkt_vector
+ \line {
+ \until }
+ */
+ template <typename T>
+ inline wkt<T> make_wkt(const T& t)
+ {
+ return wkt<T>(t);
+ }
+
+
+
+}
+
+#endif // _GEOMETRY_ASWKT_HPP

Added: sandbox/ggl/boost/ggl/geometry/io/wkt/fromwkt.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/io/wkt/fromwkt.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,354 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_FROMWKT_HPP
+#define _GEOMETRY_FROMWKT_HPP
+
+#include <string>
+
+
+#include <boost/range/functions.hpp>
+#include <boost/range/metafunctions.hpp>
+
+#include <boost/tokenizer.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <boost/concept/requires.hpp>
+
+#include <geometry/core/access.hpp>
+#include <geometry/core/exterior_ring.hpp>
+#include <geometry/core/interior_rings.hpp>
+
+#include <geometry/core/concepts/point_concept.hpp>
+
+#include <geometry/algorithms/clear.hpp>
+
+namespace geometry
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ namespace wkt
+ {
+ // (wkt: Well Known Text, defined by OGC for all geometries and implemented by e.g. databases (MySQL, PostgreSQL))
+
+ typedef boost::tokenizer<boost::char_separator<char> > TOK;
+
+ namespace impl
+ {
+ template <typename P, int I, int N>
+ struct parsing_assigner
+ {
+ static void run(TOK::iterator& it, TOK::iterator end, P& point)
+ {
+ typedef typename coordinate_type<P>::type ctype;
+
+ // Stop at end of tokens, or at "," ot ")"
+ bool finished = (it == end || *it == "," || *it == ")");
+
+ set<I>(point,
+ finished ?
+ // Initialize missing coordinates to default constructor (zero)
+ ctype():
+ // Use lexical_cast for conversion to double/int
+ // Note that it is much slower than atof. However, it is more standard
+ // and in parsing the change in performance falls probably away against
+ // the tokenizing
+ boost::lexical_cast<ctype>(it->c_str())
+ );
+
+ parsing_assigner<P, I+1, N>::run(finished ? it : ++it, end, point);
+ }
+ };
+
+ template <typename P, int N>
+ struct parsing_assigner<P, N, N>
+ {
+ static void run(TOK::iterator&, TOK::iterator, P&) {}
+ };
+ }
+
+ /*!
+ \brief Internal, parses coordinate sequences, strings are formated like "(1 2,3 4,...)"
+ \param it token-iterator, should be pre-positioned at "(", is post-positions after last ")"
+ \param end end-token-iterator
+ \param out Output itererator receiving coordinates
+ \return true if string starts with "(" and ends with ")" and all coordinates are parsed
+ */
+ template <typename P, typename O_IT>
+ inline bool parse_container(TOK::iterator& it, TOK::iterator end, O_IT out)
+ {
+ // Start with "("
+ if (it == end || *it != "(")
+ {
+ return false;
+ }
+ it++;
+
+ // Stop at ")"
+ while (it != end && *it != ")")
+ {
+ P point;
+ impl::parsing_assigner<P, 0, dimension<P>::value>::run(it, end, point);
+ out = point;
+ out++;
+ if (it != end && *it == ",")
+ {
+ it++;
+ }
+ }
+ // Should end with ")"
+ if (it != end && *it == ")")
+ {
+ it++;
+ return true;
+ }
+ return false;
+ }
+
+ /*!
+ \brief Internal, starts parsing
+ \param tokens boost tokens, parsed with separator " " and keeping separator "()"
+ \param geometry string to compare with first token
+ \return iterator put after geometry and/or optional m, z modifiers
+ */
+ inline TOK::iterator parse_begin(const TOK& tokens, const std::string& geometry)
+ {
+ TOK::iterator it = tokens.begin();
+ if (it != tokens.end() && boost::iequals(*it++, geometry))
+ {
+ while (it != tokens.end() && (boost::iequals(*it, "M")
+ || boost::iequals(*it, "Z")
+ || boost::iequals(*it, "MZ")
+ || boost::iequals(*it, "ZM")))
+ {
+ it++;
+ }
+ }
+ return it;
+ }
+
+ /*!
+ \brief Parses point from \ref WKT
+ \param wkt string containing Well-Known Text
+ \param point point receiving coordinates, if string has less than point, rest is initialized to zero
+ \return true if string starts with "POINT(". It is forgiving for last ")"
+ \note It is case insensitive and can have the WKT forms "point", "point m", "point z", "point zm", "point mz"
+ */
+ template <typename P>
+ inline
+ BOOST_CONCEPT_REQUIRES(((Point<P>)),
+ (bool))
+ parse_point(const std::string& wkt, P& point)
+ {
+ // Break it apart into "POINT" "(" c1 c2 c3 ... ")"
+ // WKT Coordinate string is space separated. Points in a sequence are comma separated
+ // Token iterator is thus created with " ", ",()"
+
+ TOK tokens(wkt, boost::char_separator<char>(" ", "()"));
+ TOK::iterator it = parse_begin(tokens, "point");
+ if (it != tokens.end() && *it == "(")
+ {
+ it++;
+ }
+ impl::parsing_assigner<P, 0, dimension<P>::value>::run(it, tokens.end(), point);
+ return true;
+ }
+
+
+
+ /*!
+ \brief Parses linestring from \ref WKT
+ \param wkt string containing Well-Known Text
+ \param out appending/inserting iterator which will receive the parsed coordinates
+ \return true if string starts with "LINESTRING(" (case-insensitive) and coordinate-string can be parsed
+ */
+ template <typename P, typename O_IT>
+ inline bool parse_linestring(const std::string& wkt, O_IT out)
+ {
+ // Break it apart into "LINESTRING" "(" point(s) ")"
+ TOK tokens(wkt, boost::char_separator<char>(" ", ",()"));
+ TOK::iterator it = parse_begin(tokens, "linestring");
+ return parse_container<P>(it, tokens.end(), out);
+ }
+
+
+
+ /*!
+ \brief Parses polygon from \ref WKT
+ \param wkt string containing Well-Known Text
+ \param poly polygon which will be cleared and set to the specified coordinates
+ \return true if string starts with "POLYGON(" (case-insensitive) and rings can be parsed
+ */
+ template <typename Y>
+ inline bool parse_polygon(const std::string& wkt, Y& poly)
+ {
+ poly.clear();
+
+ TOK tokens(wkt, boost::char_separator<char>(" ", ",()"));
+ TOK::iterator it = parse_begin(tokens, "polygon");
+ // Polygon string begin
+ if (it != tokens.end() && *it++ == "(")
+ {
+ int n = -1;
+ // For each ring
+ while (it != tokens.end())
+ {
+ if (++n == 0)
+ {
+ parse_container<typename point_type<Y>::type>(it, tokens.end(), std::back_inserter(exterior_ring(poly)));
+ }
+ else
+ {
+ interior_rings(poly).resize(n);
+ parse_container<typename point_type<Y>::type>(it, tokens.end(), std::back_inserter(interior_rings(poly).back()));
+ }
+ if (it != tokens.end())
+ {
+ // Skip "," or ")" after container is parsed
+ it++;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+
+ } // namespace wkt
+ } // namespace impl
+ #endif
+
+ #ifndef DOXYGEN_NO_DISPATCH
+ namespace dispatch
+ {
+ template <typename TAG, typename G>
+ struct from_wkt
+ {
+ };
+
+ // Partial specializations
+
+ /*!
+ \brief Build a point from OGC Well-Known Text (\ref WKT)
+ \ingroup wkt
+ \param wkt string containing \ref WKT
+ \param p point which will be cleared and set to the specified point
+ \return true if \ref WKT can be parsed
+ */
+ template <typename G>
+ struct from_wkt<point_tag, G>
+ {
+ inline static bool parse(const std::string& wkt, G& geometry)
+ {
+ return impl::wkt::parse_point(wkt, geometry);
+ }
+ };
+
+
+ /*!
+ \brief Build a linestring from OGC Well-Known Text (\ref WKT)
+ \ingroup wkt
+ \param wkt string containing \ref WKT
+ \param line linestring which will be cleared and set to the specified points
+ \return true if \ref WKT can be parsed
+ */
+ template <typename L>
+ struct from_wkt<linestring_tag, L>
+ {
+ inline static bool parse(const std::string& wkt, L& linestring)
+ {
+ geometry::clear(linestring);
+ typedef typename boost::range_value<L>::type P;
+ return impl::wkt::parse_linestring<P>(wkt, std::back_inserter(linestring));
+ }
+ };
+
+ /*!
+ \brief Build a polygon from OGC Well-Known Text (\ref WKT)
+ \ingroup wkt
+ \param wkt string containing \ref WKT
+ \param poly polygon which will be cleared and set to the specified polygon
+ \return true if \ref WKT can be parsed to the polygon (starts with "POLYGON", has valid rings and coordinates)
+ */
+ template <typename G>
+ struct from_wkt<polygon_tag, G>
+ {
+ inline static bool parse(const std::string& wkt, G& geometry)
+ {
+ return impl::wkt::parse_polygon(wkt, geometry);
+ }
+ };
+
+ } // namespace dispatch
+ #endif
+
+
+ /*!
+ \brief Parses OGC Well-Known Text (\ref WKT) into a geometry (any geometry)
+ \ingroup wkt
+ \param wkt string containing \ref WKT
+ \param geometry output geometry
+ \return true if \ref WKT can be parsed
+ \par Example:
+ Small example showing how to use from_wkt to build a point
+ \dontinclude doxygen_examples.cpp
+ \skip example_from_wkt_point
+ \line {
+ \until }
+ \par Example:
+ Small example showing how to use from_wkt to build a linestring
+ \dontinclude doxygen_examples.cpp
+ \skip example_from_wkt_linestring
+ \line {
+ \until }
+ \par Example:
+ Small example showing how to use from_wkt to build a polygon
+ \dontinclude doxygen_examples.cpp
+ \skip example_from_wkt_polygon
+ \line {
+ \until }
+ */
+ template <typename G>
+ inline bool from_wkt(const std::string& wkt, G& geometry)
+ {
+ return dispatch::from_wkt<typename tag<G>::type, G>::parse(wkt, geometry);
+ }
+
+
+ /*!
+ \brief Parses OGC Well-Known Text (\ref WKT) and outputs using an output iterator
+ \ingroup wkt
+ \param wkt string containing \ref WKT
+ \param out output iterator
+ \return true if \ref WKT can be parsed
+ \note Because the output iterator doesn't always have the type value_type, it should be
+ specified in the function call.
+ \par Example:
+ Small example showing how to use from_wkt with an output iterator
+ \dontinclude doxygen_examples.cpp
+ \skip example_from_wkt_output_iterator
+ \line {
+ \until }
+ */
+ template <typename P, typename O_IT>
+ inline bool from_wkt(const std::string& wkt, O_IT out)
+ {
+ // Todo: maybe take this from the string, or do not call parse_begin, such that
+ // any coordinate string is parsed and outputted
+ const std::string& tag = "linestring";
+
+ impl::wkt::TOK tokens(wkt, boost::char_separator<char>(" ", ",()"));
+ impl::wkt::TOK::iterator it = impl::wkt::parse_begin(tokens, tag);
+ return impl::wkt::parse_container<P>(it, tokens.end(), out);
+ }
+
+}
+
+#endif // _GEOMETRY_FROMWKT_HPP

Added: sandbox/ggl/boost/ggl/geometry/io/wkt/streamwkt.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/io/wkt/streamwkt.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,39 @@
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef _GEOMETRY_STREAMWKT_HPP
+#define _GEOMETRY_STREAMWKT_HPP
+
+#include <geometry/io/wkt/aswkt.hpp>
+
+// This short file contains only one manipulator, streaming as WKT
+// Don't move contents to as_wkt, developers must be able to choose how to stream
+
+// Don't use namespace geometry, to enable the library to stream custom geometries which
+// are living outside the namespace geometry
+
+//namespace geometry
+//{
+
+
+ /*!
+ \brief Streams a geometry as Well-Known Text
+ \ingroup wkt
+ */
+ template<typename CH, typename TR, typename G>
+ inline std::basic_ostream<CH,TR>& operator<<(std::basic_ostream<CH,TR> &os, const G& geometry)
+ {
+ os << geometry::make_wkt(geometry);
+ return os;
+ }
+
+
+//}
+
+#endif
+

Added: sandbox/ggl/boost/ggl/geometry/projections/epsg.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/epsg.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,3566 @@
+#ifndef _PROJECTIONS_EPGS_HPP
+#define _PROJECTIONS_EPGS_HPP
+
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <geometry/projections/parameters.hpp>
+#include <geometry/projections/impl/pj_init.hpp>
+
+// This file is OPTIONAL
+// Only to be included if EPSG codes are necessary.
+// It is not included automatically
+
+namespace projection
+{
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+
+ std::string code_to_string(int code)
+ {
+ switch(code)
+ {
+
+ case 2000 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m";
+ case 2001 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m";
+ case 2002 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=725,685,536,0,0,0,0 +units=m";
+ case 2003 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0 +units=m";
+ case 2004 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=174,359,365,0,0,0,0 +units=m";
+ case 2005 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +units=m";
+ case 2006 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0 +units=m";
+ case 2007 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=195.671,332.517,274.607,0,0,0,0 +units=m";
+ case 2008 : return "+proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2009 : return "+proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2010 : return "+proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2011 : return "+proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2012 : return "+proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2013 : return "+proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2014 : return "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2015 : return "+proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2016 : return "+proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2017 : return "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2018 : return "+proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2019 : return "+proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2020 : return "+proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2021 : return "+proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2022 : return "+proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2023 : return "+proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2024 : return "+proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2025 : return "+proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2026 : return "+proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +units=m";
+ case 2027 : return "+proj=utm +zone=15 +ellps=clrk66 +units=m";
+ case 2028 : return "+proj=utm +zone=16 +ellps=clrk66 +units=m";
+ case 2029 : return "+proj=utm +zone=17 +ellps=clrk66 +units=m";
+ case 2030 : return "+proj=utm +zone=18 +ellps=clrk66 +units=m";
+ case 2031 : return "+proj=utm +zone=17 +ellps=clrk66 +units=m";
+ case 2032 : return "+proj=utm +zone=18 +ellps=clrk66 +units=m";
+ case 2033 : return "+proj=utm +zone=19 +ellps=clrk66 +units=m";
+ case 2034 : return "+proj=utm +zone=20 +ellps=clrk66 +units=m";
+ case 2035 : return "+proj=utm +zone=21 +ellps=clrk66 +units=m";
+ case 2036 : return "+proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2037 : return "+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2038 : return "+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2039 : return "+proj=tmerc +lat_0=31.73439361111111 +lon_0=35.20451694444445 +k=1.0000067 +x_0=219529.584 +y_0=626907.39 +ellps=GRS80 +towgs84=-48,55,52,0,0,0,0 +units=m";
+ case 2040 : return "+proj=utm +zone=30 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m";
+ case 2041 : return "+proj=utm +zone=30 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m";
+ case 2042 : return "+proj=utm +zone=29 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m";
+ case 2043 : return "+proj=utm +zone=29 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m";
+ case 2044 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m";
+ case 2045 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m";
+ case 2056 : return "+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m";
+ case 2057 : return "+proj=omerc +lat_0=27.51882880555555 +lonc=52.60353916666667 +alpha=0.5716611944444444 +k=0.999895934 +x_0=658377.437 +y_0=3044969.194 +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0 +units=m";
+ case 2058 : return "+proj=utm +zone=38 +ellps=intl +units=m";
+ case 2059 : return "+proj=utm +zone=39 +ellps=intl +units=m";
+ case 2060 : return "+proj=utm +zone=40 +ellps=intl +units=m";
+ case 2061 : return "+proj=utm +zone=41 +ellps=intl +units=m";
+ case 2062 : return "+proj=lcc +lat_1=40 +lat_0=40 +lon_0=0 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669561 +pm=madrid +units=m";
+ case 2063 : return "+proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m";
+ case 2064 : return "+proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m";
+ case 2065 : return "+proj=krovak +lat_0=49.5 +lon_0=42.5 +alpha=30.28813972222222 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 2066 : return "+proj=cass +lat_0=11.25217861111111 +lon_0=-60.68600888888889 +x_0=37718.66159325 +y_0=36209.91512952 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.201166195164";
+ case 2067 : return "+proj=utm +zone=20 +ellps=intl +units=m";
+ case 2068 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2069 : return "+proj=tmerc +lat_0=0 +lon_0=11 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2070 : return "+proj=tmerc +lat_0=0 +lon_0=13 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2071 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2072 : return "+proj=tmerc +lat_0=0 +lon_0=17 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2073 : return "+proj=tmerc +lat_0=0 +lon_0=19 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2074 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2075 : return "+proj=tmerc +lat_0=0 +lon_0=23 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2076 : return "+proj=tmerc +lat_0=0 +lon_0=25 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +units=m";
+ case 2077 : return "+proj=utm +zone=32 +ellps=intl +units=m";
+ case 2078 : return "+proj=utm +zone=33 +ellps=intl +units=m";
+ case 2079 : return "+proj=utm +zone=34 +ellps=intl +units=m";
+ case 2080 : return "+proj=utm +zone=35 +ellps=intl +units=m";
+ case 2081 : return "+proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m";
+ case 2082 : return "+proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=27.5,14,186.4,0,0,0,0 +units=m";
+ case 2083 : return "+proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m";
+ case 2084 : return "+proj=utm +zone=19 +south +ellps=intl +units=m";
+ case 2085 : return "+proj=lcc +lat_1=22.35 +lat_0=22.35 +lon_0=-81 +k_0=0.99993602 +x_0=500000 +y_0=280296.016 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 2086 : return "+proj=lcc +lat_1=20.71666666666667 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +k_0=0.99994848 +x_0=500000 +y_0=229126.939 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 2087 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2088 : return "+proj=tmerc +lat_0=0 +lon_0=11 +k=0.9996 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +units=m";
+ case 2089 : return "+proj=utm +zone=38 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2090 : return "+proj=utm +zone=39 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2091 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m";
+ case 2092 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m";
+ case 2093 : return "+proj=tmerc +lat_0=0 +lon_0=106 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0 +units=m";
+ case 2094 : return "+proj=tmerc +lat_0=0 +lon_0=106 +k=0.9996 +x_0=500000 +y_0=0 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 2095 : return "+proj=utm +zone=28 +ellps=intl +towgs84=-173,253,27,0,0,0,0 +units=m";
+ case 2096 : return "+proj=tmerc +lat_0=38 +lon_0=129 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m";
+ case 2097 : return "+proj=tmerc +lat_0=38 +lon_0=127 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m";
+ case 2098 : return "+proj=tmerc +lat_0=38 +lon_0=125 +k=1 +x_0=200000 +y_0=500000 +ellps=bessel +units=m";
+ case 2099 : return "+proj=cass +lat_0=25.38236111111111 +lon_0=50.76138888888889 +x_0=100000 +y_0=100000 +ellps=helmert +units=m";
+ case 2100 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=-199.87,74.79,246.62,0,0,0,0 +units=m";
+ case 2101 : return "+proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=0 +y_0=-52684.972 +ellps=intl +units=m";
+ case 2102 : return "+proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=200000 +y_0=147315.028 +ellps=intl +units=m";
+ case 2103 : return "+proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=500000 +y_0=447315.028 +ellps=intl +units=m";
+ case 2104 : return "+proj=lcc +lat_1=10.16666666666667 +lat_0=10.16666666666667 +lon_0=-71.60561777777777 +k_0=1 +x_0=-17044 +y_0=-23139.97 +ellps=intl +units=m";
+ case 2105 : return "+proj=tmerc +lat_0=-36.87972222222222 +lon_0=174.7641666666667 +k=0.9999 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2106 : return "+proj=tmerc +lat_0=-37.76111111111111 +lon_0=176.4661111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2107 : return "+proj=tmerc +lat_0=-38.62444444444444 +lon_0=177.8855555555556 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2108 : return "+proj=tmerc +lat_0=-39.65083333333333 +lon_0=176.6736111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2109 : return "+proj=tmerc +lat_0=-39.13555555555556 +lon_0=174.2277777777778 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2110 : return "+proj=tmerc +lat_0=-39.51222222222222 +lon_0=175.64 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2111 : return "+proj=tmerc +lat_0=-40.24194444444444 +lon_0=175.4880555555555 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2112 : return "+proj=tmerc +lat_0=-40.92527777777777 +lon_0=175.6472222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2113 : return "+proj=tmerc +lat_0=-41.3011111111111 +lon_0=174.7763888888889 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2114 : return "+proj=tmerc +lat_0=-40.71472222222223 +lon_0=172.6719444444444 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2115 : return "+proj=tmerc +lat_0=-41.27444444444444 +lon_0=173.2991666666667 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2116 : return "+proj=tmerc +lat_0=-41.28972222222222 +lon_0=172.1088888888889 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2117 : return "+proj=tmerc +lat_0=-41.81055555555555 +lon_0=171.5811111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2118 : return "+proj=tmerc +lat_0=-42.33361111111111 +lon_0=171.5497222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2119 : return "+proj=tmerc +lat_0=-42.68888888888888 +lon_0=173.01 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2120 : return "+proj=tmerc +lat_0=-41.54444444444444 +lon_0=173.8019444444444 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2121 : return "+proj=tmerc +lat_0=-42.88611111111111 +lon_0=170.9797222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2122 : return "+proj=tmerc +lat_0=-43.11 +lon_0=170.2608333333333 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2123 : return "+proj=tmerc +lat_0=-43.97777777777778 +lon_0=168.6061111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2124 : return "+proj=tmerc +lat_0=-43.59055555555556 +lon_0=172.7269444444445 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2125 : return "+proj=tmerc +lat_0=-43.74861111111111 +lon_0=171.3605555555555 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2126 : return "+proj=tmerc +lat_0=-44.40194444444445 +lon_0=171.0572222222222 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2127 : return "+proj=tmerc +lat_0=-44.735 +lon_0=169.4675 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2128 : return "+proj=tmerc +lat_0=-45.13277777777778 +lon_0=168.3986111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2129 : return "+proj=tmerc +lat_0=-45.56361111111111 +lon_0=167.7386111111111 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2130 : return "+proj=tmerc +lat_0=-45.81611111111111 +lon_0=170.6283333333333 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2131 : return "+proj=tmerc +lat_0=-45.86138888888889 +lon_0=170.2825 +k=0.99996 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2132 : return "+proj=tmerc +lat_0=-46.6 +lon_0=168.3427777777778 +k=1 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2133 : return "+proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2134 : return "+proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2135 : return "+proj=utm +zone=60 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2136 : return "+proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.99975 +x_0=274319.7391633579 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +to_meter=0.3047997101815088";
+ case 2137 : return "+proj=tmerc +lat_0=0 +lon_0=-1 +k=0.9996 +x_0=500000 +y_0=0 +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0 +units=m";
+ case 2138 : return "+proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +units=m";
+ case 2139 : return "+proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2140 : return "+proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2141 : return "+proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2142 : return "+proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2143 : return "+proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2144 : return "+proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2145 : return "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2146 : return "+proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2147 : return "+proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2148 : return "+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2149 : return "+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2150 : return "+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2151 : return "+proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2152 : return "+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2153 : return "+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2154 : return "+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2155 : return "+proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +to_meter=0.3048006096012192";
+ case 2156 : return "+proj=utm +zone=59 +south +ellps=GRS80 +units=m";
+ case 2157 : return "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=0.99982 +x_0=600000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2158 : return "+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2159 : return "+proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1 +x_0=152399.8550907544 +y_0=0 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088";
+ case 2160 : return "+proj=tmerc +lat_0=6.666666666666667 +lon_0=-12 +k=1 +x_0=243839.7681452071 +y_0=182879.8261089053 +a=6378300 +b=6356751.689189189 +to_meter=0.3047997101815088";
+ case 2161 : return "+proj=utm +zone=28 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m";
+ case 2162 : return "+proj=utm +zone=29 +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0 +units=m";
+ case 2163 : return "+proj=laea +lat_0=45 +lon_0=-100 +x_0=0 +y_0=0 +a=6370997 +b=6370997 +units=m";
+ case 2164 : return "+proj=tmerc +lat_0=0 +lon_0=-5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0 +units=m";
+ case 2165 : return "+proj=tmerc +lat_0=0 +lon_0=-5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0 +units=m";
+ case 2166 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m";
+ case 2167 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m";
+ case 2168 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m";
+ case 2169 : return "+proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43 +units=m";
+ case 2170 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 2171 : return "+proj=sterea +lat_0=50.625 +lon_0=21.08333333333333 +k=0.9998 +x_0=4637000 +y_0=5647000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 2172 : return "+proj=sterea +lat_0=53.00194444444445 +lon_0=21.50277777777778 +k=0.9998 +x_0=4603000 +y_0=5806000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 2173 : return "+proj=sterea +lat_0=53.58333333333334 +lon_0=17.00833333333333 +k=0.9998 +x_0=3501000 +y_0=5999000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 2174 : return "+proj=sterea +lat_0=51.67083333333333 +lon_0=16.67222222222222 +k=0.9998 +x_0=3703000 +y_0=5627000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 2175 : return "+proj=tmerc +lat_0=0 +lon_0=18.95833333333333 +k=0.999983 +x_0=237000 +y_0=-4700000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 2176 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=0.999923 +x_0=5500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2177 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=0.999923 +x_0=6500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2178 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=0.999923 +x_0=7500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2179 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.999923 +x_0=8500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2180 : return "+proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m";
+ case 2188 : return "+proj=utm +zone=25 +ellps=intl +units=m";
+ case 2189 : return "+proj=utm +zone=26 +ellps=intl +towgs84=-104,167,-38,0,0,0,0 +units=m";
+ case 2190 : return "+proj=utm +zone=26 +ellps=intl +towgs84=-203,141,53,0,0,0,0 +units=m";
+ case 2191 : return "+proj=utm +zone=28 +ellps=intl +units=m";
+ case 2192 : return "+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=2.337229166666667 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +ellps=intl +units=m";
+ case 2193 : return "+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2194 : return "+proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +to_meter=0.3048006096012192";
+ case 2195 : return "+proj=utm +zone=2 +south +ellps=GRS80 +units=m";
+ case 2196 : return "+proj=tmerc +lat_0=0 +lon_0=9.5 +k=0.99995 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2197 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=0.99995 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2198 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2199 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m";
+ case 2200 : return "+proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=300000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m";
+ case 2201 : return "+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2202 : return "+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2203 : return "+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2204 : return "+proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=609601.2192024384 +y_0=30480.06096012192 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 2205 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 2206 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=intl +units=m";
+ case 2207 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=intl +units=m";
+ case 2208 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=intl +units=m";
+ case 2209 : return "+proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=intl +units=m";
+ case 2210 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=intl +units=m";
+ case 2211 : return "+proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=intl +units=m";
+ case 2212 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=intl +units=m";
+ case 2213 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2214 : return "+proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +units=m";
+ case 2215 : return "+proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0 +units=m";
+ case 2216 : return "+proj=utm +zone=22 +ellps=intl +units=m";
+ case 2217 : return "+proj=utm +zone=23 +ellps=intl +units=m";
+ case 2219 : return "+proj=utm +zone=19 +a=6378135 +b=6356750.304921594 +units=m";
+ case 2220 : return "+proj=utm +zone=20 +a=6378135 +b=6356750.304921594 +units=m";
+ case 2222 : return "+proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2223 : return "+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2224 : return "+proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2225 : return "+proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2226 : return "+proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2227 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2228 : return "+proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2229 : return "+proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2230 : return "+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2231 : return "+proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2232 : return "+proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2233 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2234 : return "+proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2235 : return "+proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2236 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2237 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2238 : return "+proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2239 : return "+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2240 : return "+proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2241 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2242 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2243 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2244 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2245 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2246 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2247 : return "+proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2248 : return "+proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2249 : return "+proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2250 : return "+proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2251 : return "+proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2252 : return "+proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2253 : return "+proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2254 : return "+proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2255 : return "+proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2256 : return "+proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2257 : return "+proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2258 : return "+proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2259 : return "+proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2260 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2261 : return "+proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2262 : return "+proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2263 : return "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2264 : return "+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2265 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2266 : return "+proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2267 : return "+proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2268 : return "+proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2269 : return "+proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2270 : return "+proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2271 : return "+proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2272 : return "+proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2273 : return "+proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2274 : return "+proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2275 : return "+proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2276 : return "+proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2277 : return "+proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2278 : return "+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2279 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2280 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2281 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2282 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2283 : return "+proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2284 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2285 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2286 : return "+proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2287 : return "+proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2288 : return "+proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2289 : return "+proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2290 : return "+proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=700000 +y_0=400000 +a=6378135 +b=6356750.304921594 +units=m";
+ case 2291 : return "+proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +a=6378135 +b=6356750.304921594 +units=m";
+ case 2292 : return "+proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2294 : return "+proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=4500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m";
+ case 2295 : return "+proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=5500000 +y_0=0 +a=6378135 +b=6356750.304921594 +units=m";
+ case 2308 : return "+proj=tmerc +lat_0=0 +lon_0=109 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=bessel +units=m";
+ case 2309 : return "+proj=tmerc +lat_0=0 +lon_0=116 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 2310 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 2311 : return "+proj=tmerc +lat_0=0 +lon_0=6 +k=0.9996 +x_0=500000 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 2312 : return "+proj=utm +zone=33 +ellps=clrk80 +units=m";
+ case 2313 : return "+proj=utm +zone=33 +ellps=clrk80 +units=m";
+ case 2314 : return "+proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46392052001 +y_0=65379.0134283 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.3047972654";
+ case 2315 : return "+proj=utm +zone=19 +south +ellps=intl +units=m";
+ case 2316 : return "+proj=utm +zone=20 +south +ellps=intl +units=m";
+ case 2317 : return "+proj=lcc +lat_1=9 +lat_2=3 +lat_0=6 +lon_0=-66 +x_0=1000000 +y_0=1000000 +ellps=intl +units=m";
+ case 2318 : return "+proj=lcc +lat_1=17 +lat_2=33 +lat_0=25.08951 +lon_0=48 +x_0=0 +y_0=0 +ellps=intl +units=m";
+ case 2319 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2320 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2321 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2322 : return "+proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2323 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2324 : return "+proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2325 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 2326 : return "+proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1 +x_0=836694.05 +y_0=819069.8 +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +units=m";
+ case 2327 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2328 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2329 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2330 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2331 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2332 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2333 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2334 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2335 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2336 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2337 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2338 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2339 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2340 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2341 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2342 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2343 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2344 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2345 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2346 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2347 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2348 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2349 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2350 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2351 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2352 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2353 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2354 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2355 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2356 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2357 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2358 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2359 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2360 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2361 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2362 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2363 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2364 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2365 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2366 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2367 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2368 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2369 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2370 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2371 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2372 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2373 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2374 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2375 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2376 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2377 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2378 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2379 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2380 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2381 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2382 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2383 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2384 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2385 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2386 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2387 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2388 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2389 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2390 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m";
+ case 2391 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=1500000 +y_0=0 +ellps=intl +towgs84=-96.0617,-82.4278,-121.743,4.80107,0.34543,-1.37646,1.4964 +units=m";
+ case 2392 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-96.0617,-82.4278,-121.743,4.80107,0.34543,-1.37646,1.4964 +units=m";
+ case 2393 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +towgs84=-96.0617,-82.4278,-121.743,4.80107,0.34543,-1.37646,1.4964 +units=m";
+ case 2394 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=4500000 +y_0=0 +ellps=intl +towgs84=-96.0617,-82.4278,-121.743,4.80107,0.34543,-1.37646,1.4964 +units=m";
+ case 2395 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m";
+ case 2396 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=-76,-138,67,0,0,0,0 +units=m";
+ case 2397 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m";
+ case 2398 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m";
+ case 2399 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m";
+ case 2400 : return "+proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 2401 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m";
+ case 2402 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m";
+ case 2403 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m";
+ case 2404 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m";
+ case 2405 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m";
+ case 2406 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m";
+ case 2407 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m";
+ case 2408 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m";
+ case 2409 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +units=m";
+ case 2410 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +units=m";
+ case 2411 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +units=m";
+ case 2412 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +units=m";
+ case 2413 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +units=m";
+ case 2414 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m";
+ case 2415 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +units=m";
+ case 2416 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +units=m";
+ case 2417 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +units=m";
+ case 2418 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +units=m";
+ case 2419 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +units=m";
+ case 2420 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +units=m";
+ case 2421 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +units=m";
+ case 2422 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2423 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2424 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2425 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2426 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2427 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2428 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2429 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2430 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2431 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2432 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2433 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2434 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2435 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2436 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2437 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2438 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2439 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2440 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2441 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2442 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2443 : return "+proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2444 : return "+proj=tmerc +lat_0=33 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2445 : return "+proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2446 : return "+proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2447 : return "+proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2448 : return "+proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2449 : return "+proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2450 : return "+proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2451 : return "+proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2452 : return "+proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2453 : return "+proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2454 : return "+proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2455 : return "+proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2456 : return "+proj=tmerc +lat_0=26 +lon_0=142 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2457 : return "+proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2458 : return "+proj=tmerc +lat_0=26 +lon_0=124 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2459 : return "+proj=tmerc +lat_0=26 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2460 : return "+proj=tmerc +lat_0=20 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2461 : return "+proj=tmerc +lat_0=26 +lon_0=154 +k=0.9999 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2462 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m";
+ case 2463 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2464 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2465 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2466 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2467 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2468 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2469 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2470 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2471 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2472 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2473 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2474 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2475 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2476 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2477 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2478 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2479 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2480 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2481 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2482 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2483 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2484 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2485 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2486 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2487 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2488 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2489 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2490 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2491 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2492 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2493 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2494 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2495 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2496 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2497 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2498 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2499 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2500 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2501 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2502 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2503 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2504 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2505 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2506 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2507 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2508 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2509 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2510 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2511 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2512 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2513 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2514 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2515 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2516 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2517 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2518 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2519 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2520 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2521 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2522 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2523 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +units=m";
+ case 2524 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m";
+ case 2525 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +units=m";
+ case 2526 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +units=m";
+ case 2527 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +units=m";
+ case 2528 : return "+proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +units=m";
+ case 2529 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m";
+ case 2530 : return "+proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m";
+ case 2531 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m";
+ case 2532 : return "+proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m";
+ case 2533 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m";
+ case 2534 : return "+proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m";
+ case 2535 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m";
+ case 2536 : return "+proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m";
+ case 2537 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m";
+ case 2538 : return "+proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m";
+ case 2539 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m";
+ case 2540 : return "+proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +units=m";
+ case 2541 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m";
+ case 2542 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m";
+ case 2543 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m";
+ case 2544 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m";
+ case 2545 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m";
+ case 2546 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m";
+ case 2547 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m";
+ case 2548 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m";
+ case 2549 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +units=m";
+ case 2550 : return "+proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m";
+ case 2551 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +units=m";
+ case 2552 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +units=m";
+ case 2553 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +units=m";
+ case 2554 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +units=m";
+ case 2555 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m";
+ case 2556 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +units=m";
+ case 2557 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +units=m";
+ case 2558 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +units=m";
+ case 2559 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +units=m";
+ case 2560 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +units=m";
+ case 2561 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +units=m";
+ case 2562 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +units=m";
+ case 2563 : return "+proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +units=m";
+ case 2564 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +units=m";
+ case 2565 : return "+proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +units=m";
+ case 2566 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +units=m";
+ case 2567 : return "+proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +units=m";
+ case 2568 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +units=m";
+ case 2569 : return "+proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +units=m";
+ case 2570 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +units=m";
+ case 2571 : return "+proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +units=m";
+ case 2572 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +units=m";
+ case 2573 : return "+proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +units=m";
+ case 2574 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +units=m";
+ case 2575 : return "+proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +units=m";
+ case 2576 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +units=m";
+ case 2577 : return "+proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +units=m";
+ case 2578 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +units=m";
+ case 2579 : return "+proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +units=m";
+ case 2580 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +units=m";
+ case 2581 : return "+proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +units=m";
+ case 2582 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2583 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2584 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2585 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2586 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2587 : return "+proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2588 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2589 : return "+proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2590 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2591 : return "+proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2592 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2593 : return "+proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2594 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2595 : return "+proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2596 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2597 : return "+proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2598 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2599 : return "+proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2600 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2601 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2602 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2603 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2604 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2605 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2606 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2607 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2608 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2609 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2610 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2611 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2612 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2613 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2614 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2615 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2616 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2617 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2618 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2619 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2620 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2621 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2622 : return "+proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2623 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2624 : return "+proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2625 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2626 : return "+proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2627 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2628 : return "+proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2629 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2630 : return "+proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2631 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2632 : return "+proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2633 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2634 : return "+proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2635 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2636 : return "+proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2637 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2638 : return "+proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2639 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2640 : return "+proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2641 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +units=m";
+ case 2642 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m";
+ case 2643 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +units=m";
+ case 2644 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +units=m";
+ case 2645 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +units=m";
+ case 2646 : return "+proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +units=m";
+ case 2647 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m";
+ case 2648 : return "+proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m";
+ case 2649 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m";
+ case 2650 : return "+proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m";
+ case 2651 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m";
+ case 2652 : return "+proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m";
+ case 2653 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m";
+ case 2654 : return "+proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m";
+ case 2655 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m";
+ case 2656 : return "+proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m";
+ case 2657 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m";
+ case 2658 : return "+proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +units=m";
+ case 2659 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m";
+ case 2660 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m";
+ case 2661 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m";
+ case 2662 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m";
+ case 2663 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m";
+ case 2664 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m";
+ case 2665 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m";
+ case 2666 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m";
+ case 2667 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +units=m";
+ case 2668 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +units=m";
+ case 2669 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +units=m";
+ case 2670 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +units=m";
+ case 2671 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +units=m";
+ case 2672 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m";
+ case 2673 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +units=m";
+ case 2674 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +units=m";
+ case 2675 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +units=m";
+ case 2676 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +units=m";
+ case 2677 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +units=m";
+ case 2678 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +units=m";
+ case 2679 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +units=m";
+ case 2680 : return "+proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +units=m";
+ case 2681 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +units=m";
+ case 2682 : return "+proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +units=m";
+ case 2683 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +units=m";
+ case 2684 : return "+proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +units=m";
+ case 2685 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +units=m";
+ case 2686 : return "+proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +units=m";
+ case 2687 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +units=m";
+ case 2688 : return "+proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +units=m";
+ case 2689 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +units=m";
+ case 2690 : return "+proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +units=m";
+ case 2691 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +units=m";
+ case 2692 : return "+proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +units=m";
+ case 2693 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +units=m";
+ case 2694 : return "+proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +units=m";
+ case 2695 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +units=m";
+ case 2696 : return "+proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +units=m";
+ case 2697 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +units=m";
+ case 2698 : return "+proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +units=m";
+ case 2699 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2700 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2701 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2702 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2703 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2704 : return "+proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2705 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2706 : return "+proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2707 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2708 : return "+proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2709 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2710 : return "+proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2711 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2712 : return "+proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2713 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2714 : return "+proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2715 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2716 : return "+proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2717 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2718 : return "+proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2719 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2720 : return "+proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2721 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2722 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2723 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2724 : return "+proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2725 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2726 : return "+proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2727 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2728 : return "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2729 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2730 : return "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2731 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2732 : return "+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2733 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2734 : return "+proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2735 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2736 : return "+proj=utm +zone=36 +south +ellps=clrk66 +units=m";
+ case 2737 : return "+proj=utm +zone=37 +south +ellps=clrk66 +units=m";
+ case 2738 : return "+proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2739 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2740 : return "+proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2741 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2742 : return "+proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2743 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2744 : return "+proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2745 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2746 : return "+proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2747 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2748 : return "+proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2749 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2750 : return "+proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2751 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2752 : return "+proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2753 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2754 : return "+proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2755 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2756 : return "+proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2757 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2758 : return "+proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 2759 : return "+proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2760 : return "+proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2761 : return "+proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m";
+ case 2762 : return "+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m";
+ case 2763 : return "+proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +units=m";
+ case 2764 : return "+proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2765 : return "+proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m";
+ case 2766 : return "+proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 2767 : return "+proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 2768 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 2769 : return "+proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 2770 : return "+proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 2771 : return "+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 2772 : return "+proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m";
+ case 2773 : return "+proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m";
+ case 2774 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +units=m";
+ case 2775 : return "+proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +units=m";
+ case 2776 : return "+proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2777 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2778 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2779 : return "+proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2780 : return "+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2781 : return "+proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2782 : return "+proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2783 : return "+proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2784 : return "+proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2785 : return "+proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2786 : return "+proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2787 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2788 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2789 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2790 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2791 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2792 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +units=m";
+ case 2793 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +units=m";
+ case 2794 : return "+proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +units=m";
+ case 2795 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2796 : return "+proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2797 : return "+proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m";
+ case 2798 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2799 : return "+proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 2800 : return "+proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2801 : return "+proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2802 : return "+proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2803 : return "+proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2804 : return "+proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2805 : return "+proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +units=m";
+ case 2806 : return "+proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2807 : return "+proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2808 : return "+proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2809 : return "+proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2810 : return "+proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m";
+ case 2811 : return "+proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m";
+ case 2812 : return "+proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m";
+ case 2813 : return "+proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2814 : return "+proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2815 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2816 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2817 : return "+proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2818 : return "+proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2819 : return "+proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2820 : return "+proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +units=m";
+ case 2821 : return "+proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +units=m";
+ case 2822 : return "+proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +units=m";
+ case 2823 : return "+proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2824 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2825 : return "+proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2826 : return "+proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2827 : return "+proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2828 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2829 : return "+proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2830 : return "+proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2831 : return "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2832 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2833 : return "+proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2834 : return "+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2835 : return "+proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2836 : return "+proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2837 : return "+proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2838 : return "+proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2839 : return "+proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2840 : return "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2841 : return "+proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2842 : return "+proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2843 : return "+proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2844 : return "+proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +units=m";
+ case 2845 : return "+proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +units=m";
+ case 2846 : return "+proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +units=m";
+ case 2847 : return "+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +units=m";
+ case 2848 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +units=m";
+ case 2849 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +units=m";
+ case 2850 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +units=m";
+ case 2851 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +units=m";
+ case 2852 : return "+proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2853 : return "+proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +units=m";
+ case 2854 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +units=m";
+ case 2855 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2856 : return "+proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2857 : return "+proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2858 : return "+proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2859 : return "+proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2860 : return "+proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2861 : return "+proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2862 : return "+proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2863 : return "+proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +units=m";
+ case 2864 : return "+proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2865 : return "+proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +units=m";
+ case 2866 : return "+proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +units=m";
+ case 2867 : return "+proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2868 : return "+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2869 : return "+proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2870 : return "+proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2871 : return "+proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2872 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2873 : return "+proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2874 : return "+proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2875 : return "+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2876 : return "+proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2877 : return "+proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2878 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2879 : return "+proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2880 : return "+proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2881 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2882 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2883 : return "+proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2884 : return "+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2885 : return "+proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2886 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2887 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2888 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2889 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249364.9987299975 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2890 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249364.9987299975 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2891 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2892 : return "+proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2893 : return "+proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2894 : return "+proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2895 : return "+proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2896 : return "+proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2897 : return "+proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2898 : return "+proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2899 : return "+proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2900 : return "+proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2901 : return "+proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2902 : return "+proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2903 : return "+proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2904 : return "+proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2905 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2906 : return "+proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2907 : return "+proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2908 : return "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2909 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2910 : return "+proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2911 : return "+proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2912 : return "+proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2913 : return "+proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2914 : return "+proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2915 : return "+proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2916 : return "+proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2917 : return "+proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2918 : return "+proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2919 : return "+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2920 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2921 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +to_meter=0.3048";
+ case 2922 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +to_meter=0.3048";
+ case 2923 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +to_meter=0.3048";
+ case 2924 : return "+proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2925 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2926 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2927 : return "+proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2928 : return "+proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2929 : return "+proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2930 : return "+proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2931 : return "+proj=tmerc +lat_0=0 +lon_0=13 +k=0.9996 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +towgs84=-106,-87,188,0,0,0,0 +units=m";
+ case 2932 : return "+proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +units=m";
+ case 2933 : return "+proj=utm +zone=50 +south +ellps=bessel +units=m";
+ case 2934 : return "+proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m";
+ case 2935 : return "+proj=tmerc +lat_0=0.1166666666666667 +lon_0=41.53333333333333 +k=1 +x_0=1300000 +y_0=0 +ellps=krass +units=m";
+ case 2936 : return "+proj=tmerc +lat_0=0.1166666666666667 +lon_0=44.53333333333333 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +units=m";
+ case 2937 : return "+proj=tmerc +lat_0=0.1166666666666667 +lon_0=47.53333333333333 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +units=m";
+ case 2938 : return "+proj=tmerc +lat_0=0.1166666666666667 +lon_0=50.53333333333333 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +units=m";
+ case 2939 : return "+proj=tmerc +lat_0=0.1333333333333333 +lon_0=50.76666666666667 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +units=m";
+ case 2940 : return "+proj=tmerc +lat_0=0.1333333333333333 +lon_0=53.76666666666667 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +units=m";
+ case 2941 : return "+proj=tmerc +lat_0=0.1333333333333333 +lon_0=56.76666666666667 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +units=m";
+ case 2942 : return "+proj=utm +zone=28 +ellps=intl +towgs84=-499,-249,314,0,0,0,0 +units=m";
+ case 2943 : return "+proj=utm +zone=28 +ellps=intl +units=m";
+ case 2944 : return "+proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2945 : return "+proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2946 : return "+proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2947 : return "+proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2948 : return "+proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2949 : return "+proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2950 : return "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2951 : return "+proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2952 : return "+proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +units=m";
+ case 2953 : return "+proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=2500000 +y_0=7500000 +ellps=GRS80 +units=m";
+ case 2954 : return "+proj=sterea +lat_0=47.25 +lon_0=-63 +k=0.999912 +x_0=400000 +y_0=800000 +ellps=GRS80 +units=m";
+ case 2955 : return "+proj=utm +zone=11 +ellps=GRS80 +units=m";
+ case 2956 : return "+proj=utm +zone=12 +ellps=GRS80 +units=m";
+ case 2957 : return "+proj=utm +zone=13 +ellps=GRS80 +units=m";
+ case 2958 : return "+proj=utm +zone=17 +ellps=GRS80 +units=m";
+ case 2959 : return "+proj=utm +zone=18 +ellps=GRS80 +units=m";
+ case 2960 : return "+proj=utm +zone=19 +ellps=GRS80 +units=m";
+ case 2961 : return "+proj=utm +zone=20 +ellps=GRS80 +units=m";
+ case 2962 : return "+proj=utm +zone=21 +ellps=GRS80 +units=m";
+ case 2964 : return "+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 2965 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2966 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 2967 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2968 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 2969 : return "+proj=utm +zone=20 +ellps=intl +towgs84=137,248,-430,0,0,0,0 +units=m";
+ case 2970 : return "+proj=utm +zone=20 +ellps=intl +units=m";
+ case 2971 : return "+proj=utm +zone=22 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m";
+ case 2972 : return "+proj=utm +zone=22 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m";
+ case 2973 : return "+proj=utm +zone=20 +ellps=intl +units=m";
+ case 2975 : return "+proj=utm +zone=40 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2976 : return "+proj=utm +zone=6 +south +ellps=intl +towgs84=162,117,154,0,0,0,0 +units=m";
+ case 2977 : return "+proj=utm +zone=5 +south +ellps=intl +units=m";
+ case 2978 : return "+proj=utm +zone=7 +south +ellps=intl +units=m";
+ case 2979 : return "+proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m";
+ case 2980 : return "+proj=utm +zone=38 +south +ellps=intl +towgs84=-382,-59,-262,0,0,0,0 +units=m";
+ case 2981 : return "+proj=utm +zone=58 +south +ellps=intl +units=m";
+ case 2982 : return "+proj=utm +zone=58 +south +ellps=intl +units=m";
+ case 2983 : return "+proj=utm +zone=58 +south +ellps=intl +towgs84=-122.383,-188.696,103.344,3.5107,-4.9668,-5.7047,4.4798 +units=m";
+ case 2984 : return "+proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=intl +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2987 : return "+proj=utm +zone=21 +ellps=clrk66 +towgs84=30,430,368,0,0,0,0 +units=m";
+ case 2988 : return "+proj=utm +zone=1 +south +ellps=intl +units=m";
+ case 2989 : return "+proj=utm +zone=20 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 2990 : return "+proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=50000 +y_0=160000 +ellps=intl +units=m";
+ case 2991 : return "+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 2992 : return "+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048";
+ case 2993 : return "+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m";
+ case 2994 : return "+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 2995 : return "+proj=utm +zone=58 +south +ellps=intl +units=m";
+ case 2996 : return "+proj=utm +zone=58 +south +ellps=intl +units=m";
+ case 2997 : return "+proj=utm +zone=58 +south +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7 +units=m";
+ case 2998 : return "+proj=utm +zone=58 +south +ellps=intl +units=m";
+ case 2999 : return "+proj=utm +zone=38 +south +ellps=intl +units=m";
+ case 3000 : return "+proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +units=m";
+ case 3001 : return "+proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +units=m";
+ case 3002 : return "+proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +units=m";
+ case 3003 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +units=m";
+ case 3004 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +units=m";
+ case 3005 : return "+proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3006 : return "+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3007 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3008 : return "+proj=tmerc +lat_0=0 +lon_0=13.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3009 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3010 : return "+proj=tmerc +lat_0=0 +lon_0=16.5 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3011 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3012 : return "+proj=tmerc +lat_0=0 +lon_0=14.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3013 : return "+proj=tmerc +lat_0=0 +lon_0=15.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3014 : return "+proj=tmerc +lat_0=0 +lon_0=17.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3015 : return "+proj=tmerc +lat_0=0 +lon_0=18.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3016 : return "+proj=tmerc +lat_0=0 +lon_0=20.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3017 : return "+proj=tmerc +lat_0=0 +lon_0=21.75 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3018 : return "+proj=tmerc +lat_0=0 +lon_0=23.25 +k=1 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3019 : return "+proj=tmerc +lat_0=0 +lon_0=11.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3020 : return "+proj=tmerc +lat_0=0 +lon_0=13.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3021 : return "+proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3022 : return "+proj=tmerc +lat_0=0 +lon_0=18.05827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3023 : return "+proj=tmerc +lat_0=0 +lon_0=20.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3024 : return "+proj=tmerc +lat_0=0 +lon_0=22.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3025 : return "+proj=tmerc +lat_0=0 +lon_0=11.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3026 : return "+proj=tmerc +lat_0=0 +lon_0=13.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3027 : return "+proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3028 : return "+proj=tmerc +lat_0=0 +lon_0=18.05827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3029 : return "+proj=tmerc +lat_0=0 +lon_0=20.30827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3030 : return "+proj=tmerc +lat_0=0 +lon_0=22.55827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 3031 : return "+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3032 : return "+proj=stere +lat_0=-90 +lat_ts=-71 +lon_0=70 +k=1 +x_0=6000000 +y_0=6000000 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3033 : return "+proj=lcc +lat_1=-68.5 +lat_2=-74.5 +lat_0=-50 +lon_0=70 +x_0=6000000 +y_0=6000000 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3034 : return "+proj=lcc +lat_1=35 +lat_2=65 +lat_0=52 +lon_0=10 +x_0=4000000 +y_0=2800000 +ellps=GRS80 +units=m";
+ case 3035 : return "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m";
+ case 3036 : return "+proj=utm +zone=36 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m";
+ case 3037 : return "+proj=utm +zone=37 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m";
+ case 3038 : return "+proj=utm +zone=26 +ellps=GRS80 +units=m";
+ case 3039 : return "+proj=utm +zone=27 +ellps=GRS80 +units=m";
+ case 3040 : return "+proj=utm +zone=28 +ellps=GRS80 +units=m";
+ case 3041 : return "+proj=utm +zone=29 +ellps=GRS80 +units=m";
+ case 3042 : return "+proj=utm +zone=30 +ellps=GRS80 +units=m";
+ case 3043 : return "+proj=utm +zone=31 +ellps=GRS80 +units=m";
+ case 3044 : return "+proj=utm +zone=32 +ellps=GRS80 +units=m";
+ case 3045 : return "+proj=utm +zone=33 +ellps=GRS80 +units=m";
+ case 3046 : return "+proj=utm +zone=34 +ellps=GRS80 +units=m";
+ case 3047 : return "+proj=utm +zone=35 +ellps=GRS80 +units=m";
+ case 3048 : return "+proj=utm +zone=36 +ellps=GRS80 +units=m";
+ case 3049 : return "+proj=utm +zone=37 +ellps=GRS80 +units=m";
+ case 3050 : return "+proj=utm +zone=38 +ellps=GRS80 +units=m";
+ case 3051 : return "+proj=utm +zone=39 +ellps=GRS80 +units=m";
+ case 3054 : return "+proj=utm +zone=26 +ellps=intl +towgs84=-73,46,-86,0,0,0,0 +units=m";
+ case 3055 : return "+proj=utm +zone=27 +ellps=intl +towgs84=-73,46,-86,0,0,0,0 +units=m";
+ case 3056 : return "+proj=utm +zone=28 +ellps=intl +towgs84=-73,46,-86,0,0,0,0 +units=m";
+ case 3057 : return "+proj=lcc +lat_1=64.25 +lat_2=65.75 +lat_0=65 +lon_0=-19 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3058 : return "+proj=tmerc +lat_0=0 +lon_0=-8.5 +k=1 +x_0=50000 +y_0=-7800000 +ellps=intl +towgs84=982.609,552.753,-540.873,32.3934,-153.257,-96.2266,16.805 +units=m";
+ case 3059 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=-6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3060 : return "+proj=utm +zone=58 +south +ellps=intl +units=m";
+ case 3061 : return "+proj=utm +zone=28 +ellps=intl +units=m";
+ case 3062 : return "+proj=utm +zone=26 +ellps=intl +units=m";
+ case 3063 : return "+proj=utm +zone=26 +ellps=intl +units=m";
+ case 3064 : return "+proj=utm +zone=32 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3065 : return "+proj=utm +zone=33 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3066 : return "+proj=tmerc +lat_0=0 +lon_0=37 +k=0.9998 +x_0=500000 +y_0=-3000000 +ellps=intl +units=m";
+ case 3067 : return "+proj=utm +zone=35 +ellps=GRS80 +units=m";
+ case 3068 : return "+proj=cass +lat_0=52.41864827777778 +lon_0=13.62720366666667 +x_0=40000 +y_0=10000 +ellps=bessel +datum=potsdam +units=m";
+ case 3069 : return "+proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=500000 +y_0=-4500000 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 3070 : return "+proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3071 : return "+proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +units=m";
+ case 3072 : return "+proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3073 : return "+proj=tmerc +lat_0=43 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3074 : return "+proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3075 : return "+proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3076 : return "+proj=tmerc +lat_0=43 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3077 : return "+proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3078 : return "+proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3079 : return "+proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +units=m";
+ case 3080 : return "+proj=lcc +lat_1=27.41666666666667 +lat_2=34.91666666666666 +lat_0=31.16666666666667 +lon_0=-100 +x_0=914400 +y_0=914400 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048";
+ case 3081 : return "+proj=lcc +lat_1=27.41666666666667 +lat_2=34.91666666666666 +lat_0=31.16666666666667 +lon_0=-100 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3082 : return "+proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3083 : return "+proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3084 : return "+proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +units=m";
+ case 3085 : return "+proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +units=m";
+ case 3086 : return "+proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3087 : return "+proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3088 : return "+proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3089 : return "+proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3090 : return "+proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +units=m";
+ case 3091 : return "+proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3092 : return "+proj=utm +zone=51 +ellps=bessel +units=m";
+ case 3093 : return "+proj=utm +zone=52 +ellps=bessel +units=m";
+ case 3094 : return "+proj=utm +zone=53 +ellps=bessel +units=m";
+ case 3095 : return "+proj=utm +zone=54 +ellps=bessel +units=m";
+ case 3096 : return "+proj=utm +zone=55 +ellps=bessel +units=m";
+ case 3097 : return "+proj=utm +zone=51 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3098 : return "+proj=utm +zone=52 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3099 : return "+proj=utm +zone=53 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3100 : return "+proj=utm +zone=54 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3101 : return "+proj=utm +zone=55 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3102 : return "+proj=lcc +lat_1=-14.26666666666667 +lat_0=-14.26666666666667 +lon_0=-170 +k_0=1 +x_0=152400.3048006096 +y_0=95169.31165862332 +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3103 : return "+proj=utm +zone=28 +ellps=clrk80 +units=m";
+ case 3104 : return "+proj=utm +zone=29 +ellps=clrk80 +units=m";
+ case 3105 : return "+proj=utm +zone=30 +ellps=clrk80 +units=m";
+ case 3106 : return "+proj=tmerc +lat_0=0 +lon_0=90 +k=0.9996 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 3107 : return "+proj=lcc +lat_1=-28 +lat_2=-36 +lat_0=-32 +lon_0=135 +x_0=1000000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3108 : return "+proj=tmerc +lat_0=49.5 +lon_0=-2.416666666666667 +k=0.999997 +x_0=47000 +y_0=50000 +ellps=GRS80 +units=m";
+ case 3109 : return "+proj=tmerc +lat_0=49.225 +lon_0=-2.135 +k=0.9999999000000001 +x_0=40000 +y_0=70000 +ellps=GRS80 +units=m";
+ case 3110 : return "+proj=lcc +lat_1=-36 +lat_2=-38 +lat_0=-37 +lon_0=145 +x_0=2500000 +y_0=4500000 +ellps=aust_SA +units=m";
+ case 3111 : return "+proj=lcc +lat_1=-36 +lat_2=-38 +lat_0=-37 +lon_0=145 +x_0=2500000 +y_0=2500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3112 : return "+proj=lcc +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=134 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3113 : return "+proj=tmerc +lat_0=-28 +lon_0=153 +k=0.99999 +x_0=50000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3114 : return "+proj=tmerc +lat_0=4.596200416666666 +lon_0=-80.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3115 : return "+proj=tmerc +lat_0=4.596200416666666 +lon_0=-77.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3116 : return "+proj=tmerc +lat_0=4.596200416666666 +lon_0=-74.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3117 : return "+proj=tmerc +lat_0=4.596200416666666 +lon_0=-71.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3118 : return "+proj=tmerc +lat_0=4.596200416666666 +lon_0=-68.07750791666666 +k=1 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3119 : return "+proj=tmerc +lat_0=0 +lon_0=10.5 +k=0.999 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0 +units=m";
+ case 3120 : return "+proj=sterea +lat_0=50.625 +lon_0=21.08333333333333 +k=0.9998 +x_0=4637000 +y_0=5467000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3121 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m";
+ case 3122 : return "+proj=tmerc +lat_0=0 +lon_0=119 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m";
+ case 3123 : return "+proj=tmerc +lat_0=0 +lon_0=121 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m";
+ case 3124 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m";
+ case 3125 : return "+proj=tmerc +lat_0=0 +lon_0=125 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06 +units=m";
+ case 3126 : return "+proj=tmerc +lat_0=0 +lon_0=19 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3127 : return "+proj=tmerc +lat_0=0 +lon_0=20 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3128 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3129 : return "+proj=tmerc +lat_0=0 +lon_0=22 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3130 : return "+proj=tmerc +lat_0=0 +lon_0=23 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3131 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3132 : return "+proj=tmerc +lat_0=0 +lon_0=25 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3133 : return "+proj=tmerc +lat_0=0 +lon_0=26 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3134 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3135 : return "+proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3136 : return "+proj=tmerc +lat_0=0 +lon_0=29 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3137 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3138 : return "+proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3140 : return "+proj=cass +lat_0=-18 +lon_0=178 +x_0=109435.392 +y_0=141622.272 +a=6378306.3696 +b=6356571.996 +towgs84=51,391,-36,0,0,0,0 +to_meter=0.201168";
+ case 3141 : return "+proj=utm +zone=60 +south +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +units=m";
+ case 3142 : return "+proj=utm +zone=1 +south +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0 +units=m";
+ case 3143 : return "+proj=tmerc +lat_0=-17 +lon_0=178.75 +k=0.99985 +x_0=2000000 +y_0=4000000 +ellps=WGS72 +units=m";
+ case 3146 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m";
+ case 3147 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 3148 : return "+proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 3149 : return "+proj=utm +zone=49 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 3150 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m";
+ case 3151 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 3152 : return "+proj=tmerc +lat_0=0 +lon_0=18.05779 +k=0.99999425 +x_0=100178.1808 +y_0=-6500614.7836 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3153 : return "+proj=aea +lat_1=50 +lat_2=58.5 +lat_0=45 +lon_0=-126 +x_0=1000000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3154 : return "+proj=utm +zone=7 +ellps=GRS80 +units=m";
+ case 3155 : return "+proj=utm +zone=8 +ellps=GRS80 +units=m";
+ case 3156 : return "+proj=utm +zone=9 +ellps=GRS80 +units=m";
+ case 3157 : return "+proj=utm +zone=10 +ellps=GRS80 +units=m";
+ case 3158 : return "+proj=utm +zone=14 +ellps=GRS80 +units=m";
+ case 3159 : return "+proj=utm +zone=15 +ellps=GRS80 +units=m";
+ case 3160 : return "+proj=utm +zone=16 +ellps=GRS80 +units=m";
+ case 3161 : return "+proj=lcc +lat_1=44.5 +lat_2=53.5 +lat_0=0 +lon_0=-85 +x_0=930000 +y_0=6430000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3162 : return "+proj=lcc +lat_1=44.5 +lat_2=53.5 +lat_0=0 +lon_0=-85 +x_0=930000 +y_0=6430000 +ellps=GRS80 +units=m";
+ case 3163 : return "+proj=lcc +lat_1=-20.66666666666667 +lat_2=-22.33333333333333 +lat_0=-21.5 +lon_0=166 +x_0=400000 +y_0=300000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3164 : return "+proj=utm +zone=58 +south +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0 +units=m";
+ case 3165 : return "+proj=lcc +lat_1=-22.24469175 +lat_2=-22.29469175 +lat_0=-22.26969175 +lon_0=166.44242575 +x_0=0.66 +y_0=1.02 +ellps=intl +units=m";
+ case 3166 : return "+proj=lcc +lat_1=-22.24472222222222 +lat_2=-22.29472222222222 +lat_0=-22.26972222222222 +lon_0=166.4425 +x_0=8.313000000000001 +y_0=-2.354 +ellps=intl +units=m";
+ case 3167 : return "+proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=40000 +y_0=0 +a=6377295.664 +b=6356094.667915204 +to_meter=20.116756";
+ case 3168 : return "+proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804670.24 +y_0=0 +a=6377295.664 +b=6356094.667915204 +units=m";
+ case 3169 : return "+proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3170 : return "+proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3171 : return "+proj=utm +zone=59 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3172 : return "+proj=utm +zone=59 +south +ellps=intl +units=m";
+ case 3174 : return "+proj=aea +lat_1=42.122774 +lat_2=49.01518 +lat_0=45.568977 +lon_0=-84.455955 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3175 : return "+proj=aea +lat_1=42.122774 +lat_2=49.01518 +lat_0=45.568977 +lon_0=-83.248627 +x_0=1000000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3176 : return "+proj=tmerc +lat_0=0 +lon_0=106 +k=0.9996 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 3177 : return "+proj=tmerc +lat_0=0 +lon_0=17 +k=0.9965000000000001 +x_0=1000000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3178 : return "+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3179 : return "+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3180 : return "+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3181 : return "+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3182 : return "+proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3183 : return "+proj=utm +zone=23 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3184 : return "+proj=utm +zone=24 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3185 : return "+proj=utm +zone=25 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3186 : return "+proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3187 : return "+proj=utm +zone=27 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3188 : return "+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3189 : return "+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3190 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3191 : return "+proj=tmerc +lat_0=0 +lon_0=11 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3192 : return "+proj=tmerc +lat_0=0 +lon_0=13 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3193 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3194 : return "+proj=tmerc +lat_0=0 +lon_0=17 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3195 : return "+proj=tmerc +lat_0=0 +lon_0=19 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3196 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3197 : return "+proj=tmerc +lat_0=0 +lon_0=23 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3198 : return "+proj=tmerc +lat_0=0 +lon_0=25 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3199 : return "+proj=utm +zone=32 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3200 : return "+proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m";
+ case 3201 : return "+proj=utm +zone=33 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3202 : return "+proj=utm +zone=34 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3203 : return "+proj=utm +zone=35 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m";
+ case 3204 : return "+proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3205 : return "+proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3206 : return "+proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-42 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3207 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-174 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3208 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3209 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=-54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3210 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=42 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3211 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3212 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3213 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=78 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3214 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3215 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=102 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3216 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=114 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3217 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=126 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3218 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=138 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3219 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=150 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3220 : return "+proj=lcc +lat_1=-64.66666666666667 +lat_2=-67.33333333333333 +lat_0=-90 +lon_0=162 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3221 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-102 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3222 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3223 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-78 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3224 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3225 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-18 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3226 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=-6 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3227 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=6 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3228 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=18 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3229 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=30 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3230 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=42 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3231 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=54 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3232 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=66 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3233 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=78 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3234 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3235 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=102 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3236 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=114 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3237 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=126 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3238 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=138 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3239 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=150 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3240 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=162 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3241 : return "+proj=lcc +lat_1=-68.66666666666667 +lat_2=-71.33333333333333 +lat_0=-90 +lon_0=174 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3242 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-153 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3243 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-135 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3244 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-117 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3245 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-99 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3246 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-81 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3247 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-63 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3248 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-27 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3249 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=-9 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3250 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=9 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3251 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=27 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3252 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=45 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3253 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=63 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3254 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=81 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3255 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=99 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3256 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=117 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3257 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=135 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3258 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=153 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3259 : return "+proj=lcc +lat_1=-72.66666666666667 +lat_2=-75.33333333333333 +lat_0=-90 +lon_0=171 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3260 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-168 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3261 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-144 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3262 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-120 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3263 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-96 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3264 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-72 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3265 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-48 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3266 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=-24 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3267 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3268 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=24 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3269 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=48 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3270 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=72 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3271 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=96 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3272 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=120 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3273 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=144 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3274 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-90 +lon_0=168 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3275 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-165 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3276 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-135 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3277 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-105 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3278 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-75 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3279 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3280 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-15 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3281 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=15 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3282 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=45 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3283 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=75 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3284 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=105 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3285 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=135 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3286 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=165 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3287 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3288 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-90 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3289 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=-30 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3290 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=30 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3291 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=90 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3292 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3293 : return "+proj=stere +lat_0=-90 +lat_ts=-80.23861111111111 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3294 : return "+proj=lcc +lat_1=-76.66666666666667 +lat_2=-79.33333333333333 +lat_0=-78 +lon_0=162 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3296 : return "+proj=utm +zone=5 +south +ellps=GRS80 +units=m";
+ case 3297 : return "+proj=utm +zone=6 +south +ellps=GRS80 +units=m";
+ case 3298 : return "+proj=utm +zone=7 +south +ellps=GRS80 +units=m";
+ case 3299 : return "+proj=utm +zone=8 +south +ellps=GRS80 +units=m";
+ case 3300 : return "+proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +units=m";
+ case 3301 : return "+proj=lcc +lat_1=59.33333333333334 +lat_2=58 +lat_0=57.51755393055556 +lon_0=24 +x_0=500000 +y_0=6375000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3302 : return "+proj=utm +zone=7 +south +ellps=intl +units=m";
+ case 3303 : return "+proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m";
+ case 3304 : return "+proj=utm +zone=6 +south +ellps=intl +units=m";
+ case 3305 : return "+proj=utm +zone=6 +south +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773 +units=m";
+ case 3306 : return "+proj=utm +zone=5 +south +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0 +units=m";
+ case 3307 : return "+proj=utm +zone=39 +ellps=WGS84 +towgs84=0,-0.15,0.68,0,0,0,0 +units=m";
+ case 3308 : return "+proj=lcc +lat_1=-30.75 +lat_2=-35.75 +lat_0=-33.25 +lon_0=147 +x_0=9300000 +y_0=4500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3309 : return "+proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 3310 : return "+proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3311 : return "+proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +units=m";
+ case 3312 : return "+proj=utm +zone=21 +ellps=intl +towgs84=-186,230,110,0,0,0,0 +units=m";
+ case 3313 : return "+proj=utm +zone=21 +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0 +units=m";
+ case 3314 : return "+proj=lcc +lat_1=-6.5 +lat_2=-11.5 +lat_0=0 +lon_0=26 +x_0=0 +y_0=0 +ellps=clrk66 +units=m";
+ case 3315 : return "+proj=tmerc +lat_0=-9 +lon_0=26 +k=0.9998 +x_0=0 +y_0=0 +ellps=clrk66 +units=m";
+ case 3316 : return "+proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3317 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3318 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3319 : return "+proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3320 : return "+proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3321 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3322 : return "+proj=tmerc +lat_0=0 +lon_0=20 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3323 : return "+proj=tmerc +lat_0=0 +lon_0=22 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3324 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3325 : return "+proj=tmerc +lat_0=0 +lon_0=26 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3326 : return "+proj=tmerc +lat_0=0 +lon_0=28 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3327 : return "+proj=tmerc +lat_0=0 +lon_0=30 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 3328 : return "+proj=sterea +lat_0=52.16666666666666 +lon_0=19.16666666666667 +k=0.999714 +x_0=500000 +y_0=500000 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3329 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3330 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3331 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3332 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3333 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3334 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3335 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m";
+ case 3336 : return "+proj=utm +zone=42 +south +ellps=intl +towgs84=145,-187,103,0,0,0,0 +units=m";
+ case 3337 : return "+proj=lcc +lat_1=-20.19506944444445 +lat_0=-20.19506944444445 +lon_0=57.52182777777778 +k_0=1 +x_0=1000000 +y_0=1000000 +ellps=clrk80 +towgs84=-770.1,158.4,-498.2,0,0,0,0 +units=m";
+ case 3338 : return "+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3339 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m";
+ case 3340 : return "+proj=tmerc +lat_0=0 +lon_0=14 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m";
+ case 3341 : return "+proj=tmerc +lat_0=0 +lon_0=16 +k=0.9999 +x_0=500000 +y_0=10000000 +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m";
+ case 3342 : return "+proj=utm +zone=33 +south +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0 +units=m";
+ case 3343 : return "+proj=utm +zone=28 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3344 : return "+proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3345 : return "+proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3346 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3347 : return "+proj=lcc +lat_1=49 +lat_2=77 +lat_0=63.390675 +lon_0=-91.86666666666666 +x_0=6200000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3348 : return "+proj=lcc +lat_1=49 +lat_2=77 +lat_0=63.390675 +lon_0=-91.86666666666666 +x_0=6200000 +y_0=3000000 +ellps=GRS80 +units=m";
+ case 3349 : return "+proj=merc +lon_0=-150 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3350 : return "+proj=tmerc +lat_0=0.1 +lon_0=21.95 +k=1 +x_0=250000 +y_0=0 +ellps=krass +units=m";
+ case 3351 : return "+proj=tmerc +lat_0=0.1 +lon_0=24.95 +k=1 +x_0=1250000 +y_0=0 +ellps=krass +units=m";
+ case 3352 : return "+proj=tmerc +lat_0=0.1 +lon_0=27.95 +k=1 +x_0=2250000 +y_0=0 +ellps=krass +units=m";
+ case 3353 : return "+proj=utm +zone=32 +south +ellps=intl +units=m";
+ case 3354 : return "+proj=utm +zone=32 +south +ellps=intl +units=m";
+ case 3355 : return "+proj=tmerc +lat_0=30 +lon_0=31 +k=1 +x_0=615000 +y_0=810000 +ellps=helmert +towgs84=-146.21,112.63,4.05,0,0,0,0 +units=m";
+ case 3356 : return "+proj=utm +zone=17 +ellps=clrk66 +towgs84=67.8,106.1,138.8,0,0,0,0 +units=m";
+ case 3357 : return "+proj=utm +zone=17 +ellps=clrk66 +units=m";
+ case 3358 : return "+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +units=m";
+ case 3359 : return "+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024385 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 3360 : return "+proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +units=m";
+ case 3361 : return "+proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +to_meter=0.3048";
+ case 3362 : return "+proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3363 : return "+proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3364 : return "+proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3365 : return "+proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3366 : return "+proj=cass +lat_0=22.31213333333334 +lon_0=114.1785555555556 +x_0=40243.57775604237 +y_0=19069.93351512578 +a=6378293.645208759 +b=6356617.987679838 +units=m";
+ case 3367 : return "+proj=utm +zone=28 +ellps=clrk80 +units=m";
+ case 3368 : return "+proj=utm +zone=29 +ellps=clrk80 +units=m";
+ case 3369 : return "+proj=utm +zone=30 +ellps=clrk80 +units=m";
+ case 3370 : return "+proj=utm +zone=59 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 3371 : return "+proj=utm +zone=60 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 3372 : return "+proj=utm +zone=59 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3373 : return "+proj=utm +zone=60 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3374 : return "+proj=utm +zone=29 +ellps=intl +units=m";
+ case 3375 : return "+proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257964666666 +k=0.99984 +x_0=804671 +y_0=0 +ellps=GRS80 +units=m";
+ case 3376 : return "+proj=omerc +lat_0=4 +lonc=115 +alpha=53.31580995 +k=0.99984 +x_0=0 +y_0=0 +ellps=GRS80 +units=m";
+ case 3377 : return "+proj=cass +lat_0=2.121679744444445 +lon_0=103.4279362361111 +x_0=-14810.562 +y_0=8758.32 +ellps=GRS80 +units=m";
+ case 3378 : return "+proj=cass +lat_0=2.682347636111111 +lon_0=101.9749050416667 +x_0=3673.785 +y_0=-4240.573 +ellps=GRS80 +units=m";
+ case 3379 : return "+proj=cass +lat_0=3.769388088888889 +lon_0=102.3682989833333 +x_0=-7368.228 +y_0=6485.858 +ellps=GRS80 +units=m";
+ case 3380 : return "+proj=cass +lat_0=3.68464905 +lon_0=101.3891079138889 +x_0=-34836.161 +y_0=56464.049 +ellps=GRS80 +units=m";
+ case 3381 : return "+proj=cass +lat_0=4.9762852 +lon_0=103.070275625 +x_0=19594.245 +y_0=3371.895 +ellps=GRS80 +units=m";
+ case 3382 : return "+proj=cass +lat_0=5.421517541666667 +lon_0=100.3443769638889 +x_0=-23.414 +y_0=62.283 +ellps=GRS80 +units=m";
+ case 3383 : return "+proj=cass +lat_0=5.964672713888889 +lon_0=100.6363711111111 +x_0=0 +y_0=0 +ellps=GRS80 +units=m";
+ case 3384 : return "+proj=cass +lat_0=4.859063022222222 +lon_0=100.8154105861111 +x_0=-1.769 +y_0=133454.779 +ellps=GRS80 +units=m";
+ case 3385 : return "+proj=cass +lat_0=5.972543658333334 +lon_0=102.2952416694444 +x_0=13227.851 +y_0=8739.894 +ellps=GRS80 +units=m";
+ case 3386 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-96.0617,-82.4278,-121.743,4.80107,0.34543,-1.37646,1.4964 +units=m";
+ case 3387 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=5500000 +y_0=0 +ellps=intl +towgs84=-96.0617,-82.4278,-121.743,4.80107,0.34543,-1.37646,1.4964 +units=m";
+ case 3388 : return "+proj=merc +lon_0=51 +k=1 +x_0=0 +y_0=0 +ellps=krass +units=m";
+ case 3389 : return "+proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +units=m";
+ case 3390 : return "+proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +units=m";
+ case 3391 : return "+proj=utm +zone=37 +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0 +units=m";
+ case 3392 : return "+proj=utm +zone=38 +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0 +units=m";
+ case 3393 : return "+proj=utm +zone=39 +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0 +units=m";
+ case 3394 : return "+proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +units=m";
+ case 3395 : return "+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3396 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +units=m";
+ case 3397 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m";
+ case 3398 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +units=m";
+ case 3399 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +units=m";
+ case 3400 : return "+proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3401 : return "+proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3402 : return "+proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3403 : return "+proj=tmerc +lat_0=0 +lon_0=-115 +k=0.9992 +x_0=0 +y_0=0 +ellps=GRS80 +units=m";
+ case 3404 : return "+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3405 : return "+proj=utm +zone=48 +ellps=WGS84 +units=m";
+ case 3406 : return "+proj=utm +zone=49 +ellps=WGS84 +units=m";
+ case 3407 : return "+proj=cass +lat_0=22.31213333333334 +lon_0=114.1785555555556 +x_0=40243.57775604237 +y_0=19069.93351512578 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.3047972654";
+ case 3408 : return "+proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m";
+ case 3409 : return "+proj=laea +lat_0=-90 +lon_0=0 +x_0=0 +y_0=0 +a=6371228 +b=6371228 +units=m";
+ case 3411 : return "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m";
+ case 3412 : return "+proj=stere +lat_0=-90 +lat_ts=-70 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6378273 +b=6356889.449 +units=m";
+ case 3413 : return "+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3414 : return "+proj=tmerc +lat_0=1.366666666666667 +lon_0=103.8333333333333 +k=1 +x_0=28001.642 +y_0=38744.572 +ellps=WGS84 +units=m";
+ case 3415 : return "+proj=lcc +lat_1=18 +lat_2=24 +lat_0=21 +lon_0=114 +x_0=500000 +y_0=500000 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 3416 : return "+proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=GRS80 +units=m";
+ case 3417 : return "+proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3418 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3419 : return "+proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3420 : return "+proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3421 : return "+proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3422 : return "+proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3423 : return "+proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3424 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3425 : return "+proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3426 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3427 : return "+proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3428 : return "+proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3429 : return "+proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3430 : return "+proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3431 : return "+proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3432 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3433 : return "+proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3434 : return "+proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3435 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3436 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3437 : return "+proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3438 : return "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3439 : return "+proj=utm +zone=39 +ellps=clrk80 +units=m";
+ case 3440 : return "+proj=utm +zone=40 +ellps=clrk80 +units=m";
+ case 3441 : return "+proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3442 : return "+proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3443 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3444 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3445 : return "+proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3446 : return "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3447 : return "+proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=50.797815 +lon_0=4.359215833333333 +x_0=150328 +y_0=166262 +ellps=GRS80 +units=m";
+ case 3448 : return "+proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=750000 +y_0=650000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3449 : return "+proj=utm +zone=17 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3450 : return "+proj=utm +zone=18 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3451 : return "+proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3452 : return "+proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3453 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3454 : return "+proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3455 : return "+proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3456 : return "+proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3457 : return "+proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3458 : return "+proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3459 : return "+proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3460 : return "+proj=tmerc +lat_0=-17 +lon_0=178.75 +k=0.99985 +x_0=2000000 +y_0=4000000 +ellps=WGS72 +units=m";
+ case 3461 : return "+proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +units=m";
+ case 3462 : return "+proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0 +units=m";
+ case 3463 : return "+proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3464 : return "+proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 3465 : return "+proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3466 : return "+proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3467 : return "+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3468 : return "+proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3469 : return "+proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3470 : return "+proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3471 : return "+proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3472 : return "+proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3473 : return "+proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3474 : return "+proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3475 : return "+proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3476 : return "+proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3477 : return "+proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3478 : return "+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3479 : return "+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3480 : return "+proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3481 : return "+proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3482 : return "+proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3483 : return "+proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3484 : return "+proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3485 : return "+proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3486 : return "+proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3487 : return "+proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3488 : return "+proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3489 : return "+proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3490 : return "+proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3491 : return "+proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3492 : return "+proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3493 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3494 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3495 : return "+proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3496 : return "+proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3497 : return "+proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3498 : return "+proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3499 : return "+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3500 : return "+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000.0001016 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3501 : return "+proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3502 : return "+proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3503 : return "+proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3504 : return "+proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3505 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3506 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3507 : return "+proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3508 : return "+proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096012192 +y_0=152400.3048006096 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3509 : return "+proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3510 : return "+proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3511 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3512 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3513 : return "+proj=aea +lat_1=24 +lat_2=31.5 +lat_0=24 +lon_0=-84 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3514 : return "+proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3515 : return "+proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3516 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3517 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3518 : return "+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3519 : return "+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3520 : return "+proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3521 : return "+proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3522 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3523 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3524 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3525 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3526 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3527 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3528 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3529 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3530 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3531 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=699999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3532 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3533 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=99999.99989839978 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3534 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3535 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=249999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3536 : return "+proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3537 : return "+proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3538 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3539 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3540 : return "+proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3541 : return "+proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3542 : return "+proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3543 : return "+proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=399999.99998984 +y_0=399999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3544 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3545 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3546 : return "+proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3547 : return "+proj=lcc +lat_1=37.08333333333334 +lat_2=38.66666666666666 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=1500000 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3548 : return "+proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3549 : return "+proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000.0001016001 +y_0=500000.0001016001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3550 : return "+proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3551 : return "+proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3552 : return "+proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3553 : return "+proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=999999.9999898402 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3554 : return "+proj=tmerc +lat_0=43.5 +lon_0=-69.125 +k=0.99998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3555 : return "+proj=tmerc +lat_0=43.83333333333334 +lon_0=-67.875 +k=0.99998 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3556 : return "+proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.375 +k=0.99998 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3557 : return "+proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3558 : return "+proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3559 : return "+proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3560 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3561 : return "+proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192";
+ case 3562 : return "+proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192";
+ case 3563 : return "+proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192";
+ case 3564 : return "+proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192";
+ case 3565 : return "+proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +to_meter=0.3048006096012192";
+ case 3566 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3567 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3568 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3569 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3570 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3571 : return "+proj=laea +lat_0=90 +lon_0=180 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3572 : return "+proj=laea +lat_0=90 +lon_0=-150 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3573 : return "+proj=laea +lat_0=90 +lon_0=-100 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3574 : return "+proj=laea +lat_0=90 +lon_0=-40 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3575 : return "+proj=laea +lat_0=90 +lon_0=10 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3576 : return "+proj=laea +lat_0=90 +lon_0=90 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3577 : return "+proj=aea +lat_1=-18 +lat_2=-36 +lat_0=0 +lon_0=132 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3578 : return "+proj=aea +lat_1=61.66666666666666 +lat_2=68 +lat_0=59 +lon_0=-132.5 +x_0=500000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3579 : return "+proj=aea +lat_1=61.66666666666666 +lat_2=68 +lat_0=59 +lon_0=-132.5 +x_0=500000 +y_0=500000 +ellps=GRS80 +units=m";
+ case 3580 : return "+proj=lcc +lat_1=62 +lat_2=70 +lat_0=0 +lon_0=-112 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 3581 : return "+proj=lcc +lat_1=62 +lat_2=70 +lat_0=0 +lon_0=-112 +x_0=0 +y_0=0 +ellps=GRS80 +units=m";
+ case 3582 : return "+proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=399999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3583 : return "+proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3584 : return "+proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3585 : return "+proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3586 : return "+proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000.0001016002 +y_0=750000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3587 : return "+proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3588 : return "+proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=5999999.999976001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3589 : return "+proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3590 : return "+proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=7999999.999968001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3591 : return "+proj=omerc +lat_0=45.30916666666666 +lonc=-86 +alpha=337.25556 +k=0.9996 +x_0=2546731.496 +y_0=-4354009.816 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3592 : return "+proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3593 : return "+proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=3999999.999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3594 : return "+proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3595 : return "+proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3596 : return "+proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3597 : return "+proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3598 : return "+proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3599 : return "+proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3600 : return "+proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=699999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3601 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3602 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3603 : return "+proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3604 : return "+proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3605 : return "+proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3606 : return "+proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3607 : return "+proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3608 : return "+proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000.00001016 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3609 : return "+proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3610 : return "+proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000.00001016 +y_0=8000000.000010163 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3611 : return "+proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3612 : return "+proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000.0000101599 +y_0=3999999.99998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3613 : return "+proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3614 : return "+proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3615 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3616 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3617 : return "+proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3618 : return "+proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3619 : return "+proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3620 : return "+proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3621 : return "+proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3622 : return "+proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3623 : return "+proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3624 : return "+proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=249999.9998983998 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3625 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3626 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3627 : return "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3628 : return "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3629 : return "+proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3630 : return "+proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3631 : return "+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3632 : return "+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3633 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3634 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3635 : return "+proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3636 : return "+proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=599999.9999976 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3637 : return "+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3638 : return "+proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3639 : return "+proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3640 : return "+proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3641 : return "+proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3642 : return "+proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3643 : return "+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=400000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3644 : return "+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3645 : return "+proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3646 : return "+proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000.0001424 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3647 : return "+proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3648 : return "+proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3649 : return "+proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3650 : return "+proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3651 : return "+proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3652 : return "+proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3653 : return "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3654 : return "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3655 : return "+proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3656 : return "+proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3657 : return "+proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3658 : return "+proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3659 : return "+proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3660 : return "+proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3661 : return "+proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3662 : return "+proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3663 : return "+proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3664 : return "+proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=699999.9998983998 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3665 : return "+proj=aea +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3666 : return "+proj=lcc +lat_1=27.5 +lat_2=35 +lat_0=18 +lon_0=-100 +x_0=1500000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3667 : return "+proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3668 : return "+proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000.0001016002 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3669 : return "+proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3670 : return "+proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3671 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3672 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000.0000000001 +y_0=5000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3673 : return "+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3674 : return "+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=3999999.9998984 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3675 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3676 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=1999999.999992 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3677 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=2000000.00001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3678 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3679 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.0001504 +y_0=999999.9999960001 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3680 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000.00001016 +y_0=999999.9999898402 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3681 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3682 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.0001504 +y_0=2999999.999988 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048";
+ case 3683 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000.00001016 +y_0=3000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3684 : return "+proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3685 : return "+proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3686 : return "+proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=2000000.0001016 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3687 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3688 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000.0001016 +y_0=999999.9998983998 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3689 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3690 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3691 : return "+proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3692 : return "+proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000.0001016001 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3693 : return "+proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3694 : return "+proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3695 : return "+proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3696 : return "+proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3697 : return "+proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3698 : return "+proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3699 : return "+proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3700 : return "+proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3701 : return "+proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9996 +x_0=520000 +y_0=-4480000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3702 : return "+proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3703 : return "+proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3704 : return "+proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3705 : return "+proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3706 : return "+proj=utm +zone=59 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3707 : return "+proj=utm +zone=60 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3708 : return "+proj=utm +zone=1 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3709 : return "+proj=utm +zone=2 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3710 : return "+proj=utm +zone=3 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3711 : return "+proj=utm +zone=4 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3712 : return "+proj=utm +zone=5 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3713 : return "+proj=utm +zone=6 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3714 : return "+proj=utm +zone=7 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3715 : return "+proj=utm +zone=8 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3716 : return "+proj=utm +zone=9 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3717 : return "+proj=utm +zone=10 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3718 : return "+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3719 : return "+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3720 : return "+proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3721 : return "+proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3722 : return "+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3723 : return "+proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3724 : return "+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3725 : return "+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3726 : return "+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 3727 : return "+proj=tmerc +lat_0=-21.11666666666667 +lon_0=55.53333333333333 +k=1 +x_0=160000 +y_0=50000 +ellps=intl +units=m";
+ case 3728 : return "+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3729 : return "+proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3730 : return "+proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3731 : return "+proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3732 : return "+proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3733 : return "+proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3734 : return "+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3735 : return "+proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3736 : return "+proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3737 : return "+proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3738 : return "+proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3739 : return "+proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3740 : return "+proj=utm +zone=10 +ellps=GRS80 +units=m";
+ case 3741 : return "+proj=utm +zone=11 +ellps=GRS80 +units=m";
+ case 3742 : return "+proj=utm +zone=12 +ellps=GRS80 +units=m";
+ case 3743 : return "+proj=utm +zone=13 +ellps=GRS80 +units=m";
+ case 3744 : return "+proj=utm +zone=14 +ellps=GRS80 +units=m";
+ case 3745 : return "+proj=utm +zone=15 +ellps=GRS80 +units=m";
+ case 3746 : return "+proj=utm +zone=16 +ellps=GRS80 +units=m";
+ case 3747 : return "+proj=utm +zone=17 +ellps=GRS80 +units=m";
+ case 3748 : return "+proj=utm +zone=18 +ellps=GRS80 +units=m";
+ case 3749 : return "+proj=utm +zone=19 +ellps=GRS80 +units=m";
+ case 3750 : return "+proj=utm +zone=4 +ellps=GRS80 +units=m";
+ case 3751 : return "+proj=utm +zone=5 +ellps=GRS80 +units=m";
+ case 3752 : return "+proj=merc +lon_0=100 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3753 : return "+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3754 : return "+proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3755 : return "+proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000.00001016 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3756 : return "+proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=399999.99998984 +y_0=99999.99998983997 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3757 : return "+proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3758 : return "+proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000.0000101599 +y_0=99999.99998983997 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3759 : return "+proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 3760 : return "+proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000.00001016 +y_0=0 +ellps=GRS80 +to_meter=0.3048006096012192";
+ case 3761 : return "+proj=utm +zone=22 +ellps=GRS80 +units=m";
+ case 3762 : return "+proj=lcc +lat_1=-54 +lat_2=-54.75 +lat_0=-55 +lon_0=-37 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 3920 : return "+proj=utm +zone=20 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +units=m";
+ case 3991 : return "+proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +to_meter=0.3048006096012192";
+ case 3992 : return "+proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=152400.3048006096 +y_0=30480.06096012192 +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0 +to_meter=0.3048006096012192";
+ case 4001 : return "+proj=longlat +ellps=airy";
+ case 4002 : return "+proj=longlat +a=6377340.189 +b=6356034.447938534";
+ case 4003 : return "+proj=longlat +ellps=aust_SA";
+ case 4004 : return "+proj=longlat +ellps=bessel";
+ case 4005 : return "+proj=longlat +a=6377492.018 +b=6356173.508712696";
+ case 4006 : return "+proj=longlat +ellps=bess_nam";
+ case 4007 : return "+proj=longlat +a=6378293.645208759 +b=6356617.987679838";
+ case 4008 : return "+proj=longlat +ellps=clrk66";
+ case 4009 : return "+proj=longlat +a=6378450.047548896 +b=6356826.621488444";
+ case 4010 : return "+proj=longlat +a=6378300.789 +b=6356566.435";
+ case 4011 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4012 : return "+proj=longlat +ellps=clrk80";
+ case 4013 : return "+proj=longlat +a=6378249.145 +b=6356514.966398753";
+ case 4014 : return "+proj=longlat +a=6378249.2 +b=6356514.996941779";
+ case 4015 : return "+proj=longlat +a=6377276.345 +b=6356075.41314024";
+ case 4016 : return "+proj=longlat +ellps=evrstSS";
+ case 4018 : return "+proj=longlat +a=6377304.063 +b=6356103.038993155";
+ case 4019 : return "+proj=longlat +ellps=GRS80";
+ case 4020 : return "+proj=longlat +ellps=helmert";
+ case 4021 : return "+proj=longlat +a=6378160 +b=6356774.50408554";
+ case 4022 : return "+proj=longlat +ellps=intl";
+ case 4024 : return "+proj=longlat +ellps=krass";
+ case 4025 : return "+proj=longlat +ellps=WGS66";
+ case 4027 : return "+proj=longlat +a=6376523 +b=6355862.933255573";
+ case 4028 : return "+proj=longlat +a=6378298.3 +b=6356657.142669561";
+ case 4029 : return "+proj=longlat +a=6378300 +b=6356751.689189189";
+ case 4030 : return "+proj=longlat +ellps=WGS84";
+ case 4031 : return "+proj=longlat +ellps=WGS84";
+ case 4032 : return "+proj=longlat +a=6378136.2 +b=6356751.516927429";
+ case 4033 : return "+proj=longlat +a=6378136.3 +b=6356751.616592146";
+ case 4034 : return "+proj=longlat +ellps=clrk80";
+ case 4035 : return "+proj=longlat +a=6371000 +b=6371000";
+ case 4036 : return "+proj=longlat +ellps=GRS67";
+ case 4041 : return "+proj=longlat +a=6378135 +b=6356750.304921594";
+ case 4042 : return "+proj=longlat +a=6377299.36559538 +b=6356098.357204818";
+ case 4043 : return "+proj=longlat +ellps=WGS72";
+ case 4044 : return "+proj=longlat +a=6377301.243 +b=6356100.230165384";
+ case 4045 : return "+proj=longlat +a=6377299.151 +b=6356098.145120132";
+ case 4047 : return "+proj=longlat +a=6371007 +b=6371007";
+ case 4052 : return "+proj=longlat +a=6370997 +b=6370997";
+ case 4053 : return "+proj=longlat +a=6371228 +b=6371228";
+ case 4054 : return "+proj=longlat +a=6378273 +b=6356889.449";
+ case 4120 : return "+proj=longlat +ellps=bessel";
+ case 4121 : return "+proj=longlat +ellps=GRS80 +towgs84=-199.87,74.79,246.62,0,0,0,0";
+ case 4122 : return "+proj=longlat +a=6378135 +b=6356750.304921594";
+ case 4123 : return "+proj=longlat +ellps=intl +towgs84=-96.0617,-82.4278,-121.743,4.80107,0.34543,-1.37646,1.4964";
+ case 4124 : return "+proj=longlat +ellps=bessel";
+ case 4125 : return "+proj=longlat +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0";
+ case 4126 : return "+proj=longlat +ellps=GRS80";
+ case 4127 : return "+proj=longlat +ellps=clrk66";
+ case 4128 : return "+proj=longlat +ellps=clrk66";
+ case 4129 : return "+proj=longlat +ellps=clrk66";
+ case 4130 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0";
+ case 4131 : return "+proj=longlat +a=6377276.345 +b=6356075.41314024";
+ case 4132 : return "+proj=longlat +ellps=clrk80";
+ case 4133 : return "+proj=longlat +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014";
+ case 4134 : return "+proj=longlat +ellps=clrk80";
+ case 4135 : return "+proj=longlat +ellps=clrk66";
+ case 4136 : return "+proj=longlat +ellps=clrk66";
+ case 4137 : return "+proj=longlat +ellps=clrk66";
+ case 4138 : return "+proj=longlat +ellps=clrk66";
+ case 4139 : return "+proj=longlat +ellps=clrk66 +towgs84=11,72,-101,0,0,0,0";
+ case 4140 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4141 : return "+proj=longlat +ellps=GRS80 +towgs84=-48,55,52,0,0,0,0";
+ case 4142 : return "+proj=longlat +ellps=clrk80 +towgs84=-125,53,467,0,0,0,0";
+ case 4143 : return "+proj=longlat +ellps=clrk80 +towgs84=-124.76,53,466.79,0,0,0,0";
+ case 4144 : return "+proj=longlat +a=6377276.345 +b=6356075.41314024";
+ case 4145 : return "+proj=longlat +a=6377301.243 +b=6356100.230165384";
+ case 4146 : return "+proj=longlat +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0";
+ case 4147 : return "+proj=longlat +ellps=krass +towgs84=-17.51,-108.32,-62.39,0,0,0,0";
+ case 4148 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4149 : return "+proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0";
+ case 4150 : return "+proj=longlat +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0";
+ case 4151 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4152 : return "+proj=longlat +ellps=GRS80";
+ case 4153 : return "+proj=longlat +ellps=intl +towgs84=-133.63,-157.5,-158.62,0,0,0,0";
+ case 4154 : return "+proj=longlat +ellps=intl";
+ case 4155 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-83,37,124,0,0,0,0";
+ case 4156 : return "+proj=longlat +ellps=bessel";
+ case 4157 : return "+proj=longlat +a=6378293.645208759 +b=6356617.987679838";
+ case 4158 : return "+proj=longlat +ellps=intl";
+ case 4159 : return "+proj=longlat +ellps=intl";
+ case 4160 : return "+proj=longlat +ellps=intl";
+ case 4161 : return "+proj=longlat +ellps=intl +towgs84=27.5,14,186.4,0,0,0,0";
+ case 4162 : return "+proj=longlat +ellps=bessel";
+ case 4163 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4164 : return "+proj=longlat +ellps=krass +towgs84=-76,-138,67,0,0,0,0";
+ case 4165 : return "+proj=longlat +ellps=intl +towgs84=-173,253,27,0,0,0,0";
+ case 4166 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4167 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4168 : return "+proj=longlat +a=6378300 +b=6356751.689189189 +towgs84=-199,32,322,0,0,0,0";
+ case 4169 : return "+proj=longlat +ellps=clrk66 +towgs84=-115,118,426,0,0,0,0";
+ case 4170 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4171 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4172 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4173 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4174 : return "+proj=longlat +a=6378300 +b=6356751.689189189";
+ case 4175 : return "+proj=longlat +ellps=clrk80 +towgs84=-88,4,101,0,0,0,0";
+ case 4176 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4178 : return "+proj=longlat +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1";
+ case 4179 : return "+proj=longlat +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84";
+ case 4180 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4181 : return "+proj=longlat +ellps=intl +towgs84=-193,13.7,-39.3,-0.41,-2.933,2.688,0.43";
+ case 4182 : return "+proj=longlat +ellps=intl";
+ case 4183 : return "+proj=longlat +ellps=intl +towgs84=-104,167,-38,0,0,0,0";
+ case 4184 : return "+proj=longlat +ellps=intl +towgs84=-203,141,53,0,0,0,0";
+ case 4185 : return "+proj=longlat +ellps=intl";
+ case 4188 : return "+proj=longlat +ellps=airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15";
+ case 4189 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4190 : return "+proj=longlat +ellps=GRS80";
+ case 4191 : return "+proj=longlat +ellps=krass";
+ case 4192 : return "+proj=longlat +ellps=intl +towgs84=-206.1,-174.7,-87.7,0,0,0,0";
+ case 4193 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-70.9,-151.8,-41.4,0,0,0,0";
+ case 4194 : return "+proj=longlat +ellps=intl";
+ case 4195 : return "+proj=longlat +ellps=intl +towgs84=105,326,-102.5,0,0,0.814,-0.6";
+ case 4196 : return "+proj=longlat +ellps=intl +towgs84=-45,417,-3.5,0,0,0.814,-0.6";
+ case 4197 : return "+proj=longlat +ellps=clrk80";
+ case 4198 : return "+proj=longlat +ellps=clrk80";
+ case 4199 : return "+proj=longlat +ellps=intl";
+ case 4200 : return "+proj=longlat +ellps=krass";
+ case 4201 : return "+proj=longlat +ellps=clrk80";
+ case 4202 : return "+proj=longlat +ellps=aust_SA";
+ case 4203 : return "+proj=longlat +ellps=aust_SA";
+ case 4204 : return "+proj=longlat +ellps=intl";
+ case 4205 : return "+proj=longlat +ellps=krass +towgs84=-43,-163,45,0,0,0,0";
+ case 4206 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4207 : return "+proj=longlat +ellps=intl";
+ case 4208 : return "+proj=longlat +ellps=intl";
+ case 4209 : return "+proj=longlat +a=6378249.145 +b=6356514.966398753";
+ case 4210 : return "+proj=longlat +ellps=clrk80";
+ case 4211 : return "+proj=longlat +ellps=bessel";
+ case 4212 : return "+proj=longlat +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0";
+ case 4213 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-106,-87,188,0,0,0,0";
+ case 4214 : return "+proj=longlat +ellps=krass";
+ case 4215 : return "+proj=longlat +ellps=intl";
+ case 4216 : return "+proj=longlat +ellps=clrk66 +towgs84=-73,213,296,0,0,0,0";
+ case 4218 : return "+proj=longlat +ellps=intl +towgs84=307,304,-318,0,0,0,0";
+ case 4219 : return "+proj=longlat +ellps=bessel +towgs84=-384,664,-48,0,0,0,0";
+ case 4220 : return "+proj=longlat +ellps=clrk80";
+ case 4221 : return "+proj=longlat +ellps=intl";
+ case 4222 : return "+proj=longlat +a=6378249.145 +b=6356514.966398753";
+ case 4223 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4224 : return "+proj=longlat +ellps=intl +towgs84=-134,229,-29,0,0,0,0";
+ case 4225 : return "+proj=longlat +ellps=intl +towgs84=-206,172,-6,0,0,0,0";
+ case 4226 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4227 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4228 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4229 : return "+proj=longlat +ellps=helmert";
+ case 4230 : return "+proj=longlat +ellps=intl";
+ case 4231 : return "+proj=longlat +ellps=intl";
+ case 4232 : return "+proj=longlat +ellps=clrk80";
+ case 4233 : return "+proj=longlat +ellps=intl +towgs84=-133,-321,50,0,0,0,0";
+ case 4234 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4235 : return "+proj=longlat +ellps=intl";
+ case 4236 : return "+proj=longlat +ellps=intl +towgs84=-637,-549,-203,0,0,0,0";
+ case 4237 : return "+proj=longlat +ellps=GRS67";
+ case 4238 : return "+proj=longlat +a=6378160 +b=6356774.50408554";
+ case 4239 : return "+proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0";
+ case 4240 : return "+proj=longlat +a=6377276.345 +b=6356075.41314024";
+ case 4241 : return "+proj=longlat +ellps=clrk80";
+ case 4242 : return "+proj=longlat +ellps=clrk66";
+ case 4243 : return "+proj=longlat +a=6377299.36559538 +b=6356098.357204818";
+ case 4244 : return "+proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=-97,787,86,0,0,0,0";
+ case 4245 : return "+proj=longlat +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0";
+ case 4246 : return "+proj=longlat +ellps=clrk80 +towgs84=-294.7,-200.1,525.5,0,0,0,0";
+ case 4247 : return "+proj=longlat +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0";
+ case 4248 : return "+proj=longlat +ellps=intl";
+ case 4249 : return "+proj=longlat +ellps=intl";
+ case 4250 : return "+proj=longlat +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0";
+ case 4251 : return "+proj=longlat +ellps=clrk80 +towgs84=-90,40,88,0,0,0,0";
+ case 4252 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4253 : return "+proj=longlat +ellps=clrk66";
+ case 4254 : return "+proj=longlat +ellps=intl";
+ case 4255 : return "+proj=longlat +ellps=intl +towgs84=-333,-222,114,0,0,0,0";
+ case 4256 : return "+proj=longlat +ellps=clrk80 +towgs84=41,-220,-134,0,0,0,0";
+ case 4257 : return "+proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0";
+ case 4258 : return "+proj=longlat +ellps=GRS80";
+ case 4259 : return "+proj=longlat +ellps=intl";
+ case 4260 : return "+proj=longlat +ellps=clrk80 +towgs84=-70.9,-151.8,-41.4,0,0,0,0";
+ case 4261 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0";
+ case 4262 : return "+proj=longlat +ellps=bessel +towgs84=639,405,60,0,0,0,0";
+ case 4263 : return "+proj=longlat +ellps=clrk80";
+ case 4264 : return "+proj=longlat +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0";
+ case 4265 : return "+proj=longlat +ellps=intl";
+ case 4266 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4267 : return "+proj=longlat +ellps=clrk66 +datum=NAD27";
+ case 4268 : return "+proj=longlat +a=6378450.047548896 +b=6356826.621488444";
+ case 4269 : return "+proj=longlat +ellps=GRS80 +datum=NAD83";
+ case 4270 : return "+proj=longlat +ellps=clrk80";
+ case 4271 : return "+proj=longlat +ellps=intl";
+ case 4272 : return "+proj=longlat +ellps=intl +datum=nzgd49";
+ case 4273 : return "+proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21";
+ case 4274 : return "+proj=longlat +ellps=intl";
+ case 4275 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0";
+ case 4276 : return "+proj=longlat +ellps=WGS66";
+ case 4277 : return "+proj=longlat +ellps=airy +datum=OSGB36";
+ case 4278 : return "+proj=longlat +ellps=airy";
+ case 4279 : return "+proj=longlat +ellps=airy";
+ case 4280 : return "+proj=longlat +ellps=bessel";
+ case 4281 : return "+proj=longlat +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1";
+ case 4282 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4283 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4284 : return "+proj=longlat +ellps=krass";
+ case 4285 : return "+proj=longlat +ellps=intl";
+ case 4286 : return "+proj=longlat +ellps=helmert";
+ case 4287 : return "+proj=longlat +ellps=intl +towgs84=164,138,-189,0,0,0,0";
+ case 4288 : return "+proj=longlat +ellps=intl";
+ case 4289 : return "+proj=longlat +ellps=bessel";
+ case 4291 : return "+proj=longlat +ellps=GRS67";
+ case 4292 : return "+proj=longlat +ellps=intl +towgs84=-355,21,72,0,0,0,0";
+ case 4293 : return "+proj=longlat +ellps=bess_nam";
+ case 4294 : return "+proj=longlat +ellps=bessel";
+ case 4295 : return "+proj=longlat +ellps=bessel";
+ case 4296 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4297 : return "+proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0";
+ case 4298 : return "+proj=longlat +ellps=evrstSS";
+ case 4299 : return "+proj=longlat +a=6377340.189 +b=6356034.447938534";
+ case 4300 : return "+proj=longlat +a=6377340.189 +b=6356034.447938534";
+ case 4301 : return "+proj=longlat +ellps=bessel";
+ case 4302 : return "+proj=longlat +a=6378293.645208759 +b=6356617.987679838";
+ case 4303 : return "+proj=longlat +ellps=helmert";
+ case 4304 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0";
+ case 4306 : return "+proj=longlat +ellps=bessel";
+ case 4307 : return "+proj=longlat +ellps=clrk80";
+ case 4308 : return "+proj=longlat +ellps=bessel";
+ case 4309 : return "+proj=longlat +ellps=intl +towgs84=-155,171,37,0,0,0,0";
+ case 4310 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4311 : return "+proj=longlat +ellps=intl +towgs84=-265,120,-358,0,0,0,0";
+ case 4312 : return "+proj=longlat +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232";
+ case 4313 : return "+proj=longlat +ellps=intl +towgs84=106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1";
+ case 4314 : return "+proj=longlat +ellps=bessel +datum=potsdam";
+ case 4315 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0";
+ case 4316 : return "+proj=longlat +ellps=intl";
+ case 4317 : return "+proj=longlat +ellps=krass";
+ case 4318 : return "+proj=longlat +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0";
+ case 4319 : return "+proj=longlat +ellps=GRS80";
+ case 4322 : return "+proj=longlat +ellps=WGS72";
+ case 4324 : return "+proj=longlat +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38";
+ case 4326 : return "+proj=longlat +ellps=WGS84 +datum=WGS84";
+ case 4600 : return "+proj=longlat +ellps=clrk80";
+ case 4601 : return "+proj=longlat +ellps=clrk80";
+ case 4602 : return "+proj=longlat +ellps=clrk80 +towgs84=725,685,536,0,0,0,0";
+ case 4603 : return "+proj=longlat +ellps=clrk80 +towgs84=72,213.7,93,0,0,0,0";
+ case 4604 : return "+proj=longlat +ellps=clrk80 +towgs84=174,359,365,0,0,0,0";
+ case 4605 : return "+proj=longlat +ellps=clrk80";
+ case 4606 : return "+proj=longlat +ellps=clrk80 +towgs84=-149,128,296,0,0,0,0";
+ case 4607 : return "+proj=longlat +ellps=clrk80 +towgs84=195.671,332.517,274.607,0,0,0,0";
+ case 4608 : return "+proj=longlat +ellps=clrk66";
+ case 4609 : return "+proj=longlat +ellps=clrk66";
+ case 4610 : return "+proj=longlat +a=6378140 +b=6356755.288157528";
+ case 4611 : return "+proj=longlat +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425";
+ case 4612 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4613 : return "+proj=longlat +ellps=bessel";
+ case 4614 : return "+proj=longlat +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706";
+ case 4615 : return "+proj=longlat +ellps=intl +towgs84=-499,-249,314,0,0,0,0";
+ case 4616 : return "+proj=longlat +ellps=intl";
+ case 4617 : return "+proj=longlat +ellps=GRS80";
+ case 4618 : return "+proj=longlat +ellps=aust_SA";
+ case 4619 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4620 : return "+proj=longlat +ellps=clrk80 +towgs84=-106,-129,165,0,0,0,0";
+ case 4621 : return "+proj=longlat +ellps=intl +towgs84=137,248,-430,0,0,0,0";
+ case 4622 : return "+proj=longlat +ellps=intl";
+ case 4623 : return "+proj=longlat +ellps=intl +towgs84=-186,230,110,0,0,0,0";
+ case 4624 : return "+proj=longlat +ellps=GRS80 +towgs84=2,2,-2,0,0,0,0";
+ case 4625 : return "+proj=longlat +ellps=intl";
+ case 4626 : return "+proj=longlat +ellps=intl";
+ case 4627 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4628 : return "+proj=longlat +ellps=intl +towgs84=162,117,154,0,0,0,0";
+ case 4629 : return "+proj=longlat +ellps=intl";
+ case 4630 : return "+proj=longlat +ellps=intl";
+ case 4631 : return "+proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0";
+ case 4632 : return "+proj=longlat +ellps=intl +towgs84=-382,-59,-262,0,0,0,0";
+ case 4633 : return "+proj=longlat +ellps=intl";
+ case 4634 : return "+proj=longlat +ellps=intl";
+ case 4635 : return "+proj=longlat +ellps=intl +towgs84=-122.383,-188.696,103.344,3.5107,-4.9668,-5.7047,4.4798";
+ case 4636 : return "+proj=longlat +ellps=intl +towgs84=365,194,166,0,0,0,0";
+ case 4637 : return "+proj=longlat +ellps=intl +towgs84=325,154,172,0,0,0,0";
+ case 4638 : return "+proj=longlat +ellps=clrk66 +towgs84=30,430,368,0,0,0,0";
+ case 4639 : return "+proj=longlat +ellps=intl";
+ case 4640 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4641 : return "+proj=longlat +ellps=intl";
+ case 4642 : return "+proj=longlat +ellps=intl";
+ case 4643 : return "+proj=longlat +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7";
+ case 4644 : return "+proj=longlat +ellps=intl";
+ case 4645 : return "+proj=longlat +ellps=intl +towgs84=0,0,0,0,0,0,0";
+ case 4646 : return "+proj=longlat +ellps=intl";
+ case 4657 : return "+proj=longlat +a=6377019.27 +b=6355762.5391 +towgs84=-28,199,5,0,0,0,0";
+ case 4658 : return "+proj=longlat +ellps=intl +towgs84=-73,46,-86,0,0,0,0";
+ case 4659 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4660 : return "+proj=longlat +ellps=intl +towgs84=982.609,552.753,-540.873,32.3934,-153.257,-96.2266,16.805";
+ case 4661 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4662 : return "+proj=longlat +ellps=intl";
+ case 4663 : return "+proj=longlat +ellps=intl";
+ case 4664 : return "+proj=longlat +ellps=intl";
+ case 4665 : return "+proj=longlat +ellps=intl";
+ case 4666 : return "+proj=longlat +ellps=bessel";
+ case 4667 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4668 : return "+proj=longlat +ellps=intl +towgs84=-86,-98,-119,0,0,0,0";
+ case 4669 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4670 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4671 : return "+proj=longlat +a=6378249.2 +b=6356515";
+ case 4672 : return "+proj=longlat +ellps=intl +towgs84=175,-38,113,0,0,0,0";
+ case 4673 : return "+proj=longlat +ellps=intl +towgs84=174.05,-25.49,112.57,-0,-0,0.554,0.2263";
+ case 4674 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4675 : return "+proj=longlat +ellps=clrk66 +towgs84=-100,-248,259,0,0,0,0";
+ case 4676 : return "+proj=longlat +ellps=krass";
+ case 4677 : return "+proj=longlat +ellps=krass";
+ case 4678 : return "+proj=longlat +ellps=krass +towgs84=44.585,-131.212,-39.544,0,0,0,0";
+ case 4679 : return "+proj=longlat +ellps=clrk80 +towgs84=-80.01,253.26,291.19,0,0,0,0";
+ case 4680 : return "+proj=longlat +ellps=clrk80 +towgs84=124.5,-63.5,-281,0,0,0,0";
+ case 4681 : return "+proj=longlat +ellps=clrk80";
+ case 4682 : return "+proj=longlat +a=6377276.345 +b=6356075.41314024";
+ case 4683 : return "+proj=longlat +ellps=clrk66 +towgs84=-127.62,-67.24,-47.04,-3.068,4.903,1.578,-1.06";
+ case 4684 : return "+proj=longlat +ellps=intl +towgs84=-133,-321,50,0,0,0,0";
+ case 4685 : return "+proj=longlat +ellps=intl";
+ case 4686 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4687 : return "+proj=longlat +ellps=GRS80";
+ case 4688 : return "+proj=longlat +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074";
+ case 4689 : return "+proj=longlat +ellps=intl";
+ case 4690 : return "+proj=longlat +ellps=intl";
+ case 4691 : return "+proj=longlat +ellps=intl +towgs84=215.525,149.593,176.229,-3.2624,-1.692,-1.1571,10.4773";
+ case 4692 : return "+proj=longlat +ellps=intl +towgs84=217.037,86.959,23.956,0,0,0,0";
+ case 4693 : return "+proj=longlat +ellps=WGS84 +towgs84=0,-0.15,0.68,0,0,0,0";
+ case 4694 : return "+proj=longlat +ellps=GRS80";
+ case 4695 : return "+proj=longlat +ellps=clrk66";
+ case 4696 : return "+proj=longlat +ellps=clrk80";
+ case 4697 : return "+proj=longlat +ellps=clrk80";
+ case 4698 : return "+proj=longlat +ellps=intl +towgs84=145,-187,103,0,0,0,0";
+ case 4699 : return "+proj=longlat +ellps=clrk80 +towgs84=-770.1,158.4,-498.2,0,0,0,0";
+ case 4700 : return "+proj=longlat +ellps=clrk80";
+ case 4701 : return "+proj=longlat +ellps=clrk80 +towgs84=-79.9,-158,-168.9,0,0,0,0";
+ case 4702 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4703 : return "+proj=longlat +ellps=clrk80";
+ case 4704 : return "+proj=longlat +ellps=intl";
+ case 4705 : return "+proj=longlat +ellps=intl";
+ case 4706 : return "+proj=longlat +ellps=helmert +towgs84=-146.21,112.63,4.05,0,0,0,0";
+ case 4707 : return "+proj=longlat +ellps=intl +towgs84=114,-116,-333,0,0,0,0";
+ case 4708 : return "+proj=longlat +ellps=aust_SA +towgs84=-491,-22,435,0,0,0,0";
+ case 4709 : return "+proj=longlat +ellps=intl +towgs84=145,75,-272,0,0,0,0";
+ case 4710 : return "+proj=longlat +ellps=intl +towgs84=-320,550,-494,0,0,0,0";
+ case 4711 : return "+proj=longlat +ellps=intl +towgs84=124,-234,-25,0,0,0,0";
+ case 4712 : return "+proj=longlat +ellps=intl +towgs84=-205,107,53,0,0,0,0";
+ case 4713 : return "+proj=longlat +ellps=clrk80 +towgs84=-79,-129,145,0,0,0,0";
+ case 4714 : return "+proj=longlat +ellps=intl +towgs84=-127,-769,472,0,0,0,0";
+ case 4715 : return "+proj=longlat +ellps=intl +towgs84=-104,-129,239,0,0,0,0";
+ case 4716 : return "+proj=longlat +ellps=intl +towgs84=298,-304,-375,0,0,0,0";
+ case 4717 : return "+proj=longlat +ellps=clrk66 +towgs84=-2,151,181,0,0,0,0";
+ case 4718 : return "+proj=longlat +ellps=intl";
+ case 4719 : return "+proj=longlat +ellps=intl +towgs84=211,147,111,0,0,0,0";
+ case 4720 : return "+proj=longlat +ellps=WGS72";
+ case 4721 : return "+proj=longlat +ellps=intl +towgs84=265.025,384.929,-194.046,0,0,0,0";
+ case 4722 : return "+proj=longlat +ellps=intl +towgs84=-794,119,-298,0,0,0,0";
+ case 4723 : return "+proj=longlat +ellps=clrk66 +towgs84=67.8,106.1,138.8,0,0,0,0";
+ case 4724 : return "+proj=longlat +ellps=intl +towgs84=208,-435,-229,0,0,0,0";
+ case 4725 : return "+proj=longlat +ellps=intl +towgs84=189,-79,-202,0,0,0,0";
+ case 4726 : return "+proj=longlat +ellps=clrk66";
+ case 4727 : return "+proj=longlat +ellps=intl";
+ case 4728 : return "+proj=longlat +ellps=intl +towgs84=-307,-92,127,0,0,0,0";
+ case 4729 : return "+proj=longlat +ellps=intl +towgs84=185,165,42,0,0,0,0";
+ case 4730 : return "+proj=longlat +ellps=intl +towgs84=170,42,84,0,0,0,0";
+ case 4731 : return "+proj=longlat +ellps=clrk80 +towgs84=51,391,-36,0,0,0,0";
+ case 4732 : return "+proj=longlat +a=6378270 +b=6356794.343434343 +towgs84=102,52,-38,0,0,0,0";
+ case 4733 : return "+proj=longlat +ellps=intl +towgs84=276,-57,149,0,0,0,0";
+ case 4734 : return "+proj=longlat +ellps=intl +towgs84=-632,438,-609,0,0,0,0";
+ case 4735 : return "+proj=longlat +ellps=intl +towgs84=647,1777,-1124,0,0,0,0";
+ case 4736 : return "+proj=longlat +ellps=clrk80 +towgs84=260,12,-147,0,0,0,0";
+ case 4737 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4738 : return "+proj=longlat +a=6378293.645208759 +b=6356617.987679838";
+ case 4739 : return "+proj=longlat +ellps=intl +towgs84=-156,-271,-189,0,0,0,0";
+ case 4740 : return "+proj=longlat +a=6378136 +b=6356751.361745712 +towgs84=0,0,1.5,-0,-0,0.076,0";
+ case 4741 : return "+proj=longlat +ellps=intl";
+ case 4742 : return "+proj=longlat +ellps=GRS80";
+ case 4743 : return "+proj=longlat +ellps=clrk80 +towgs84=84.1,-320.1,218.7,0,0,0,0";
+ case 4744 : return "+proj=longlat +ellps=clrk80";
+ case 4745 : return "+proj=longlat +ellps=bessel";
+ case 4746 : return "+proj=longlat +ellps=bessel";
+ case 4747 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4748 : return "+proj=longlat +a=6378306.3696 +b=6356571.996 +towgs84=51,391,-36,0,0,0,0";
+ case 4749 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4750 : return "+proj=longlat +ellps=WGS84 +towgs84=-56.263,16.136,-22.856,0,0,0,0";
+ case 4751 : return "+proj=longlat +a=6377295.664 +b=6356094.667915204";
+ case 4752 : return "+proj=longlat +a=6378306.3696 +b=6356571.996 +towgs84=51,391,-36,0,0,0,0";
+ case 4753 : return "+proj=longlat +ellps=intl";
+ case 4754 : return "+proj=longlat +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0";
+ case 4755 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4756 : return "+proj=longlat +ellps=WGS84";
+ case 4757 : return "+proj=longlat +ellps=WGS84";
+ case 4758 : return "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0";
+ case 4759 : return "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0";
+ case 4760 : return "+proj=longlat +ellps=WGS66";
+ case 4801 : return "+proj=longlat +ellps=bessel +pm=bern";
+ case 4802 : return "+proj=longlat +ellps=intl +pm=bogota";
+ case 4803 : return "+proj=longlat +ellps=intl +pm=lisbon";
+ case 4804 : return "+proj=longlat +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta";
+ case 4805 : return "+proj=longlat +ellps=bessel +pm=ferro";
+ case 4806 : return "+proj=longlat +ellps=intl +pm=rome";
+ case 4807 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris";
+ case 4808 : return "+proj=longlat +ellps=bessel +pm=jakarta";
+ case 4809 : return "+proj=longlat +ellps=intl +pm=brussels";
+ case 4810 : return "+proj=longlat +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris";
+ case 4811 : return "+proj=longlat +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +pm=paris";
+ case 4813 : return "+proj=longlat +ellps=bessel +pm=jakarta";
+ case 4814 : return "+proj=longlat +ellps=bessel +pm=stockholm";
+ case 4815 : return "+proj=longlat +ellps=bessel +pm=athens";
+ case 4816 : return "+proj=longlat +a=6378249.2 +b=6356515 +pm=paris";
+ case 4817 : return "+proj=longlat +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo";
+ case 4818 : return "+proj=longlat +ellps=bessel +pm=ferro";
+ case 4819 : return "+proj=longlat +ellps=clrk80 +pm=paris";
+ case 4820 : return "+proj=longlat +ellps=bessel +pm=jakarta";
+ case 4821 : return "+proj=longlat +a=6378249.2 +b=6356515 +pm=paris";
+ case 4901 : return "+proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris";
+ case 4902 : return "+proj=longlat +a=6376523 +b=6355862.933255573 +pm=paris";
+ case 4903 : return "+proj=longlat +a=6378298.3 +b=6356657.142669561 +pm=madrid";
+ case 4904 : return "+proj=longlat +ellps=bessel +pm=lisbon";
+ case 20004 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m";
+ case 20005 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +units=m";
+ case 20006 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m";
+ case 20007 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +units=m";
+ case 20008 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m";
+ case 20009 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +units=m";
+ case 20010 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +units=m";
+ case 20011 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +units=m";
+ case 20012 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +units=m";
+ case 20013 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m";
+ case 20014 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m";
+ case 20015 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m";
+ case 20016 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m";
+ case 20017 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m";
+ case 20018 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m";
+ case 20019 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m";
+ case 20020 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m";
+ case 20021 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m";
+ case 20022 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m";
+ case 20023 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m";
+ case 20024 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +units=m";
+ case 20025 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m";
+ case 20026 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m";
+ case 20027 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m";
+ case 20028 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m";
+ case 20029 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m";
+ case 20030 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m";
+ case 20031 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m";
+ case 20032 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m";
+ case 20064 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20065 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20066 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20067 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20068 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20069 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20070 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20071 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20072 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20073 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20074 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20075 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20076 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20077 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20078 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20079 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20080 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20081 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20082 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20083 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20084 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20085 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20086 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20087 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20088 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20089 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20090 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20091 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20092 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 20135 : return "+proj=utm +zone=35 +ellps=clrk80 +units=m";
+ case 20136 : return "+proj=utm +zone=36 +ellps=clrk80 +units=m";
+ case 20137 : return "+proj=utm +zone=37 +ellps=clrk80 +units=m";
+ case 20138 : return "+proj=utm +zone=38 +ellps=clrk80 +units=m";
+ case 20248 : return "+proj=utm +zone=48 +south +ellps=aust_SA +units=m";
+ case 20249 : return "+proj=utm +zone=49 +south +ellps=aust_SA +units=m";
+ case 20250 : return "+proj=utm +zone=50 +south +ellps=aust_SA +units=m";
+ case 20251 : return "+proj=utm +zone=51 +south +ellps=aust_SA +units=m";
+ case 20252 : return "+proj=utm +zone=52 +south +ellps=aust_SA +units=m";
+ case 20253 : return "+proj=utm +zone=53 +south +ellps=aust_SA +units=m";
+ case 20254 : return "+proj=utm +zone=54 +south +ellps=aust_SA +units=m";
+ case 20255 : return "+proj=utm +zone=55 +south +ellps=aust_SA +units=m";
+ case 20256 : return "+proj=utm +zone=56 +south +ellps=aust_SA +units=m";
+ case 20257 : return "+proj=utm +zone=57 +south +ellps=aust_SA +units=m";
+ case 20258 : return "+proj=utm +zone=58 +south +ellps=aust_SA +units=m";
+ case 20348 : return "+proj=utm +zone=48 +south +ellps=aust_SA +units=m";
+ case 20349 : return "+proj=utm +zone=49 +south +ellps=aust_SA +units=m";
+ case 20350 : return "+proj=utm +zone=50 +south +ellps=aust_SA +units=m";
+ case 20351 : return "+proj=utm +zone=51 +south +ellps=aust_SA +units=m";
+ case 20352 : return "+proj=utm +zone=52 +south +ellps=aust_SA +units=m";
+ case 20353 : return "+proj=utm +zone=53 +south +ellps=aust_SA +units=m";
+ case 20354 : return "+proj=utm +zone=54 +south +ellps=aust_SA +units=m";
+ case 20355 : return "+proj=utm +zone=55 +south +ellps=aust_SA +units=m";
+ case 20356 : return "+proj=utm +zone=56 +south +ellps=aust_SA +units=m";
+ case 20357 : return "+proj=utm +zone=57 +south +ellps=aust_SA +units=m";
+ case 20358 : return "+proj=utm +zone=58 +south +ellps=aust_SA +units=m";
+ case 20436 : return "+proj=utm +zone=36 +ellps=intl +units=m";
+ case 20437 : return "+proj=utm +zone=37 +ellps=intl +units=m";
+ case 20438 : return "+proj=utm +zone=38 +ellps=intl +units=m";
+ case 20439 : return "+proj=utm +zone=39 +ellps=intl +units=m";
+ case 20440 : return "+proj=utm +zone=40 +ellps=intl +units=m";
+ case 20499 : return "+proj=utm +zone=39 +ellps=intl +units=m";
+ case 20538 : return "+proj=utm +zone=38 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m";
+ case 20539 : return "+proj=utm +zone=39 +ellps=krass +towgs84=-43,-163,45,0,0,0,0 +units=m";
+ case 20790 : return "+proj=tmerc +lat_0=39.66666666666666 +lon_0=1 +k=1 +x_0=200000 +y_0=300000 +ellps=intl +pm=lisbon +units=m";
+ case 20791 : return "+proj=tmerc +lat_0=39.66666666666666 +lon_0=1 +k=1 +x_0=0 +y_0=0 +ellps=intl +pm=lisbon +units=m";
+ case 20822 : return "+proj=utm +zone=22 +south +ellps=intl +units=m";
+ case 20823 : return "+proj=utm +zone=23 +south +ellps=intl +units=m";
+ case 20824 : return "+proj=utm +zone=24 +south +ellps=intl +units=m";
+ case 20934 : return "+proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m";
+ case 20935 : return "+proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m";
+ case 20936 : return "+proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m";
+ case 21035 : return "+proj=utm +zone=35 +south +ellps=clrk80 +units=m";
+ case 21036 : return "+proj=utm +zone=36 +south +ellps=clrk80 +units=m";
+ case 21037 : return "+proj=utm +zone=37 +south +ellps=clrk80 +units=m";
+ case 21095 : return "+proj=utm +zone=35 +ellps=clrk80 +units=m";
+ case 21096 : return "+proj=utm +zone=36 +ellps=clrk80 +units=m";
+ case 21097 : return "+proj=utm +zone=37 +ellps=clrk80 +units=m";
+ case 21100 : return "+proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +pm=jakarta +units=m";
+ case 21148 : return "+proj=utm +zone=48 +south +ellps=bessel +units=m";
+ case 21149 : return "+proj=utm +zone=49 +south +ellps=bessel +units=m";
+ case 21150 : return "+proj=utm +zone=50 +south +ellps=bessel +units=m";
+ case 21291 : return "+proj=tmerc +lat_0=0 +lon_0=-62 +k=0.9995000000000001 +x_0=400000 +y_0=0 +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +units=m";
+ case 21292 : return "+proj=tmerc +lat_0=13.17638888888889 +lon_0=-59.55972222222222 +k=0.9999986 +x_0=30000 +y_0=75000 +ellps=clrk80 +towgs84=31.95,300.99,419.19,0,0,0,0 +units=m";
+ case 21413 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m";
+ case 21414 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m";
+ case 21415 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m";
+ case 21416 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m";
+ case 21417 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m";
+ case 21418 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m";
+ case 21419 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m";
+ case 21420 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m";
+ case 21421 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m";
+ case 21422 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m";
+ case 21423 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m";
+ case 21453 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21454 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21455 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21456 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21457 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21458 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21459 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21460 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21461 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21462 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21463 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21473 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21474 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21475 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21476 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21477 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21478 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21479 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21480 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21481 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21482 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21483 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 21500 : return "+proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=0 +x_0=150000 +y_0=5400000 +ellps=intl +pm=brussels +units=m";
+ case 21780 : return "+proj=somerc +lat_0=46.95240555555556 +lon_0=0 +x_0=0 +y_0=0 +ellps=bessel +pm=bern +units=m";
+ case 21781 : return "+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m";
+ case 21817 : return "+proj=utm +zone=17 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21818 : return "+proj=utm +zone=18 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21891 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21892 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21893 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21894 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21896 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-77.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21897 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-74.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21898 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-71.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 21899 : return "+proj=tmerc +lat_0=4.599047222222222 +lon_0=-68.08091666666667 +k=1 +x_0=1000000 +y_0=1000000 +ellps=intl +towgs84=307,304,-318,0,0,0,0 +units=m";
+ case 22032 : return "+proj=utm +zone=32 +south +ellps=clrk80 +units=m";
+ case 22033 : return "+proj=utm +zone=33 +south +ellps=clrk80 +units=m";
+ case 22091 : return "+proj=tmerc +lat_0=0 +lon_0=11.5 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 22092 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=clrk80 +units=m";
+ case 22171 : return "+proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22172 : return "+proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22173 : return "+proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22174 : return "+proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22175 : return "+proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22176 : return "+proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22177 : return "+proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22181 : return "+proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22182 : return "+proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22183 : return "+proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22184 : return "+proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22185 : return "+proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22186 : return "+proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22187 : return "+proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 22191 : return "+proj=tmerc +lat_0=-90 +lon_0=-72 +k=1 +x_0=1500000 +y_0=0 +ellps=intl +units=m";
+ case 22192 : return "+proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m";
+ case 22193 : return "+proj=tmerc +lat_0=-90 +lon_0=-66 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +units=m";
+ case 22194 : return "+proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +ellps=intl +units=m";
+ case 22195 : return "+proj=tmerc +lat_0=-90 +lon_0=-60 +k=1 +x_0=5500000 +y_0=0 +ellps=intl +units=m";
+ case 22196 : return "+proj=tmerc +lat_0=-90 +lon_0=-57 +k=1 +x_0=6500000 +y_0=0 +ellps=intl +units=m";
+ case 22197 : return "+proj=tmerc +lat_0=-90 +lon_0=-54 +k=1 +x_0=7500000 +y_0=0 +ellps=intl +units=m";
+ case 22234 : return "+proj=utm +zone=34 +south +a=6378249.145 +b=6356514.966398753 +units=m";
+ case 22235 : return "+proj=utm +zone=35 +south +a=6378249.145 +b=6356514.966398753 +units=m";
+ case 22236 : return "+proj=utm +zone=36 +south +a=6378249.145 +b=6356514.966398753 +units=m";
+ case 22332 : return "+proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m";
+ case 22391 : return "+proj=lcc +lat_1=36 +lat_0=36 +lon_0=9.9 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m";
+ case 22392 : return "+proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=9.9 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m";
+ case 22521 : return "+proj=utm +zone=21 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m";
+ case 22522 : return "+proj=utm +zone=22 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m";
+ case 22523 : return "+proj=utm +zone=23 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m";
+ case 22524 : return "+proj=utm +zone=24 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m";
+ case 22525 : return "+proj=utm +zone=25 +south +ellps=intl +towgs84=-206,172,-6,0,0,0,0 +units=m";
+ case 22700 : return "+proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m";
+ case 22770 : return "+proj=lcc +lat_1=34.65 +lat_0=34.65 +lon_0=37.35 +k_0=0.9996256 +x_0=300000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m";
+ case 22780 : return "+proj=sterea +lat_0=34.2 +lon_0=39.15 +k=0.9995341 +x_0=0 +y_0=0 +a=6378249.2 +b=6356515 +units=m";
+ case 22832 : return "+proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m";
+ case 22991 : return "+proj=tmerc +lat_0=30 +lon_0=35 +k=1 +x_0=300000 +y_0=1100000 +ellps=helmert +units=m";
+ case 22992 : return "+proj=tmerc +lat_0=30 +lon_0=31 +k=1 +x_0=615000 +y_0=810000 +ellps=helmert +units=m";
+ case 22993 : return "+proj=tmerc +lat_0=30 +lon_0=27 +k=1 +x_0=700000 +y_0=200000 +ellps=helmert +units=m";
+ case 22994 : return "+proj=tmerc +lat_0=30 +lon_0=27 +k=1 +x_0=700000 +y_0=1200000 +ellps=helmert +units=m";
+ case 23028 : return "+proj=utm +zone=28 +ellps=intl +units=m";
+ case 23029 : return "+proj=utm +zone=29 +ellps=intl +units=m";
+ case 23030 : return "+proj=utm +zone=30 +ellps=intl +units=m";
+ case 23031 : return "+proj=utm +zone=31 +ellps=intl +units=m";
+ case 23032 : return "+proj=utm +zone=32 +ellps=intl +units=m";
+ case 23033 : return "+proj=utm +zone=33 +ellps=intl +units=m";
+ case 23034 : return "+proj=utm +zone=34 +ellps=intl +units=m";
+ case 23035 : return "+proj=utm +zone=35 +ellps=intl +units=m";
+ case 23036 : return "+proj=utm +zone=36 +ellps=intl +units=m";
+ case 23037 : return "+proj=utm +zone=37 +ellps=intl +units=m";
+ case 23038 : return "+proj=utm +zone=38 +ellps=intl +units=m";
+ case 23090 : return "+proj=tmerc +lat_0=0 +lon_0=0 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 23095 : return "+proj=tmerc +lat_0=0 +lon_0=5 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +units=m";
+ case 23239 : return "+proj=utm +zone=39 +ellps=clrk80 +units=m";
+ case 23240 : return "+proj=utm +zone=40 +ellps=clrk80 +units=m";
+ case 23433 : return "+proj=utm +zone=33 +a=6378249.2 +b=6356515 +units=m";
+ case 23700 : return "+proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +x_0=650000 +y_0=200000 +ellps=GRS67 +units=m";
+ case 23830 : return "+proj=tmerc +lat_0=0 +lon_0=94.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23831 : return "+proj=tmerc +lat_0=0 +lon_0=97.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23832 : return "+proj=tmerc +lat_0=0 +lon_0=100.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23833 : return "+proj=tmerc +lat_0=0 +lon_0=103.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23834 : return "+proj=tmerc +lat_0=0 +lon_0=106.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23835 : return "+proj=tmerc +lat_0=0 +lon_0=109.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23836 : return "+proj=tmerc +lat_0=0 +lon_0=112.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23837 : return "+proj=tmerc +lat_0=0 +lon_0=115.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23838 : return "+proj=tmerc +lat_0=0 +lon_0=118.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23839 : return "+proj=tmerc +lat_0=0 +lon_0=121.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23840 : return "+proj=tmerc +lat_0=0 +lon_0=124.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23841 : return "+proj=tmerc +lat_0=0 +lon_0=127.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23842 : return "+proj=tmerc +lat_0=0 +lon_0=130.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23843 : return "+proj=tmerc +lat_0=0 +lon_0=133.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23844 : return "+proj=tmerc +lat_0=0 +lon_0=136.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23845 : return "+proj=tmerc +lat_0=0 +lon_0=139.5 +k=0.9999 +x_0=200000 +y_0=1500000 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23846 : return "+proj=utm +zone=46 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23847 : return "+proj=utm +zone=47 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23848 : return "+proj=utm +zone=48 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23849 : return "+proj=utm +zone=49 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23850 : return "+proj=utm +zone=50 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23851 : return "+proj=utm +zone=51 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23852 : return "+proj=utm +zone=52 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23853 : return "+proj=utm +zone=53 +a=6378160 +b=6356774.50408554 +units=m";
+ case 23866 : return "+proj=utm +zone=46 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23867 : return "+proj=utm +zone=47 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23868 : return "+proj=utm +zone=48 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23869 : return "+proj=utm +zone=49 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23870 : return "+proj=utm +zone=50 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23871 : return "+proj=utm +zone=51 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23872 : return "+proj=utm +zone=52 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23877 : return "+proj=utm +zone=47 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23878 : return "+proj=utm +zone=48 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23879 : return "+proj=utm +zone=49 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23880 : return "+proj=utm +zone=50 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23881 : return "+proj=utm +zone=51 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23882 : return "+proj=utm +zone=52 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23883 : return "+proj=utm +zone=53 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23884 : return "+proj=utm +zone=54 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 23886 : return "+proj=utm +zone=46 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23887 : return "+proj=utm +zone=47 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23888 : return "+proj=utm +zone=48 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23889 : return "+proj=utm +zone=49 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23890 : return "+proj=utm +zone=50 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23891 : return "+proj=utm +zone=51 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23892 : return "+proj=utm +zone=52 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23893 : return "+proj=utm +zone=53 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23894 : return "+proj=utm +zone=54 +south +a=6378160 +b=6356774.50408554 +units=m";
+ case 23946 : return "+proj=utm +zone=46 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m";
+ case 23947 : return "+proj=utm +zone=47 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m";
+ case 23948 : return "+proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +towgs84=217,823,299,0,0,0,0 +units=m";
+ case 24047 : return "+proj=utm +zone=47 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 24048 : return "+proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 24100 : return "+proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=167638.49597 +y_0=121918.90616 +ellps=clrk80 +to_meter=0.3047972654";
+ case 24200 : return "+proj=lcc +lat_1=18 +lat_0=18 +lon_0=-77 +k_0=1 +x_0=250000 +y_0=150000 +ellps=clrk66 +units=m";
+ case 24305 : return "+proj=utm +zone=45 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 24306 : return "+proj=utm +zone=46 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 24311 : return "+proj=utm +zone=41 +a=6377301.243 +b=6356100.230165384 +units=m";
+ case 24312 : return "+proj=utm +zone=42 +a=6377301.243 +b=6356100.230165384 +units=m";
+ case 24313 : return "+proj=utm +zone=43 +a=6377301.243 +b=6356100.230165384 +units=m";
+ case 24342 : return "+proj=utm +zone=42 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24343 : return "+proj=utm +zone=43 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24344 : return "+proj=utm +zone=44 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24345 : return "+proj=utm +zone=45 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24346 : return "+proj=utm +zone=46 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24347 : return "+proj=utm +zone=47 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24370 : return "+proj=lcc +lat_1=39.5 +lat_0=39.5 +lon_0=68 +k_0=0.99846154 +x_0=2153865.73916853 +y_0=2368292.194628102 +a=6377299.36559538 +b=6356098.357204818 +to_meter=0.9143985307444408";
+ case 24371 : return "+proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204818 +to_meter=0.9143985307444408";
+ case 24372 : return "+proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204818 +to_meter=0.9143985307444408";
+ case 24373 : return "+proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204818 +to_meter=0.9143985307444408";
+ case 24374 : return "+proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204818 +to_meter=0.9143985307444408";
+ case 24375 : return "+proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743185.69 +y_0=914395.23 +a=6377276.345 +b=6356075.41314024 +units=m";
+ case 24376 : return "+proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165384 +units=m";
+ case 24377 : return "+proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743196.4 +y_0=914398.8 +a=6377301.243 +b=6356100.230165384 +units=m";
+ case 24378 : return "+proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=68 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24379 : return "+proj=lcc +lat_1=26 +lat_0=26 +lon_0=74 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24380 : return "+proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24381 : return "+proj=lcc +lat_1=19 +lat_0=19 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24382 : return "+proj=lcc +lat_1=26 +lat_0=26 +lon_0=90 +k_0=0.99878641 +x_0=2743195.592233322 +y_0=914398.5307444407 +a=6377299.36559538 +b=6356098.357204818 +to_meter=0.9143985307444408";
+ case 24383 : return "+proj=lcc +lat_1=12 +lat_0=12 +lon_0=80 +k_0=0.99878641 +x_0=2743195.5 +y_0=914398.5 +a=6377299.151 +b=6356098.145120132 +towgs84=295,736,257,0,0,0,0 +units=m";
+ case 24500 : return "+proj=cass +lat_0=1.287646666666667 +lon_0=103.8530022222222 +x_0=30000 +y_0=30000 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m";
+ case 24547 : return "+proj=utm +zone=47 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m";
+ case 24548 : return "+proj=utm +zone=48 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +units=m";
+ case 24571 : return "+proj=omerc +lat_0=4 +lonc=102.25 +alpha=323.0257905 +k=0.99984 +x_0=804671.2997750348 +y_0=0 +a=6377304.063 +b=6356103.038993155 +towgs84=-11,851,5,0,0,0,0 +to_meter=20.11678249437587";
+ case 24600 : return "+proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +towgs84=-294.7,-200.1,525.5,0,0,0,0 +units=m";
+ case 24718 : return "+proj=utm +zone=18 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m";
+ case 24719 : return "+proj=utm +zone=19 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m";
+ case 24720 : return "+proj=utm +zone=20 +ellps=intl +towgs84=-273.5,110.6,-357.9,0,0,0,0 +units=m";
+ case 24817 : return "+proj=utm +zone=17 +ellps=intl +units=m";
+ case 24818 : return "+proj=utm +zone=18 +ellps=intl +units=m";
+ case 24819 : return "+proj=utm +zone=19 +ellps=intl +units=m";
+ case 24820 : return "+proj=utm +zone=20 +ellps=intl +units=m";
+ case 24821 : return "+proj=utm +zone=21 +ellps=intl +units=m";
+ case 24877 : return "+proj=utm +zone=17 +south +ellps=intl +units=m";
+ case 24878 : return "+proj=utm +zone=18 +south +ellps=intl +units=m";
+ case 24879 : return "+proj=utm +zone=19 +south +ellps=intl +units=m";
+ case 24880 : return "+proj=utm +zone=20 +south +ellps=intl +units=m";
+ case 24881 : return "+proj=utm +zone=21 +south +ellps=intl +units=m";
+ case 24882 : return "+proj=utm +zone=22 +south +ellps=intl +units=m";
+ case 24891 : return "+proj=tmerc +lat_0=-6 +lon_0=-80.5 +k=0.99983008 +x_0=222000 +y_0=1426834.743 +ellps=intl +units=m";
+ case 24892 : return "+proj=tmerc +lat_0=-9.5 +lon_0=-76 +k=0.99932994 +x_0=720000 +y_0=1039979.159 +ellps=intl +units=m";
+ case 24893 : return "+proj=tmerc +lat_0=-9.5 +lon_0=-70.5 +k=0.99952992 +x_0=1324000 +y_0=1040084.558 +ellps=intl +units=m";
+ case 25000 : return "+proj=tmerc +lat_0=4.666666666666667 +lon_0=-1 +k=0.99975 +x_0=274319.51 +y_0=0 +ellps=clrk80 +towgs84=-130,29,364,0,0,0,0 +units=m";
+ case 25231 : return "+proj=utm +zone=31 +a=6378249.2 +b=6356515 +units=m";
+ case 25391 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m";
+ case 25392 : return "+proj=tmerc +lat_0=0 +lon_0=119 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m";
+ case 25393 : return "+proj=tmerc +lat_0=0 +lon_0=121 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m";
+ case 25394 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m";
+ case 25395 : return "+proj=tmerc +lat_0=0 +lon_0=125 +k=0.99995 +x_0=500000 +y_0=0 +ellps=clrk66 +units=m";
+ case 25700 : return "+proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-587.8,519.75,145.76,0,0,0,0 +pm=jakarta +units=m";
+ case 25828 : return "+proj=utm +zone=28 +ellps=GRS80 +units=m";
+ case 25829 : return "+proj=utm +zone=29 +ellps=GRS80 +units=m";
+ case 25830 : return "+proj=utm +zone=30 +ellps=GRS80 +units=m";
+ case 25831 : return "+proj=utm +zone=31 +ellps=GRS80 +units=m";
+ case 25832 : return "+proj=utm +zone=32 +ellps=GRS80 +units=m";
+ case 25833 : return "+proj=utm +zone=33 +ellps=GRS80 +units=m";
+ case 25834 : return "+proj=utm +zone=34 +ellps=GRS80 +units=m";
+ case 25835 : return "+proj=utm +zone=35 +ellps=GRS80 +units=m";
+ case 25836 : return "+proj=utm +zone=36 +ellps=GRS80 +units=m";
+ case 25837 : return "+proj=utm +zone=37 +ellps=GRS80 +units=m";
+ case 25838 : return "+proj=utm +zone=38 +ellps=GRS80 +units=m";
+ case 25884 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 25932 : return "+proj=utm +zone=32 +south +ellps=intl +units=m";
+ case 26191 : return "+proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=-5.4 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m";
+ case 26192 : return "+proj=lcc +lat_1=29.7 +lat_0=29.7 +lon_0=-5.4 +k_0=0.9996155960000001 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m";
+ case 26193 : return "+proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.9996 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m";
+ case 26194 : return "+proj=lcc +lat_1=26.1 +lat_0=26.1 +lon_0=-5.4 +k_0=0.999616304 +x_0=1200000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m";
+ case 26195 : return "+proj=lcc +lat_1=22.5 +lat_0=22.5 +lon_0=-5.4 +k_0=0.999616437 +x_0=1500000 +y_0=400000 +a=6378249.2 +b=6356515 +towgs84=31,146,47,0,0,0,0 +units=m";
+ case 26237 : return "+proj=utm +zone=37 +ellps=bessel +towgs84=639,405,60,0,0,0,0 +units=m";
+ case 26331 : return "+proj=utm +zone=31 +ellps=clrk80 +units=m";
+ case 26332 : return "+proj=utm +zone=32 +ellps=clrk80 +units=m";
+ case 26391 : return "+proj=tmerc +lat_0=4 +lon_0=4.5 +k=0.99975 +x_0=230738.26 +y_0=0 +ellps=clrk80 +units=m";
+ case 26392 : return "+proj=tmerc +lat_0=4 +lon_0=8.5 +k=0.99975 +x_0=670553.98 +y_0=0 +ellps=clrk80 +units=m";
+ case 26393 : return "+proj=tmerc +lat_0=4 +lon_0=12.5 +k=0.99975 +x_0=1110369.7 +y_0=0 +ellps=clrk80 +units=m";
+ case 26432 : return "+proj=utm +zone=32 +south +ellps=intl +towgs84=-252.95,-4.11,-96.38,0,0,0,0 +units=m";
+ case 26591 : return "+proj=tmerc +lat_0=0 +lon_0=-3.45233333333333 +k=0.9996 +x_0=1500000 +y_0=0 +ellps=intl +pm=rome +units=m";
+ case 26592 : return "+proj=tmerc +lat_0=0 +lon_0=2.54766666666666 +k=0.9996 +x_0=2520000 +y_0=0 +ellps=intl +pm=rome +units=m";
+ case 26632 : return "+proj=utm +zone=32 +a=6378249.2 +b=6356515 +units=m";
+ case 26692 : return "+proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m";
+ case 26701 : return "+proj=utm +zone=1 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26702 : return "+proj=utm +zone=2 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26703 : return "+proj=utm +zone=3 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26704 : return "+proj=utm +zone=4 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26705 : return "+proj=utm +zone=5 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26706 : return "+proj=utm +zone=6 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26707 : return "+proj=utm +zone=7 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26708 : return "+proj=utm +zone=8 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26709 : return "+proj=utm +zone=9 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26710 : return "+proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26711 : return "+proj=utm +zone=11 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26712 : return "+proj=utm +zone=12 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26713 : return "+proj=utm +zone=13 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26714 : return "+proj=utm +zone=14 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26715 : return "+proj=utm +zone=15 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26716 : return "+proj=utm +zone=16 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26717 : return "+proj=utm +zone=17 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26718 : return "+proj=utm +zone=18 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26719 : return "+proj=utm +zone=19 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26720 : return "+proj=utm +zone=20 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26721 : return "+proj=utm +zone=21 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26722 : return "+proj=utm +zone=22 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 26729 : return "+proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26730 : return "+proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26731 : return "+proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000.001016002 +y_0=-5000000.001016002 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26732 : return "+proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26733 : return "+proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26734 : return "+proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26735 : return "+proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26736 : return "+proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26737 : return "+proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=213360.4267208534 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26738 : return "+proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26739 : return "+proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26740 : return "+proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=914401.8288036576 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26741 : return "+proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26742 : return "+proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26743 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26744 : return "+proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26745 : return "+proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26746 : return "+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26747 : return "+proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=127079.524511049 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26748 : return "+proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26749 : return "+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26750 : return "+proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26751 : return "+proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26752 : return "+proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26753 : return "+proj=lcc +lat_1=39.71666666666667 +lat_2=40.78333333333333 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26754 : return "+proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26755 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26756 : return "+proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26757 : return "+proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26758 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26759 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26760 : return "+proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26766 : return "+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26767 : return "+proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26768 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26769 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26770 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26771 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26772 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26773 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26774 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26775 : return "+proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26776 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26777 : return "+proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26778 : return "+proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26779 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=38.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26780 : return "+proj=lcc +lat_1=36.73333333333333 +lat_2=37.93333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26781 : return "+proj=lcc +lat_1=31.16666666666667 +lat_2=32.66666666666666 +lat_0=30.66666666666667 +lon_0=-92.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26782 : return "+proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26783 : return "+proj=tmerc +lat_0=43.83333333333334 +lon_0=-68.5 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26784 : return "+proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26785 : return "+proj=lcc +lat_1=38.3 +lat_2=39.45 +lat_0=37.83333333333334 +lon_0=-77 +x_0=243840.4876809754 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26786 : return "+proj=lcc +lat_1=41.71666666666667 +lat_2=42.68333333333333 +lat_0=41 +lon_0=-71.5 +x_0=182880.3657607315 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26787 : return "+proj=lcc +lat_1=41.28333333333333 +lat_2=41.48333333333333 +lat_0=41 +lon_0=-70.5 +x_0=60960.12192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26791 : return "+proj=lcc +lat_1=47.03333333333333 +lat_2=48.63333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26792 : return "+proj=lcc +lat_1=45.61666666666667 +lat_2=47.05 +lat_0=45 +lon_0=-94.25 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26793 : return "+proj=lcc +lat_1=43.78333333333333 +lat_2=45.21666666666667 +lat_0=43 +lon_0=-94 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26794 : return "+proj=tmerc +lat_0=29.66666666666667 +lon_0=-88.83333333333333 +k=0.99996 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26795 : return "+proj=tmerc +lat_0=30.5 +lon_0=-90.33333333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26796 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26797 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26798 : return "+proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26799 : return "+proj=lcc +lat_1=34.41666666666666 +lat_2=33.86666666666667 +lat_0=34.13333333333333 +lon_0=-118.3333333333333 +x_0=1276106.450596901 +y_0=1268253.006858014 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 26801 : return "+proj=tmerc +lat_0=41.5 +lon_0=-83.66666666666667 +k=0.999942857 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192";
+ case 26802 : return "+proj=tmerc +lat_0=41.5 +lon_0=-85.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192";
+ case 26803 : return "+proj=tmerc +lat_0=41.5 +lon_0=-88.75 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192";
+ case 26811 : return "+proj=lcc +lat_1=45.48333333333333 +lat_2=47.08333333333334 +lat_0=44.78333333333333 +lon_0=-87 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192";
+ case 26812 : return "+proj=lcc +lat_1=44.18333333333333 +lat_2=45.7 +lat_0=43.31666666666667 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192";
+ case 26813 : return "+proj=lcc +lat_1=42.1 +lat_2=43.66666666666666 +lat_0=41.5 +lon_0=-84.33333333333333 +x_0=609601.2192024384 +y_0=0 +a=6378450.047548896 +b=6356826.621488444 +to_meter=0.3048006096012192";
+ case 26901 : return "+proj=utm +zone=1 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26902 : return "+proj=utm +zone=2 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26903 : return "+proj=utm +zone=3 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26904 : return "+proj=utm +zone=4 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26905 : return "+proj=utm +zone=5 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26906 : return "+proj=utm +zone=6 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26907 : return "+proj=utm +zone=7 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26908 : return "+proj=utm +zone=8 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26909 : return "+proj=utm +zone=9 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26910 : return "+proj=utm +zone=10 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26911 : return "+proj=utm +zone=11 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26912 : return "+proj=utm +zone=12 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26913 : return "+proj=utm +zone=13 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26914 : return "+proj=utm +zone=14 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26915 : return "+proj=utm +zone=15 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26916 : return "+proj=utm +zone=16 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26917 : return "+proj=utm +zone=17 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26918 : return "+proj=utm +zone=18 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26919 : return "+proj=utm +zone=19 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26920 : return "+proj=utm +zone=20 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26921 : return "+proj=utm +zone=21 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26922 : return "+proj=utm +zone=22 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26923 : return "+proj=utm +zone=23 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26929 : return "+proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26930 : return "+proj=tmerc +lat_0=30 +lon_0=-87.5 +k=0.999933333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26931 : return "+proj=omerc +lat_0=57 +lonc=-133.6666666666667 +alpha=323.1301023611111 +k=0.9999 +x_0=5000000 +y_0=-5000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26932 : return "+proj=tmerc +lat_0=54 +lon_0=-142 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26933 : return "+proj=tmerc +lat_0=54 +lon_0=-146 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26934 : return "+proj=tmerc +lat_0=54 +lon_0=-150 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26935 : return "+proj=tmerc +lat_0=54 +lon_0=-154 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26936 : return "+proj=tmerc +lat_0=54 +lon_0=-158 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26937 : return "+proj=tmerc +lat_0=54 +lon_0=-162 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26938 : return "+proj=tmerc +lat_0=54 +lon_0=-166 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26939 : return "+proj=tmerc +lat_0=54 +lon_0=-170 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26940 : return "+proj=lcc +lat_1=53.83333333333334 +lat_2=51.83333333333334 +lat_0=51 +lon_0=-176 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26941 : return "+proj=lcc +lat_1=41.66666666666666 +lat_2=40 +lat_0=39.33333333333334 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26942 : return "+proj=lcc +lat_1=39.83333333333334 +lat_2=38.33333333333334 +lat_0=37.66666666666666 +lon_0=-122 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26943 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.06666666666667 +lat_0=36.5 +lon_0=-120.5 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26944 : return "+proj=lcc +lat_1=37.25 +lat_2=36 +lat_0=35.33333333333334 +lon_0=-119 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26945 : return "+proj=lcc +lat_1=35.46666666666667 +lat_2=34.03333333333333 +lat_0=33.5 +lon_0=-118 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26946 : return "+proj=lcc +lat_1=33.88333333333333 +lat_2=32.78333333333333 +lat_0=32.16666666666666 +lon_0=-116.25 +x_0=2000000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26948 : return "+proj=tmerc +lat_0=31 +lon_0=-110.1666666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26949 : return "+proj=tmerc +lat_0=31 +lon_0=-111.9166666666667 +k=0.9999 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26950 : return "+proj=tmerc +lat_0=31 +lon_0=-113.75 +k=0.999933333 +x_0=213360 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26951 : return "+proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26952 : return "+proj=lcc +lat_1=34.76666666666667 +lat_2=33.3 +lat_0=32.66666666666666 +lon_0=-92 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26953 : return "+proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26954 : return "+proj=lcc +lat_1=39.75 +lat_2=38.45 +lat_0=37.83333333333334 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26955 : return "+proj=lcc +lat_1=38.43333333333333 +lat_2=37.23333333333333 +lat_0=36.66666666666666 +lon_0=-105.5 +x_0=914401.8289 +y_0=304800.6096 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26956 : return "+proj=lcc +lat_1=41.86666666666667 +lat_2=41.2 +lat_0=40.83333333333334 +lon_0=-72.75 +x_0=304800.6096 +y_0=152400.3048 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26957 : return "+proj=tmerc +lat_0=38 +lon_0=-75.41666666666667 +k=0.999995 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26958 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26959 : return "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-82 +k=0.999941177 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26960 : return "+proj=lcc +lat_1=30.75 +lat_2=29.58333333333333 +lat_0=29 +lon_0=-84.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26961 : return "+proj=tmerc +lat_0=18.83333333333333 +lon_0=-155.5 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26962 : return "+proj=tmerc +lat_0=20.33333333333333 +lon_0=-156.6666666666667 +k=0.999966667 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26963 : return "+proj=tmerc +lat_0=21.16666666666667 +lon_0=-158 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26964 : return "+proj=tmerc +lat_0=21.83333333333333 +lon_0=-159.5 +k=0.99999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26965 : return "+proj=tmerc +lat_0=21.66666666666667 +lon_0=-160.1666666666667 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26966 : return "+proj=tmerc +lat_0=30 +lon_0=-82.16666666666667 +k=0.9999 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26967 : return "+proj=tmerc +lat_0=30 +lon_0=-84.16666666666667 +k=0.9999 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26968 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-112.1666666666667 +k=0.9999473679999999 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26969 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-114 +k=0.9999473679999999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26970 : return "+proj=tmerc +lat_0=41.66666666666666 +lon_0=-115.75 +k=0.999933333 +x_0=800000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26971 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-88.33333333333333 +k=0.9999749999999999 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26972 : return "+proj=tmerc +lat_0=36.66666666666666 +lon_0=-90.16666666666667 +k=0.999941177 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26973 : return "+proj=tmerc +lat_0=37.5 +lon_0=-85.66666666666667 +k=0.999966667 +x_0=100000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26974 : return "+proj=tmerc +lat_0=37.5 +lon_0=-87.08333333333333 +k=0.999966667 +x_0=900000 +y_0=250000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26975 : return "+proj=lcc +lat_1=43.26666666666667 +lat_2=42.06666666666667 +lat_0=41.5 +lon_0=-93.5 +x_0=1500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26976 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.61666666666667 +lat_0=40 +lon_0=-93.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26977 : return "+proj=lcc +lat_1=39.78333333333333 +lat_2=38.71666666666667 +lat_0=38.33333333333334 +lon_0=-98 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26978 : return "+proj=lcc +lat_1=38.56666666666667 +lat_2=37.26666666666667 +lat_0=36.66666666666666 +lon_0=-98.5 +x_0=400000 +y_0=400000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26979 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=37.96666666666667 +lat_0=37.5 +lon_0=-84.25 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26980 : return "+proj=lcc +lat_1=37.93333333333333 +lat_2=36.73333333333333 +lat_0=36.33333333333334 +lon_0=-85.75 +x_0=500000 +y_0=500000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26981 : return "+proj=lcc +lat_1=32.66666666666666 +lat_2=31.16666666666667 +lat_0=30.5 +lon_0=-92.5 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26982 : return "+proj=lcc +lat_1=30.7 +lat_2=29.3 +lat_0=28.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26983 : return "+proj=tmerc +lat_0=43.66666666666666 +lon_0=-68.5 +k=0.9999 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26984 : return "+proj=tmerc +lat_0=42.83333333333334 +lon_0=-70.16666666666667 +k=0.999966667 +x_0=900000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26985 : return "+proj=lcc +lat_1=39.45 +lat_2=38.3 +lat_0=37.66666666666666 +lon_0=-77 +x_0=400000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26986 : return "+proj=lcc +lat_1=42.68333333333333 +lat_2=41.71666666666667 +lat_0=41 +lon_0=-71.5 +x_0=200000 +y_0=750000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26987 : return "+proj=lcc +lat_1=41.48333333333333 +lat_2=41.28333333333333 +lat_0=41 +lon_0=-70.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26988 : return "+proj=lcc +lat_1=47.08333333333334 +lat_2=45.48333333333333 +lat_0=44.78333333333333 +lon_0=-87 +x_0=8000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26989 : return "+proj=lcc +lat_1=45.7 +lat_2=44.18333333333333 +lat_0=43.31666666666667 +lon_0=-84.36666666666666 +x_0=6000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26990 : return "+proj=lcc +lat_1=43.66666666666666 +lat_2=42.1 +lat_0=41.5 +lon_0=-84.36666666666666 +x_0=4000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26991 : return "+proj=lcc +lat_1=48.63333333333333 +lat_2=47.03333333333333 +lat_0=46.5 +lon_0=-93.09999999999999 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26992 : return "+proj=lcc +lat_1=47.05 +lat_2=45.61666666666667 +lat_0=45 +lon_0=-94.25 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26993 : return "+proj=lcc +lat_1=45.21666666666667 +lat_2=43.78333333333333 +lat_0=43 +lon_0=-94 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26994 : return "+proj=tmerc +lat_0=29.5 +lon_0=-88.83333333333333 +k=0.99995 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26995 : return "+proj=tmerc +lat_0=29.5 +lon_0=-90.33333333333333 +k=0.99995 +x_0=700000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26996 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-90.5 +k=0.999933333 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26997 : return "+proj=tmerc +lat_0=35.83333333333334 +lon_0=-92.5 +k=0.999933333 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 26998 : return "+proj=tmerc +lat_0=36.16666666666666 +lon_0=-94.5 +k=0.999941177 +x_0=850000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 27037 : return "+proj=utm +zone=37 +ellps=clrk80 +units=m";
+ case 27038 : return "+proj=utm +zone=38 +ellps=clrk80 +units=m";
+ case 27039 : return "+proj=utm +zone=39 +ellps=clrk80 +units=m";
+ case 27040 : return "+proj=utm +zone=40 +ellps=clrk80 +units=m";
+ case 27120 : return "+proj=utm +zone=20 +ellps=intl +units=m";
+ case 27200 : return "+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +datum=nzgd49 +units=m";
+ case 27205 : return "+proj=tmerc +lat_0=-36.87986527777778 +lon_0=174.7643393611111 +k=0.9999 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27206 : return "+proj=tmerc +lat_0=-37.76124980555556 +lon_0=176.46619725 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27207 : return "+proj=tmerc +lat_0=-38.62470277777778 +lon_0=177.8856362777778 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27208 : return "+proj=tmerc +lat_0=-39.65092930555556 +lon_0=176.6736805277778 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27209 : return "+proj=tmerc +lat_0=-39.13575830555556 +lon_0=174.22801175 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27210 : return "+proj=tmerc +lat_0=-39.51247038888889 +lon_0=175.6400368055556 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27211 : return "+proj=tmerc +lat_0=-40.24194713888889 +lon_0=175.4880996111111 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27212 : return "+proj=tmerc +lat_0=-40.92553263888889 +lon_0=175.6473496666667 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27213 : return "+proj=tmerc +lat_0=-41.30131963888888 +lon_0=174.7766231111111 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27214 : return "+proj=tmerc +lat_0=-40.71475905555556 +lon_0=172.6720465 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27215 : return "+proj=tmerc +lat_0=-41.27454472222222 +lon_0=173.2993168055555 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27216 : return "+proj=tmerc +lat_0=-41.28991152777778 +lon_0=172.1090281944444 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27217 : return "+proj=tmerc +lat_0=-41.81080286111111 +lon_0=171.5812600555556 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27218 : return "+proj=tmerc +lat_0=-42.33369427777778 +lon_0=171.5497713055556 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27219 : return "+proj=tmerc +lat_0=-42.68911658333333 +lon_0=173.0101333888889 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27220 : return "+proj=tmerc +lat_0=-41.54448666666666 +lon_0=173.8020741111111 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27221 : return "+proj=tmerc +lat_0=-42.88632236111111 +lon_0=170.9799935 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27222 : return "+proj=tmerc +lat_0=-43.11012813888889 +lon_0=170.2609258333333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27223 : return "+proj=tmerc +lat_0=-43.97780288888889 +lon_0=168.606267 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27224 : return "+proj=tmerc +lat_0=-43.59063758333333 +lon_0=172.7271935833333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27225 : return "+proj=tmerc +lat_0=-43.74871155555556 +lon_0=171.3607484722222 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27226 : return "+proj=tmerc +lat_0=-44.40222036111111 +lon_0=171.0572508333333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27227 : return "+proj=tmerc +lat_0=-44.73526797222222 +lon_0=169.4677550833333 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27228 : return "+proj=tmerc +lat_0=-45.13290258333333 +lon_0=168.3986411944444 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27229 : return "+proj=tmerc +lat_0=-45.56372616666666 +lon_0=167.7388617777778 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27230 : return "+proj=tmerc +lat_0=-45.81619661111111 +lon_0=170.6285951666667 +k=1 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27231 : return "+proj=tmerc +lat_0=-45.86151336111111 +lon_0=170.2825891111111 +k=0.99996 +x_0=300000 +y_0=700000 +ellps=intl +datum=nzgd49 +units=m";
+ case 27232 : return "+proj=tmerc +lat_0=-46.60000961111111 +lon_0=168.342872 +k=1 +x_0=300002.66 +y_0=699999.58 +ellps=intl +datum=nzgd49 +units=m";
+ case 27258 : return "+proj=utm +zone=58 +south +ellps=intl +datum=nzgd49 +units=m";
+ case 27259 : return "+proj=utm +zone=59 +south +ellps=intl +datum=nzgd49 +units=m";
+ case 27260 : return "+proj=utm +zone=60 +south +ellps=intl +datum=nzgd49 +units=m";
+ case 27291 : return "+proj=tmerc +lat_0=-39 +lon_0=175.5 +k=1 +x_0=274319.5243848086 +y_0=365759.3658464114 +ellps=intl +datum=nzgd49 +to_meter=0.9143984146160287";
+ case 27292 : return "+proj=tmerc +lat_0=-44 +lon_0=171.5 +k=1 +x_0=457199.2073080143 +y_0=457199.2073080143 +ellps=intl +datum=nzgd49 +to_meter=0.9143984146160287";
+ case 27391 : return "+proj=tmerc +lat_0=58 +lon_0=-4.666666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27392 : return "+proj=tmerc +lat_0=58 +lon_0=-2.333333333333333 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27393 : return "+proj=tmerc +lat_0=58 +lon_0=0 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27394 : return "+proj=tmerc +lat_0=58 +lon_0=2.5 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27395 : return "+proj=tmerc +lat_0=58 +lon_0=6.166666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27396 : return "+proj=tmerc +lat_0=58 +lon_0=10.16666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27397 : return "+proj=tmerc +lat_0=58 +lon_0=14.16666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27398 : return "+proj=tmerc +lat_0=58 +lon_0=18.33333333333333 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m";
+ case 27429 : return "+proj=utm +zone=29 +ellps=intl +units=m";
+ case 27492 : return "+proj=tmerc +lat_0=39.66666666666666 +lon_0=-8.131906111111112 +k=1 +x_0=180.598 +y_0=-86.98999999999999 +ellps=intl +units=m";
+ case 27500 : return "+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=5.399999999999999 +k_0=0.99950908 +x_0=500000 +y_0=300000 +a=6376523 +b=6355862.933255573 +pm=paris +units=m";
+ case 27561 : return "+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27562 : return "+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27563 : return "+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27564 : return "+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27571 : return "+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27572 : return "+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27573 : return "+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27574 : return "+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27581 : return "+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=1200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27582 : return "+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27583 : return "+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=3200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27584 : return "+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=4185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27591 : return "+proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=0 +k_0=0.999877341 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27592 : return "+proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27593 : return "+proj=lcc +lat_1=44.10000000000001 +lat_0=44.10000000000001 +lon_0=0 +k_0=0.999877499 +x_0=600000 +y_0=200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27594 : return "+proj=lcc +lat_1=42.16500000000001 +lat_0=42.16500000000001 +lon_0=0 +k_0=0.99994471 +x_0=234.358 +y_0=185861.369 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m";
+ case 27700 : return "+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m";
+ case 28191 : return "+proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m";
+ case 28192 : return "+proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m";
+ case 28193 : return "+proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m";
+ case 28232 : return "+proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +units=m";
+ case 28348 : return "+proj=utm +zone=48 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28349 : return "+proj=utm +zone=49 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28350 : return "+proj=utm +zone=50 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28351 : return "+proj=utm +zone=51 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28352 : return "+proj=utm +zone=52 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28353 : return "+proj=utm +zone=53 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28354 : return "+proj=utm +zone=54 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28355 : return "+proj=utm +zone=55 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28356 : return "+proj=utm +zone=56 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28357 : return "+proj=utm +zone=57 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28358 : return "+proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 28402 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +units=m";
+ case 28403 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +units=m";
+ case 28404 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m";
+ case 28405 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +units=m";
+ case 28406 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +units=m";
+ case 28407 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +units=m";
+ case 28408 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +units=m";
+ case 28409 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +units=m";
+ case 28410 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +units=m";
+ case 28411 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +units=m";
+ case 28412 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +units=m";
+ case 28413 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +units=m";
+ case 28414 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +units=m";
+ case 28415 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +units=m";
+ case 28416 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +units=m";
+ case 28417 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +units=m";
+ case 28418 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +units=m";
+ case 28419 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +units=m";
+ case 28420 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +units=m";
+ case 28421 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +units=m";
+ case 28422 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +units=m";
+ case 28423 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +units=m";
+ case 28424 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +units=m";
+ case 28425 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +units=m";
+ case 28426 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +units=m";
+ case 28427 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +units=m";
+ case 28428 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +units=m";
+ case 28429 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +units=m";
+ case 28430 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +units=m";
+ case 28431 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +units=m";
+ case 28432 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +units=m";
+ case 28462 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28463 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28464 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28465 : return "+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28466 : return "+proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28467 : return "+proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28468 : return "+proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28469 : return "+proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28470 : return "+proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28471 : return "+proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28472 : return "+proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28473 : return "+proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28474 : return "+proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28475 : return "+proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28476 : return "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28477 : return "+proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28478 : return "+proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28479 : return "+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28480 : return "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28481 : return "+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28482 : return "+proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28483 : return "+proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28484 : return "+proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28485 : return "+proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28486 : return "+proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28487 : return "+proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28488 : return "+proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28489 : return "+proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28490 : return "+proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28491 : return "+proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28492 : return "+proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +units=m";
+ case 28600 : return "+proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +units=m";
+ case 28991 : return "+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 28992 : return "+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m";
+ case 29100 : return "+proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS67 +units=m";
+ case 29101 : return "+proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=aust_SA +units=m";
+ case 29118 : return "+proj=utm +zone=18 +ellps=GRS67 +units=m";
+ case 29119 : return "+proj=utm +zone=19 +ellps=GRS67 +units=m";
+ case 29120 : return "+proj=utm +zone=20 +ellps=GRS67 +units=m";
+ case 29121 : return "+proj=utm +zone=21 +ellps=GRS67 +units=m";
+ case 29122 : return "+proj=utm +zone=22 +ellps=GRS67 +units=m";
+ case 29168 : return "+proj=utm +zone=18 +ellps=aust_SA +units=m";
+ case 29169 : return "+proj=utm +zone=19 +ellps=aust_SA +units=m";
+ case 29170 : return "+proj=utm +zone=20 +ellps=aust_SA +units=m";
+ case 29171 : return "+proj=utm +zone=21 +ellps=aust_SA +units=m";
+ case 29172 : return "+proj=utm +zone=22 +ellps=aust_SA +units=m";
+ case 29177 : return "+proj=utm +zone=17 +south +ellps=GRS67 +units=m";
+ case 29178 : return "+proj=utm +zone=18 +south +ellps=GRS67 +units=m";
+ case 29179 : return "+proj=utm +zone=19 +south +ellps=GRS67 +units=m";
+ case 29180 : return "+proj=utm +zone=20 +south +ellps=GRS67 +units=m";
+ case 29181 : return "+proj=utm +zone=21 +south +ellps=GRS67 +units=m";
+ case 29182 : return "+proj=utm +zone=22 +south +ellps=GRS67 +units=m";
+ case 29183 : return "+proj=utm +zone=23 +south +ellps=GRS67 +units=m";
+ case 29184 : return "+proj=utm +zone=24 +south +ellps=GRS67 +units=m";
+ case 29185 : return "+proj=utm +zone=25 +south +ellps=GRS67 +units=m";
+ case 29187 : return "+proj=utm +zone=17 +south +ellps=aust_SA +units=m";
+ case 29188 : return "+proj=utm +zone=18 +south +ellps=aust_SA +units=m";
+ case 29189 : return "+proj=utm +zone=19 +south +ellps=aust_SA +units=m";
+ case 29190 : return "+proj=utm +zone=20 +south +ellps=aust_SA +units=m";
+ case 29191 : return "+proj=utm +zone=21 +south +ellps=aust_SA +units=m";
+ case 29192 : return "+proj=utm +zone=22 +south +ellps=aust_SA +units=m";
+ case 29193 : return "+proj=utm +zone=23 +south +ellps=aust_SA +units=m";
+ case 29194 : return "+proj=utm +zone=24 +south +ellps=aust_SA +units=m";
+ case 29195 : return "+proj=utm +zone=25 +south +ellps=aust_SA +units=m";
+ case 29220 : return "+proj=utm +zone=20 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m";
+ case 29221 : return "+proj=utm +zone=21 +south +ellps=intl +towgs84=-355,21,72,0,0,0,0 +units=m";
+ case 29333 : return "+proj=utm +zone=33 +south +ellps=bess_nam +units=m";
+ case 29635 : return "+proj=utm +zone=35 +a=6378249.2 +b=6356515 +units=m";
+ case 29636 : return "+proj=utm +zone=36 +a=6378249.2 +b=6356515 +units=m";
+ case 29700 : return "+proj=omerc +lat_0=-18.9 +lonc=44.10000000000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m";
+ case 29702 : return "+proj=omerc +lat_0=-18.9 +lonc=44.10000000000001 +alpha=18.9 +k=0.9995000000000001 +x_0=400000 +y_0=800000 +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +pm=paris +units=m";
+ case 29738 : return "+proj=utm +zone=38 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m";
+ case 29739 : return "+proj=utm +zone=39 +south +ellps=intl +towgs84=-189,-242,-91,0,0,0,0 +units=m";
+ case 29849 : return "+proj=utm +zone=49 +ellps=evrstSS +units=m";
+ case 29850 : return "+proj=utm +zone=50 +ellps=evrstSS +units=m";
+ case 29871 : return "+proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8714630401 +y_0=442857.653094361 +ellps=evrstSS +to_meter=20.11676512155263";
+ case 29872 : return "+proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.8727431979 +y_0=442857.6545573985 +ellps=evrstSS +to_meter=0.3047994715386762";
+ case 29873 : return "+proj=omerc +lat_0=4 +lonc=115 +alpha=53.31582047222222 +k=0.99984 +x_0=590476.87 +y_0=442857.65 +ellps=evrstSS +units=m";
+ case 29900 : return "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m";
+ case 29901 : return "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1 +x_0=200000 +y_0=250000 +ellps=airy +towgs84=482.5,-130.6,564.6,-1.042,-0.214,-0.631,8.15 +units=m";
+ case 29902 : return "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m";
+ case 29903 : return "+proj=tmerc +lat_0=53.5 +lon_0=-8 +k=1.000035 +x_0=200000 +y_0=250000 +a=6377340.189 +b=6356034.447938534 +units=m";
+ case 30161 : return "+proj=tmerc +lat_0=33 +lon_0=129.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30162 : return "+proj=tmerc +lat_0=33 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30163 : return "+proj=tmerc +lat_0=36 +lon_0=132.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30164 : return "+proj=tmerc +lat_0=33 +lon_0=133.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30165 : return "+proj=tmerc +lat_0=36 +lon_0=134.3333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30166 : return "+proj=tmerc +lat_0=36 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30167 : return "+proj=tmerc +lat_0=36 +lon_0=137.1666666666667 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30168 : return "+proj=tmerc +lat_0=36 +lon_0=138.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30169 : return "+proj=tmerc +lat_0=36 +lon_0=139.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30170 : return "+proj=tmerc +lat_0=40 +lon_0=140.8333333333333 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30171 : return "+proj=tmerc +lat_0=44 +lon_0=140.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30172 : return "+proj=tmerc +lat_0=44 +lon_0=142.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30173 : return "+proj=tmerc +lat_0=44 +lon_0=144.25 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30174 : return "+proj=tmerc +lat_0=26 +lon_0=142 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30175 : return "+proj=tmerc +lat_0=26 +lon_0=127.5 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30176 : return "+proj=tmerc +lat_0=26 +lon_0=124 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30177 : return "+proj=tmerc +lat_0=26 +lon_0=131 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30178 : return "+proj=tmerc +lat_0=20 +lon_0=136 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30179 : return "+proj=tmerc +lat_0=26 +lon_0=154 +k=0.9999 +x_0=0 +y_0=0 +ellps=bessel +units=m";
+ case 30200 : return "+proj=cass +lat_0=10.44166666666667 +lon_0=-61.33333333333334 +x_0=86501.46392051999 +y_0=65379.0134283 +a=6378293.645208759 +b=6356617.987679838 +to_meter=0.201166195164";
+ case 30339 : return "+proj=utm +zone=39 +ellps=helmert +units=m";
+ case 30340 : return "+proj=utm +zone=40 +ellps=helmert +units=m";
+ case 30491 : return "+proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m";
+ case 30492 : return "+proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +towgs84=-73,-247,227,0,0,0,0 +units=m";
+ case 30493 : return "+proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m";
+ case 30494 : return "+proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m";
+ case 30729 : return "+proj=utm +zone=29 +ellps=clrk80 +units=m";
+ case 30730 : return "+proj=utm +zone=30 +ellps=clrk80 +units=m";
+ case 30731 : return "+proj=utm +zone=31 +ellps=clrk80 +units=m";
+ case 30732 : return "+proj=utm +zone=32 +ellps=clrk80 +units=m";
+ case 30791 : return "+proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m";
+ case 30792 : return "+proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +units=m";
+ case 30800 : return "+proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m";
+ case 31028 : return "+proj=utm +zone=28 +a=6378249.2 +b=6356515 +units=m";
+ case 31121 : return "+proj=utm +zone=21 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m";
+ case 31154 : return "+proj=tmerc +lat_0=0 +lon_0=-54 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m";
+ case 31170 : return "+proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m";
+ case 31171 : return "+proj=tmerc +lat_0=0 +lon_0=-55.68333333333333 +k=0.9999 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-265,120,-358,0,0,0,0 +units=m";
+ case 31251 : return "+proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +pm=ferro +units=m";
+ case 31252 : return "+proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +pm=ferro +units=m";
+ case 31253 : return "+proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +pm=ferro +units=m";
+ case 31254 : return "+proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31255 : return "+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31256 : return "+proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31257 : return "+proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31258 : return "+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31259 : return "+proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31265 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31266 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31267 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31268 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31275 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=5500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31276 : return "+proj=tmerc +lat_0=0 +lon_0=18 +k=0.9999 +x_0=6500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31277 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31278 : return "+proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=7500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31279 : return "+proj=tmerc +lat_0=0 +lon_0=24 +k=0.9999 +x_0=8500000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31281 : return "+proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31282 : return "+proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31283 : return "+proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31284 : return "+proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31285 : return "+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31286 : return "+proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31287 : return "+proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31288 : return "+proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=150000 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31289 : return "+proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=450000 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31290 : return "+proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=750000 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31291 : return "+proj=tmerc +lat_0=0 +lon_0=28 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31292 : return "+proj=tmerc +lat_0=0 +lon_0=31 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31293 : return "+proj=tmerc +lat_0=0 +lon_0=34 +k=1 +x_0=0 +y_0=0 +ellps=bessel +pm=ferro +units=m";
+ case 31294 : return "+proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=150000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31295 : return "+proj=tmerc +lat_0=0 +lon_0=13.33333333333333 +k=1 +x_0=450000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31296 : return "+proj=tmerc +lat_0=0 +lon_0=16.33333333333333 +k=1 +x_0=750000 +y_0=0 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31297 : return "+proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m";
+ case 31300 : return "+proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.356939722222222 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +towgs84=106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1 +units=m";
+ case 31370 : return "+proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1 +units=m";
+ case 31461 : return "+proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31462 : return "+proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31463 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31464 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31465 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31466 : return "+proj=tmerc +lat_0=0 +lon_0=6 +k=1 +x_0=2500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31467 : return "+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31468 : return "+proj=tmerc +lat_0=0 +lon_0=12 +k=1 +x_0=4500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31469 : return "+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m";
+ case 31528 : return "+proj=utm +zone=28 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m";
+ case 31529 : return "+proj=utm +zone=29 +a=6378249.2 +b=6356515 +towgs84=-23,259,-9,0,0,0,0 +units=m";
+ case 31600 : return "+proj=sterea +lat_0=45.9 +lon_0=25.39246588888889 +k=0.9996667 +x_0=500000 +y_0=500000 +ellps=intl +units=m";
+ case 31700 : return "+proj=sterea +lat_0=46 +lon_0=25 +k=0.99975 +x_0=500000 +y_0=500000 +ellps=krass +units=m";
+ case 31838 : return "+proj=utm +zone=38 +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +units=m";
+ case 31839 : return "+proj=utm +zone=39 +ellps=WGS84 +towgs84=-3.2,-5.7,2.8,0,0,0,0 +units=m";
+ case 31900 : return "+proj=tmerc +lat_0=0 +lon_0=48 +k=0.9996 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 31901 : return "+proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m";
+ case 31965 : return "+proj=utm +zone=11 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31966 : return "+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31967 : return "+proj=utm +zone=13 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31968 : return "+proj=utm +zone=14 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31969 : return "+proj=utm +zone=15 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31970 : return "+proj=utm +zone=16 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31971 : return "+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31972 : return "+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31973 : return "+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31974 : return "+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31975 : return "+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31976 : return "+proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31977 : return "+proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31978 : return "+proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31979 : return "+proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31980 : return "+proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31981 : return "+proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31982 : return "+proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31983 : return "+proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31984 : return "+proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31985 : return "+proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31986 : return "+proj=utm +zone=17 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31987 : return "+proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31988 : return "+proj=utm +zone=19 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31989 : return "+proj=utm +zone=20 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31990 : return "+proj=utm +zone=21 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31991 : return "+proj=utm +zone=22 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31992 : return "+proj=utm +zone=17 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31993 : return "+proj=utm +zone=18 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31994 : return "+proj=utm +zone=19 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31995 : return "+proj=utm +zone=20 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31996 : return "+proj=utm +zone=21 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31997 : return "+proj=utm +zone=22 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31998 : return "+proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 31999 : return "+proj=utm +zone=24 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 32000 : return "+proj=utm +zone=25 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m";
+ case 32001 : return "+proj=lcc +lat_1=48.71666666666667 +lat_2=47.85 +lat_0=47 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32002 : return "+proj=lcc +lat_1=47.88333333333333 +lat_2=46.45 +lat_0=45.83333333333334 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32003 : return "+proj=lcc +lat_1=46.4 +lat_2=44.86666666666667 +lat_0=44 +lon_0=-109.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32005 : return "+proj=lcc +lat_1=41.85 +lat_2=42.81666666666667 +lat_0=41.33333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32006 : return "+proj=lcc +lat_1=40.28333333333333 +lat_2=41.71666666666667 +lat_0=39.66666666666666 +lon_0=-99.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32007 : return "+proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32008 : return "+proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32009 : return "+proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32010 : return "+proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32011 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.66666666666667 +k=0.9999749999999999 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32012 : return "+proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32013 : return "+proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32014 : return "+proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32015 : return "+proj=tmerc +lat_0=40 +lon_0=-74.33333333333333 +k=0.999966667 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32016 : return "+proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32017 : return "+proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32018 : return "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.5 +lon_0=-74 +x_0=304800.6096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32019 : return "+proj=lcc +lat_1=34.33333333333334 +lat_2=36.16666666666666 +lat_0=33.75 +lon_0=-79 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32020 : return "+proj=lcc +lat_1=47.43333333333333 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32021 : return "+proj=lcc +lat_1=46.18333333333333 +lat_2=47.48333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32022 : return "+proj=lcc +lat_1=40.43333333333333 +lat_2=41.7 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32023 : return "+proj=lcc +lat_1=38.73333333333333 +lat_2=40.03333333333333 +lat_0=38 +lon_0=-82.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32024 : return "+proj=lcc +lat_1=35.56666666666667 +lat_2=36.76666666666667 +lat_0=35 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32025 : return "+proj=lcc +lat_1=33.93333333333333 +lat_2=35.23333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32026 : return "+proj=lcc +lat_1=44.33333333333334 +lat_2=46 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32027 : return "+proj=lcc +lat_1=42.33333333333334 +lat_2=44 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32028 : return "+proj=lcc +lat_1=40.88333333333333 +lat_2=41.95 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32029 : return "+proj=lcc +lat_1=39.93333333333333 +lat_2=40.8 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32030 : return "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.9999938 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32031 : return "+proj=lcc +lat_1=33.76666666666667 +lat_2=34.96666666666667 +lat_0=33 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32033 : return "+proj=lcc +lat_1=32.33333333333334 +lat_2=33.66666666666666 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32034 : return "+proj=lcc +lat_1=44.41666666666666 +lat_2=45.68333333333333 +lat_0=43.83333333333334 +lon_0=-100 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32035 : return "+proj=lcc +lat_1=42.83333333333334 +lat_2=44.4 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32036 : return "+proj=lcc +lat_1=35.25 +lat_2=36.41666666666666 +lat_0=34.66666666666666 +lon_0=-86 +x_0=30480.06096012192 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32037 : return "+proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32038 : return "+proj=lcc +lat_1=32.13333333333333 +lat_2=33.96666666666667 +lat_0=31.66666666666667 +lon_0=-97.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32039 : return "+proj=lcc +lat_1=30.11666666666667 +lat_2=31.88333333333333 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32040 : return "+proj=lcc +lat_1=28.38333333333333 +lat_2=30.28333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32041 : return "+proj=lcc +lat_1=26.16666666666667 +lat_2=27.83333333333333 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32042 : return "+proj=lcc +lat_1=40.71666666666667 +lat_2=41.78333333333333 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32043 : return "+proj=lcc +lat_1=39.01666666666667 +lat_2=40.65 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32044 : return "+proj=lcc +lat_1=37.21666666666667 +lat_2=38.35 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32045 : return "+proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32046 : return "+proj=lcc +lat_1=38.03333333333333 +lat_2=39.2 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32047 : return "+proj=lcc +lat_1=36.76666666666667 +lat_2=37.96666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32048 : return "+proj=lcc +lat_1=47.5 +lat_2=48.73333333333333 +lat_0=47 +lon_0=-120.8333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32049 : return "+proj=lcc +lat_1=45.83333333333334 +lat_2=47.33333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32050 : return "+proj=lcc +lat_1=39 +lat_2=40.25 +lat_0=38.5 +lon_0=-79.5 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32051 : return "+proj=lcc +lat_1=37.48333333333333 +lat_2=38.88333333333333 +lat_0=37 +lon_0=-81 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32052 : return "+proj=lcc +lat_1=45.56666666666667 +lat_2=46.76666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32053 : return "+proj=lcc +lat_1=44.25 +lat_2=45.5 +lat_0=43.83333333333334 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32054 : return "+proj=lcc +lat_1=42.73333333333333 +lat_2=44.06666666666667 +lat_0=42 +lon_0=-90 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32055 : return "+proj=tmerc +lat_0=40.66666666666666 +lon_0=-105.1666666666667 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32056 : return "+proj=tmerc +lat_0=40.66666666666666 +lon_0=-107.3333333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32057 : return "+proj=tmerc +lat_0=40.66666666666666 +lon_0=-108.75 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32058 : return "+proj=tmerc +lat_0=40.66666666666666 +lon_0=-110.0833333333333 +k=0.999941177 +x_0=152400.3048006096 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32061 : return "+proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32062 : return "+proj=lcc +lat_1=14.9 +lat_0=14.9 +lon_0=-90.33333333333333 +k_0=0.99989906 +x_0=500000 +y_0=325992.681 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32064 : return "+proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32065 : return "+proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32066 : return "+proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32067 : return "+proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32074 : return "+proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32075 : return "+proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32076 : return "+proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32077 : return "+proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32081 : return "+proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32082 : return "+proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32083 : return "+proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32084 : return "+proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32085 : return "+proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32086 : return "+proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32098 : return "+proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=clrk66 +datum=NAD27 +units=m";
+ case 32099 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 +ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192";
+ case 32100 : return "+proj=lcc +lat_1=49 +lat_2=45 +lat_0=44.25 +lon_0=-109.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32104 : return "+proj=lcc +lat_1=43 +lat_2=40 +lat_0=39.83333333333334 +lon_0=-100 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32107 : return "+proj=tmerc +lat_0=34.75 +lon_0=-115.5833333333333 +k=0.9999 +x_0=200000 +y_0=8000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32108 : return "+proj=tmerc +lat_0=34.75 +lon_0=-116.6666666666667 +k=0.9999 +x_0=500000 +y_0=6000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32109 : return "+proj=tmerc +lat_0=34.75 +lon_0=-118.5833333333333 +k=0.9999 +x_0=800000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32110 : return "+proj=tmerc +lat_0=42.5 +lon_0=-71.66666666666667 +k=0.999966667 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32111 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32112 : return "+proj=tmerc +lat_0=31 +lon_0=-104.3333333333333 +k=0.999909091 +x_0=165000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32113 : return "+proj=tmerc +lat_0=31 +lon_0=-106.25 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32114 : return "+proj=tmerc +lat_0=31 +lon_0=-107.8333333333333 +k=0.999916667 +x_0=830000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32115 : return "+proj=tmerc +lat_0=38.83333333333334 +lon_0=-74.5 +k=0.9999 +x_0=150000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32116 : return "+proj=tmerc +lat_0=40 +lon_0=-76.58333333333333 +k=0.9999375 +x_0=250000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32117 : return "+proj=tmerc +lat_0=40 +lon_0=-78.58333333333333 +k=0.9999375 +x_0=350000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32118 : return "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32119 : return "+proj=lcc +lat_1=36.16666666666666 +lat_2=34.33333333333334 +lat_0=33.75 +lon_0=-79 +x_0=609601.22 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32120 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.43333333333333 +lat_0=47 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32121 : return "+proj=lcc +lat_1=47.48333333333333 +lat_2=46.18333333333333 +lat_0=45.66666666666666 +lon_0=-100.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32122 : return "+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32123 : return "+proj=lcc +lat_1=40.03333333333333 +lat_2=38.73333333333333 +lat_0=38 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32124 : return "+proj=lcc +lat_1=36.76666666666667 +lat_2=35.56666666666667 +lat_0=35 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32125 : return "+proj=lcc +lat_1=35.23333333333333 +lat_2=33.93333333333333 +lat_0=33.33333333333334 +lon_0=-98 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32126 : return "+proj=lcc +lat_1=46 +lat_2=44.33333333333334 +lat_0=43.66666666666666 +lon_0=-120.5 +x_0=2500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32127 : return "+proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32128 : return "+proj=lcc +lat_1=41.95 +lat_2=40.88333333333333 +lat_0=40.16666666666666 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32129 : return "+proj=lcc +lat_1=40.96666666666667 +lat_2=39.93333333333333 +lat_0=39.33333333333334 +lon_0=-77.75 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32130 : return "+proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=100000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32133 : return "+proj=lcc +lat_1=34.83333333333334 +lat_2=32.5 +lat_0=31.83333333333333 +lon_0=-81 +x_0=609600 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32134 : return "+proj=lcc +lat_1=45.68333333333333 +lat_2=44.41666666666666 +lat_0=43.83333333333334 +lon_0=-100 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32135 : return "+proj=lcc +lat_1=44.4 +lat_2=42.83333333333334 +lat_0=42.33333333333334 +lon_0=-100.3333333333333 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32136 : return "+proj=lcc +lat_1=36.41666666666666 +lat_2=35.25 +lat_0=34.33333333333334 +lon_0=-86 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32137 : return "+proj=lcc +lat_1=36.18333333333333 +lat_2=34.65 +lat_0=34 +lon_0=-101.5 +x_0=200000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32138 : return "+proj=lcc +lat_1=33.96666666666667 +lat_2=32.13333333333333 +lat_0=31.66666666666667 +lon_0=-98.5 +x_0=600000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32139 : return "+proj=lcc +lat_1=31.88333333333333 +lat_2=30.11666666666667 +lat_0=29.66666666666667 +lon_0=-100.3333333333333 +x_0=700000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32140 : return "+proj=lcc +lat_1=30.28333333333333 +lat_2=28.38333333333333 +lat_0=27.83333333333333 +lon_0=-99 +x_0=600000 +y_0=4000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32141 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.66666666666667 +lon_0=-98.5 +x_0=300000 +y_0=5000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32142 : return "+proj=lcc +lat_1=41.78333333333333 +lat_2=40.71666666666667 +lat_0=40.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32143 : return "+proj=lcc +lat_1=40.65 +lat_2=39.01666666666667 +lat_0=38.33333333333334 +lon_0=-111.5 +x_0=500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32144 : return "+proj=lcc +lat_1=38.35 +lat_2=37.21666666666667 +lat_0=36.66666666666666 +lon_0=-111.5 +x_0=500000 +y_0=3000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32145 : return "+proj=tmerc +lat_0=42.5 +lon_0=-72.5 +k=0.999964286 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32146 : return "+proj=lcc +lat_1=39.2 +lat_2=38.03333333333333 +lat_0=37.66666666666666 +lon_0=-78.5 +x_0=3500000 +y_0=2000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32147 : return "+proj=lcc +lat_1=37.96666666666667 +lat_2=36.76666666666667 +lat_0=36.33333333333334 +lon_0=-78.5 +x_0=3500000 +y_0=1000000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32148 : return "+proj=lcc +lat_1=48.73333333333333 +lat_2=47.5 +lat_0=47 +lon_0=-120.8333333333333 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32149 : return "+proj=lcc +lat_1=47.33333333333334 +lat_2=45.83333333333334 +lat_0=45.33333333333334 +lon_0=-120.5 +x_0=500000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32150 : return "+proj=lcc +lat_1=40.25 +lat_2=39 +lat_0=38.5 +lon_0=-79.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32151 : return "+proj=lcc +lat_1=38.88333333333333 +lat_2=37.48333333333333 +lat_0=37 +lon_0=-81 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32152 : return "+proj=lcc +lat_1=46.76666666666667 +lat_2=45.56666666666667 +lat_0=45.16666666666666 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32153 : return "+proj=lcc +lat_1=45.5 +lat_2=44.25 +lat_0=43.83333333333334 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32154 : return "+proj=lcc +lat_1=44.06666666666667 +lat_2=42.73333333333333 +lat_0=42 +lon_0=-90 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32155 : return "+proj=tmerc +lat_0=40.5 +lon_0=-105.1666666666667 +k=0.9999375 +x_0=200000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32156 : return "+proj=tmerc +lat_0=40.5 +lon_0=-107.3333333333333 +k=0.9999375 +x_0=400000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32157 : return "+proj=tmerc +lat_0=40.5 +lon_0=-108.75 +k=0.9999375 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32158 : return "+proj=tmerc +lat_0=40.5 +lon_0=-110.0833333333333 +k=0.9999375 +x_0=800000 +y_0=100000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32161 : return "+proj=lcc +lat_1=18.43333333333333 +lat_2=18.03333333333333 +lat_0=17.83333333333333 +lon_0=-66.43333333333334 +x_0=200000 +y_0=200000 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32164 : return "+proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 32165 : return "+proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 32166 : return "+proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 32167 : return "+proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192";
+ case 32180 : return "+proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32181 : return "+proj=tmerc +lat_0=0 +lon_0=-53 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32182 : return "+proj=tmerc +lat_0=0 +lon_0=-56 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32183 : return "+proj=tmerc +lat_0=0 +lon_0=-58.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32184 : return "+proj=tmerc +lat_0=0 +lon_0=-61.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32185 : return "+proj=tmerc +lat_0=0 +lon_0=-64.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32186 : return "+proj=tmerc +lat_0=0 +lon_0=-67.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32187 : return "+proj=tmerc +lat_0=0 +lon_0=-70.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32188 : return "+proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32189 : return "+proj=tmerc +lat_0=0 +lon_0=-76.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32190 : return "+proj=tmerc +lat_0=0 +lon_0=-79.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32191 : return "+proj=tmerc +lat_0=0 +lon_0=-82.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32192 : return "+proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32193 : return "+proj=tmerc +lat_0=0 +lon_0=-84 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32194 : return "+proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32195 : return "+proj=tmerc +lat_0=0 +lon_0=-90 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32196 : return "+proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32197 : return "+proj=tmerc +lat_0=0 +lon_0=-96 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32198 : return "+proj=lcc +lat_1=60 +lat_2=46 +lat_0=44 +lon_0=-68.5 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32199 : return "+proj=lcc +lat_1=27.83333333333333 +lat_2=26.16666666666667 +lat_0=25.5 +lon_0=-91.33333333333333 +x_0=1000000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m";
+ case 32201 : return "+proj=utm +zone=1 +ellps=WGS72 +units=m";
+ case 32202 : return "+proj=utm +zone=2 +ellps=WGS72 +units=m";
+ case 32203 : return "+proj=utm +zone=3 +ellps=WGS72 +units=m";
+ case 32204 : return "+proj=utm +zone=4 +ellps=WGS72 +units=m";
+ case 32205 : return "+proj=utm +zone=5 +ellps=WGS72 +units=m";
+ case 32206 : return "+proj=utm +zone=6 +ellps=WGS72 +units=m";
+ case 32207 : return "+proj=utm +zone=7 +ellps=WGS72 +units=m";
+ case 32208 : return "+proj=utm +zone=8 +ellps=WGS72 +units=m";
+ case 32209 : return "+proj=utm +zone=9 +ellps=WGS72 +units=m";
+ case 32210 : return "+proj=utm +zone=10 +ellps=WGS72 +units=m";
+ case 32211 : return "+proj=utm +zone=11 +ellps=WGS72 +units=m";
+ case 32212 : return "+proj=utm +zone=12 +ellps=WGS72 +units=m";
+ case 32213 : return "+proj=utm +zone=13 +ellps=WGS72 +units=m";
+ case 32214 : return "+proj=utm +zone=14 +ellps=WGS72 +units=m";
+ case 32215 : return "+proj=utm +zone=15 +ellps=WGS72 +units=m";
+ case 32216 : return "+proj=utm +zone=16 +ellps=WGS72 +units=m";
+ case 32217 : return "+proj=utm +zone=17 +ellps=WGS72 +units=m";
+ case 32218 : return "+proj=utm +zone=18 +ellps=WGS72 +units=m";
+ case 32219 : return "+proj=utm +zone=19 +ellps=WGS72 +units=m";
+ case 32220 : return "+proj=utm +zone=20 +ellps=WGS72 +units=m";
+ case 32221 : return "+proj=utm +zone=21 +ellps=WGS72 +units=m";
+ case 32222 : return "+proj=utm +zone=22 +ellps=WGS72 +units=m";
+ case 32223 : return "+proj=utm +zone=23 +ellps=WGS72 +units=m";
+ case 32224 : return "+proj=utm +zone=24 +ellps=WGS72 +units=m";
+ case 32225 : return "+proj=utm +zone=25 +ellps=WGS72 +units=m";
+ case 32226 : return "+proj=utm +zone=26 +ellps=WGS72 +units=m";
+ case 32227 : return "+proj=utm +zone=27 +ellps=WGS72 +units=m";
+ case 32228 : return "+proj=utm +zone=28 +ellps=WGS72 +units=m";
+ case 32229 : return "+proj=utm +zone=29 +ellps=WGS72 +units=m";
+ case 32230 : return "+proj=utm +zone=30 +ellps=WGS72 +units=m";
+ case 32231 : return "+proj=utm +zone=31 +ellps=WGS72 +units=m";
+ case 32232 : return "+proj=utm +zone=32 +ellps=WGS72 +units=m";
+ case 32233 : return "+proj=utm +zone=33 +ellps=WGS72 +units=m";
+ case 32234 : return "+proj=utm +zone=34 +ellps=WGS72 +units=m";
+ case 32235 : return "+proj=utm +zone=35 +ellps=WGS72 +units=m";
+ case 32236 : return "+proj=utm +zone=36 +ellps=WGS72 +units=m";
+ case 32237 : return "+proj=utm +zone=37 +ellps=WGS72 +units=m";
+ case 32238 : return "+proj=utm +zone=38 +ellps=WGS72 +units=m";
+ case 32239 : return "+proj=utm +zone=39 +ellps=WGS72 +units=m";
+ case 32240 : return "+proj=utm +zone=40 +ellps=WGS72 +units=m";
+ case 32241 : return "+proj=utm +zone=41 +ellps=WGS72 +units=m";
+ case 32242 : return "+proj=utm +zone=42 +ellps=WGS72 +units=m";
+ case 32243 : return "+proj=utm +zone=43 +ellps=WGS72 +units=m";
+ case 32244 : return "+proj=utm +zone=44 +ellps=WGS72 +units=m";
+ case 32245 : return "+proj=utm +zone=45 +ellps=WGS72 +units=m";
+ case 32246 : return "+proj=utm +zone=46 +ellps=WGS72 +units=m";
+ case 32247 : return "+proj=utm +zone=47 +ellps=WGS72 +units=m";
+ case 32248 : return "+proj=utm +zone=48 +ellps=WGS72 +units=m";
+ case 32249 : return "+proj=utm +zone=49 +ellps=WGS72 +units=m";
+ case 32250 : return "+proj=utm +zone=50 +ellps=WGS72 +units=m";
+ case 32251 : return "+proj=utm +zone=51 +ellps=WGS72 +units=m";
+ case 32252 : return "+proj=utm +zone=52 +ellps=WGS72 +units=m";
+ case 32253 : return "+proj=utm +zone=53 +ellps=WGS72 +units=m";
+ case 32254 : return "+proj=utm +zone=54 +ellps=WGS72 +units=m";
+ case 32255 : return "+proj=utm +zone=55 +ellps=WGS72 +units=m";
+ case 32256 : return "+proj=utm +zone=56 +ellps=WGS72 +units=m";
+ case 32257 : return "+proj=utm +zone=57 +ellps=WGS72 +units=m";
+ case 32258 : return "+proj=utm +zone=58 +ellps=WGS72 +units=m";
+ case 32259 : return "+proj=utm +zone=59 +ellps=WGS72 +units=m";
+ case 32260 : return "+proj=utm +zone=60 +ellps=WGS72 +units=m";
+ case 32301 : return "+proj=utm +zone=1 +south +ellps=WGS72 +units=m";
+ case 32302 : return "+proj=utm +zone=2 +south +ellps=WGS72 +units=m";
+ case 32303 : return "+proj=utm +zone=3 +south +ellps=WGS72 +units=m";
+ case 32304 : return "+proj=utm +zone=4 +south +ellps=WGS72 +units=m";
+ case 32305 : return "+proj=utm +zone=5 +south +ellps=WGS72 +units=m";
+ case 32306 : return "+proj=utm +zone=6 +south +ellps=WGS72 +units=m";
+ case 32307 : return "+proj=utm +zone=7 +south +ellps=WGS72 +units=m";
+ case 32308 : return "+proj=utm +zone=8 +south +ellps=WGS72 +units=m";
+ case 32309 : return "+proj=utm +zone=9 +south +ellps=WGS72 +units=m";
+ case 32310 : return "+proj=utm +zone=10 +south +ellps=WGS72 +units=m";
+ case 32311 : return "+proj=utm +zone=11 +south +ellps=WGS72 +units=m";
+ case 32312 : return "+proj=utm +zone=12 +south +ellps=WGS72 +units=m";
+ case 32313 : return "+proj=utm +zone=13 +south +ellps=WGS72 +units=m";
+ case 32314 : return "+proj=utm +zone=14 +south +ellps=WGS72 +units=m";
+ case 32315 : return "+proj=utm +zone=15 +south +ellps=WGS72 +units=m";
+ case 32316 : return "+proj=utm +zone=16 +south +ellps=WGS72 +units=m";
+ case 32317 : return "+proj=utm +zone=17 +south +ellps=WGS72 +units=m";
+ case 32318 : return "+proj=utm +zone=18 +south +ellps=WGS72 +units=m";
+ case 32319 : return "+proj=utm +zone=19 +south +ellps=WGS72 +units=m";
+ case 32320 : return "+proj=utm +zone=20 +south +ellps=WGS72 +units=m";
+ case 32321 : return "+proj=utm +zone=21 +south +ellps=WGS72 +units=m";
+ case 32322 : return "+proj=utm +zone=22 +south +ellps=WGS72 +units=m";
+ case 32323 : return "+proj=utm +zone=23 +south +ellps=WGS72 +units=m";
+ case 32324 : return "+proj=utm +zone=24 +south +ellps=WGS72 +units=m";
+ case 32325 : return "+proj=utm +zone=25 +south +ellps=WGS72 +units=m";
+ case 32326 : return "+proj=utm +zone=26 +south +ellps=WGS72 +units=m";
+ case 32327 : return "+proj=utm +zone=27 +south +ellps=WGS72 +units=m";
+ case 32328 : return "+proj=utm +zone=28 +south +ellps=WGS72 +units=m";
+ case 32329 : return "+proj=utm +zone=29 +south +ellps=WGS72 +units=m";
+ case 32330 : return "+proj=utm +zone=30 +south +ellps=WGS72 +units=m";
+ case 32331 : return "+proj=utm +zone=31 +south +ellps=WGS72 +units=m";
+ case 32332 : return "+proj=utm +zone=32 +south +ellps=WGS72 +units=m";
+ case 32333 : return "+proj=utm +zone=33 +south +ellps=WGS72 +units=m";
+ case 32334 : return "+proj=utm +zone=34 +south +ellps=WGS72 +units=m";
+ case 32335 : return "+proj=utm +zone=35 +south +ellps=WGS72 +units=m";
+ case 32336 : return "+proj=utm +zone=36 +south +ellps=WGS72 +units=m";
+ case 32337 : return "+proj=utm +zone=37 +south +ellps=WGS72 +units=m";
+ case 32338 : return "+proj=utm +zone=38 +south +ellps=WGS72 +units=m";
+ case 32339 : return "+proj=utm +zone=39 +south +ellps=WGS72 +units=m";
+ case 32340 : return "+proj=utm +zone=40 +south +ellps=WGS72 +units=m";
+ case 32341 : return "+proj=utm +zone=41 +south +ellps=WGS72 +units=m";
+ case 32342 : return "+proj=utm +zone=42 +south +ellps=WGS72 +units=m";
+ case 32343 : return "+proj=utm +zone=43 +south +ellps=WGS72 +units=m";
+ case 32344 : return "+proj=utm +zone=44 +south +ellps=WGS72 +units=m";
+ case 32345 : return "+proj=utm +zone=45 +south +ellps=WGS72 +units=m";
+ case 32346 : return "+proj=utm +zone=46 +south +ellps=WGS72 +units=m";
+ case 32347 : return "+proj=utm +zone=47 +south +ellps=WGS72 +units=m";
+ case 32348 : return "+proj=utm +zone=48 +south +ellps=WGS72 +units=m";
+ case 32349 : return "+proj=utm +zone=49 +south +ellps=WGS72 +units=m";
+ case 32350 : return "+proj=utm +zone=50 +south +ellps=WGS72 +units=m";
+ case 32351 : return "+proj=utm +zone=51 +south +ellps=WGS72 +units=m";
+ case 32352 : return "+proj=utm +zone=52 +south +ellps=WGS72 +units=m";
+ case 32353 : return "+proj=utm +zone=53 +south +ellps=WGS72 +units=m";
+ case 32354 : return "+proj=utm +zone=54 +south +ellps=WGS72 +units=m";
+ case 32355 : return "+proj=utm +zone=55 +south +ellps=WGS72 +units=m";
+ case 32356 : return "+proj=utm +zone=56 +south +ellps=WGS72 +units=m";
+ case 32357 : return "+proj=utm +zone=57 +south +ellps=WGS72 +units=m";
+ case 32358 : return "+proj=utm +zone=58 +south +ellps=WGS72 +units=m";
+ case 32359 : return "+proj=utm +zone=59 +south +ellps=WGS72 +units=m";
+ case 32360 : return "+proj=utm +zone=60 +south +ellps=WGS72 +units=m";
+ case 32401 : return "+proj=utm +zone=1 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32402 : return "+proj=utm +zone=2 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32403 : return "+proj=utm +zone=3 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32404 : return "+proj=utm +zone=4 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32405 : return "+proj=utm +zone=5 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32406 : return "+proj=utm +zone=6 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32407 : return "+proj=utm +zone=7 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32408 : return "+proj=utm +zone=8 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32409 : return "+proj=utm +zone=9 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32410 : return "+proj=utm +zone=10 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32411 : return "+proj=utm +zone=11 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32412 : return "+proj=utm +zone=12 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32413 : return "+proj=utm +zone=13 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32414 : return "+proj=utm +zone=14 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32415 : return "+proj=utm +zone=15 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32416 : return "+proj=utm +zone=16 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32417 : return "+proj=utm +zone=17 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32418 : return "+proj=utm +zone=18 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32419 : return "+proj=utm +zone=19 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32420 : return "+proj=utm +zone=20 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32421 : return "+proj=utm +zone=21 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32422 : return "+proj=utm +zone=22 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32423 : return "+proj=utm +zone=23 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32424 : return "+proj=utm +zone=24 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32425 : return "+proj=utm +zone=25 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32426 : return "+proj=utm +zone=26 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32427 : return "+proj=utm +zone=27 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32428 : return "+proj=utm +zone=28 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32429 : return "+proj=utm +zone=29 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32430 : return "+proj=utm +zone=30 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32431 : return "+proj=utm +zone=31 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32432 : return "+proj=utm +zone=32 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32433 : return "+proj=utm +zone=33 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32434 : return "+proj=utm +zone=34 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32435 : return "+proj=utm +zone=35 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32436 : return "+proj=utm +zone=36 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32437 : return "+proj=utm +zone=37 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32438 : return "+proj=utm +zone=38 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32439 : return "+proj=utm +zone=39 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32440 : return "+proj=utm +zone=40 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32441 : return "+proj=utm +zone=41 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32442 : return "+proj=utm +zone=42 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32443 : return "+proj=utm +zone=43 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32444 : return "+proj=utm +zone=44 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32445 : return "+proj=utm +zone=45 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32446 : return "+proj=utm +zone=46 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32447 : return "+proj=utm +zone=47 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32448 : return "+proj=utm +zone=48 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32449 : return "+proj=utm +zone=49 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32450 : return "+proj=utm +zone=50 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32451 : return "+proj=utm +zone=51 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32452 : return "+proj=utm +zone=52 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32453 : return "+proj=utm +zone=53 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32454 : return "+proj=utm +zone=54 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32455 : return "+proj=utm +zone=55 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32456 : return "+proj=utm +zone=56 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32457 : return "+proj=utm +zone=57 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32458 : return "+proj=utm +zone=58 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32459 : return "+proj=utm +zone=59 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32460 : return "+proj=utm +zone=60 +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32501 : return "+proj=utm +zone=1 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32502 : return "+proj=utm +zone=2 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32503 : return "+proj=utm +zone=3 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32504 : return "+proj=utm +zone=4 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32505 : return "+proj=utm +zone=5 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32506 : return "+proj=utm +zone=6 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32507 : return "+proj=utm +zone=7 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32508 : return "+proj=utm +zone=8 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32509 : return "+proj=utm +zone=9 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32510 : return "+proj=utm +zone=10 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32511 : return "+proj=utm +zone=11 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32512 : return "+proj=utm +zone=12 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32513 : return "+proj=utm +zone=13 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32514 : return "+proj=utm +zone=14 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32515 : return "+proj=utm +zone=15 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32516 : return "+proj=utm +zone=16 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32517 : return "+proj=utm +zone=17 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32518 : return "+proj=utm +zone=18 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32519 : return "+proj=utm +zone=19 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32520 : return "+proj=utm +zone=20 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32521 : return "+proj=utm +zone=21 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32522 : return "+proj=utm +zone=22 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32523 : return "+proj=utm +zone=23 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32524 : return "+proj=utm +zone=24 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32525 : return "+proj=utm +zone=25 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32526 : return "+proj=utm +zone=26 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32527 : return "+proj=utm +zone=27 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32528 : return "+proj=utm +zone=28 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32529 : return "+proj=utm +zone=29 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32530 : return "+proj=utm +zone=30 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32531 : return "+proj=utm +zone=31 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32532 : return "+proj=utm +zone=32 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32533 : return "+proj=utm +zone=33 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32534 : return "+proj=utm +zone=34 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32535 : return "+proj=utm +zone=35 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32536 : return "+proj=utm +zone=36 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32537 : return "+proj=utm +zone=37 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32538 : return "+proj=utm +zone=38 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32539 : return "+proj=utm +zone=39 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32540 : return "+proj=utm +zone=40 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32541 : return "+proj=utm +zone=41 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32542 : return "+proj=utm +zone=42 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32543 : return "+proj=utm +zone=43 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32544 : return "+proj=utm +zone=44 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32545 : return "+proj=utm +zone=45 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32546 : return "+proj=utm +zone=46 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32547 : return "+proj=utm +zone=47 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32548 : return "+proj=utm +zone=48 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32549 : return "+proj=utm +zone=49 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32550 : return "+proj=utm +zone=50 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32551 : return "+proj=utm +zone=51 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32552 : return "+proj=utm +zone=52 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32553 : return "+proj=utm +zone=53 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32554 : return "+proj=utm +zone=54 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32555 : return "+proj=utm +zone=55 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32556 : return "+proj=utm +zone=56 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32557 : return "+proj=utm +zone=57 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32558 : return "+proj=utm +zone=58 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32559 : return "+proj=utm +zone=59 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32560 : return "+proj=utm +zone=60 +south +ellps=WGS72 +towgs84=0,0,1.9,0,0,0.814,-0.38 +units=m";
+ case 32601 : return "+proj=utm +zone=1 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32602 : return "+proj=utm +zone=2 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32603 : return "+proj=utm +zone=3 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32604 : return "+proj=utm +zone=4 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32605 : return "+proj=utm +zone=5 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32606 : return "+proj=utm +zone=6 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32607 : return "+proj=utm +zone=7 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32608 : return "+proj=utm +zone=8 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32609 : return "+proj=utm +zone=9 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32610 : return "+proj=utm +zone=10 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32611 : return "+proj=utm +zone=11 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32612 : return "+proj=utm +zone=12 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32613 : return "+proj=utm +zone=13 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32614 : return "+proj=utm +zone=14 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32615 : return "+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32616 : return "+proj=utm +zone=16 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32617 : return "+proj=utm +zone=17 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32618 : return "+proj=utm +zone=18 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32619 : return "+proj=utm +zone=19 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32620 : return "+proj=utm +zone=20 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32621 : return "+proj=utm +zone=21 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32622 : return "+proj=utm +zone=22 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32623 : return "+proj=utm +zone=23 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32624 : return "+proj=utm +zone=24 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32625 : return "+proj=utm +zone=25 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32626 : return "+proj=utm +zone=26 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32627 : return "+proj=utm +zone=27 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32628 : return "+proj=utm +zone=28 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32629 : return "+proj=utm +zone=29 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32630 : return "+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32631 : return "+proj=utm +zone=31 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32632 : return "+proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32633 : return "+proj=utm +zone=33 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32634 : return "+proj=utm +zone=34 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32635 : return "+proj=utm +zone=35 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32636 : return "+proj=utm +zone=36 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32637 : return "+proj=utm +zone=37 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32638 : return "+proj=utm +zone=38 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32639 : return "+proj=utm +zone=39 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32640 : return "+proj=utm +zone=40 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32641 : return "+proj=utm +zone=41 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32642 : return "+proj=utm +zone=42 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32643 : return "+proj=utm +zone=43 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32644 : return "+proj=utm +zone=44 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32645 : return "+proj=utm +zone=45 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32646 : return "+proj=utm +zone=46 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32647 : return "+proj=utm +zone=47 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32648 : return "+proj=utm +zone=48 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32649 : return "+proj=utm +zone=49 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32650 : return "+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32651 : return "+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32652 : return "+proj=utm +zone=52 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32653 : return "+proj=utm +zone=53 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32654 : return "+proj=utm +zone=54 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32655 : return "+proj=utm +zone=55 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32656 : return "+proj=utm +zone=56 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32657 : return "+proj=utm +zone=57 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32658 : return "+proj=utm +zone=58 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32659 : return "+proj=utm +zone=59 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32660 : return "+proj=utm +zone=60 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32661 : return "+proj=stere +lat_0=90 +lat_ts=90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32662 : return "+proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32664 : return "+proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +to_meter=0.3048006096012192";
+ case 32665 : return "+proj=tmerc +lat_0=0 +lon_0=-93 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +to_meter=0.3048006096012192";
+ case 32666 : return "+proj=tmerc +lat_0=0 +lon_0=-87 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +to_meter=0.3048006096012192";
+ case 32667 : return "+proj=tmerc +lat_0=0 +lon_0=-81 +k=0.9996 +x_0=500000.001016002 +y_0=0 +ellps=WGS84 +datum=WGS84 +to_meter=0.3048006096012192";
+ case 32701 : return "+proj=utm +zone=1 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32702 : return "+proj=utm +zone=2 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32703 : return "+proj=utm +zone=3 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32704 : return "+proj=utm +zone=4 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32705 : return "+proj=utm +zone=5 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32706 : return "+proj=utm +zone=6 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32707 : return "+proj=utm +zone=7 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32708 : return "+proj=utm +zone=8 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32709 : return "+proj=utm +zone=9 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32710 : return "+proj=utm +zone=10 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32711 : return "+proj=utm +zone=11 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32712 : return "+proj=utm +zone=12 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32713 : return "+proj=utm +zone=13 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32714 : return "+proj=utm +zone=14 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32715 : return "+proj=utm +zone=15 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32716 : return "+proj=utm +zone=16 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32717 : return "+proj=utm +zone=17 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32718 : return "+proj=utm +zone=18 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32719 : return "+proj=utm +zone=19 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32720 : return "+proj=utm +zone=20 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32721 : return "+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32722 : return "+proj=utm +zone=22 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32723 : return "+proj=utm +zone=23 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32724 : return "+proj=utm +zone=24 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32725 : return "+proj=utm +zone=25 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32726 : return "+proj=utm +zone=26 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32727 : return "+proj=utm +zone=27 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32728 : return "+proj=utm +zone=28 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32729 : return "+proj=utm +zone=29 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32730 : return "+proj=utm +zone=30 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32731 : return "+proj=utm +zone=31 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32732 : return "+proj=utm +zone=32 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32733 : return "+proj=utm +zone=33 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32734 : return "+proj=utm +zone=34 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32735 : return "+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32736 : return "+proj=utm +zone=36 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32737 : return "+proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32738 : return "+proj=utm +zone=38 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32739 : return "+proj=utm +zone=39 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32740 : return "+proj=utm +zone=40 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32741 : return "+proj=utm +zone=41 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32742 : return "+proj=utm +zone=42 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32743 : return "+proj=utm +zone=43 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32744 : return "+proj=utm +zone=44 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32745 : return "+proj=utm +zone=45 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32746 : return "+proj=utm +zone=46 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32747 : return "+proj=utm +zone=47 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32748 : return "+proj=utm +zone=48 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32749 : return "+proj=utm +zone=49 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32750 : return "+proj=utm +zone=50 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32751 : return "+proj=utm +zone=51 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32752 : return "+proj=utm +zone=52 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32753 : return "+proj=utm +zone=53 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32754 : return "+proj=utm +zone=54 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32755 : return "+proj=utm +zone=55 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32756 : return "+proj=utm +zone=56 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32757 : return "+proj=utm +zone=57 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32758 : return "+proj=utm +zone=58 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32759 : return "+proj=utm +zone=59 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32760 : return "+proj=utm +zone=60 +south +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32761 : return "+proj=stere +lat_0=-90 +lat_ts=-90 +lon_0=0 +k=0.994 +x_0=2000000 +y_0=2000000 +ellps=WGS84 +datum=WGS84 +units=m";
+ case 32766 : return "+proj=tmerc +lat_0=0 +lon_0=36 +k=0.9996 +x_0=500000 +y_0=10000000 +ellps=WGS84 +datum=WGS84 +units=m";
+ }
+ return "";
+ }
+
+ }
+ #endif // DOXYGEN_NO_IMPL
+
+ // Overloaded function
+ parameters init(int epsg_code)
+ {
+ std::string args = impl::code_to_string(epsg_code);
+ return impl::pj_init_plus(args, false);
+ }
+
+}
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/epsg_traits.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/epsg_traits.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,40 @@
+#ifndef _PROJECTIONS_EPSG_TRAITS_HPP
+#define _PROJECTIONS_EPSG_TRAITS_HPP
+
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include "geometry/projections/impl/projects.hpp"
+
+
+namespace projection
+{
+ /*!
+ \brief EPSG traits
+ \details With help of the EPSG traits library users can statically use projections
+ or coordinate systems specifying an EPSG code. The correct projections for transformations
+ are used automically then, still keeping static polymorphism.
+ \ingroup projection
+ \tparam EPSG epsg code
+ \tparam LL latlong point type
+ \tparam XY xy point type
+ \tparam PAR parameter type, normally not specified
+ */
+ template <size_t EPSG, typename LLR, typename XY, typename PAR = parameters>
+ struct epsg_traits
+ {
+ // Specializations define:
+ // - type to get projection type
+ // - function par to get parameters
+ };
+
+}
+
+#endif
+

Added: sandbox/ggl/boost/ggl/geometry/projections/factory.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/factory.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,242 @@
+#ifndef _PROJECTIONS_FACTORY_HPP
+#define _PROJECTIONS_FACTORY_HPP
+
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <geometry/projections/parameters.hpp>
+#include <geometry/projections/impl/factory_entry.hpp>
+
+#include <geometry/projections/proj/aea.hpp>
+#include <geometry/projections/proj/aeqd.hpp>
+#include <geometry/projections/proj/airy.hpp>
+#include <geometry/projections/proj/aitoff.hpp>
+#include <geometry/projections/proj/august.hpp>
+#include <geometry/projections/proj/bacon.hpp>
+#include <geometry/projections/proj/bipc.hpp>
+#include <geometry/projections/proj/boggs.hpp>
+#include <geometry/projections/proj/bonne.hpp>
+#include <geometry/projections/proj/cass.hpp>
+#include <geometry/projections/proj/cc.hpp>
+#include <geometry/projections/proj/cea.hpp>
+#include <geometry/projections/proj/chamb.hpp> // control points XY
+#include <geometry/projections/proj/collg.hpp>
+#include <geometry/projections/proj/crast.hpp>
+#include <geometry/projections/proj/denoy.hpp>
+#include <geometry/projections/proj/eck1.hpp>
+#include <geometry/projections/proj/eck2.hpp>
+#include <geometry/projections/proj/eck3.hpp>
+#include <geometry/projections/proj/eck4.hpp>
+#include <geometry/projections/proj/eck5.hpp>
+#include <geometry/projections/proj/eqc.hpp>
+#include <geometry/projections/proj/eqdc.hpp>
+#include <geometry/projections/proj/fahey.hpp>
+#include <geometry/projections/proj/fouc_s.hpp>
+#include <geometry/projections/proj/gall.hpp>
+#include <geometry/projections/proj/geocent.hpp>
+#include <geometry/projections/proj/geos.hpp>
+#include <geometry/projections/proj/gins8.hpp>
+#include <geometry/projections/proj/gn_sinu.hpp>
+#include <geometry/projections/proj/gnom.hpp>
+#include <geometry/projections/proj/goode.hpp> // includes two other projections
+#include <geometry/projections/proj/gstmerc.hpp>
+#include <geometry/projections/proj/hammer.hpp>
+#include <geometry/projections/proj/hatano.hpp>
+#include <geometry/projections/proj/krovak.hpp>
+#include <geometry/projections/proj/imw_p.hpp> // xy functions after inverse
+#include <geometry/projections/proj/laea.hpp>
+#include <geometry/projections/proj/labrd.hpp>
+#include <geometry/projections/proj/lagrng.hpp>
+#include <geometry/projections/proj/larr.hpp>
+#include <geometry/projections/proj/lask.hpp>
+#include <geometry/projections/proj/latlong.hpp>
+#include <geometry/projections/proj/lcc.hpp>
+#include <geometry/projections/proj/lcca.hpp>
+#include <geometry/projections/proj/loxim.hpp>
+#include <geometry/projections/proj/lsat.hpp>
+#include <geometry/projections/proj/mbtfpp.hpp>
+#include <geometry/projections/proj/mbtfpq.hpp>
+#include <geometry/projections/proj/mbt_fps.hpp>
+#include <geometry/projections/proj/merc.hpp>
+#include <geometry/projections/proj/mill.hpp>
+#include <geometry/projections/proj/mod_ster.hpp>
+#include <geometry/projections/proj/moll.hpp>
+#include <geometry/projections/proj/nell.hpp>
+#include <geometry/projections/proj/nell_h.hpp>
+#include <geometry/projections/proj/nocol.hpp>
+#include <geometry/projections/proj/nsper.hpp>
+#include <geometry/projections/proj/nzmg.hpp>
+#include <geometry/projections/proj/ob_tran.hpp> // includes other projection
+#include <geometry/projections/proj/ocea.hpp>
+#include <geometry/projections/proj/oea.hpp>
+#include <geometry/projections/proj/omerc.hpp>
+#include <geometry/projections/proj/ortho.hpp>
+#include <geometry/projections/proj/poly.hpp>
+#include <geometry/projections/proj/putp2.hpp>
+#include <geometry/projections/proj/putp3.hpp>
+#include <geometry/projections/proj/putp4p.hpp>
+#include <geometry/projections/proj/putp5.hpp>
+#include <geometry/projections/proj/putp6.hpp>
+#include <geometry/projections/proj/robin.hpp>
+#include <geometry/projections/proj/rouss.hpp>
+#include <geometry/projections/proj/rpoly.hpp>
+#include <geometry/projections/proj/sconics.hpp>
+#include <geometry/projections/proj/somerc.hpp>
+#include <geometry/projections/proj/stere.hpp>
+#include <geometry/projections/proj/sterea.hpp>
+#include <geometry/projections/proj/sts.hpp>
+#include <geometry/projections/proj/tcc.hpp>
+#include <geometry/projections/proj/tcea.hpp>
+#include <geometry/projections/proj/tmerc.hpp>
+#include <geometry/projections/proj/tpeqd.hpp>
+#include <geometry/projections/proj/urm5.hpp>
+#include <geometry/projections/proj/urmfps.hpp>
+#include <geometry/projections/proj/vandg.hpp>
+#include <geometry/projections/proj/vandg2.hpp>
+#include <geometry/projections/proj/vandg4.hpp>
+#include <geometry/projections/proj/wag2.hpp>
+#include <geometry/projections/proj/wag3.hpp>
+#include <geometry/projections/proj/wag7.hpp>
+#include <geometry/projections/proj/wink1.hpp>
+#include <geometry/projections/proj/wink2.hpp>
+
+#include <boost/shared_ptr.hpp>
+
+#include <map>
+
+namespace projection
+{
+ template <typename LL, typename XY, typename PAR = parameters>
+ class factory : public impl::base_factory<LL, XY, PAR>
+ {
+ private :
+ typedef std::map<std::string, boost::shared_ptr<impl::factory_entry<LL, XY, PAR> > > MAP;
+ MAP m_registry;
+
+ public :
+ factory()
+ {
+ impl::aea_init(*this);
+ impl::aeqd_init(*this);
+ impl::airy_init(*this);
+ impl::aitoff_init(*this);
+ impl::august_init(*this);
+ impl::bacon_init(*this);
+ impl::bipc_init(*this);
+ impl::boggs_init(*this);
+ impl::bonne_init(*this);
+ impl::cass_init(*this);
+ impl::cc_init(*this);
+ impl::cea_init(*this);
+ impl::chamb_init(*this);
+ impl::collg_init(*this);
+ impl::crast_init(*this);
+ impl::denoy_init(*this);
+ impl::eck1_init(*this);
+ impl::eck2_init(*this);
+ impl::eck3_init(*this);
+ impl::eck4_init(*this);
+ impl::eck5_init(*this);
+ impl::eqc_init(*this);
+ impl::eqdc_init(*this);
+ impl::fahey_init(*this);
+ impl::fouc_s_init(*this);
+ impl::gall_init(*this);
+ impl::geocent_init(*this);
+ impl::geos_init(*this);
+ impl::gins8_init(*this);
+ impl::gn_sinu_init(*this);
+ impl::gnom_init(*this);
+ impl::goode_init(*this);
+ impl::gstmerc_init(*this);
+ impl::hammer_init(*this);
+ impl::hatano_init(*this);
+ impl::krovak_init(*this);
+ impl::imw_p_init(*this);
+ impl::labrd_init(*this);
+ impl::laea_init(*this);
+ impl::lagrng_init(*this);
+ impl::larr_init(*this);
+ impl::lask_init(*this);
+ impl::latlong_init(*this);
+ impl::lcc_init(*this);
+ impl::lcca_init(*this);
+ impl::loxim_init(*this);
+ impl::lsat_init(*this);
+ impl::mbtfpp_init(*this);
+ impl::mbtfpq_init(*this);
+ impl::mbt_fps_init(*this);
+ impl::merc_init(*this);
+ impl::mill_init(*this);
+ impl::mod_ster_init(*this);
+ impl::moll_init(*this);
+ impl::nell_init(*this);
+ impl::nell_h_init(*this);
+ impl::nocol_init(*this);
+ impl::nsper_init(*this);
+ impl::nzmg_init(*this);
+ impl::ob_tran_init(*this);
+ impl::ocea_init(*this);
+ impl::oea_init(*this);
+ impl::omerc_init(*this);
+ impl::ortho_init(*this);
+ impl::poly_init(*this);
+ impl::putp2_init(*this);
+ impl::putp3_init(*this);
+ impl::putp4p_init(*this);
+ impl::putp5_init(*this);
+ impl::putp6_init(*this);
+ impl::robin_init(*this);
+ impl::rouss_init(*this);
+ impl::rpoly_init(*this);
+ impl::sconics_init(*this);
+ impl::somerc_init(*this);
+ impl::stere_init(*this);
+ impl::sterea_init(*this);
+ impl::sts_init(*this);
+ impl::tcc_init(*this);
+ impl::tcea_init(*this);
+ impl::tmerc_init(*this);
+ impl::tpeqd_init(*this);
+ impl::urm5_init(*this);
+ impl::urmfps_init(*this);
+ impl::vandg_init(*this);
+ impl::vandg2_init(*this);
+ impl::vandg4_init(*this);
+ impl::wag2_init(*this);
+ impl::wag3_init(*this);
+ impl::wag7_init(*this);
+ impl::wink1_init(*this);
+ impl::wink2_init(*this);
+ }
+
+ virtual ~factory() {}
+
+ virtual void add_to_factory(const std::string& name, impl::factory_entry<LL, XY, PAR>* sub)
+ {
+ m_registry[name].reset(sub);
+ }
+
+ inline projection<LL, XY>* create_new(const PAR& parameters)
+ {
+ typename MAP::iterator it = m_registry.find(parameters.name);
+ if (it != m_registry.end())
+ {
+ return it->second->create_new(parameters);
+ }
+ return NULL;
+ }
+
+
+ };
+
+
+};
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/aasincos.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/aasincos.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,80 @@
+#ifndef _PROJECTIONS_AASINCOS_HPP
+#define _PROJECTIONS_AASINCOS_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+
+namespace projection
+{
+ namespace impl
+ {
+ namespace aasincos
+ {
+ static const double ONE_TOL= 1.00000000000001;
+ //static const double TOL = 0.000000001;
+ static const double ATOL = 1e-50;
+ }
+
+ double
+ aasin(double v) {
+ double av;
+
+ if ((av = fabs(v)) >= 1.) {
+ if (av > aasincos::ONE_TOL)
+ throw proj_exception(-19);
+ return (v < 0. ? -HALFPI : HALFPI);
+ }
+ return asin(v);
+ }
+ double
+ aacos(double v) {
+ double av;
+
+ if ((av = fabs(v)) >= 1.) {
+ if (av > aasincos::ONE_TOL)
+ throw proj_exception(-19);
+ return (v < 0. ? PI : 0.);
+ }
+ return acos(v);
+ }
+ double
+ asqrt(double v) { return ((v <= 0) ? 0. : sqrt(v)); }
+ double
+ aatan2(double n, double d) {
+ return ((fabs(n) < aasincos::ATOL && fabs(d) < aasincos::ATOL) ? 0. : atan2(n,d));
+ }
+ }
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/adjlon.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/adjlon.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,58 @@
+#ifndef _PROJECTIONS_ADJLON_HPP
+#define _PROJECTIONS_ADJLON_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#include <geometry/projections/impl/projects.hpp>
+
+namespace projection
+{
+ namespace impl
+ {
+ /* reduce argument to range +/- PI */
+ inline double adjlon (double lon)
+ {
+ static const double SPI = 3.14159265359;
+ static const double TWOPI = 6.2831853071795864769;
+ static const double ONEPI = 3.14159265358979323846;
+ if (fabs(lon) <= SPI) return( lon );
+ lon += ONEPI; /* adjust to 0..2pi rad */
+ lon -= TWOPI * floor(lon / TWOPI); /* remove integral # of 'revolutions'*/
+ lon -= ONEPI; /* adjust back to -pi..pi rad */
+ return( lon );
+ }
+ }
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/base_dynamic.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/base_dynamic.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,88 @@
+#ifndef _PROJECTIONS_BASE_DYNAMIC_HPP
+#define _PROJECTIONS_BASE_DYNAMIC_HPP
+
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <geometry/projections/projection.hpp>
+
+
+namespace projection
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ // Base-virtual-forward
+ template <typename C, typename LL, typename XY, typename PAR>
+ class base_v_f : public projection<LL, XY>
+ {
+ protected :
+ typedef typename projection<LL, XY>::LL_T LL_T;
+ typedef typename projection<LL, XY>::XY_T XY_T;
+ C m_proj;
+
+ public :
+ base_v_f(const PAR& par) : m_proj(par) {}
+
+ virtual bool forward(const LL& ll, XY& xy) const
+ {
+ return m_proj.forward(ll, xy);
+ }
+ virtual void fwd(LL_T& lp_lon, LL_T& lp_lat, XY_T& xy_x, XY_T& xy_y) const
+ {
+ m_proj.fwd(lp_lon, lp_lat, xy_x, xy_y);
+ }
+
+ virtual bool inverse(const XY& xy, LL& ll) const
+ {
+ // exception?
+ return false;
+ }
+ virtual void inv(XY_T& xy_x, XY_T& xy_y, LL_T& lp_lon, LL_T& lp_lat) const
+ {
+ // exception?
+ }
+
+ virtual std::string name() const
+ {
+ return m_proj.name();
+ }
+
+ };
+
+ // Base-virtual-forward/inverse
+ template <typename C, typename LL, typename XY, typename PAR>
+ class base_v_fi : public base_v_f<C, LL, XY, PAR>
+ {
+ typedef typename base_v_f<C, LL, XY, PAR>::LL_T LL_T;
+ typedef typename base_v_f<C, LL, XY, PAR>::XY_T XY_T;
+
+ public :
+ base_v_fi(const PAR& par) : base_v_f<C, LL, XY, PAR>(par) {}
+
+ virtual bool inverse(const XY& xy, LL& ll) const
+ {
+ return this->m_proj.inverse(xy, ll);
+ }
+ void inv(XY_T& xy_x, XY_T& xy_y, LL_T& lp_lon, LL_T& lp_lat) const
+ {
+ this->m_proj.inv(xy_x, xy_y, lp_lon, lp_lat);
+ }
+
+ };
+ }
+ #endif
+
+}
+
+
+
+#endif
+

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/base_static.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/base_static.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,85 @@
+#ifndef _PROJECTIONS_BASE_STATIC_HPP
+#define _PROJECTIONS_BASE_STATIC_HPP
+
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <geometry/projections/impl/pj_fwd.hpp>
+#include <geometry/projections/impl/pj_inv.hpp>
+
+
+namespace projection
+{
+
+ #ifndef DOXYGEN_NO_IMPL
+ namespace impl
+ {
+ // Base-template-forward
+ template <typename PRJ, typename LL, typename XY, typename PAR>
+ struct base_t_f
+ {
+ protected :
+ // some projections do not work with float -> wrong results
+ // todo: make traits which select <double> from int/float/double and else selects T
+
+ //typedef typename geometry::coordinate_type<LL>::type LL_T;
+ //typedef typename geometry::coordinate_type<XY>::type XY_T;
+ typedef double LL_T;
+ typedef double XY_T;
+ PAR m_par;
+ const PRJ& m_prj;
+
+ public :
+ inline base_t_f(const PRJ& prj, const PAR& par) : m_par(par), m_prj(prj) {}
+ inline bool forward(const LL& lp, XY& xy) const
+ {
+ try
+ {
+ pj_fwd(m_prj, m_par, lp, xy);
+ return true;
+ }
+ catch(...)
+ {
+ return false;
+ }
+ }
+
+ inline std::string name() const { return this->m_par.name; }
+
+ };
+
+ // Base-template-forward/inverse
+ template <typename PRJ, typename LL, typename XY, typename PAR>
+ struct base_t_fi : public base_t_f<PRJ, LL, XY, PAR>
+ {
+ public :
+ inline base_t_fi(const PRJ& prj, const PAR& par) : base_t_f<PRJ, LL, XY, PAR>(prj, par) {}
+
+ inline bool inverse(const XY& xy, LL& lp) const
+ {
+ try
+ {
+ pj_inv(this->m_prj, this->m_par, xy, lp);
+ return true;
+ }
+ catch(...)
+ {
+ return false;
+ }
+ }
+ };
+ }
+ #endif
+
+}
+
+
+
+#endif
+

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/factory_entry.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/factory_entry.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,43 @@
+#ifndef _PROJECTIONS_FACTORY_ENTRY_HPP
+#define _PROJECTIONS_FACTORY_ENTRY_HPP
+
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <string>
+
+
+#include <geometry/projections/projection.hpp>
+
+
+namespace projection
+{
+ namespace impl
+ {
+ template <typename LL, typename XY, typename PAR>
+ class factory_entry
+ {
+ public :
+ virtual ~factory_entry() {}
+ virtual projection<LL, XY>* create_new(const PAR& par) const = 0;
+ };
+
+ template <typename LL, typename XY, typename PAR>
+ class base_factory
+ {
+ public :
+ virtual ~base_factory() {}
+ virtual void add_to_factory(const std::string& name, factory_entry<LL, XY, PAR>* sub) = 0;
+ };
+
+ }
+
+}
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/function_overloads.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/function_overloads.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,37 @@
+#ifndef _PROJECTIONS_FUNCTION_OVERLOADS_HPP
+#define _PROJECTIONS_FUNCTION_OVERLOADS_HPP
+
+// Generic Geometry Library
+//
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+
+
+namespace projection
+{
+
+ // Functions to resolve ambiguity when compiling with coordinates of different types
+ /*inline double atan2(double a, double b)
+ {
+ return ::atan2(a, b);
+ }
+ inline double pow(double a, double b)
+ {
+ return ::pow(a, b);
+ }
+ */
+
+ inline int int_floor(double f)
+ {
+ return int(::floor(f));
+ }
+
+}
+
+
+#endif
+

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_auth.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_auth.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,75 @@
+#ifndef _PROJECTIONS_PJ_AUTH_HPP
+#define _PROJECTIONS_PJ_AUTH_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+namespace projection
+{
+ namespace impl
+ {
+ static const double P00 = .33333333333333333333;
+ static const double P01 = .17222222222222222222;
+ static const double P02 = .10257936507936507936;
+ static const double P10 = .06388888888888888888;
+ static const double P11 = .06640211640211640211;
+ static const double P20 = .01641501294219154443;
+ static const int APA_SIZE = 3;
+
+ /* determine latitude from authalic latitude */
+ inline void pj_authset(double es, double* APA)
+ {
+ double t;
+
+ // if (APA = (double *)pj_malloc(APA_SIZE * sizeof(double)))
+ {
+ APA[0] = es * P00;
+ t = es * es;
+ APA[0] += t * P01;
+ APA[1] = t * P10;
+ t *= es;
+ APA[0] += t * P02;
+ APA[1] += t * P11;
+ APA[2] = t * P20;
+ }
+ }
+ inline double pj_authlat(double beta, const double *APA)
+ {
+ double t = beta+beta;
+ return(beta + APA[0] * sin(t) + APA[1] * sin(t+t) + APA[2] * sin(t+t+t));
+ }
+
+ }
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_datum_set.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_datum_set.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,160 @@
+#ifndef _PROJECTIONS_PJ_DATUM_SET_HPP
+#define _PROJECTIONS_PJ_DATUM_SET_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+
+#include "geometry/projections/parameters.hpp"
+#include "geometry/projections/impl/pj_param.hpp"
+#include "geometry/projections/impl/pj_datums.hpp"
+
+
+namespace projection
+{
+ namespace impl
+ {
+
+
+ /* SEC_TO_RAD = Pi/180/3600 */
+ const double SEC_TO_RAD = 4.84813681109535993589914102357e-6;
+
+ /************************************************************************/
+ /* pj_datum_set() */
+ /************************************************************************/
+
+ void pj_datum_set(std::vector<pvalue>& pvalues, parameters& projdef)
+
+ {
+ std::string name, towgs84, nadgrids;
+
+ projdef.datum_type = PJD_UNKNOWN;
+
+ /* -------------------------------------------------------------------- */
+ /* Is there a datum definition in the parameter list? If so, */
+ /* add the defining values to the parameter list. Note that */
+ /* this will append the ellipse definition as well as the */
+ /* towgs84= and related parameters. It should also be pointed */
+ /* out that the addition is permanent rather than temporary */
+ /* like most other keyword expansion so that the ellipse */
+ /* definition will last into the pj_ell_set() function called */
+ /* after this one. */
+ /* -------------------------------------------------------------------- */
+ name = pj_param(pvalues, "sdatum").s;
+ if(! name.empty())
+ {
+ /* find the datum definition */
+ const int n = sizeof(pj_datums) / sizeof(pj_datums[0]);
+ int index = -1;
+ for (int i = 0; i < n && index == -1; i++)
+ {
+ if(pj_datums[i].id == name)
+ {
+ index = i;
+ }
+ }
+
+ if (index == -1) { throw proj_exception(-9); }
+
+ if(! pj_datums[index].ellipse_id.empty())
+ {
+ std::string entry("ellps=");
+ entry +=pj_datums[index].ellipse_id;
+ pvalues.push_back(pj_mkparam(entry));
+ }
+
+ if(! pj_datums[index].defn.empty())
+ {
+ pvalues.push_back(pj_mkparam(pj_datums[index].defn));
+ }
+ }
+
+ /* -------------------------------------------------------------------- */
+ /* Check for nadgrids parameter. */
+ /* -------------------------------------------------------------------- */
+ nadgrids = pj_param(pvalues, "snadgrids").s;
+ towgs84 = pj_param(pvalues, "stowgs84").s;
+ if(! nadgrids.empty())
+ {
+ /* We don't actually save the value separately. It will continue
+ to exist int he param list for use in pj_apply_gridshift.c */
+
+ projdef.datum_type = PJD_GRIDSHIFT;
+ }
+
+ /* -------------------------------------------------------------------- */
+ /* Check for towgs84 parameter. */
+ /* -------------------------------------------------------------------- */
+ else if(! towgs84.empty())
+ {
+ int parm_count = 0;
+
+ int n = sizeof(projdef.datum_params) / sizeof(projdef.datum_params[0]);
+
+ /* parse out the pvalues */
+ std::vector<std::string> parm;
+ boost::split(parm, towgs84, boost::is_any_of(" ,"));
+ for (std::vector<std::string>::const_iterator it = parm.begin();
+ it != parm.end() && parm_count < n;
+ it++, parm_count++)
+ {
+ projdef.datum_params[parm_count++] = atof(it->c_str());
+ }
+
+ if( projdef.datum_params[3] != 0.0
+ || projdef.datum_params[4] != 0.0
+ || projdef.datum_params[5] != 0.0
+ || projdef.datum_params[6] != 0.0 )
+ {
+ projdef.datum_type = PJD_7PARAM;
+
+ /* transform from arc seconds to radians */
+ projdef.datum_params[3] *= SEC_TO_RAD;
+ projdef.datum_params[4] *= SEC_TO_RAD;
+ projdef.datum_params[5] *= SEC_TO_RAD;
+ /* transform from parts per million to scaling factor */
+ projdef.datum_params[6] =
+ (projdef.datum_params[6]/1000000.0) + 1;
+ }
+ else
+ projdef.datum_type = PJD_3PARAM;
+
+ /* Note that pj_init() will later switch datum_type to
+ PJD_WGS84 if shifts are all zero, and ellipsoid is WGS84 or GRS80 */
+ }
+
+ }
+ }
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_datums.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_datums.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,88 @@
+#ifndef _PROJECTIONS_PJ_DATUMS_HPP
+#define _PROJECTIONS_PJ_DATUMS_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+
+namespace projection
+{
+ namespace impl
+ {
+
+ /*
+ * The ellipse code must match one from pj_ellps.c. The datum id should
+ * be kept to 12 characters or less if possible. Use the official OGC
+ * datum name for the comments if available.
+ */
+
+ PJ_DATUMS pj_datums[] = {
+ /* id definition ellipse comments */
+ /* -- ---------- ------- -------- */
+ "WGS84", "towgs84=0,0,0", "WGS84", "",
+ "GGRS87", "towgs84=-199.87,74.79,246.62", "GRS80", "Greek_Geodetic_Reference_System_1987",
+ "NAD83", "towgs84=0,0,0", "GRS80","North_American_Datum_1983",
+ "NAD27", "nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",
+ "clrk66", "North_American_Datum_1927",
+ "potsdam", "towgs84=606.0,23.0,413.0", "bessel", "Potsdam Rauenberg 1950 DHDN",
+ "carthage", "towgs84=-263.0,6.0,431.0", "clark80", "Carthage 1934 Tunisia",
+ "hermannskogel", "towgs84=653.0,-212.0,449.0", "bessel", "Hermannskogel",
+ "ire65", "towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", "mod_airy", "Ireland 1965",
+ "nzgd49", "towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", "intl", "New Zealand Geodetic Datum 1949",
+ "OSGB36", "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", "airy", "Airy 1830",
+ };
+
+
+
+ PJ_PRIME_MERIDIANS pj_prime_meridians[] = {
+ /* id definition */
+ /* -- ---------- */
+ "greenwich", "0dE",
+ "lisbon", "9d07'54.862\"W",
+ "paris", "2d20'14.025\"E",
+ "bogota", "74d04'51.3\"W",
+ "madrid", "3d41'16.58\"W",
+ "rome", "12d27'8.4\"E",
+ "bern", "7d26'22.5\"E",
+ "jakarta", "106d48'27.79\"E",
+ "ferro", "17d40'W",
+ "brussels", "4d22'4.71\"E",
+ "stockholm", "18d3'29.8\"E",
+ "athens", "23d42'58.815\"E",
+ "oslo", "10d43'22.5\"E",
+ };
+
+ }
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_ell_set.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_ell_set.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,147 @@
+#ifndef _PROJECTIONS_PJ_ELL_SET_HPP
+#define _PROJECTIONS_PJ_ELL_SET_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#include "geometry/projections/impl/pj_param.hpp"
+#include "geometry/projections/impl/pj_ellps.hpp"
+
+
+namespace projection
+{
+ namespace impl
+ {
+
+ /* set ellipsoid parameters a and es */
+ static const double SIXTH = .1666666666666666667; /* 1/6 */
+ static const double RA4 = .04722222222222222222; /* 17/360 */
+ static const double RA6 = .02215608465608465608; /* 67/3024 */
+ static const double RV4 = .06944444444444444444; /* 5/72 */
+ static const double RV6 = .04243827160493827160; /* 55/1296 */
+
+ void /* initialize geographic shape parameters */
+ pj_ell_set(std::vector<pvalue>& parameters, double &a, double &es)
+ {
+ int i;
+ double b=0.0, e;
+ std::string name;
+
+ /* check for varying forms of ellipsoid input */
+ a = es = 0.;
+ /* R takes precedence */
+ if (pj_param(parameters, "tR").i)
+ a = pj_param(parameters, "dR").f;
+ else { /* probable elliptical figure */
+
+ /* check if ellps present and temporarily append its values to pl */
+ name = pj_param(parameters, "sellps").s;
+ if (! name.empty())
+ {
+ const int n = sizeof(pj_ellps) / sizeof(pj_ellps[0]);
+ int index = -1;
+ for (int i = 0; i < n && index == -1; i++)
+ {
+ if(pj_ellps[i].id == name)
+ {
+ index = i;
+ }
+ }
+
+ if (index == -1) { throw proj_exception(-9); }
+
+ parameters.push_back(pj_mkparam(pj_ellps[index].major));
+ parameters.push_back(pj_mkparam(pj_ellps[index].ell));
+ }
+ a = pj_param(parameters, "da").f;
+ if (pj_param(parameters, "tes").i) /* eccentricity squared */
+ es = pj_param(parameters, "des").f;
+ else if (pj_param(parameters, "te").i) { /* eccentricity */
+ e = pj_param(parameters, "de").f;
+ es = e * e;
+ } else if (pj_param(parameters, "trf").i) { /* recip flattening */
+ es = pj_param(parameters, "drf").f;
+ if (!es) {
+ throw proj_exception(-10);
+ }
+ es = 1./ es;
+ es = es * (2. - es);
+ } else if (pj_param(parameters, "tf").i) { /* flattening */
+ es = pj_param(parameters, "df").f;
+ es = es * (2. - es);
+ } else if (pj_param(parameters, "tb").i) { /* minor axis */
+ b = pj_param(parameters, "db").f;
+ es = 1. - (b * b) / (a * a);
+ } /* else es == 0. and sphere of radius a */
+ if (!b)
+ b = a * sqrt(1. - es);
+ /* following options turn ellipsoid into equivalent sphere */
+ if (pj_param(parameters, "bR_A").i) { /* sphere--area of ellipsoid */
+ a *= 1. - es * (SIXTH + es * (RA4 + es * RA6));
+ es = 0.;
+ } else if (pj_param(parameters, "bR_V").i) { /* sphere--vol. of ellipsoid */
+ a *= 1. - es * (SIXTH + es * (RV4 + es * RV6));
+ es = 0.;
+ } else if (pj_param(parameters, "bR_a").i) { /* sphere--arithmetic mean */
+ a = .5 * (a + b);
+ es = 0.;
+ } else if (pj_param(parameters, "bR_g").i) { /* sphere--geometric mean */
+ a = sqrt(a * b);
+ es = 0.;
+ } else if (pj_param(parameters, "bR_h").i) { /* sphere--harmonic mean */
+ a = 2. * a * b / (a + b);
+ es = 0.;
+ } else if ((i = pj_param(parameters, "tR_lat_a").i) || /* sphere--arith. */
+ pj_param(parameters, "tR_lat_g").i) { /* or geom. mean at latitude */
+ double tmp;
+
+ tmp = sin(pj_param(parameters, i ? "rR_lat_a" : "rR_lat_g").f);
+ if (fabs(tmp) > HALFPI) {
+ throw proj_exception(-11);
+ }
+ tmp = 1. - es * tmp * tmp;
+ a *= i ? .5 * (1. - es + tmp) / ( tmp * sqrt(tmp)) :
+ sqrt(1. - es) / tmp;
+ es = 0.;
+ }
+ }
+ /* some remaining checks */
+ if (es < 0.)
+ { throw proj_exception(-12); }
+ if (a <= 0.)
+ { throw proj_exception(-13); }
+ }
+ }
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_ellps.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_ellps.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,91 @@
+#ifndef _PROJECTIONS_PJ_ELLPS_HPP
+#define _PROJECTIONS_PJ_ELLPS_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+
+namespace projection
+{
+ namespace impl
+ {
+
+ PJ_ELLPS pj_ellps[] = {
+ "MERIT", "a=6378137.0", "rf=298.257", "MERIT 1983",
+ "SGS85", "a=6378136.0", "rf=298.257", "Soviet Geodetic System 85",
+ "GRS80", "a=6378137.0", "rf=298.257222101", "GRS 1980(IUGG, 1980)",
+ "IAU76", "a=6378140.0", "rf=298.257", "IAU 1976",
+ "airy", "a=6377563.396", "b=6356256.910", "Airy 1830",
+ "APL4.9", "a=6378137.0.", "rf=298.25", "Appl. Physics. 1965",
+ "NWL9D", "a=6378145.0.", "rf=298.25", "Naval Weapons Lab., 1965",
+ "mod_airy", "a=6377340.189", "b=6356034.446", "Modified Airy",
+ "andrae", "a=6377104.43", "rf=300.0", "Andrae 1876 (Den., Iclnd.)",
+ "aust_SA", "a=6378160.0", "rf=298.25", "Australian Natl & S. Amer. 1969",
+ "GRS67", "a=6378160.0", "rf=298.2471674270", "GRS 67(IUGG 1967)",
+ "bessel", "a=6377397.155", "rf=299.1528128", "Bessel 1841",
+ "bess_nam", "a=6377483.865", "rf=299.1528128", "Bessel 1841 (Namibia)",
+ "clrk66", "a=6378206.4", "b=6356583.8", "Clarke 1866",
+ "clrk80", "a=6378249.145", "rf=293.4663", "Clarke 1880 mod.",
+ "CPM", "a=6375738.7", "rf=334.29", "Comm. des Poids et Mesures 1799",
+ "delmbr", "a=6376428.", "rf=311.5", "Delambre 1810 (Belgium)",
+ "engelis", "a=6378136.05", "rf=298.2566", "Engelis 1985",
+ "evrst30", "a=6377276.345", "rf=300.8017", "Everest 1830",
+ "evrst48", "a=6377304.063", "rf=300.8017", "Everest 1948",
+ "evrst56", "a=6377301.243", "rf=300.8017", "Everest 1956",
+ "evrst69", "a=6377295.664", "rf=300.8017", "Everest 1969",
+ "evrstSS", "a=6377298.556", "rf=300.8017", "Everest (Sabah & Sarawak)",
+ "fschr60", "a=6378166.", "rf=298.3", "Fischer (Mercury Datum) 1960",
+ "fschr60m", "a=6378155.", "rf=298.3", "Modified Fischer 1960",
+ "fschr68", "a=6378150.", "rf=298.3", "Fischer 1968",
+ "helmert", "a=6378200.", "rf=298.3", "Helmert 1906",
+ "hough", "a=6378270.0", "rf=297.", "Hough",
+ "intl", "a=6378388.0", "rf=297.", "International 1909 (Hayford)",
+ "krass", "a=6378245.0", "rf=298.3", "Krassovsky, 1942",
+ "kaula", "a=6378163.", "rf=298.24", "Kaula 1961",
+ "lerch", "a=6378139.", "rf=298.257", "Lerch 1979",
+ "mprts", "a=6397300.", "rf=191.", "Maupertius 1738",
+ "new_intl", "a=6378157.5", "b=6356772.2", "New International 1967",
+ "plessis", "a=6376523.", "b=6355863.", "Plessis 1817 (France)",
+ "SEasia", "a=6378155.0", "b=6356773.3205", "Southeast Asia",
+ "walbeck", "a=6376896.0", "b=6355834.8467", "Walbeck",
+ "WGS60", "a=6378165.0", "rf=298.3", "WGS 60",
+ "WGS66", "a=6378145.0", "rf=298.25", "WGS 66",
+ "WGS72", "a=6378135.0", "rf=298.26", "WGS 72",
+ "WGS84", "a=6378137.0", "rf=298.257223563", "WGS 84",
+ "sphere", "a=6370997.0", "b=6370997.0", "Normal Sphere (r=6370997)",
+ };
+
+ }
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_fwd.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_fwd.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,91 @@
+#ifndef _PROJECTIONS_PJ_FWD_HPP
+#define _PROJECTIONS_PJ_FWD_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+
+/* general forward projection */
+#include <geometry/projections/impl/adjlon.hpp>
+#include <geometry/core/radian_access.hpp>
+
+namespace projection
+{
+ namespace impl
+ {
+ namespace forwrd
+ {
+ static const double EPS = 1.0e-12;
+ }
+
+ /* forward projection entry */
+ template <typename PRJ, typename LL, typename XY, typename PAR>
+ inline void pj_fwd(const PRJ& prj, const PAR& par, const LL& ll, XY& xy)
+ {
+ using namespace impl;
+ double lp_lon = geometry::get_as_radian<0>(ll);
+ double lp_lat = geometry::get_as_radian<1>(ll);
+ double t = fabs(lp_lat) - HALFPI;
+
+ /* check for forward and latitude or longitude overange */
+ if (t > forwrd::EPS || fabs(lp_lon) > 10.)
+ {
+ throw proj_exception();
+ }
+
+ if (fabs(t) <= forwrd::EPS)
+ {
+ lp_lat = lp_lat < 0. ? -HALFPI : HALFPI;
+ }
+ else if (par.geoc)
+ {
+ lp_lat = atan(par.rone_es * tan(lp_lat));
+ }
+ lp_lon -= par.lam0; /* compute del lp.lam */
+ if (! par.over)
+ {
+ lp_lon = adjlon(lp_lon); /* post_forward del longitude */
+ }
+
+ double x = 0, y = 0;
+ prj.fwd(lp_lon, lp_lat, x, y);
+ geometry::set<0>(xy, par.fr_meter * (par.a * x + par.x0));
+ geometry::set<1>(xy, par.fr_meter * (par.a * y + par.y0));
+ }
+ }
+
+
+
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_gauss.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_gauss.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,114 @@
+#ifndef _PROJECTIONS_PJ_GAUSS_HPP
+#define _PROJECTIONS_PJ_GAUSS_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+namespace projection
+{
+ namespace impl
+ {
+ namespace gauss
+ {
+ static const int MAX_ITER = 20;
+
+ struct GAUSS
+ {
+ double C;
+ double K;
+ double e;
+ double ratexp;
+ };
+
+ static const double DEL_TOL = 1e-14;
+ inline double srat(double esinp, double exp)
+ {
+ return(pow((1.-esinp)/(1.+esinp), exp));
+ }
+
+
+ GAUSS gauss_ini(double e, double phi0, double &chi, double &rc)
+ {
+ double sphi, cphi, es;
+ GAUSS en;
+ es = e * e;
+ en.e = e;
+ sphi = sin(phi0);
+ cphi = cos(phi0); cphi *= cphi;
+ rc = sqrt(1. - es) / (1. - es * sphi * sphi);
+ en.C = sqrt(1. + es * cphi * cphi / (1. - es));
+ chi = asin(sphi / en.C);
+ en.ratexp = 0.5 * en.C * e;
+ en.K = tan(.5 * chi + impl::FORTPI) / (
+ pow(tan(.5 * phi0 + impl::FORTPI), en.C) *
+ srat(en.e * sphi, en.ratexp) );
+ return en;
+ }
+
+
+ template <typename T>
+ inline void gauss(const GAUSS& en, T& lam, T& phi)
+ {
+ phi = 2. * atan( en.K *
+ pow(tan(.5 * phi + FORTPI), en.C) *
+ srat(en.e * sin(phi), en.ratexp) ) - HALFPI;
+ lam *= en.C;
+ }
+
+ template <typename T>
+ inline void inv_gauss(const GAUSS& en, T& lam, T& phi)
+ {
+ lam /= en.C;
+ double num = pow(tan(.5 * phi + FORTPI)/en.K, 1./en.C);
+ int i;
+ for (i = MAX_ITER; i; --i)
+ {
+ double elp_phi = 2. * atan(num * srat(en.e * sin(phi), -.5 * en.e))
+ - HALFPI;
+ if (fabs(elp_phi - phi) < DEL_TOL) break;
+ phi = elp_phi;
+ }
+ /* convergence failed */
+ if (!i)
+ throw proj_exception(-17);
+ }
+
+ }
+ }
+
+
+
+}
+
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_init.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_init.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,289 @@
+#ifndef _PROJECTIONS_PJ_INIT_HPP
+#define _PROJECTIONS_PJ_INIT_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted from PROJ4
+
+// Copyright Barend Gehrels 1995-2009, Geodan Holding B.V. Amsterdam, the Netherlands.
+// Copyright Bruno Lalande 2008, 2009
+// Use, modification and distribution is subject to the Boost Software License,
+// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+// This file is converted from PROJ4, http://trac.osgeo.org/proj
+// PROJ4 is originally written by Gerald Evenden (then of the USGS)
+// PROJ4 is maintained by Frank Warmerdam
+// PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
+
+// Original copyright notice:
+
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the "Software"),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+#include <string>
+
+#include <boost/algorithm/string.hpp>
+
+#include <boost/range/functions.hpp>
+
+
+#include "geometry/strategies/geographic/geo_parse.hpp"
+
+#include "geometry/projections/parameters.hpp"
+
+#include "geometry/projections/impl/projects.hpp"
+
+#include "geometry/projections/impl/pj_param.hpp"
+#include "geometry/projections/impl/pj_ell_set.hpp"
+#include "geometry/projections/impl/pj_datum_set.hpp"
+#include "geometry/projections/impl/pj_units.hpp"
+
+
+namespace projection
+{
+ namespace impl
+ {
+
+ /************************************************************************/
+ /* pj_init() */
+ /* */
+ /* Main entry point for initialing a PJ projections */
+ /* definition. Note that the projection specific function is */
+ /* called to do the initial allocation so it can be created */
+ /* large enough to hold projection specific parameters. */
+ /************************************************************************/
+ template <typename R>
+ parameters pj_init(const R& arguments, bool use_defaults = true)
+ {
+ parameters pin;
+ for (std::vector<std::string>::const_iterator it = boost::begin(arguments);
+ it != boost::end(arguments); it++)
+ {
+ pin.params.push_back(pj_mkparam(*it));
+ }
+
+ /* check if +init present */
+ if (pj_param(pin.params, "tinit").i)
+ {
+ // maybe TODO: handle "init" parameter
+ //if (!(curr = get_init(&arguments, curr, pj_param(pin.params, "sinit").s)))
+ }
+
+ // find projection -> implemented in projection factory
+ pin.name = pj_param(pin.params, "sproj").s;
+ //if (pin.name.empty())
+ //{ throw proj_exception(-4); }
+
+
+ // set defaults, unless inhibited
+ // GL-Addition, if use_defaults is false then defaults are ignored
+ if (use_defaults && ! pj_param(pin.params, "bno_defs").i)
+ {
+ // proj4 gets defaults from "proj_def.dat", file of 94/02/23 with a few defaults.
+ // Here manually
+ if (pin.name == "lcc")
+ {
+ pin.params.push_back(pj_mkparam("lat_1=33"));
+ pin.params.push_back(pj_mkparam("lat_2=45"));
+ }
+ else if (pin.name == "aea")
+ {
+ pin.params.push_back(pj_mkparam("lat_1=29.5"));
+ pin.params.push_back(pj_mkparam("lat_2=45.5 "));
+ }
+ else
+ {
+ //<general>ellps=WGS84
+ }
+ //curr = get_defaults(&arguments, curr, name);
+ }
+
+ /* allocate projection structure */
+ // done by constructor:
+ // pin.is_latlong = 0;
+ // pin.is_geocent = 0;
+ // pin.long_wrap_center = 0.0;
+
+ /* set datum parameters */
+ pj_datum_set(pin.params, pin);
+
+ /* set ellipsoid/sphere parameters */
+ pj_ell_set(pin.params, pin.a, pin.es);
+
+ pin.a_orig = pin.a;
+ pin.es_orig = pin.es;
+
+ pin.e = sqrt(pin.es);
+ pin.ra = 1. / pin.a;
+ pin.one_es = 1. - pin.es;
+ if (pin.one_es == 0.) { throw proj_exception(-6); }
+ pin.rone_es = 1./pin.one_es;
+
+ /* Now that we have ellipse information check for WGS84 datum */
+ if( pin.datum_type == PJD_3PARAM
+ && pin.datum_params[0] == 0.0
+ && pin.datum_params[1] == 0.0
+ && pin.datum_params[2] == 0.0
+ && pin.a == 6378137.0
+ && fabs(pin.es - 0.006694379990) < 0.000000000050 )/*WGS84/GRS80*/
+ {
+ pin.datum_type = PJD_WGS84;
+ }
+
+ /* set pin.geoc coordinate system */
+ pin.geoc = (pin.es && pj_param(pin.params, "bgeoc").i);
+
+ /* over-ranging flag */
+ pin.over = pj_param(pin.params, "bover").i;
+
+ /* longitude center for wrapping */
+ pin.long_wrap_center = pj_param(pin.params, "rlon_wrap").f;
+
+ /* central meridian */
+ pin.lam0 = pj_param(pin.params, "rlon_0").f;
+
+ /* central latitude */
+ pin.phi0 = pj_param(pin.params, "rlat_0").f;
+
+ /* false easting and northing */
+ pin.x0 = pj_param(pin.params, "dx_0").f;
+ pin.y0 = pj_param(pin.params, "dy_0").f;
+
+ /* general scaling factor */
+ if (pj_param(pin.params, "tk_0").i)
+ pin.k0 = pj_param(pin.params, "dk_0").f;
+ else if (pj_param(pin.params, "tk").i)
+ pin.k0 = pj_param(pin.params, "dk").f;
+ else
+ pin.k0 = 1.;
+ if (pin.k0 <= 0.) {
+ throw proj_exception(-31);
+ }
+
+ /* set units */
+ std::string s;
+ std::string units = pj_param(pin.params, "sunits").s;
+ if (! units.empty())
+ {
+ const int n = sizeof(pj_units) / sizeof(pj_units[0]);
+ int index = -1;
+ for (int i = 0; i < n && index == -1; i++)
+ {
+ if(pj_units[i].id == units)
+ {
+ index = i;
+ }
+ }
+
+ if (index == -1) { throw proj_exception(-7); }
+ s = pj_units[index].to_meter;
+ }
+ if (s.empty())
+ {
+ s = pj_param(pin.params, "sto_meter").s;
+ }
+ if (! s.empty())
+ {
+ // TODO: IMPLEMENT SPLIT
+ pin.to_meter = atof(s.c_str());
+ //if (*s == '/') /* ratio number */
+ // pin.to_meter /= strtod(++s, 0);
+ pin.fr_meter = 1. / pin.to_meter;
+ } else
+ pin.to_meter = pin.fr_meter = 1.;
+
+ /* prime meridian */
+ s.clear();
+ std::string pm = pj_param(pin.params, "spm").s;
+ if (! pm.empty())
+ {
+ std::string value;
+
+ int n = sizeof(pj_prime_meridians) / sizeof(pj_prime_meridians[0]);
+ int index = -1;
+ for (int i = 0; i < n && index == -1; i++)
+ {
+ if(pj_prime_meridians[i].id == pm)
+ {
+ value = pj_prime_meridians[i].defn;
+ index = i;
+ }
+ }
+ if (index == -1) { throw proj_exception(-7); }
+ if (value.empty()) { throw proj_exception(-46); }
+
+ geometry::strategy::dms_parser<true> parser;
+ pin.from_greenwich = parser(value.c_str());
+ }
+ else
+ pin.from_greenwich = 0.0;
+
+ return pin;
+ }
+
+ /************************************************************************/
+ /* pj_init_plus() */
+ /* */
+ /* Same as pj_init() except it takes one argument string with */
+ /* individual arguments preceeded by '+', such as "+proj=utm */
+ /* +zone=11 +ellps=WGS84". */
+ /************************************************************************/
+
+
+ parameters pj_init_plus(const std::string& definition, bool use_defaults = true)
+ {
+ static const char* sep = " +";
+
+ /* split into arguments based on '+' and trim white space */
+
+ // boost::split splits on one character, here it should be on " +", so implementation below
+ // todo: put in different routine or sort out
+ std::vector<std::string> arguments;
+ std::string def = boost::trim_copy(definition);
+ boost::trim_left_if(def, boost::is_any_of(sep));
+ std::string::size_type loc = def.find(sep);
+ while (loc != std::string::npos)
+ {
+ std::string par = def.substr(0, loc);
+ boost::trim(par);
+ if (! par.empty())
+ {
+ arguments.push_back(par);
+ }
+
+ def.erase(0, loc);
+ boost::trim_left_if(def, boost::is_any_of(sep));
+ loc = def.find(sep);
+ }
+ if (! def.empty())
+ {
+ arguments.push_back(def);
+ }
+ /*boost::split(arguments, definition, boost::is_any_of("+"));
+ for (std::vector<std::string>::iterator it = arguments.begin(); it != arguments.end(); it++)
+ {
+ boost::trim(*it);
+ }*/
+ return pj_init(arguments, use_defaults);
+ }
+
+ }
+
+
+}
+#endif

Added: sandbox/ggl/boost/ggl/geometry/projections/impl/pj_inv.hpp
==============================================================================
--- (empty file)
+++ sandbox/ggl/boost/ggl/geometry/projections/impl/pj_inv.hpp 2009-02-17 06:29:42 EST (Tue, 17 Feb 2009)
@@ -0,0 +1,76 @@
+#ifndef _PROJECTIONS_PJ_INV_HPP
+#define _PROJECTIONS_PJ_INV_HPP
+
+// Generic Geometry Library - projections (based on PROJ4)
+// This file is manually converted