arup-group / genet

Manipulate MATSim networks via a Python API.
MIT License
44 stars 9 forks source link

Support Python 3.11 #167

Closed mfitz closed 1 year ago

mfitz commented 1 year ago

GeNet does not install in a Python 3.11.0 environment. On an EC2 instance running ubuntu:

Distributor ID: Ubuntu
Description:    Ubuntu 20.04 LTS
Release:    20.04
Codename:   focal
Collecting osmnx==0.15.0
  Using cached osmnx-0.15.0-py2.py3-none-any.whl (84 kB)
Collecting packaging==20.4
  Using cached packaging-20.4-py2.py3-none-any.whl (37 kB)
Collecting pandas==1.3.3
  Using cached pandas-1.3.3.tar.gz (4.7 MB)
  Installing build dependencies ... error
  error: subprocess-exited-with-error

  × pip subprocess to install build dependencies did not run successfully.
  │ exit code: 1
  ╰─> [964 lines of output]
      Ignoring numpy: markers 'python_version == "3.7" and (platform_machine != "arm64" or platform_system != "Darwin") and platform_machine != "aarch64"' don't match your environment
      Ignoring numpy: markers 'python_version == "3.8" and (platform_machine != "arm64" or platform_system != "Darwin") and platform_machine != "aarch64"' don't match your environment
      Ignoring numpy: markers 'python_version == "3.7" and platform_machine == "aarch64"' don't match your environment
      Ignoring numpy: markers 'python_version == "3.8" and platform_machine == "aarch64"' don't match your environment
      Ignoring numpy: markers 'python_version == "3.8" and platform_machine == "arm64" and platform_system == "Darwin"' don't match your environment
      Ignoring numpy: markers 'python_version == "3.9" and platform_machine == "arm64" and platform_system == "Darwin"' don't match your environment

...

            error: Command "gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -DNPY_INTERNAL_BUILD=1 -DHAVE_NPY_CONFIG_H=1 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1 -D_LARGEFILE64_SOURCE=1 -DNO_ATLAS_INFO=1 -DHAVE_CBLAS -I/usr/local/include -I/usr/include -I/home/arup/.pyenv/versions/3.11.0/envs/genet-3.11.0/include -Ibuild/src.linux-x86_64-3.11/numpy/core/src/umath -Ibuild/src.linux-x86_64-3.11/numpy/core/src/npymath -Ibuild/src.linux-x86_64-3.11/numpy/core/src/common -Inumpy/core/include -Ibuild/src.linux-x86_64-3.11/numpy/core/include/numpy -Inumpy/core/src/common -Inumpy/core/src -Inumpy/core -Inumpy/core/src/npymath -Inumpy/core/src/multiarray -Inumpy/core/src/umath -Inumpy/core/src/npysort -I/home/arup/.pyenv/versions/3.11.0/envs/genet-3.11.0/include -I/home/arup/.pyenv/versions/3.11.0/include/python3.11 -Ibuild/src.linux-x86_64-3.11/numpy/core/src/common -Ibuild/src.linux-x86_64-3.11/numpy/core/src/npymath -c build/src.linux-x86_64-3.11/numpy/core/src/multiarray/scalartypes.c -o build/temp.linux-x86_64-3.11/build/src.linux-x86_64-3.11/numpy/core/src/multiarray/scalartypes.o -MMD -MF build/temp.linux-x86_64-3.11/build/src.linux-x86_64-3.11/numpy/core/src/multiarray/scalartypes.o.d -std=c99" failed with exit status 1
            [end of output]

        note: This error originates from a subprocess, and is likely not a problem with pip.
        ERROR: Failed building wheel for numpy
      Failed to build numpy
      ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects

      [notice] A new release of pip available: 22.3 -> 22.3.1
      [notice] To update, run: python3.11 -m pip install --upgrade pip
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

× pip subprocess to install build dependencies did not run successfully.
│ exit code: 1
╰─> See above for output.

note: This error originates from a subprocess, and is likely not a problem with pip.

I can make the pip installation work by upgrading a couple of dependencies in requirements.txt:

