Commit b6951538 authored by Claude Paroz's avatar Claude Paroz
Browse files

Rearranged imports in geos files

parent d9bcba9b
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -5,7 +5,9 @@
from ctypes import byref, c_int, c_uint

from django.contrib.gis.geos import prototypes as capi
from django.contrib.gis.geos.geometry import GEOSGeometry
from django.contrib.gis.geos.geometry import (
    GEOSGeometry, ProjectInterpolateMixin,
)
from django.contrib.gis.geos.libgeos import get_pointer_arr
from django.contrib.gis.geos.linestring import LinearRing, LineString
from django.contrib.gis.geos.point import Point
@@ -99,7 +101,7 @@ class MultiPoint(GeometryCollection):
    _typeid = 4


class MultiLineString(GeometryCollection):
class MultiLineString(ProjectInterpolateMixin, GeometryCollection):
    _allowed = (LineString, LinearRing)
    _typeid = 5

+44 −52
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ from django.contrib.gis.geos.coordseq import GEOSCoordSeq
from django.contrib.gis.geos.error import GEOSException, GEOSIndexError
from django.contrib.gis.geos.libgeos import GEOM_PTR
from django.contrib.gis.geos.mutable_list import ListMixin
from django.contrib.gis.geos.prepared import PreparedGeometry
from django.contrib.gis.geos.prototypes.io import (
    ewkb_w, wkb_r, wkb_w, wkt_r, wkt_w,
)
@@ -27,8 +28,10 @@ class GEOSGeometry(GEOSBase, ListMixin):
    # Raise GEOSIndexError instead of plain IndexError
    # (see ticket #4740 and GEOSIndexError docstring)
    _IndexError = GEOSIndexError
    _GEOS_CLASSES = None

    ptr_type = GEOM_PTR
    has_cs = False  # Only Point, LineString, LinearRing have coordinate sequences

    def __init__(self, geo_input, srid=None):
        """
@@ -92,7 +95,24 @@ class GEOSGeometry(GEOSBase, ListMixin):
            self.srid = srid

        # Setting the class type (e.g., Point, Polygon, etc.)
        self.__class__ = GEOS_CLASSES[self.geom_typeid]
        if GEOSGeometry._GEOS_CLASSES is None:
            # Lazy-loaded variable to avoid import conflicts with GEOSGeometry.
            from .linestring import LineString, LinearRing
            from .point import Point
            from .polygon import Polygon
            from .collections import (
                GeometryCollection, MultiPoint, MultiLineString, MultiPolygon)
            GEOSGeometry._GEOS_CLASSES = {
                0: Point,
                1: LineString,
                2: LinearRing,
                3: Polygon,
                4: MultiPoint,
                5: MultiLineString,
                6: MultiPolygon,
                7: GeometryCollection,
            }
        self.__class__ = GEOSGeometry._GEOS_CLASSES[self.geom_typeid]

        # Setting the coordinate sequence for the geometry (will be None on
        # geometries that do not have coordinate sequences)
@@ -185,15 +205,6 @@ class GEOSGeometry(GEOSBase, ListMixin):
        return self.sym_difference(other)

    # #### Coordinate Sequence Routines ####
    @property
    def has_cs(self):
        "Returns True if this Geometry has a coordinate sequence, False if not."
        # Only these geometries are allowed to have coordinate sequences.
        if isinstance(self, (Point, LineString, LinearRing)):
            return True
        else:
            return False

    def _set_cs(self):
        "Sets the coordinate sequence for this Geometry."
        if self.has_cs:
@@ -560,16 +571,6 @@ class GEOSGeometry(GEOSBase, ListMixin):
        "Return the envelope for this geometry (a polygon)."
        return self._topology(capi.geos_envelope(self.ptr))

    def interpolate(self, distance):
        if not isinstance(self, (LineString, MultiLineString)):
            raise TypeError('interpolate only works on LineString and MultiLineString geometries')
        return self._topology(capi.geos_interpolate(self.ptr, distance))

    def interpolate_normalized(self, distance):
        if not isinstance(self, (LineString, MultiLineString)):
            raise TypeError('interpolate only works on LineString and MultiLineString geometries')
        return self._topology(capi.geos_interpolate_normalized(self.ptr, distance))

    def intersection(self, other):
        "Returns a Geometry representing the points shared by this Geometry and other."
        return self._topology(capi.geos_intersection(self.ptr, other.ptr))
@@ -579,20 +580,6 @@ class GEOSGeometry(GEOSBase, ListMixin):
        "Computes an interior point of this Geometry."
        return self._topology(capi.geos_pointonsurface(self.ptr))

    def project(self, point):
        if not isinstance(point, Point):
            raise TypeError('locate_point argument must be a Point')
        if not isinstance(self, (LineString, MultiLineString)):
            raise TypeError('locate_point only works on LineString and MultiLineString geometries')
        return capi.geos_project(self.ptr, point.ptr)

    def project_normalized(self, point):
        if not isinstance(point, Point):
            raise TypeError('locate_point argument must be a Point')
        if not isinstance(self, (LineString, MultiLineString)):
            raise TypeError('locate_point only works on LineString and MultiLineString geometries')
        return capi.geos_project_normalized(self.ptr, point.ptr)

    def relate(self, other):
        "Returns the DE-9IM intersection matrix for this Geometry and the other."
        return capi.geos_relate(self.ptr, other.ptr).decode()
@@ -647,6 +634,7 @@ class GEOSGeometry(GEOSBase, ListMixin):
        Returns the extent of this geometry as a 4-tuple, consisting of
        (xmin, ymin, xmax, ymax).
        """
        from .point import Point
        env = self.envelope
        if isinstance(env, Point):
            xmin, ymin = env.tuple
