Rearranged imports in geos files

This commit is contained in:
Claude Paroz 2015-04-24 18:09:20 +02:00
parent d9bcba9b29
commit b695153852
6 changed files with 58 additions and 57 deletions

View File

@ -5,7 +5,9 @@
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 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.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
@ -99,7 +101,7 @@ class MultiPoint(GeometryCollection):
_typeid = 4 _typeid = 4
class MultiLineString(GeometryCollection): class MultiLineString(ProjectInterpolateMixin, GeometryCollection):
_allowed = (LineString, LinearRing) _allowed = (LineString, LinearRing)
_typeid = 5 _typeid = 5

View File

@ -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.error import GEOSException, GEOSIndexError
from django.contrib.gis.geos.libgeos import GEOM_PTR from django.contrib.gis.geos.libgeos import GEOM_PTR
from django.contrib.gis.geos.mutable_list import ListMixin 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 ( from django.contrib.gis.geos.prototypes.io import (
ewkb_w, wkb_r, wkb_w, wkt_r, wkt_w, ewkb_w, wkb_r, wkb_w, wkt_r, wkt_w,
) )
@ -27,8 +28,10 @@ class GEOSGeometry(GEOSBase, ListMixin):
# Raise GEOSIndexError instead of plain IndexError # Raise GEOSIndexError instead of plain IndexError
# (see ticket #4740 and GEOSIndexError docstring) # (see ticket #4740 and GEOSIndexError docstring)
_IndexError = GEOSIndexError _IndexError = GEOSIndexError
_GEOS_CLASSES = None
ptr_type = GEOM_PTR ptr_type = GEOM_PTR
has_cs = False # Only Point, LineString, LinearRing have coordinate sequences
def __init__(self, geo_input, srid=None): def __init__(self, geo_input, srid=None):
""" """
@ -92,7 +95,24 @@ class GEOSGeometry(GEOSBase, ListMixin):
self.srid = srid self.srid = srid
# Setting the class type (e.g., Point, Polygon, etc.) # 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 # Setting the coordinate sequence for the geometry (will be None on
# geometries that do not have coordinate sequences) # geometries that do not have coordinate sequences)
@ -185,15 +205,6 @@ class GEOSGeometry(GEOSBase, ListMixin):
return self.sym_difference(other) return self.sym_difference(other)
# #### Coordinate Sequence Routines #### # #### 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): def _set_cs(self):
"Sets the coordinate sequence for this Geometry." "Sets the coordinate sequence for this Geometry."
if self.has_cs: if self.has_cs:
@ -560,16 +571,6 @@ class GEOSGeometry(GEOSBase, ListMixin):
"Return the envelope for this geometry (a polygon)." "Return the envelope for this geometry (a polygon)."
return self._topology(capi.geos_envelope(self.ptr)) 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): def intersection(self, other):
"Returns a Geometry representing the points shared by this Geometry and other." "Returns a Geometry representing the points shared by this Geometry and other."
return self._topology(capi.geos_intersection(self.ptr, other.ptr)) 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." "Computes an interior point of this Geometry."
return self._topology(capi.geos_pointonsurface(self.ptr)) 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): def relate(self, other):
"Returns the DE-9IM intersection matrix for this Geometry and the other." "Returns the DE-9IM intersection matrix for this Geometry and the other."
return capi.geos_relate(self.ptr, other.ptr).decode() 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 Returns the extent of this geometry as a 4-tuple, consisting of
(xmin, ymin, xmax, ymax). (xmin, ymin, xmax, ymax).
""" """
from .point import Point
env = self.envelope env = self.envelope
if isinstance(env, Point): if isinstance(env, Point):
xmin, ymin = env.tuple xmin, ymin = env.tuple
@ -668,21 +656,25 @@ class GEOSGeometry(GEOSBase, ListMixin):
"Clones this Geometry." "Clones this Geometry."
return GEOSGeometry(capi.geom_clone(self.ptr), srid=self.srid) 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. class ProjectInterpolateMixin(object):
from django.contrib.gis.geos.linestring import LineString, LinearRing # isort:skip """
from django.contrib.gis.geos.point import Point # isort:skip Used for LineString and MultiLineString.
from django.contrib.gis.geos.polygon import Polygon # isort:skip """
from django.contrib.gis.geos.collections import ( # isort:skip def interpolate(self, distance):
GeometryCollection, MultiPoint, MultiLineString, MultiPolygon) return self._topology(capi.geos_interpolate(self.ptr, distance))
from django.contrib.gis.geos.prepared import PreparedGeometry # isort:skip
GEOS_CLASSES = { def interpolate_normalized(self, distance):
0: Point, return self._topology(capi.geos_interpolate_normalized(self.ptr, distance))
1: LineString,
2: LinearRing, def project(self, point):
3: Polygon, from .point import Point
4: MultiPoint, if not isinstance(point, Point):
5: MultiLineString, raise TypeError('locate_point argument must be a Point')
6: MultiPolygon, return capi.geos_project(self.ptr, point.ptr)
7: GeometryCollection,
} 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)

View File

@ -135,6 +135,9 @@ lgeos = SimpleLazyObject(load_geos)
class GEOSFuncFactory(object): class GEOSFuncFactory(object):
"""
Lazy loading of GEOS functions.
"""
argtypes = None argtypes = None
restype = None restype = None
errcheck = None errcheck = None

View File

@ -1,15 +1,18 @@
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 GEOSGeometry from django.contrib.gis.geos.geometry import (
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(GEOSGeometry): class LineString(ProjectInterpolateMixin, GEOSGeometry):
_init_func = capi.create_linestring _init_func = capi.create_linestring
_minlength = 2 _minlength = 2
has_cs = True
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """

View File

@ -10,6 +10,7 @@ from django.utils.six.moves import range
class Point(GEOSGeometry): class Point(GEOSGeometry):
_minlength = 2 _minlength = 2
_maxlength = 3 _maxlength = 3
has_cs = True
def __init__(self, x, y=None, z=None, srid=None): def __init__(self, x, y=None, z=None, srid=None):
""" """

View File

@ -1,6 +1,5 @@
from .base import GEOSBase from .base import GEOSBase
from .error import GEOSException from .error import GEOSException
from .geometry import GEOSGeometry
from .libgeos import geos_version_info from .libgeos import geos_version_info
from .prototypes import prepared as capi from .prototypes import prepared as capi
@ -18,6 +17,7 @@ class PreparedGeometry(GEOSBase):
# from being garbage collected which could then crash the prepared one # from being garbage collected which could then crash the prepared one
# See #21662 # See #21662
self._base_geom = geom self._base_geom = geom
from .geometry import GEOSGeometry
if not isinstance(geom, GEOSGeometry): if not isinstance(geom, GEOSGeometry):
raise TypeError raise TypeError
self.ptr = capi.geos_prepare(geom.ptr) self.ptr = capi.geos_prepare(geom.ptr)