$ diff requirements.txt requirements-3.11.txt
44c44
< pandas==1.3.3
---
> pandas==1.5.2
67c67
< pyzmq==19.0.1
---
> pyzmq==24.0.1

However, the unit test suite then fails with a lot of errors:

FAIL Required test coverage of 94.0% not reached. Total coverage: 3.49%
================================================================== short test summary info ===================================================================
ERROR tests/test_auxiliary_files.py - TypeError: 'tuple' object does not support item assignment
ERROR tests/test_auxiliary_files.py - TypeError: 'tuple' object does not support item assignment
ERROR tests/test_core_components_route.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_components_route.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_components_service.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_components_service.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_components_stop.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_components_stop.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_network.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_network.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_schedule_elements.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_core_schedule_elements.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_gtfs_reader.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_gtfs_reader.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_matsim_reader.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_matsim_reader.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_osm_reader.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_osm_reader.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_osmnx_customised.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_osmnx_customised.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_read.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_input_read.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_max_stable_set.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_max_stable_set.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_modify_change_log.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_modify_change_log.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_modify_graph.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_modify_graph.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_modify_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_modify_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_output_geojson.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_output_geojson.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_output_matsim_xml_writer.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_output_matsim_xml_writer.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_output_sanitiser.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_output_sanitiser.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_road_pricing.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_road_pricing.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_use_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_use_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_dict_support.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_dict_support.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_elevation.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_elevation.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_google_directions.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_google_directions.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_graph_operations.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_graph_operations.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_parallel.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_parallel.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_persistence.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_persistence.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_secrets_vault.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_secrets_vault.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_simplification.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_simplification.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_spatial.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_utils_spatial.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_validate_network.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_validate_network.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_validate_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
ERROR tests/test_validate_schedule.py - RuntimeError: Duplicate Global Set declaration, Any
======================================================== 22 passed, 77 warnings, 64 errors in 32.96s =========================================================

An example stack trace:

______________________________________________________ ERROR collecting tests/test_validate_schedule.py ______________________________________________________
tests/test_validate_schedule.py:3: in <module>
    from genet import Schedule, Service, Route, Stop, schedule_elements
genet/__init__.py:1: in <module>
    from genet.core import Network  # noqa: F401
genet/core.py:14: in <module>
    import genet.modify.schedule as modify_schedule
genet/modify/schedule.py:4: in <module>
    from genet.max_stable_set import MaxStableSet
genet/max_stable_set.py:7: in <module>
    from pyomo.environ import *  # noqa: F403
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/environ/__init__.py:103: in <module>
    _import_packages()
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/environ/__init__.py:74: in _import_packages
    _do_import(pname)
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/environ/__init__.py:18: in _do_import
    importlib.import_module(pkg_name)