@@ -668,21 +656,25 @@ class GEOSGeometry(GEOSBase, ListMixin):
        "Clones this Geometry."
        return GEOSGeometry(capi.geom_clone(self.ptr), srid=self.srid)

# Class mapping dictionary.  Has to be at the end to avoid import
# conflicts with GEOSGeometry.
from django.contrib.gis.geos.linestring import LineString, LinearRing  # isort:skip
from django.contrib.gis.geos.point import Point                     # isort:skip
from django.contrib.gis.geos.polygon import Polygon                 # isort:skip
from django.contrib.gis.geos.collections import (                   # isort:skip
    GeometryCollection, MultiPoint, MultiLineString, MultiPolygon)
from django.contrib.gis.geos.prepared import PreparedGeometry       # isort:skip
GEOS_CLASSES = {
    0: Point,
    1: LineString,
    2: LinearRing,
    3: Polygon,
    4: MultiPoint,
    5: MultiLineString,
    6: MultiPolygon,
    7: GeometryCollection,
}

class ProjectInterpolateMixin(object):
    """
    Used for LineString and MultiLineString.
    """
    def interpolate(self, distance):
        return self._topology(capi.geos_interpolate(self.ptr, distance))

    def interpolate_normalized(self, distance):
        return self._topology(capi.geos_interpolate_normalized(self.ptr, distance))

    def project(self, point):
        from .point import Point
        if not isinstance(point, Point):
            raise TypeError('locate_point argument must be a Point')
        return capi.geos_project(self.ptr, point.ptr)

    def project_normalized(self, point):
        from .point import Point
        if not isinstance(point, Point):
            raise TypeError('locate_point argument must be a Point')
        return capi.geos_project_normalized(self.ptr, point.ptr)
+3 −0
Original line number Diff line number Diff line
@@ -135,6 +135,9 @@ lgeos = SimpleLazyObject(load_geos)


class GEOSFuncFactory(object):
    """
    Lazy loading of GEOS functions.
    """
    argtypes = None
    restype = None
    errcheck = None
+5 −2
Original line number Diff line number Diff line
from django.contrib.gis.geos import prototypes as capi
from django.contrib.gis.geos.coordseq import GEOSCoordSeq
from django.contrib.gis.geos.error import GEOSException
from django.contrib.gis.geos.geometry import GEOSGeometry
from django.contrib.gis.geos.geometry import (
    GEOSGeometry, ProjectInterpolateMixin,
)
from django.contrib.gis.geos.point import Point
from django.contrib.gis.shortcuts import numpy
from django.utils.six.moves import range


class LineString(GEOSGeometry):
class LineString(ProjectInterpolateMixin, GEOSGeometry):
    _init_func = capi.create_linestring
    _minlength = 2
    has_cs = True

    def __init__(self, *args, **kwargs):
        """
+1 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ from django.utils.six.moves import range
class Point(GEOSGeometry):
    _minlength = 2
    _maxlength = 3
    has_cs = True

    def __init__(self, x, y=None, z=None, srid=None):
        """
Loading