summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2017-03-29 22:17:31 +0500
committerTim Graham <timograham@gmail.com>2017-03-29 13:17:31 -0400
commit4bc355079c995162354c47d770fa5290470620ca (patch)
treeab6e5d19c9317e7bfc40facc18686bf65e64df39
parent9cd6ba991f75bec78a5d34f4a0a765388b2a173b (diff)
Fixed #27973 -- Fixed GeoJSON representation of LinearRing and custom GEOSGeometry subclasses.
-rw-r--r--django/contrib/gis/geos/collections.py4
-rw-r--r--django/contrib/gis/geos/geometry.py2
-rw-r--r--django/contrib/gis/geos/linestring.py1
-rw-r--r--django/contrib/gis/geos/point.py1
-rw-r--r--django/contrib/gis/geos/polygon.py1
-rw-r--r--tests/gis_tests/geos_tests/test_geos.py10
6 files changed, 18 insertions, 1 deletions
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."""