../.pyenv/versions/3.11.0/lib/python3.11/importlib/__init__.py:126: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/core/__init__.py:36: in <module>
    import pyomo.core.base._pyomo
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/core/base/__init__.py:20: in <module>
    import pyomo.core.base.boolean_var
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/core/base/boolean_var.py:15: in <module>
    from pyomo.core.base.set import Set, BooleanSet
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/core/base/set.py:4055: in <module>
    DeclareGlobalSet(_AnySet(
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyomo/core/base/set.py:3963: in DeclareGlobalSet
    raise RuntimeError("Duplicate Global Set declaration, %s"
E   RuntimeError: Duplicate Global Set declaration, Any

There are also a fair number of warnings:

====================================================================== warnings summary ======================================================================
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/xdist/plugin.py:227
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/xdist/plugin.py:227
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/xdist/plugin.py:227
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/xdist/plugin.py:227: DeprecationWarning: The --rsyncdir command line argument and rsyncdirs config variable are deprecated.
  The rsync feature will be removed in pytest-xdist 4.0.
    config.issue_config_time_warning(warning, 2)

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/networkx/readwrite/graphml.py:346
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/networkx/readwrite/graphml.py:346
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/networkx/readwrite/graphml.py:346: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.
  Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
    (np.int, "int"), (np.int8, "int"),

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/networkx/readwrite/gexf.py:223
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/networkx/readwrite/gexf.py:223
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/networkx/readwrite/gexf.py:223: DeprecationWarning: `np.int` is a deprecated alias for the builtin `int`. To silence this warning, use `int` by itself. Doing this will not modify any behavior and is safe. When replacing `np.int`, you may wish to use e.g. `np.int64` or `np.int32` to specify the precision. If you wish to review your current use, check the release note link for additional information.
  Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
    (np.int, "int"), (np.int8, "int"),

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/multiclass.py:14
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/multiclass.py:14
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/multiclass.py:14: DeprecationWarning: Please use `spmatrix` from the `scipy.sparse` namespace, the `scipy.sparse.base` namespace is deprecated.
    from scipy.sparse.base import spmatrix

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/optimize.py:18
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/optimize.py:18
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/optimize.py:18: DeprecationWarning: Please use `line_search_wolfe2` from the `scipy.optimize` namespace, the `scipy.optimize.linesearch` namespace is deprecated.
    from scipy.optimize.linesearch import line_search_wolfe2, line_search_wolfe1

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/optimize.py:18
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/optimize.py:18
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/sklearn/utils/optimize.py:18: DeprecationWarning: Please use `line_search_wolfe1` from the `scipy.optimize` namespace, the `scipy.optimize.linesearch` namespace is deprecated.
    from scipy.optimize.linesearch import line_search_wolfe2, line_search_wolfe1

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/certifi/core.py:36
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/certifi/core.py:36
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/certifi/core.py:36: DeprecationWarning: path is deprecated. Use files() instead. Refer to https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy for migration advice.
    _CACERT_CTX = get_path("certifi", "cacert.pem")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:17
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:17
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:17: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    PANDAS_GE_025 = str(pd.__version__) >= LooseVersion("0.25.0")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/setuptools/_distutils/version.py:346: 26 warnings
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/setuptools/_distutils/version.py:346: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    other = LooseVersion(other)

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:18
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:18
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:18: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    PANDAS_GE_10 = str(pd.__version__) >= LooseVersion("1.0.0")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:19
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:19
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:19: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    PANDAS_GE_11 = str(pd.__version__) >= LooseVersion("1.1.0")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:20
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:20
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:20: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    PANDAS_GE_115 = str(pd.__version__) >= LooseVersion("1.1.5")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:21
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:21
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:21: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    PANDAS_GE_12 = str(pd.__version__) >= LooseVersion("1.2.0")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:29
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:29
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:29: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    SHAPELY_GE_17 = str(shapely.__version__) >= LooseVersion("1.7.0")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:30
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:30
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:30: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    SHAPELY_GE_18 = str(shapely.__version__) >= LooseVersion("1.8")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:31
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:31
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:31: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    SHAPELY_GE_20 = str(shapely.__version__) >= LooseVersion("2.0")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:212
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:212
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:212
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:212
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/geopandas/_compat.py:212: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    PYPROJ_LT_3 = LooseVersion(pyproj.__version__) < LooseVersion("3")

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyparsing.py:108
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyparsing.py:108
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyparsing.py:108: DeprecationWarning: module 'sre_constants' is deprecated
    import sre_constants

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/matplotlib/__init__.py:202: 10 warnings
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/matplotlib/__init__.py:202: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
    if LooseVersion(module.__version__) < minver:

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyutilib/misc/import_file.py:11
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyutilib/misc/import_file.py:11
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/pyutilib/misc/import_file.py:11: DeprecationWarning: the imp module is deprecated in favour of importlib and slated for removal in Python 3.12; see the module's documentation for alternative uses
    import imp

../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/botocore/utils.py:25
../.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/botocore/utils.py:25
  /home/arup/.pyenv/versions/genet-3.11.0/lib/python3.11/site-packages/botocore/utils.py:25: DeprecationWarning: 'cgi' is deprecated and slated for removal in Python 3.13
    import cgi

Most likely this is a question of upgrading the right dependencies to the correct versions, but this may leave us in a situation where GeNet can no longer be used in a Python 3.7 environment. If we can be backwards compatible, we should.

brynpickering commented 1 year ago

I have updated to work with py3.9-3.11 in #188. However, it comes with a slight change in the result of reprojections. This is caused by updating the PROJ package from v7.x to >v7.x (ideally v9.x). The cause is a change in the underlying steps taken by PROJ to reproject (expand below to see the steps).

I would be inclined to say that reprojection is more correct now than it was before. If you agree @KasiaKoz then I would update the expected coordinate values in the failing tests to the result of the newer PROJ reprojections.

proj v7.2.1 ```bash projinfo -s EPSG:27700 -t EPSG:4326 Candidate operations found: 2 Note: using '--spatial-test intersects' would bring more results (9) ------------------------------------- Operation No. 1: unknown id, Inverse of British National Grid + OSGB 1936 to WGS 84 (9), 1 m, United Kingdom (UK) - offshore to boundary of UKCS within 49°45'N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland). Isle of Man onshore., at least one grid missing PROJ string: +proj=pipeline +step +inv +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +step +proj=hgridshift +grids=uk_os_OSTN15_NTv2_OSGBtoETRS.tif +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1 WKT2:2019 string: CONCATENATEDOPERATION["Inverse of British National Grid + OSGB 1936 to WGS 84 (9)", SOURCECRS[ PROJCRS["OSGB 1936 / British National Grid", BASEGEOGCRS["OSGB 1936", DATUM["OSGB 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]], CONVERSION["British National Grid", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1]], ID["EPSG",27700]]], TARGETCRS[ GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], STEP[ CONVERSION["Inverse of British National Grid", METHOD["Inverse of Transverse Mercator", ID["INVERSE(EPSG)",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]], ID["INVERSE(EPSG)",19916]]], STEP[ COORDINATEOPERATION["OSGB 1936 to WGS 84 (9)", SOURCECRS[ GEOGCRS["OSGB 1936", DATUM["OSGB 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]]], TARGETCRS[ GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], METHOD["HORIZONTAL_SHIFT_GTIFF"], PARAMETERFILE["Latitude and longitude difference file","uk_os_OSTN15_NTv2_OSGBtoETRS.tif"], OPERATIONACCURACY[1.0], ID["DERIVED_FROM(EPSG)",7710], REMARK["Parameter values taken from OSGB 1936 to ETRS89 (3) (tfm code 7709) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the tfm. Replaces OSGB 1936 to WGS 84 (7) (tfm code 5339)."]]], USAGE[ SCOPE["unknown"], AREA["United Kingdom (UK) - offshore to boundary of UKCS within 49°45'N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland). Isle of Man onshore."], BBOX[49.75,-9,61.01,2.01]]] Grid uk_os_OSTN15_NTv2_OSGBtoETRS.tif needed but not found on the system. Can be obtained at https://cdn.proj.org/uk_os_OSTN15_NTv2_OSGBtoETRS.tif ------------------------------------- Operation No. 2: unknown id, Inverse of British National Grid + Ballpark geographic offset from OSGB 1936 to WGS 84, unknown accuracy, World, has ballpark transformation PROJ string: +proj=pipeline +step +inv +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1 WKT2:2019 string: CONCATENATEDOPERATION["Inverse of British National Grid + Ballpark geographic offset from OSGB 1936 to WGS 84", SOURCECRS[ PROJCRS["OSGB 1936 / British National Grid", BASEGEOGCRS["OSGB 1936", DATUM["OSGB 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]], CONVERSION["British National Grid", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1]], ID["EPSG",27700]]], TARGETCRS[ GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], STEP[ CONVERSION["Inverse of British National Grid", METHOD["Inverse of Transverse Mercator", ID["INVERSE(EPSG)",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]], ID["INVERSE(EPSG)",19916]]], STEP[ COORDINATEOPERATION["Ballpark geographic offset from OSGB 1936 to WGS 84", SOURCECRS[ GEOGCRS["OSGB 1936", DATUM["OSGB 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]]], TARGETCRS[ GEOGCRS["WGS 84", DATUM["World Geodetic System 1984", ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], METHOD["Geographic2D offsets", ID["EPSG",9619]], PARAMETER["Latitude offset",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8601]], PARAMETER["Longitude offset",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8602]]]], USAGE[ SCOPE["unknown"], AREA["World"], BBOX[-90,-180,90,180]]] ```
proj v9.1.0 ```bash projinfo -s EPSG:27700 -t EPSG:4326 Candidate operations found: 2 Note: using '--spatial-test intersects' would bring more results (9) ------------------------------------- Operation No. 1: unknown id, Inverse of British National Grid + OSGB36 to WGS 84 (9), 1 m, United Kingdom (UK) - offshore to boundary of UKCS within 49°45'N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland). Isle of Man onshore. PROJ string: +proj=pipeline +step +inv +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +step +proj=hgridshift +grids=uk_os_OSTN15_NTv2_OSGBtoETRS.tif +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1 WKT2:2019 string: CONCATENATEDOPERATION["Inverse of British National Grid + OSGB36 to WGS 84 (9)", SOURCECRS[ PROJCRS["OSGB36 / British National Grid", BASEGEOGCRS["OSGB36", DATUM["Ordnance Survey of Great Britain 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]], CONVERSION["British National Grid", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1]], ID["EPSG",27700]]], TARGETCRS[ GEOGCRS["WGS 84", ENSEMBLE["World Geodetic System 1984 ensemble", MEMBER["World Geodetic System 1984 (Transit)"], MEMBER["World Geodetic System 1984 (G730)"], MEMBER["World Geodetic System 1984 (G873)"], MEMBER["World Geodetic System 1984 (G1150)"], MEMBER["World Geodetic System 1984 (G1674)"], MEMBER["World Geodetic System 1984 (G1762)"], MEMBER["World Geodetic System 1984 (G2139)"], ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]], ENSEMBLEACCURACY[2.0]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], STEP[ CONVERSION["Inverse of British National Grid", METHOD["Inverse of Transverse Mercator", ID["INVERSE(EPSG)",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]], ID["INVERSE(EPSG)",19916]]], STEP[ COORDINATEOPERATION["OSGB36 to WGS 84 (9)", SOURCECRS[ GEOGCRS["OSGB36", DATUM["Ordnance Survey of Great Britain 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]]], TARGETCRS[ GEOGCRS["WGS 84", ENSEMBLE["World Geodetic System 1984 ensemble", MEMBER["World Geodetic System 1984 (Transit)"], MEMBER["World Geodetic System 1984 (G730)"], MEMBER["World Geodetic System 1984 (G873)"], MEMBER["World Geodetic System 1984 (G1150)"], MEMBER["World Geodetic System 1984 (G1674)"], MEMBER["World Geodetic System 1984 (G1762)"], MEMBER["World Geodetic System 1984 (G2139)"], ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]], ENSEMBLEACCURACY[2.0]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], METHOD["HORIZONTAL_SHIFT_GTIFF"], PARAMETERFILE["Latitude and longitude difference file","uk_os_OSTN15_NTv2_OSGBtoETRS.tif"], OPERATIONACCURACY[1.0], ID["DERIVED_FROM(EPSG)",7710], REMARK["Parameter values taken from OSGB36 to ETRS89 (2) (tfm code 7709) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the tfm. Replaces OSGB36 to WGS 84 (7) (tfm code 5339)."]]], USAGE[ SCOPE["unknown"], AREA["United Kingdom (UK) - offshore to boundary of UKCS within 49°45'N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland). Isle of Man onshore."], BBOX[49.75,-9,61.01,2.01]]] ------------------------------------- Operation No. 2: unknown id, Inverse of British National Grid + Ballpark geographic offset from OSGB36 to WGS 84, unknown accuracy, World, has ballpark transformation PROJ string: +proj=pipeline +step +inv +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1 WKT2:2019 string: CONCATENATEDOPERATION["Inverse of British National Grid + Ballpark geographic offset from OSGB36 to WGS 84", SOURCECRS[ PROJCRS["OSGB36 / British National Grid", BASEGEOGCRS["OSGB36", DATUM["Ordnance Survey of Great Britain 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]], CONVERSION["British National Grid", METHOD["Transverse Mercator", ID["EPSG",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]]], CS[Cartesian,2], AXIS["(E)",east, ORDER[1], LENGTHUNIT["metre",1]], AXIS["(N)",north, ORDER[2], LENGTHUNIT["metre",1]], ID["EPSG",27700]]], TARGETCRS[ GEOGCRS["WGS 84", ENSEMBLE["World Geodetic System 1984 ensemble", MEMBER["World Geodetic System 1984 (Transit)"], MEMBER["World Geodetic System 1984 (G730)"], MEMBER["World Geodetic System 1984 (G873)"], MEMBER["World Geodetic System 1984 (G1150)"], MEMBER["World Geodetic System 1984 (G1674)"], MEMBER["World Geodetic System 1984 (G1762)"], MEMBER["World Geodetic System 1984 (G2139)"], ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]], ENSEMBLEACCURACY[2.0]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], STEP[ CONVERSION["Inverse of British National Grid", METHOD["Inverse of Transverse Mercator", ID["INVERSE(EPSG)",9807]], PARAMETER["Latitude of natural origin",49, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8801]], PARAMETER["Longitude of natural origin",-2, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8802]], PARAMETER["Scale factor at natural origin",0.9996012717, SCALEUNIT["unity",1], ID["EPSG",8805]], PARAMETER["False easting",400000, LENGTHUNIT["metre",1], ID["EPSG",8806]], PARAMETER["False northing",-100000, LENGTHUNIT["metre",1], ID["EPSG",8807]], ID["INVERSE(EPSG)",19916]]], STEP[ COORDINATEOPERATION["Ballpark geographic offset from OSGB36 to WGS 84", SOURCECRS[ GEOGCRS["OSGB36", DATUM["Ordnance Survey of Great Britain 1936", ELLIPSOID["Airy 1830",6377563.396,299.3249646, LENGTHUNIT["metre",1]]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4277]]], TARGETCRS[ GEOGCRS["WGS 84", ENSEMBLE["World Geodetic System 1984 ensemble", MEMBER["World Geodetic System 1984 (Transit)"], MEMBER["World Geodetic System 1984 (G730)"], MEMBER["World Geodetic System 1984 (G873)"], MEMBER["World Geodetic System 1984 (G1150)"], MEMBER["World Geodetic System 1984 (G1674)"], MEMBER["World Geodetic System 1984 (G1762)"], MEMBER["World Geodetic System 1984 (G2139)"], ELLIPSOID["WGS 84",6378137,298.257223563, LENGTHUNIT["metre",1]], ENSEMBLEACCURACY[2.0]], PRIMEM["Greenwich",0, ANGLEUNIT["degree",0.0174532925199433]], CS[ellipsoidal,2], AXIS["geodetic latitude (Lat)",north, ORDER[1], ANGLEUNIT["degree",0.0174532925199433]], AXIS["geodetic longitude (Lon)",east, ORDER[2], ANGLEUNIT["degree",0.0174532925199433]], ID["EPSG",4326]]], METHOD["Geographic2D offsets", ID["EPSG",9619]], PARAMETER["Latitude offset",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8601]], PARAMETER["Longitude offset",0, ANGLEUNIT["degree",0.0174532925199433], ID["EPSG",8602]]]], USAGE[ SCOPE["unknown"], AREA["World"], BBOX[-90,-180,90,180]]] ```
KasiaKoz commented 1 year ago

I ran a test: I generated our small Londinium test network in epsg:4326, then projected to epsg:27700 and then back to epsg:4326, using two set-ups:

main (636a8b7) branch of genet but M1 packages are closer to this because the older versions of packages from main branch don't work

TLDR:

epsg:4326->epsg:27700->epsg:4326: Screenshot 2023-09-26 at 17 42 10

epsg:27700 networks: Screenshot 2023-09-26 at 17 17 25 Screenshot 2023-09-26 at 17 18 06 Screenshot 2023-09-26 at 17 18 57