From feec9afa66131b074c40359529e498eab0d79a02 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Fri, 19 Mar 2021 17:10:29 +0000 Subject: [PATCH 01/14] Upgrade to use new APIs [skip ci] --- src/mapnik_proj_transform.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/mapnik_proj_transform.cpp b/src/mapnik_proj_transform.cpp index fc753564c..8588e9fb7 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 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 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 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 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_("ProjTransform", init< projection const&, projection const& >()) + class_("ProjTransform", init()) .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) ; } From dcb0bcf665308cc36f81eb4d2b39d623f9038002 Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Mon, 22 Mar 2021 16:23:28 +0000 Subject: [PATCH 02/14] Update test data and data-visual --- test/data | 2 +- test/data-visual | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/data b/test/data index 99da07d5e..dd0c41c3f 160000 --- a/test/data +++ b/test/data @@ -1 +1 @@ -Subproject commit 99da07d5e76ccf5978ef0a380bf5f631f9088584 +Subproject commit dd0c41c3f9f5dc98291a727af00bb42734d2a8c0 diff --git a/test/data-visual b/test/data-visual index e040c3d9c..1f20cf257 160000 --- a/test/data-visual +++ b/test/data-visual @@ -1 +1 @@ -Subproject commit e040c3d9c8f6bdf3319e25f42b1cf907725285c9 +Subproject commit 1f20cf257f35224d3c139a6015b1cf70814b0d24 From ca66af65204d68a5496a94d36d69bf61144daf3b Mon Sep 17 00:00:00 2001 From: Artem Pavlenko Date: Mon, 22 Mar 2021 16:23:54 +0000 Subject: [PATCH 03/14] Update to use libproj >=6 projection initialisation syntax [skip ci] --- mapnik/__init__.py | 4 +-- src/mapnik_layer.cpp | 36 +++++++++---------- src/mapnik_map.cpp | 20 +++++------ src/mapnik_projection.cpp | 8 ++--- src/mapnik_python.cpp | 10 +++--- .../agg_rasterizer_integer_overflow_test.py | 4 +-- test/python_tests/datasource_test.py | 2 +- test/python_tests/layer_modification_test.py | 4 +-- test/python_tests/layer_test.py | 2 +- test/python_tests/multi_tile_raster_test.py | 2 +- test/python_tests/object_test.py | 4 +-- test/python_tests/ogr_test.py | 10 +++--- test/python_tests/projection_test.py | 18 +++++----- test/python_tests/query_tolerance_test.py | 2 +- test/python_tests/raster_symbolizer_test.py | 12 +++---- test/python_tests/render_test.py | 8 ++--- 16 files changed, 73 insertions(+), 73 deletions(-) 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 @@ def forward(self, projection): 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 @@ def inverse(self, projection): 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", "A Mapnik map layer.", init >( "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:') or\n" - "of a Proj.4 literal ('+proj=').\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:') or\n" + "of a Proj literal ('+proj=').\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" "\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" "\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" "\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","The map object.",init >( ( 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:')\n" - "or with a Proj.4 literal ('+proj=').\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:')\n" + "or with a Proj literal ('+proj=').\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" "\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()), &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_projection.cpp b/src/mapnik_projection.cpp index c2088cd89..8875fa62b 100644 --- a/src/mapnik_projection.cpp +++ b/src/mapnik_projection.cpp @@ -95,8 +95,8 @@ void export_projection () using namespace boost::python; class_("Projection", "Represents a map projection.",init( - (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()), - "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 14523b034..50b5544e4 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 @@ 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 @@ 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_string = ''' #