Blob Blame History Raw
commit 4eca2c124ede541aaf7fe30e96ab25fdbd9237d6
Author: Artem Pavlenko <artem@mapnik.org>
Date:   Fri Mar 19 17:10:29 2021 +0000

    Upgrade to use new proj APIs [skip ci]

diff --git a/mapnik/__init__.py b/mapnik/__init__.py
index 4d99ad14b..213242632 100644
--- a/mapnik/__init__.py
+++ b/mapnik/__init__.py
@@ -156,7 +156,7 @@ class _Coord(Coord, _injector()):
         Example: Project the geographic coordinates of the
                  city center of Stuttgart into the local
                  map projection (GK Zone 3/DHDN, EPSG 31467)
-        >>> p = Projection('+init=epsg:31467')
+        >>> p = Projection('epsg:31467')
         >>> Coord(9.1, 48.7).forward(p)
         Coord(3507360.12813,5395719.2749)
         """
@@ -176,7 +176,7 @@ class _Coord(Coord, _injector()):
                  city center of Stuttgart in the local
                  map projection (GK Zone 3/DHDN, EPSG 31467)
                  into geographic coordinates:
-        >>> p = Projection('+init=epsg:31467')
+        >>> p = Projection('epsg:31467')
         >>> Coord(3507360.12813,5395719.2749).inverse(p)
         Coord(9.1, 48.7)
         """
diff --git a/src/mapnik_layer.cpp b/src/mapnik_layer.cpp
index a7caf38d3..4fc7ea579 100644
--- a/src/mapnik_layer.cpp
+++ b/src/mapnik_layer.cpp
@@ -146,13 +146,13 @@ void export_layer()
     class_<layer>("Layer", "A Mapnik map layer.", init<std::string const&,optional<std::string const&> >(
                       "Create a Layer with a named string and, optionally, an srs string.\n"
                       "\n"
-                      "The srs can be either a Proj.4 epsg code ('+init=epsg:<code>') or\n"
-                      "of a Proj.4 literal ('+proj=<literal>').\n"
-                      "If no srs is specified it will default to '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                      "The srs can be either a Proj epsg code ('epsg:<code>') or\n"
+                      "of a Proj literal ('+proj=<literal>').\n"
+                      "If no srs is specified it will default to 'epsg:4326'\n"
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import Layer\n"
-                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = Layer('My Layer','epsg:4326')\n"
                       ">>> lyr\n"
                       "<mapnik._mapnik.Layer object at 0x6a270>\n"
                       ))
@@ -166,7 +166,7 @@ void export_layer()
              "\n"
              "Usage:\n"
              ">>> from mapnik import Layer\n"
-             ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+             ">>> lyr = Layer('My Layer','epsg:4326')\n"
              ">>> lyr.envelope()\n"
              "box2d(-1.0,-1.0,0.0,0.0) # default until a datasource is loaded\n"
             )
@@ -183,7 +183,7 @@ void export_layer()
              "\n"
              "Usage:\n"
              ">>> from mapnik import Layer\n"
-             ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+             ">>> lyr = Layer('My Layer','epsg:4326')\n"
              ">>> lyr.visible(1.0/1000000)\n"
              "True\n"
              ">>> lyr.active = False\n"
@@ -198,7 +198,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import Layer\n"
-                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = Layer('My Layer','epsg:4326')\n"
                       ">>> lyr.active\n"
                       "True # Active by default\n"
                       ">>> lyr.active = False # set False to disable layer rendering\n"
@@ -213,7 +213,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import Layer\n"
-                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = Layer('My Layer','epsg:4326')\n"
                       ">>> lyr.status\n"
                       "True # Active by default\n"
                       ">>> lyr.status = False # set False to disable layer rendering\n"
@@ -250,7 +250,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import Layer, Datasource\n"
-                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = Layer('My Layer','epsg:4326')\n"
                       ">>> lyr.datasource = Datasource(type='shape',file='world_borders')\n"
                       ">>> lyr.datasource\n"
                       "<mapnik.Datasource object at 0x65470>\n"
@@ -285,7 +285,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import Layer\n"
-                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = Layer('My Layer','epsg:4326')\n"
                       ">>> lyr.maximum_scale_denominator\n"
                       "1.7976931348623157e+308 # default is the numerical maximum\n"
                       ">>> lyr.maximum_scale_denominator = 1.0/1000000\n"
