mirror of
https://github.com/django/django.git
synced 2025-06-05 11:39:13 +00:00
Fixed #27973 -- Fixed GeoJSON representation of LinearRing and custom GEOSGeometry subclasses.
This commit is contained in:
parent
9cd6ba991f
commit
4bc355079c
@ -15,6 +15,7 @@ from django.contrib.gis.geos.polygon import Polygon
|
|||||||
|
|
||||||
|
|
||||||
class GeometryCollection(GEOSGeometry):
|
class GeometryCollection(GEOSGeometry):
|
||||||
|
_json_type = 'GeometryCollection'
|
||||||
_typeid = 7
|
_typeid = 7
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@ -106,11 +107,13 @@ class GeometryCollection(GEOSGeometry):
|
|||||||
# MultiPoint, MultiLineString, and MultiPolygon class definitions.
|
# MultiPoint, MultiLineString, and MultiPolygon class definitions.
|
||||||
class MultiPoint(GeometryCollection):
|
class MultiPoint(GeometryCollection):
|
||||||
_allowed = Point
|
_allowed = Point
|
||||||
|
_json_type = 'MultiPoint'
|
||||||
_typeid = 4
|
_typeid = 4
|
||||||
|
|
||||||
|
|
||||||
class MultiLineString(LinearGeometryMixin, GeometryCollection):
|
class MultiLineString(LinearGeometryMixin, GeometryCollection):
|
||||||
_allowed = (LineString, LinearRing)
|
_allowed = (LineString, LinearRing)
|
||||||
|
_json_type = 'MultiLineString'
|
||||||
_typeid = 5
|
_typeid = 5
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -122,6 +125,7 @@ class MultiLineString(LinearGeometryMixin, GeometryCollection):
|
|||||||
|
|
||||||
class MultiPolygon(GeometryCollection):
|
class MultiPolygon(GeometryCollection):
|
||||||
_allowed = Polygon
|
_allowed = Polygon
|
||||||
|
_json_type = 'MultiPolygon'
|
||||||
_typeid = 6
|
_typeid = 6
|
||||||
|
|
||||||
|
|
||||||
|
@ -415,7 +415,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
|||||||
"""
|
"""
|
||||||
Return GeoJSON representation of this Geometry.
|
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
|
geojson = json
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -8,6 +8,7 @@ from django.contrib.gis.shortcuts import numpy
|
|||||||
|
|
||||||
class LineString(LinearGeometryMixin, GEOSGeometry):
|
class LineString(LinearGeometryMixin, GEOSGeometry):
|
||||||
_init_func = capi.create_linestring
|
_init_func = capi.create_linestring
|
||||||
|
_json_type = 'LineString'
|
||||||
_minlength = 2
|
_minlength = 2
|
||||||
has_cs = True
|
has_cs = True
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ from django.contrib.gis.geos.geometry import GEOSGeometry
|
|||||||
|
|
||||||
|
|
||||||
class Point(GEOSGeometry):
|
class Point(GEOSGeometry):
|
||||||
|
_json_type = 'Point'
|
||||||
_minlength = 2
|
_minlength = 2
|
||||||
_maxlength = 3
|
_maxlength = 3
|
||||||
has_cs = True
|
has_cs = True
|
||||||
|
@ -7,6 +7,7 @@ from django.contrib.gis.geos.linestring import LinearRing
|
|||||||
|
|
||||||
|
|
||||||
class Polygon(GEOSGeometry):
|
class Polygon(GEOSGeometry):
|
||||||
|
_json_type = 'Polygon'
|
||||||
_minlength = 1
|
_minlength = 1
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
@ -372,6 +372,12 @@ class GEOSTest(SimpleTestCase, TestDataMixin):
|
|||||||
with self.assertRaisesMessage(ValueError, 'LinearRing requires at least 4 points, got 1.'):
|
with self.assertRaisesMessage(ValueError, 'LinearRing requires at least 4 points, got 1.'):
|
||||||
LinearRing(numpy.array([(0, 0)]))
|
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):
|
def test_polygons_from_bbox(self):
|
||||||
"Testing `from_bbox` class method."
|
"Testing `from_bbox` class method."
|
||||||
bbox = (-180, -90, 180, 90)
|
bbox = (-180, -90, 180, 90)
|
||||||
@ -1269,6 +1275,10 @@ class GEOSTest(SimpleTestCase, TestDataMixin):
|
|||||||
self.assertEqual(type(ext_poly), ExtendedPolygon)
|
self.assertEqual(type(ext_poly), ExtendedPolygon)
|
||||||
# ExtendedPolygon.__str__ should be called (instead of Polygon.__str__).
|
# 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.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):
|
def test_geos_version(self):
|
||||||
"""Testing the GEOS version regular expression."""
|
"""Testing the GEOS version regular expression."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user