Commit 5146e2cf authored by Sergey Fedoseev's avatar Sergey Fedoseev Committed by Tim Graham
Browse files

Fixed #25662 -- Allowed creation of empty GEOS geometries.

parent 8035cee9
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -25,9 +25,6 @@ class GeometryCollection(GEOSGeometry):
        "Initializes a Geometry Collection from a sequence of Geometry objects."

        # Checking the arguments
        if not args:
            raise TypeError('Must provide at least one Geometry to initialize %s.' % self.__class__.__name__)

        if len(args) == 1:
            # If only one geometry provided or a list of geometries is provided
            #  in the first argument.
+7 −3
Original line number Diff line number Diff line
@@ -35,7 +35,14 @@ class LineString(ProjectInterpolateMixin, GEOSGeometry):
        if not (isinstance(coords, (tuple, list)) or numpy and isinstance(coords, numpy.ndarray)):
            raise TypeError('Invalid initialization input for LineStrings.')

        # If SRID was passed in with the keyword arguments
        srid = kwargs.get('srid')

        ncoords = len(coords)
        if not ncoords:
            super(LineString, self).__init__(self._init_func(None), srid=srid)
            return

        if ncoords < self._minlength:
            raise ValueError(
                '%s requires at least %d points, got %s.' % (
@@ -80,9 +87,6 @@ class LineString(ProjectInterpolateMixin, GEOSGeometry):
            else:
                cs[i] = coords[i]

        # If SRID was passed in with the keyword arguments
        srid = kwargs.get('srid')

        # Calling the base geometry initialization with the returned pointer
        #  from the function.
        super(LineString, self).__init__(self._init_func(cs.ptr), srid=srid)
+1 −1
Original line number Diff line number Diff line
@@ -229,7 +229,7 @@ class ListMixin(object):

    # ### Private routines ###
    def _rebuild(self, newLen, newItems):
        if newLen < self._minlength:
        if newLen and newLen < self._minlength:
            raise ValueError('Must have at least %d items' % self._minlength)
        if self._maxlength is not None and newLen > self._maxlength:
            raise ValueError('Cannot have more than %d items' % self._maxlength)
+8 −6
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@ class Point(GEOSGeometry):
    _maxlength = 3
    has_cs = True

    def __init__(self, x, y=None, z=None, srid=None):
    def __init__(self, x=None, y=None, z=None, srid=None):
        """
        The Point object may be initialized with either a tuple, or individual
        parameters.
@@ -23,22 +23,21 @@ class Point(GEOSGeometry):
        >>> p = Point((5, 23)) # 2D point, passed in as a tuple
        >>> p = Point(5, 23, 8) # 3D point, passed in with individual parameters
        """
        if isinstance(x, (tuple, list)):
        if x is None:
            coords = []
        elif isinstance(x, (tuple, list)):
            # Here a tuple or list was passed in under the `x` parameter.
            ndim = len(x)
            coords = x
        elif isinstance(x, six.integer_types + (float,)) and isinstance(y, six.integer_types + (float,)):
            # Here X, Y, and (optionally) Z were passed in individually, as parameters.
            if isinstance(z, six.integer_types + (float,)):
                ndim = 3
                coords = [x, y, z]
            else:
                ndim = 2
                coords = [x, y]
        else:
            raise TypeError('Invalid parameters given for Point initialization.')

        point = self._create_point(ndim, coords)
        point = self._create_point(len(coords), coords)

        # Initializing using the address returned from the GEOS
        #  createPoint factory.
@@ -48,6 +47,9 @@ class Point(GEOSGeometry):
        """
        Create a coordinate sequence, set X, Y, [Z], and create point
        """
        if not ndim:
            return capi.create_point(None)

        if ndim < 2 or ndim > 3:
            raise TypeError('Invalid point dimension: %s' % str(ndim))

+5 −1
Original line number Diff line number Diff line
@@ -29,7 +29,8 @@ class Polygon(GEOSGeometry):
        ...                ((4, 4), (4, 6), (6, 6), (6, 4), (4, 4)))
        """
        if not args:
            raise TypeError('Must provide at least one LinearRing, or a tuple, to initialize a Polygon.')
            super(Polygon, self).__init__(self._create_polygon(0, None), **kwargs)
            return

        # Getting the ext_ring and init_holes parameters from the argument list
        ext_ring = args[0]
@@ -73,6 +74,9 @@ class Polygon(GEOSGeometry):
        # _construct_ring will throw a TypeError if a parameter isn't a valid ring
        # If we cloned the pointers here, we wouldn't be able to clean up
        # in case of error.
        if not length:
            return capi.create_empty_polygon()

        rings = []
        for r in items:
            if isinstance(r, GEOM_PTR):
Loading