@@ -300,7 +300,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import Layer\n"
-                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = Layer('My Layer','epsg:4326')\n"
                       ">>> lyr.minimum_scale_denominator # default is 0\n"
                       "0.0\n"
                       ">>> lyr.minimum_scale_denominator = 1.0/1000000\n"
@@ -315,7 +315,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import Layer\n"
-                      ">>> lyr = Layer('My Layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = Layer('My Layer','epsg:4326')\n"
                       ">>> lyr.name\n"
                       "'My Layer'\n"
                       ">>> lyr.name = 'New Name'\n"
@@ -330,7 +330,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import layer\n"
-                      ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = layer('My layer','epsg:4326')\n"
                       ">>> lyr.queryable\n"
                       "False # Not queryable by default\n"
                       ">>> lyr.queryable = True\n"
@@ -345,12 +345,12 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import layer\n"
-                      ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = layer('My layer','epsg:4326')\n"
                       ">>> lyr.srs\n"
-                      "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' # The default srs if not initialized with custom srs\n"
-                      ">>> # set to google mercator with Proj.4 literal\n"
+                      "'epsg:4326' # The default srs if not initialized with custom srs\n"
+                      ">>> # set to google mercator with Proj literal\n"
                       "... \n"
-                      ">>> lyr.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over'\n"
+                      ">>> lyr.srs = 'epsg:3857'\n"
             )
 
         .add_property("group_by",
@@ -367,7 +367,7 @@ void export_layer()
                       "\n"
                       "Usage:\n"
                       ">>> from mapnik import layer\n"
-                      ">>> lyr = layer('My layer','+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')\n"
+                      ">>> lyr = layer('My layer','epsg:4326')\n"
                       ">>> lyr.styles\n"
                       "<mapnik._mapnik.Names object at 0x6d3e8>\n"
                       ">>> len(lyr.styles)\n"
diff --git a/src/mapnik_map.cpp b/src/mapnik_map.cpp
index 3036cf89b..3587e5d8a 100644
--- a/src/mapnik_map.cpp
+++ b/src/mapnik_map.cpp
@@ -165,9 +165,9 @@ void export_map()
     class_<Map>("Map","The map object.",init<int,int,optional<std::string const&> >(
                     ( arg("width"),arg("height"),arg("srs") ),
                     "Create a Map with a width and height as integers and, optionally,\n"
-                    "an srs string either with a Proj.4 epsg code ('+init=epsg:<code>')\n"
-                    "or with a Proj.4 literal ('+proj=<literal>').\n"
-                    "If no srs is specified the map will default to '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                    "an srs string either with a Proj epsg code ('epsg:<code>')\n"
+                    "or with a Proj literal ('+proj=<literal>').\n"
+                    "If no srs is specified the map will default to 'epsg:4326'\n"
                     "\n"
                     "Usage:\n"
                     ">>> from mapnik import Map\n"
@@ -175,7 +175,7 @@ void export_map()
                     ">>> m\n"
                     "<mapnik._mapnik.Map object at 0x6a240>\n"
                     ">>> m.srs\n"
-                    "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                    "'epsg:4326'\n"
                     ))
 
         .def("append_style",insert_style,
@@ -502,22 +502,22 @@ void export_map()
         .add_property("srs",
                       make_function(&Map::srs,return_value_policy<copy_const_reference>()),
                       &Map::set_srs,
-                      "Spatial reference in Proj.4 format.\n"
+                      "Spatial reference in Proj format.\n"
                       "Either an epsg code or proj literal.\n"
                       "For example, a proj literal:\n"
-                      "\t'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
+                      "\t'epsg:4326'\n"
                       "and a proj epsg code:\n"
-                      "\t'+init=epsg:4326'\n"
+                      "\t'epsg:4326'\n"
                       "\n"
                       "Note: using epsg codes requires the installation of\n"
-                      "the Proj.4 'epsg' data file normally found in '/usr/local/share/proj'\n"
+                      "the Proj 'epsg' data file normally found in '/usr/local/share/proj'\n"
                       "\n"
                       "Usage:\n"
                       ">>> m.srs\n"
-                      "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs' # The default srs if not initialized with custom srs\n"
+                      "'epsg:4326' # The default srs if not initialized with custom srs\n"
                       ">>> # set to google mercator with Proj.4 literal\n"
                       "... \n"
-                      ">>> m.srs = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over'\n"
+                      ">>> m.srs = 'epsg:3857'\n"
             )
 
         .add_property("width",
diff --git a/src/mapnik_proj_transform.cpp b/src/mapnik_proj_transform.cpp
index a17f162ba..5ba6647a2 100644
--- a/src/mapnik_proj_transform.cpp
+++ b/src/mapnik_proj_transform.cpp
@@ -48,7 +48,7 @@ struct proj_transform_pickle_suite : boost::python::pickle_suite
     getinitargs(const proj_transform& p)
     {
         using namespace boost::python;
-        return boost::python::make_tuple(p.source(),p.dest());
+        return boost::python::make_tuple(p.definition());
     }
 };
 
@@ -62,7 +62,7 @@ mapnik::coord2d forward_transform_c(mapnik::proj_transform& t, mapnik::coord2d c
     if (!t.forward(x,y,z)) {
         std::ostringstream s;
         s << "Failed to forward project "
-          << "from " << t.source().params() << " to: " << t.dest().params();
+          << t.definition();
         throw std::runtime_error(s.str());
     }
     return mapnik::coord2d(x,y);
@@ -76,7 +76,7 @@ mapnik::coord2d backward_transform_c(mapnik::proj_transform& t, mapnik::coord2d
     if (!t.backward(x,y,z)) {
         std::ostringstream s;
         s << "Failed to back project "
-          << "from " <<  t.dest().params() << " to: " << t.source().params();
+         << t.definition();
         throw std::runtime_error(s.str());
     }
     return mapnik::coord2d(x,y);
@@ -88,7 +88,7 @@ mapnik::box2d<double> forward_transform_env(mapnik::proj_transform& t, mapnik::b
     if (!t.forward(new_box)) {
         std::ostringstream s;
         s << "Failed to forward project "
-          << "from " << t.source().params() << " to: " << t.dest().params();
+          << t.definition();
         throw std::runtime_error(s.str());
     }
     return new_box;
@@ -100,7 +100,7 @@ mapnik::box2d<double> backward_transform_env(mapnik::proj_transform& t, mapnik::
     if (!t.backward(new_box)){
         std::ostringstream s;
         s << "Failed to back project "
-          << "from " <<  t.dest().params() << " to: " << t.source().params();
+          << t.definition();
         throw std::runtime_error(s.str());
     }
     return new_box;
@@ -112,7 +112,7 @@ mapnik::box2d<double> forward_transform_env_p(mapnik::proj_transform& t, mapnik:
     if (!t.forward(new_box,points)) {
         std::ostringstream s;
         s << "Failed to forward project "
-          << "from " << t.source().params() << " to: " << t.dest().params();
+          << t.definition();
         throw std::runtime_error(s.str());
     }
     return new_box;
@@ -124,7 +124,7 @@ mapnik::box2d<double> backward_transform_env_p(mapnik::proj_transform& t, mapnik
     if (!t.backward(new_box,points)){
         std::ostringstream s;
         s << "Failed to back project "
-          << "from " <<  t.dest().params() << " to: " << t.source().params();
+          <<  t.definition();
         throw std::runtime_error(s.str());
     }
     return new_box;
@@ -136,7 +136,7 @@ void export_proj_transform ()
 {
     using namespace boost::python;
 
-    class_<proj_transform, boost::noncopyable>("ProjTransform", init< projection const&, projection const& >())
+    class_<proj_transform, boost::noncopyable>("ProjTransform", init<projection const&, projection const&>())
         .def_pickle(proj_transform_pickle_suite())
         .def("forward", forward_transform_c)
         .def("backward",backward_transform_c)
@@ -144,6 +144,7 @@ void export_proj_transform ()
         .def("backward",backward_transform_env)
         .def("forward", forward_transform_env_p)
         .def("backward",backward_transform_env_p)
+        .def("definition",&proj_transform::definition)
         ;
 
 }
diff --git a/src/mapnik_projection.cpp b/src/mapnik_projection.cpp
index f3c1263f0..35f0cae6f 100644
--- a/src/mapnik_projection.cpp
+++ b/src/mapnik_projection.cpp
@@ -95,8 +95,8 @@ void export_projection ()
     using namespace boost::python;
 
     class_<projection>("Projection", "Represents a map projection.",init<std::string const&>(
-                           (arg("proj4_string")),
-                           "Constructs a new projection from its PROJ.4 string representation.\n"
+                           (arg("proj_string")),
+                           "Constructs a new projection from its PROJ string representation.\n"
                            "\n"
                            "The constructor will throw a RuntimeError in case the projection\n"
                            "cannot be initialized.\n"
@@ -105,9 +105,9 @@ void export_projection ()
         .def_pickle(projection_pickle_suite())
         .def ("params", make_function(&projection::params,
                                       return_value_policy<copy_const_reference>()),
-              "Returns the PROJ.4 string for this projection.\n")
+              "Returns the PROJ string for this projection.\n")
         .def ("expanded",&projection::expanded,
-              "normalize PROJ.4 definition by expanding +init= syntax\n")
+              "normalize PROJ definition by expanding epsg:XXXX syntax\n")
         .add_property ("geographic", &projection::is_geographic,
                        "This property is True if the projection is a geographic projection\n"
                        "(i.e. it uses lon/lat coordinates)\n")
diff --git a/src/mapnik_python.cpp b/src/mapnik_python.cpp
index b101cef1e..fa1f20c64 100644
--- a/src/mapnik_python.cpp
+++ b/src/mapnik_python.cpp
@@ -598,9 +598,9 @@ std::string mapnik_version_string()
     return MAPNIK_VERSION_STRING;
 }
 
-bool has_proj4()
+bool has_proj()
 {
-#if defined(MAPNIK_USE_PROJ4)
+#if defined(MAPNIK_USE_PROJ)
     return true;
 #else
     return false;
@@ -1035,8 +1035,8 @@ BOOST_PYTHON_MODULE(_mapnik)
   ">>> m = Map(256,256)\n"
   ">>> load_map(m,'mapfile_wgs84.xml')\n"
   ">>> m.srs\n"
-  "'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'\n"
-  ">>> m.srs = '+init=espg:3395'\n"
+  "'epsg:4326'\n"
+  ">>> m.srs = 'espg:3395'\n"
   ">>> save_map(m,'mapfile_mercator.xml')\n"
   "\n"
   );
@@ -1045,7 +1045,7 @@ BOOST_PYTHON_MODULE(_mapnik)
     def("save_map_to_string", &save_map_to_string, save_map_to_string_overloads());
     def("mapnik_version", &mapnik_version,"Get the Mapnik version number");
     def("mapnik_version_string", &mapnik_version_string,"Get the Mapnik version string");
-    def("has_proj4", &has_proj4, "Get proj4 status");
+    def("has_proj", &has_proj, "Get proj status");
     def("has_jpeg", &has_jpeg, "Get jpeg read/write support status");
     def("has_png", &has_png, "Get png read/write support status");
     def("has_tiff", &has_tiff, "Get tiff read/write support status");
diff --git a/test/python_tests/agg_rasterizer_integer_overflow_test.py b/test/python_tests/agg_rasterizer_integer_overflow_test.py
index af705e3d8..1f984fb61 100644
--- a/test/python_tests/agg_rasterizer_integer_overflow_test.py
+++ b/test/python_tests/agg_rasterizer_integer_overflow_test.py
@@ -27,7 +27,7 @@ geojson = {"type": "Feature",
 
 def test_that_coordinates_do_not_overflow_and_polygon_is_rendered_memory():
     expected_color = mapnik.Color('white')
-    projection = '+init=epsg:4326'
+    projection = 'epsg:4326'
     ds = mapnik.MemoryDatasource()
     context = mapnik.Context()
     feat = mapnik.Feature.from_geojson(json.dumps(geojson), context)
@@ -57,7 +57,7 @@ def test_that_coordinates_do_not_overflow_and_polygon_is_rendered_memory():
 
 def test_that_coordinates_do_not_overflow_and_polygon_is_rendered_csv():
     expected_color = mapnik.Color('white')
-    projection = '+init=epsg:4326'
+    projection = 'epsg:4326'
     ds = mapnik.MemoryDatasource()
     context = mapnik.Context()
     feat = mapnik.Feature.from_geojson(json.dumps(geojson), context)
diff --git a/test/python_tests/datasource_test.py b/test/python_tests/datasource_test.py
index 011b07cbd..8a2183abb 100644
--- a/test/python_tests/datasource_test.py
+++ b/test/python_tests/datasource_test.py
@@ -29,7 +29,7 @@ def test_that_datasources_exist():
 
 @raises(RuntimeError)
 def test_vrt_referring_to_missing_files():
-    srs = '+init=epsg:32630'
+    srs = 'epsg:32630'
     if 'gdal' in mapnik.DatasourceCache.plugin_names():
         lyr = mapnik.Layer('dataraster')
         lyr.datasource = mapnik.Gdal(
diff --git a/test/python_tests/layer_modification_test.py b/test/python_tests/layer_modification_test.py
index a4af1861f..373a57618 100644
--- a/test/python_tests/layer_modification_test.py
+++ b/test/python_tests/layer_modification_test.py
@@ -54,8 +54,8 @@ def test_adding_datasource_to_layer():
 
         # also note that since the srs was black it defaulted to wgs84
         eq_(m.layers[0].srs,
-            '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
-        eq_(lyr.srs, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+            'epsg:4326')
+        eq_(lyr.srs, 'epsg:4326')
 
         # now add a datasource one...
         ds = mapnik.Shapefile(file='../data/shp/world_merc.shp')
diff --git a/test/python_tests/layer_test.py b/test/python_tests/layer_test.py
index e303c0242..f096e2589 100644
--- a/test/python_tests/layer_test.py
+++ b/test/python_tests/layer_test.py
@@ -14,7 +14,7 @@ from .utilities import run_all
 def test_layer_init():
     l = mapnik.Layer('test')
     eq_(l.name, 'test')
-    eq_(l.srs, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+    eq_(l.srs, 'epsg:4326')
     eq_(l.envelope(), mapnik.Box2d())
     eq_(l.clear_label_cache, False)
     eq_(l.cache_features, False)
diff --git a/test/python_tests/multi_tile_raster_test.py b/test/python_tests/multi_tile_raster_test.py
index 6e131d41a..26fd68adc 100644
--- a/test/python_tests/multi_tile_raster_test.py
+++ b/test/python_tests/multi_tile_raster_test.py
@@ -16,7 +16,7 @@ def setup():
 
 
 def test_multi_tile_policy():
-    srs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
+    srs = 'epsg:4326'
     lyr = mapnik.Layer('raster')
     if 'raster' in mapnik.DatasourceCache.plugin_names():
         lyr.datasource = mapnik.Raster(
diff --git a/test/python_tests/object_test.py b/test/python_tests/object_test.py
index 583a523dc..a972d416d 100644
--- a/test/python_tests/object_test.py
+++ b/test/python_tests/object_test.py
@@ -331,7 +331,7 @@
 
 #     eq_(m.width, 256)
 #     eq_(m.height, 256)
-#     eq_(m.srs, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+#     eq_(m.srs, 'epsg:4326')
 #     eq_(m.base, '')
 #     eq_(m.maximum_extent, None)
 #     eq_(m.background_image, None)
@@ -361,7 +361,7 @@
 
 # # Map initialization from string
 # def test_map_init_from_string():
-#     map_string = '''<Map background-color="steelblue" base="./" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
+#     map_string = '''<Map background-color="steelblue" base="./" srs="epsg:4326">
 #      <Style name="My Style">
 #       <Rule>
 #        <PolygonSymbolizer fill="#f2eff9"/>
diff --git a/test/python_tests/projection_test.py b/test/python_tests/projection_test.py
index 316632928..4740f69d5 100644
--- a/test/python_tests/projection_test.py
+++ b/test/python_tests/projection_test.py
@@ -14,87 +14,13 @@ if PYTHON3:
 
 # Tests that exercise map projections.
 
-
-def test_normalizing_definition():
-    p = mapnik.Projection('+init=epsg:4326')
-    expanded = p.expanded()
-    eq_('+proj=longlat' in expanded, True)
-
-
-# Trac Ticket #128
-def test_wgs84_inverse_forward():
-    p = mapnik.Projection('+init=epsg:4326')
-
-    c = mapnik.Coord(3.01331418311, 43.3333092669)
-    e = mapnik.Box2d(-122.54345245, 45.12312553, 68.2335581353, 48.231231233)
-
-    # It appears that the y component changes very slightly, is this OK?
-    # so we test for 'almost equal float values'
-
-    assert_almost_equal(p.inverse(c).y, c.y)
-    assert_almost_equal(p.inverse(c).x, c.x)
-
-    assert_almost_equal(p.forward(c).y, c.y)
-    assert_almost_equal(p.forward(c).x, c.x)
-
-    assert_almost_equal(p.inverse(e).center().y, e.center().y)
-    assert_almost_equal(p.inverse(e).center().x, e.center().x)
-
-    assert_almost_equal(p.forward(e).center().y, e.center().y)
-    assert_almost_equal(p.forward(e).center().x, e.center().x)
-
-    assert_almost_equal(c.inverse(p).y, c.y)
-    assert_almost_equal(c.inverse(p).x, c.x)
-
-    assert_almost_equal(c.forward(p).y, c.y)
-    assert_almost_equal(c.forward(p).x, c.x)
-
-    assert_almost_equal(e.inverse(p).center().y, e.center().y)
-    assert_almost_equal(e.inverse(p).center().x, e.center().x)
-
-    assert_almost_equal(e.forward(p).center().y, e.center().y)
-    assert_almost_equal(e.forward(p).center().x, e.center().x)
-
-
-def wgs2merc(lon, lat):
-    x = lon * 20037508.34 / 180
-    y = math.log(math.tan((90 + lat) * math.pi / 360)) / (math.pi / 180)
-    y = y * 20037508.34 / 180
-    return [x, y]
-
-
-def merc2wgs(x, y):
-    x = (x / 20037508.34) * 180
-    y = (y / 20037508.34) * 180
-    y = 180 / math.pi * \
-        (2 * math.atan(math.exp(y * math.pi / 180)) - math.pi / 2)
-    if x > 180:
-        x = 180
-    if x < -180:
-        x = -180
-    if y > 85.0511:
-        y = 85.0511
-    if y < -85.0511:
-        y = -85.0511
-    return [x, y]
-
-# echo -109 37 | cs2cs -f "%.10f" +init=epsg:4326 +to +init=epsg:3857
-#-12133824.4964668211    4439106.7872505859 0.0000000000
-
-# todo
-# benchmarks
-# better well known detection
-# better srs matching with strip/trim
-# python copy to avoid crash
-
-
 def test_proj_transform_between_init_and_literal():
-    one = mapnik.Projection('+init=epsg:4326')
-    two = mapnik.Projection('+init=epsg:3857')
+    one = mapnik.Projection('epsg:4326')
+    two = mapnik.Projection('epsg:3857')
     tr1 = mapnik.ProjTransform(one, two)
     tr1b = mapnik.ProjTransform(two, one)
-    wgs84 = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
-    merc = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over'
+    wgs84 = 'epsg:4326'
+    merc = 'epsg:3857'
     src = mapnik.Projection(wgs84)
     dest = mapnik.Projection(merc)
     tr2 = mapnik.ProjTransform(src, dest)
@@ -133,8 +59,8 @@ def test_proj_antimeridian_bbox():
     # this is logic from feature_style_processor::prepare_layer()
     PROJ_ENVELOPE_POINTS = 20  # include/mapnik/config.hpp
 
-    prjGeog = mapnik.Projection('+init=epsg:4326')
-    prjProj = mapnik.Projection('+init=epsg:2193')
+    prjGeog = mapnik.Projection('epsg:4326')
+    prjProj = mapnik.Projection('epsg:2193')
     prj_trans_fwd = mapnik.ProjTransform(prjProj, prjGeog)
     prj_trans_rev = mapnik.ProjTransform(prjGeog, prjProj)
 
@@ -152,8 +78,8 @@ def test_proj_antimeridian_bbox():
     assert_box2d_almost_equal(rev_ext, better)
 
     # checks for not being snapped (ie. not antimeridian)
-    normal = mapnik.Box2d(148.766759749, -60.1222810238,
-                          159.95484893, -24.9771195151)
+    normal = mapnik.Box2d(148.763992289372, -60.122148979554645,
+                          159.95484764763412, -24.97711944942666)
     buffered_query_ext = mapnik.Box2d(274000, 3087000, 276000, 7173000)
     fwd_ext = prj_trans_fwd.forward(buffered_query_ext, PROJ_ENVELOPE_POINTS)
     assert_box2d_almost_equal(fwd_ext, normal)
diff --git a/test/python_tests/query_tolerance_test.py b/test/python_tests/query_tolerance_test.py
index c49bf258e..b60611334 100644
--- a/test/python_tests/query_tolerance_test.py
+++ b/test/python_tests/query_tolerance_test.py
@@ -16,7 +16,7 @@ def setup():
 
 if 'shape' in mapnik.DatasourceCache.plugin_names():
     def test_query_tolerance():
-        srs = '+init=epsg:4326'
+        srs = 'epsg:4326'
         lyr = mapnik.Layer('test')
         ds = mapnik.Shapefile(file='../data/shp/arrows.shp')
         lyr.datasource = ds
diff --git a/test/python_tests/raster_symbolizer_test.py b/test/python_tests/raster_symbolizer_test.py
index 7e02de25f..3de0cf43e 100644
--- a/test/python_tests/raster_symbolizer_test.py
+++ b/test/python_tests/raster_symbolizer_test.py
@@ -16,7 +16,7 @@ def setup():
 
 
 def test_dataraster_coloring():
-    srs = '+init=epsg:32630'
+    srs = 'epsg:32630'
     lyr = mapnik.Layer('dataraster')
     if 'gdal' in mapnik.DatasourceCache.plugin_names():
         lyr.datasource = mapnik.Gdal(
@@ -71,7 +71,7 @@ def test_dataraster_coloring():
 
 
 def test_dataraster_query_point():
-    srs = '+init=epsg:32630'
+    srs = 'epsg:32630'
     lyr = mapnik.Layer('dataraster')
     if 'gdal' in mapnik.DatasourceCache.plugin_names():
         lyr.datasource = mapnik.Gdal(
@@ -156,8 +156,8 @@ def test_raster_with_alpha_blends_correctly_with_background():
 
 
 def test_raster_warping():
-    lyrSrs = "+init=epsg:32630"
-    mapSrs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
+    lyrSrs = "epsg:32630"
+    mapSrs = 'epsg:4326'
     lyr = mapnik.Layer('dataraster', lyrSrs)
     if 'gdal' in mapnik.DatasourceCache.plugin_names():
         lyr.datasource = mapnik.Gdal(
@@ -196,8 +196,8 @@ def test_raster_warping():
 
 
 def test_raster_warping_does_not_overclip_source():
-    lyrSrs = "+init=epsg:32630"
-    mapSrs = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
+    lyrSrs = "epsg:32630"
+    mapSrs = 'epsg:4326'
     lyr = mapnik.Layer('dataraster', lyrSrs)
     if 'gdal' in mapnik.DatasourceCache.plugin_names():
         lyr.datasource = mapnik.Gdal(
diff --git a/test/python_tests/render_test.py b/test/python_tests/render_test.py
index bc638c350..0dd5e94de 100644
--- a/test/python_tests/render_test.py
+++ b/test/python_tests/render_test.py
@@ -166,7 +166,7 @@ def test_render_points():
     s.rules.append(r)
     lyr = mapnik.Layer(
         'Places',
-        '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
+        'epsg:4326')
     lyr.datasource = ds
     lyr.styles.append('places_labels')
     # latlon bounding box corners
@@ -174,8 +174,8 @@ def test_render_points():
     lr_lonlat = mapnik.Coord(143.40, -38.80)
     # render for different projections
     projs = {
-        'google': '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over',
-        'latlon': '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs',
+        'google': 'epsg:3857',
+        'latlon': 'epsg:4326',
         'merc': '+proj=merc +datum=WGS84 +k=1.0 +units=m +over +no_defs',
         'utm': '+proj=utm +zone=54 +datum=WGS84'
     }
@@ -184,7 +184,7 @@ def test_render_points():
         m.append_style('places_labels', s)
         m.layers.append(lyr)
         dest_proj = mapnik.Projection(projs[projdescr])
-        src_proj = mapnik.Projection('+init=epsg:4326')
+        src_proj = mapnik.Projection('epsg:4326')
         tr = mapnik.ProjTransform(src_proj, dest_proj)
         m.zoom_to_box(tr.forward(mapnik.Box2d(ul_lonlat, lr_lonlat)))
         # Render to SVG so that it can be checked how many points are there