Kaydet (Commit) 5d348bba authored tarafından Sergey Fedoseev's avatar Sergey Fedoseev Kaydeden (comit) Tim Graham

Fixed #25950 -- Added support for GEOSisClosed.

üst 64ba7d82
...@@ -7,10 +7,9 @@ import warnings ...@@ -7,10 +7,9 @@ import warnings
from ctypes import byref, c_int, c_uint from ctypes import byref, c_int, c_uint
from django.contrib.gis.geos import prototypes as capi from django.contrib.gis.geos import prototypes as capi
from django.contrib.gis.geos.geometry import ( from django.contrib.gis.geos.error import GEOSException
GEOSGeometry, ProjectInterpolateMixin, from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin
) from django.contrib.gis.geos.libgeos import geos_version_info, get_pointer_arr
from django.contrib.gis.geos.libgeos import get_pointer_arr
from django.contrib.gis.geos.linestring import LinearRing, LineString from django.contrib.gis.geos.linestring import LinearRing, LineString
from django.contrib.gis.geos.point import Point from django.contrib.gis.geos.point import Point
from django.contrib.gis.geos.polygon import Polygon from django.contrib.gis.geos.polygon import Polygon
...@@ -114,17 +113,15 @@ class MultiPoint(GeometryCollection): ...@@ -114,17 +113,15 @@ class MultiPoint(GeometryCollection):
_typeid = 4 _typeid = 4
class MultiLineString(ProjectInterpolateMixin, GeometryCollection): class MultiLineString(LinearGeometryMixin, GeometryCollection):
_allowed = (LineString, LinearRing) _allowed = (LineString, LinearRing)
_typeid = 5 _typeid = 5
@property @property
def merged(self): def closed(self):
""" if geos_version_info()['version'] < '3.5':
Returns a LineString representing the line merge of this raise GEOSException("MultiLineString.closed requires GEOS >= 3.5.0.")
MultiLineString. return super(MultiLineString, self).closed
"""
return self._topology(capi.geos_linemerge(self.ptr))
class MultiPolygon(GeometryCollection): class MultiPolygon(GeometryCollection):
......
...@@ -685,7 +685,7 @@ class GEOSGeometry(GEOSBase, ListMixin): ...@@ -685,7 +685,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
return GEOSGeometry(capi.geom_clone(self.ptr), srid=self.srid) return GEOSGeometry(capi.geom_clone(self.ptr), srid=self.srid)
class ProjectInterpolateMixin(object): class LinearGeometryMixin(object):
""" """
Used for LineString and MultiLineString. Used for LineString and MultiLineString.
""" """
...@@ -706,3 +706,17 @@ class ProjectInterpolateMixin(object): ...@@ -706,3 +706,17 @@ class ProjectInterpolateMixin(object):
if not isinstance(point, Point): if not isinstance(point, Point):
raise TypeError('locate_point argument must be a Point') raise TypeError('locate_point argument must be a Point')
return capi.geos_project_normalized(self.ptr, point.ptr) return capi.geos_project_normalized(self.ptr, point.ptr)
@property
def merged(self):
"""
Return the line merge of this Geometry.
"""
return self._topology(capi.geos_linemerge(self.ptr))
@property
def closed(self):
"""
Return whether or not this Geometry is closed.
"""
return capi.geos_isclosed(self.ptr)
from django.contrib.gis.geos import prototypes as capi from django.contrib.gis.geos import prototypes as capi
from django.contrib.gis.geos.coordseq import GEOSCoordSeq from django.contrib.gis.geos.coordseq import GEOSCoordSeq
from django.contrib.gis.geos.error import GEOSException from django.contrib.gis.geos.error import GEOSException
from django.contrib.gis.geos.geometry import ( from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin
GEOSGeometry, ProjectInterpolateMixin,
)
from django.contrib.gis.geos.point import Point from django.contrib.gis.geos.point import Point
from django.contrib.gis.shortcuts import numpy from django.contrib.gis.shortcuts import numpy
from django.utils.six.moves import range from django.utils.six.moves import range
class LineString(ProjectInterpolateMixin, GEOSGeometry): class LineString(LinearGeometryMixin, GEOSGeometry):
_init_func = capi.create_linestring _init_func = capi.create_linestring
_minlength = 2 _minlength = 2
has_cs = True has_cs = True
...@@ -154,11 +152,6 @@ class LineString(ProjectInterpolateMixin, GEOSGeometry): ...@@ -154,11 +152,6 @@ class LineString(ProjectInterpolateMixin, GEOSGeometry):
"Returns a numpy array for the LineString." "Returns a numpy array for the LineString."
return self._listarr(self._cs.__getitem__) return self._listarr(self._cs.__getitem__)
@property
def merged(self):
"Returns the line merge of this LineString."
return self._topology(capi.geos_linemerge(self.ptr))
@property @property
def x(self): def x(self):
"Returns a list or numpy array of the X variable." "Returns a list or numpy array of the X variable."
......
...@@ -19,8 +19,8 @@ from django.contrib.gis.geos.prototypes.geom import ( # NOQA ...@@ -19,8 +19,8 @@ from django.contrib.gis.geos.prototypes.geom import ( # NOQA
from django.contrib.gis.geos.prototypes.misc import * # NOQA from django.contrib.gis.geos.prototypes.misc import * # NOQA
from django.contrib.gis.geos.prototypes.predicates import ( # NOQA from django.contrib.gis.geos.prototypes.predicates import ( # NOQA
geos_contains, geos_covers, geos_crosses, geos_disjoint, geos_equals, geos_contains, geos_covers, geos_crosses, geos_disjoint, geos_equals,
geos_equalsexact, geos_hasz, geos_intersects, geos_isempty, geos_isring, geos_equalsexact, geos_hasz, geos_intersects, geos_isclosed, geos_isempty,
geos_issimple, geos_isvalid, geos_overlaps, geos_relatepattern, geos_isring, geos_issimple, geos_isvalid, geos_overlaps,
geos_touches, geos_within, geos_relatepattern, geos_touches, geos_within,
) )
from django.contrib.gis.geos.prototypes.topology import * # NOQA from django.contrib.gis.geos.prototypes.topology import * # NOQA
...@@ -23,6 +23,7 @@ class BinaryPredicate(UnaryPredicate): ...@@ -23,6 +23,7 @@ class BinaryPredicate(UnaryPredicate):
# ## Unary Predicates ## # ## Unary Predicates ##
geos_hasz = UnaryPredicate('GEOSHasZ') geos_hasz = UnaryPredicate('GEOSHasZ')
geos_isclosed = UnaryPredicate('GEOSisClosed')
geos_isempty = UnaryPredicate('GEOSisEmpty') geos_isempty = UnaryPredicate('GEOSisEmpty')
geos_isring = UnaryPredicate('GEOSisRing') geos_isring = UnaryPredicate('GEOSisRing')
geos_issimple = UnaryPredicate('GEOSisSimple') geos_issimple = UnaryPredicate('GEOSisSimple')
......
...@@ -694,6 +694,12 @@ is returned instead. ...@@ -694,6 +694,12 @@ is returned instead.
In previous versions, an empty ``LineString`` couldn't be instantiated. In previous versions, an empty ``LineString`` couldn't be instantiated.
.. attribute:: closed
.. versionadded:: 1.10
Returns whether or not this ``LineString`` is closed.
``LinearRing`` ``LinearRing``
-------------- --------------
...@@ -790,6 +796,11 @@ Geometry Collections ...@@ -790,6 +796,11 @@ Geometry Collections
Returns a :class:`LineString` representing the line merge of Returns a :class:`LineString` representing the line merge of
all the components in this ``MultiLineString``. all the components in this ``MultiLineString``.
.. attribute:: closed
.. versionadded:: 1.10
Returns ``True`` if and only if all elements are closed. Requires GEOS 3.5.
``MultiPolygon`` ``MultiPolygon``
---------------- ----------------
......
...@@ -104,6 +104,11 @@ Minor features ...@@ -104,6 +104,11 @@ Minor features
of :class:`~django.contrib.gis.geos.WKTWriter` allow controlling of :class:`~django.contrib.gis.geos.WKTWriter` allow controlling
output of the fractional part of the coordinates in WKT. output of the fractional part of the coordinates in WKT.
* Added the :attr:`LineString.closed
<django.contrib.gis.geos.LineString.closed>` and
:attr:`MultiLineString.closed
<django.contrib.gis.geos.MultiLineString.closed>` properties.
:mod:`django.contrib.messages` :mod:`django.contrib.messages`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
......
...@@ -15,6 +15,7 @@ from django.contrib.gis.geos import ( ...@@ -15,6 +15,7 @@ from django.contrib.gis.geos import (
fromfile, fromstr, fromfile, fromstr,
) )
from django.contrib.gis.geos.base import GEOSBase from django.contrib.gis.geos.base import GEOSBase
from django.contrib.gis.geos.libgeos import geos_version_info
from django.contrib.gis.shortcuts import numpy from django.contrib.gis.shortcuts import numpy
from django.template import Context from django.template import Context
from django.template.engine import Engine from django.template.engine import Engine
...@@ -660,6 +661,20 @@ class GEOSTest(SimpleTestCase, TestDataMixin): ...@@ -660,6 +661,20 @@ class GEOSTest(SimpleTestCase, TestDataMixin):
self.assertTrue(poly.covers(Point(5, 5))) self.assertTrue(poly.covers(Point(5, 5)))
self.assertFalse(poly.covers(Point(100, 100))) self.assertFalse(poly.covers(Point(100, 100)))
def test_closed(self):
ls_closed = LineString((0, 0), (1, 1), (0, 0))
ls_not_closed = LineString((0, 0), (1, 1))
self.assertFalse(ls_not_closed.closed)
self.assertTrue(ls_closed.closed)
if geos_version_info()['version'] >= '3.5':
self.assertFalse(MultiLineString(ls_closed, ls_not_closed).closed)
self.assertTrue(MultiLineString(ls_closed, ls_closed).closed)
with mock.patch('django.contrib.gis.geos.collections.geos_version_info', lambda: {'version': '3.4.9'}):
with self.assertRaisesMessage(GEOSException, "MultiLineString.closed requires GEOS >= 3.5.0."):
MultiLineString().closed
def test_srid(self): def test_srid(self):
"Testing the SRID property and keyword." "Testing the SRID property and keyword."
# Testing SRID keyword on Point # Testing SRID keyword on Point
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment