Skip to content

Commit

Permalink
Refs #35058 -- Deprecated OGRGeometry.coord_dim setter.
Browse files Browse the repository at this point in the history
Reflecting a change in the underlying GDAL library (since GDAL 2.1)
using coord_dim to set a geometries dimensions is deprecated in favor
of set_3d().
  • Loading branch information
smithdc1 authored and felixxm committed Jan 23, 2024
1 parent 8570e09 commit f4c5973
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 6 deletions.
13 changes: 9 additions & 4 deletions django/contrib/gis/gdal/geometries.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
True True
"""
import sys
import warnings
from binascii import b2a_hex
from ctypes import byref, c_char_p, c_double, c_ubyte, c_void_p, string_at

Expand All @@ -50,6 +51,7 @@
from django.contrib.gis.gdal.prototypes import srs as srs_api
from django.contrib.gis.gdal.srs import CoordTransform, SpatialReference
from django.contrib.gis.geometry import hex_regex, json_regex, wkt_regex
from django.utils.deprecation import RemovedInDjango60Warning
from django.utils.encoding import force_bytes


Expand Down Expand Up @@ -206,18 +208,21 @@ def dimension(self):
"Return 0 for points, 1 for lines, and 2 for surfaces."
return capi.get_dims(self.ptr)

def _get_coord_dim(self):
@property
def coord_dim(self):
"Return the coordinate dimension of the Geometry."
return capi.get_coord_dim(self.ptr)

def _set_coord_dim(self, dim):
# RemovedInDjango60Warning
@coord_dim.setter
def coord_dim(self, dim):
"Set the coordinate dimension of this Geometry."
msg = "coord_dim setter is deprecated. Use set_3d() instead."
warnings.warn(msg, RemovedInDjango60Warning, stacklevel=2)
if dim not in (2, 3):
raise ValueError("Geometry dimension must be either 2 or 3")
capi.set_coord_dim(self.ptr, dim)

coord_dim = property(_get_coord_dim, _set_coord_dim)

@property
def geom_count(self):
"Return the number of elements in this Geometry."
Expand Down
3 changes: 3 additions & 0 deletions docs/internals/deprecation.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ details on these changes.
* Support for passing positional arguments to ``Model.save()`` and
``Model.asave()`` will be removed.

* The setter for ``django.contrib.gis.gdal.OGRGeometry.coord_dim`` will be
removed.

.. _deprecation-removed-in-5.1:

5.1
Expand Down
8 changes: 6 additions & 2 deletions docs/ref/contrib/gis/gdal.txt
Original file line number Diff line number Diff line change
Expand Up @@ -553,8 +553,12 @@ coordinate transformation:

.. attribute:: coord_dim

Returns or sets the coordinate dimension of this geometry. For example, the
value would be 2 for two-dimensional geometries.
Returns the coordinate dimension of this geometry. For example, the value
would be 2 for two-dimensional geometries.

.. deprecated:: 5.1

The ``coord_dim`` setter is deprecated. Use :meth:`.set_3d` instead.

.. attribute:: is_3d

Expand Down
3 changes: 3 additions & 0 deletions docs/releases/5.1.txt
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,9 @@ Miscellaneous
* Passing positional arguments to :meth:`.Model.save` and :meth:`.Model.asave`
is deprecated in favor of keyword-only arguments.

* Setting ``django.contrib.gis.gdal.OGRGeometry.coord_dim`` is deprecated. Use
:meth:`~django.contrib.gis.gdal.OGRGeometry.set_3d` instead.

Features removed in 5.1
=======================

Expand Down
10 changes: 10 additions & 0 deletions tests/gis_tests/gdal_tests/test_geom.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from django.template import Context
from django.template.engine import Engine
from django.test import SimpleTestCase
from django.utils.deprecation import RemovedInDjango60Warning

from ..test_data import TestDataMixin

Expand Down Expand Up @@ -810,3 +811,12 @@ def test_wkt_and_wkb_output(self):
g = OGRGeometry(geom)
self.assertEqual(g.wkt, geom)
self.assertEqual(g.wkb.hex(), wkb)


class DeprecationTests(SimpleTestCase):
def test_coord_setter_deprecation(self):
geom = OGRGeometry("POINT (1 2)")
msg = "coord_dim setter is deprecated. Use set_3d() instead."
with self.assertWarnsMessage(RemovedInDjango60Warning, msg):
geom.coord_dim = 3
self.assertEqual(geom.coord_dim, 3)

0 comments on commit f4c5973

Please sign in to comment.