diff --git a/django/contrib/gis/geos/collections.py b/django/contrib/gis/geos/collections.py index c3904774dd..74a45d7cde 100644 --- a/django/contrib/gis/geos/collections.py +++ b/django/contrib/gis/geos/collections.py @@ -15,6 +15,7 @@ from django.contrib.gis.geos.polygon import Polygon class GeometryCollection(GEOSGeometry): + _json_type = 'GeometryCollection' _typeid = 7 def __init__(self, *args, **kwargs): @@ -106,11 +107,13 @@ class GeometryCollection(GEOSGeometry): # MultiPoint, MultiLineString, and MultiPolygon class definitions. class MultiPoint(GeometryCollection): _allowed = Point + _json_type = 'MultiPoint' _typeid = 4 class MultiLineString(LinearGeometryMixin, GeometryCollection): _allowed = (LineString, LinearRing) + _json_type = 'MultiLineString' _typeid = 5 @property @@ -122,6 +125,7 @@ class MultiLineString(LinearGeometryMixin, GeometryCollection): class MultiPolygon(GeometryCollection): _allowed = Polygon + _json_type = 'MultiPolygon' _typeid = 6 diff --git a/django/contrib/gis/geos/geometry.py b/django/contrib/gis/geos/geometry.py index ccecc51f89..55cc2614ad 100644 --- a/django/contrib/gis/geos/geometry.py +++ b/django/contrib/gis/geos/geometry.py @@ -415,7 +415,7 @@ class GEOSGeometry(GEOSBase, ListMixin): """ Return GeoJSON representation of this Geometry. """ - return json.dumps({'type': self.__class__.__name__, 'coordinates': self.coords}) + return json.dumps({'type': self._json_type, 'coordinates': self.coords}) geojson = json @property diff --git a/django/contrib/gis/geos/linestring.py b/django/contrib/gis/geos/linestring.py index 9f98ed7e23..aec2f558bd 100644 --- a/django/contrib/gis/geos/linestring.py +++ b/django/contrib/gis/geos/linestring.py @@ -8,6 +8,7 @@ from django.contrib.gis.shortcuts import numpy class LineString(LinearGeometryMixin, GEOSGeometry): _init_func = capi.create_linestring + _json_type = 'LineString' _minlength = 2 has_cs = True diff --git a/django/contrib/gis/geos/point.py b/django/contrib/gis/geos/point.py index d46844248c..3b2a77c81f 100644 --- a/django/contrib/gis/geos/point.py +++ b/django/contrib/gis/geos/point.py @@ -7,6 +7,7 @@ from django.contrib.gis.geos.geometry import GEOSGeometry class Point(GEOSGeometry): + _json_type = 'Point' _minlength = 2 _maxlength = 3 has_cs = True diff --git a/django/contrib/gis/geos/polygon.py b/django/contrib/gis/geos/polygon.py index 845c440e53..221a3b1b04 100644 --- a/django/contrib/gis/geos/polygon.py +++ b/django/contrib/gis/geos/polygon.py @@ -7,6 +7,7 @@ from django.contrib.gis.geos.linestring import LinearRing class Polygon(GEOSGeometry): + _json_type = 'Polygon' _minlength = 1 def __init__(self, *args, **kwargs): diff --git a/tests/gis_tests/geos_tests/test_geos.py b/tests/gis_tests/geos_tests/test_geos.py index bb3341493c..53e42e4b2f 100644 --- a/tests/gis_tests/geos_tests/test_geos.py +++ b/tests/gis_tests/geos_tests/test_geos.py @@ -372,6 +372,12 @@ class GEOSTest(SimpleTestCase, TestDataMixin): with self.assertRaisesMessage(ValueError, 'LinearRing requires at least 4 points, got 1.'): LinearRing(numpy.array([(0, 0)])) + def test_linearring_json(self): + self.assertJSONEqual( + LinearRing((0, 0), (0, 1), (1, 1), (0, 0)).json, + '{"coordinates": [[0, 0], [0, 1], [1, 1], [0, 0]], "type": "LineString"}', + ) + def test_polygons_from_bbox(self): "Testing `from_bbox` class method." bbox = (-180, -90, 180, 90) @@ -1269,6 +1275,10 @@ class GEOSTest(SimpleTestCase, TestDataMixin): self.assertEqual(type(ext_poly), ExtendedPolygon) # ExtendedPolygon.__str__ should be called (instead of Polygon.__str__). self.assertEqual(str(ext_poly), "EXT_POLYGON - data: 3 - POLYGON ((0 0, 0 1, 1 1, 0 0))") + self.assertJSONEqual( + ext_poly.json, + '{"coordinates": [[[0, 0], [0, 1], [1, 1], [0, 0]]], "type": "Polygon"}', + ) def test_geos_version(self): """Testing the GEOS version regular expression."""