Fixed #21270 -- Fixed E701 pep8 warnings
This commit is contained in:
parent
650b6fd90e
commit
eb214452c3
|
@ -198,8 +198,10 @@ class ChangeList(six.with_metaclass(RenameChangeListMethods)):
|
||||||
six.reraise(IncorrectLookupParameters, IncorrectLookupParameters(e), sys.exc_info()[2])
|
six.reraise(IncorrectLookupParameters, IncorrectLookupParameters(e), sys.exc_info()[2])
|
||||||
|
|
||||||
def get_query_string(self, new_params=None, remove=None):
|
def get_query_string(self, new_params=None, remove=None):
|
||||||
if new_params is None: new_params = {}
|
if new_params is None:
|
||||||
if remove is None: remove = []
|
new_params = {}
|
||||||
|
if remove is None:
|
||||||
|
remove = []
|
||||||
p = self.params.copy()
|
p = self.params.copy()
|
||||||
for r in remove:
|
for r in remove:
|
||||||
for k in list(p):
|
for k in list(p):
|
||||||
|
|
|
@ -94,15 +94,19 @@ ROLES = {
|
||||||
|
|
||||||
def create_reference_role(rolename, urlbase):
|
def create_reference_role(rolename, urlbase):
|
||||||
def _role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
def _role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
||||||
if options is None: options = {}
|
if options is None:
|
||||||
if content is None: content = []
|
options = {}
|
||||||
|
if content is None:
|
||||||
|
content = []
|
||||||
node = docutils.nodes.reference(rawtext, text, refuri=(urlbase % (inliner.document.settings.link_base, text.lower())), **options)
|
node = docutils.nodes.reference(rawtext, text, refuri=(urlbase % (inliner.document.settings.link_base, text.lower())), **options)
|
||||||
return [node], []
|
return [node], []
|
||||||
docutils.parsers.rst.roles.register_canonical_role(rolename, _role)
|
docutils.parsers.rst.roles.register_canonical_role(rolename, _role)
|
||||||
|
|
||||||
def default_reference_role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
def default_reference_role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
||||||
if options is None: options = {}
|
if options is None:
|
||||||
if content is None: content = []
|
options = {}
|
||||||
|
if content is None:
|
||||||
|
content = []
|
||||||
context = inliner.document.settings.default_reference_context
|
context = inliner.document.settings.default_reference_context
|
||||||
node = docutils.nodes.reference(rawtext, text, refuri=(ROLES[context] % (inliner.document.settings.link_base, text.lower())), **options)
|
node = docutils.nodes.reference(rawtext, text, refuri=(ROLES[context] % (inliner.document.settings.link_base, text.lower())), **options)
|
||||||
return [node], []
|
return [node], []
|
||||||
|
|
|
@ -70,8 +70,10 @@ class GeoModelAdmin(ModelAdmin):
|
||||||
"""
|
"""
|
||||||
is_collection = db_field.geom_type in ('MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION')
|
is_collection = db_field.geom_type in ('MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION')
|
||||||
if is_collection:
|
if is_collection:
|
||||||
if db_field.geom_type == 'GEOMETRYCOLLECTION': collection_type = 'Any'
|
if db_field.geom_type == 'GEOMETRYCOLLECTION':
|
||||||
else: collection_type = OGRGeomType(db_field.geom_type.replace('MULTI', ''))
|
collection_type = 'Any'
|
||||||
|
else:
|
||||||
|
collection_type = OGRGeomType(db_field.geom_type.replace('MULTI', ''))
|
||||||
else:
|
else:
|
||||||
collection_type = 'None'
|
collection_type = 'None'
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,8 @@ class OpenLayersWidget(Textarea):
|
||||||
"""
|
"""
|
||||||
def render(self, name, value, attrs=None):
|
def render(self, name, value, attrs=None):
|
||||||
# Update the template parameters with any attributes passed in.
|
# Update the template parameters with any attributes passed in.
|
||||||
if attrs: self.params.update(attrs)
|
if attrs:
|
||||||
|
self.params.update(attrs)
|
||||||
|
|
||||||
# Defaulting the WKT value to a blank string -- this
|
# Defaulting the WKT value to a blank string -- this
|
||||||
# will be tested in the JavaScript and the appropriate
|
# will be tested in the JavaScript and the appropriate
|
||||||
|
|
|
@ -201,8 +201,10 @@ class SpatialRefSysMixin(object):
|
||||||
return self.srs.ellipsoid
|
return self.srs.ellipsoid
|
||||||
else:
|
else:
|
||||||
m = self.spheroid_regex.match(self.wkt)
|
m = self.spheroid_regex.match(self.wkt)
|
||||||
if m: return (float(m.group('major')), float(m.group('flattening')))
|
if m:
|
||||||
else: return None
|
return (float(m.group('major')), float(m.group('flattening')))
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
|
|
|
@ -72,7 +72,8 @@ class PostGISIntrospection(DatabaseIntrospection):
|
||||||
'WHERE "f_table_name"=%s AND "f_geometry_column"=%s',
|
'WHERE "f_table_name"=%s AND "f_geometry_column"=%s',
|
||||||
(table_name, geo_col))
|
(table_name, geo_col))
|
||||||
row = cursor.fetchone()
|
row = cursor.fetchone()
|
||||||
if not row: raise GeoIntrospectionError
|
if not row:
|
||||||
|
raise GeoIntrospectionError
|
||||||
except GeoIntrospectionError:
|
except GeoIntrospectionError:
|
||||||
if self.connection.ops.geography:
|
if self.connection.ops.geography:
|
||||||
cursor.execute('SELECT "coord_dimension", "srid", "type" '
|
cursor.execute('SELECT "coord_dimension", "srid", "type" '
|
||||||
|
|
|
@ -453,8 +453,10 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
|
||||||
Helper routine that returns a boolean indicating whether the number of
|
Helper routine that returns a boolean indicating whether the number of
|
||||||
parameters is correct for the lookup type.
|
parameters is correct for the lookup type.
|
||||||
"""
|
"""
|
||||||
def exactly_two(np): return np == 2
|
def exactly_two(np):
|
||||||
def two_to_three(np): return np >= 2 and np <=3
|
return np == 2
|
||||||
|
def two_to_three(np):
|
||||||
|
return np >= 2 and np <=3
|
||||||
if (lookup_type in self.distance_functions and
|
if (lookup_type in self.distance_functions and
|
||||||
lookup_type != 'dwithin'):
|
lookup_type != 'dwithin'):
|
||||||
return two_to_three(num_param)
|
return two_to_three(num_param)
|
||||||
|
|
|
@ -275,12 +275,14 @@ class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
|
||||||
version = None
|
version = None
|
||||||
try:
|
try:
|
||||||
tmp = self._get_spatialite_func("X(GeomFromText('POINT(1 1)'))")
|
tmp = self._get_spatialite_func("X(GeomFromText('POINT(1 1)'))")
|
||||||
if tmp == 1.0: version = '2.3.0'
|
if tmp == 1.0:
|
||||||
|
version = '2.3.0'
|
||||||
except DatabaseError:
|
except DatabaseError:
|
||||||
pass
|
pass
|
||||||
# If no version string defined, then just re-raise the original
|
# If no version string defined, then just re-raise the original
|
||||||
# exception.
|
# exception.
|
||||||
if version is None: raise
|
if version is None:
|
||||||
|
raise
|
||||||
|
|
||||||
m = self.version_regex.match(version)
|
m = self.version_regex.match(version)
|
||||||
if m:
|
if m:
|
||||||
|
@ -301,7 +303,8 @@ class SpatiaLiteOperations(DatabaseOperations, BaseSpatialOperations):
|
||||||
if not self.check_aggregate_support(agg):
|
if not self.check_aggregate_support(agg):
|
||||||
raise NotImplementedError('%s spatial aggregate is not implmented for this backend.' % agg_name)
|
raise NotImplementedError('%s spatial aggregate is not implmented for this backend.' % agg_name)
|
||||||
agg_name = agg_name.lower()
|
agg_name = agg_name.lower()
|
||||||
if agg_name == 'union': agg_name += 'agg'
|
if agg_name == 'union':
|
||||||
|
agg_name += 'agg'
|
||||||
sql_template = self.select % '%(function)s(%(field)s)'
|
sql_template = self.select % '%(function)s(%(field)s)'
|
||||||
sql_function = getattr(self, agg_name)
|
sql_function = getattr(self, agg_name)
|
||||||
return sql_template, sql_function
|
return sql_template, sql_function
|
||||||
|
|
|
@ -54,7 +54,8 @@ class GeometryProxy(object):
|
||||||
# general GeometryField is used.
|
# general GeometryField is used.
|
||||||
if isinstance(value, self._klass) and (str(value.geom_type).upper() == gtype or gtype == 'GEOMETRY'):
|
if isinstance(value, self._klass) and (str(value.geom_type).upper() == gtype or gtype == 'GEOMETRY'):
|
||||||
# Assigning the SRID to the geometry.
|
# Assigning the SRID to the geometry.
|
||||||
if value.srid is None: value.srid = self._field.srid
|
if value.srid is None:
|
||||||
|
value.srid = self._field.srid
|
||||||
elif value is None or isinstance(value, six.string_types + (memoryview,)):
|
elif value is None or isinstance(value, six.string_types + (memoryview,)):
|
||||||
# Set with None, WKT, HEX, or WKB
|
# Set with None, WKT, HEX, or WKB
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -156,14 +156,20 @@ class GeoQuerySet(QuerySet):
|
||||||
# PostGIS we're using. SpatiaLite only uses the first group of options.
|
# PostGIS we're using. SpatiaLite only uses the first group of options.
|
||||||
if backend.spatial_version >= (1, 4, 0):
|
if backend.spatial_version >= (1, 4, 0):
|
||||||
options = 0
|
options = 0
|
||||||
if crs and bbox: options = 3
|
if crs and bbox:
|
||||||
elif bbox: options = 1
|
options = 3
|
||||||
elif crs: options = 2
|
elif bbox:
|
||||||
|
options = 1
|
||||||
|
elif crs:
|
||||||
|
options = 2
|
||||||
else:
|
else:
|
||||||
options = 0
|
options = 0
|
||||||
if crs and bbox: options = 3
|
if crs and bbox:
|
||||||
elif crs: options = 1
|
options = 3
|
||||||
elif bbox: options = 2
|
elif crs:
|
||||||
|
options = 1
|
||||||
|
elif bbox:
|
||||||
|
options = 2
|
||||||
s = {'desc' : 'GeoJSON',
|
s = {'desc' : 'GeoJSON',
|
||||||
'procedure_args' : {'precision' : precision, 'options' : options},
|
'procedure_args' : {'precision' : precision, 'options' : options},
|
||||||
'procedure_fmt' : '%(geo_col)s,%(precision)s,%(options)s',
|
'procedure_fmt' : '%(geo_col)s,%(precision)s,%(options)s',
|
||||||
|
@ -441,7 +447,8 @@ class GeoQuerySet(QuerySet):
|
||||||
# Does the spatial backend support this?
|
# Does the spatial backend support this?
|
||||||
connection = connections[self.db]
|
connection = connections[self.db]
|
||||||
func = getattr(connection.ops, att, False)
|
func = getattr(connection.ops, att, False)
|
||||||
if desc is None: desc = att
|
if desc is None:
|
||||||
|
desc = att
|
||||||
if not func:
|
if not func:
|
||||||
raise NotImplementedError('%s stored procedure not available on '
|
raise NotImplementedError('%s stored procedure not available on '
|
||||||
'the %s backend.' %
|
'the %s backend.' %
|
||||||
|
@ -489,7 +496,8 @@ class GeoQuerySet(QuerySet):
|
||||||
# Adding any keyword parameters for the Aggregate object. Oracle backends
|
# Adding any keyword parameters for the Aggregate object. Oracle backends
|
||||||
# in particular need an additional `tolerance` parameter.
|
# in particular need an additional `tolerance` parameter.
|
||||||
agg_kwargs = {}
|
agg_kwargs = {}
|
||||||
if connections[self.db].ops.oracle: agg_kwargs['tolerance'] = tolerance
|
if connections[self.db].ops.oracle:
|
||||||
|
agg_kwargs['tolerance'] = tolerance
|
||||||
|
|
||||||
# Calling the QuerySet.aggregate, and returning only the value of the aggregate.
|
# Calling the QuerySet.aggregate, and returning only the value of the aggregate.
|
||||||
return self.aggregate(geoagg=aggregate(agg_col, **agg_kwargs))['geoagg']
|
return self.aggregate(geoagg=aggregate(agg_col, **agg_kwargs))['geoagg']
|
||||||
|
@ -533,12 +541,14 @@ class GeoQuerySet(QuerySet):
|
||||||
if settings.get('setup', True):
|
if settings.get('setup', True):
|
||||||
default_args, geo_field = self._spatial_setup(att, desc=settings['desc'], field_name=field_name,
|
default_args, geo_field = self._spatial_setup(att, desc=settings['desc'], field_name=field_name,
|
||||||
geo_field_type=settings.get('geo_field_type', None))
|
geo_field_type=settings.get('geo_field_type', None))
|
||||||
for k, v in six.iteritems(default_args): settings['procedure_args'].setdefault(k, v)
|
for k, v in six.iteritems(default_args):
|
||||||
|
settings['procedure_args'].setdefault(k, v)
|
||||||
else:
|
else:
|
||||||
geo_field = settings['geo_field']
|
geo_field = settings['geo_field']
|
||||||
|
|
||||||
# The attribute to attach to the model.
|
# The attribute to attach to the model.
|
||||||
if not isinstance(model_att, six.string_types): model_att = att
|
if not isinstance(model_att, six.string_types):
|
||||||
|
model_att = att
|
||||||
|
|
||||||
# Special handling for any argument that is a geometry.
|
# Special handling for any argument that is a geometry.
|
||||||
for name in settings['geom_args']:
|
for name in settings['geom_args']:
|
||||||
|
|
|
@ -166,7 +166,8 @@ class GeoSQLCompiler(compiler.SQLCompiler):
|
||||||
# doing pagination with Oracle.
|
# doing pagination with Oracle.
|
||||||
rn_offset = 0
|
rn_offset = 0
|
||||||
if self.connection.ops.oracle:
|
if self.connection.ops.oracle:
|
||||||
if self.query.high_mark is not None or self.query.low_mark: rn_offset = 1
|
if self.query.high_mark is not None or self.query.low_mark:
|
||||||
|
rn_offset = 1
|
||||||
index_start = rn_offset + len(aliases)
|
index_start = rn_offset + len(aliases)
|
||||||
|
|
||||||
# Converting any extra selection values (e.g., geometries and
|
# Converting any extra selection values (e.g., geometries and
|
||||||
|
@ -243,7 +244,8 @@ class GeoSQLCompiler(compiler.SQLCompiler):
|
||||||
used. If `column` is specified, it will be used instead of the value
|
used. If `column` is specified, it will be used instead of the value
|
||||||
in `field.column`.
|
in `field.column`.
|
||||||
"""
|
"""
|
||||||
if table_alias is None: table_alias = self.query.get_meta().db_table
|
if table_alias is None:
|
||||||
|
table_alias = self.query.get_meta().db_table
|
||||||
return "%s.%s" % (self.quote_name_unless_alias(table_alias),
|
return "%s.%s" % (self.quote_name_unless_alias(table_alias),
|
||||||
self.connection.ops.quote_name(column or field.column))
|
self.connection.ops.quote_name(column or field.column))
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,8 @@ class GeoQuery(sql.Query):
|
||||||
if field_name is None:
|
if field_name is None:
|
||||||
# Incrementing until the first geographic field is found.
|
# Incrementing until the first geographic field is found.
|
||||||
for fld in self.model._meta.fields:
|
for fld in self.model._meta.fields:
|
||||||
if isinstance(fld, GeometryField): return fld
|
if isinstance(fld, GeometryField):
|
||||||
|
return fld
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
# Otherwise, check by the given field name -- which may be
|
# Otherwise, check by the given field name -- which may be
|
||||||
|
|
|
@ -58,7 +58,8 @@ class GeoFeedMixin(object):
|
||||||
raise ValueError('Only should be 2 or 4 numeric elements.')
|
raise ValueError('Only should be 2 or 4 numeric elements.')
|
||||||
# If a GeoRSS box was given via tuple.
|
# If a GeoRSS box was given via tuple.
|
||||||
if not box_coords is None:
|
if not box_coords is None:
|
||||||
if w3c_geo: raise ValueError('Cannot use simple GeoRSS box in W3C Geo feeds.')
|
if w3c_geo:
|
||||||
|
raise ValueError('Cannot use simple GeoRSS box in W3C Geo feeds.')
|
||||||
handler.addQuickElement('georss:box', self.georss_coords(box_coords))
|
handler.addQuickElement('georss:box', self.georss_coords(box_coords))
|
||||||
else:
|
else:
|
||||||
# Getting the lower-case geometry type.
|
# Getting the lower-case geometry type.
|
||||||
|
@ -66,7 +67,8 @@ class GeoFeedMixin(object):
|
||||||
if gtype == 'point':
|
if gtype == 'point':
|
||||||
self.add_georss_point(handler, geom.coords, w3c_geo=w3c_geo)
|
self.add_georss_point(handler, geom.coords, w3c_geo=w3c_geo)
|
||||||
else:
|
else:
|
||||||
if w3c_geo: raise ValueError('W3C Geo only supports Point geometries.')
|
if w3c_geo:
|
||||||
|
raise ValueError('W3C Geo only supports Point geometries.')
|
||||||
# For formatting consistent w/the GeoRSS simple standard:
|
# For formatting consistent w/the GeoRSS simple standard:
|
||||||
# http://georss.org/1.0#simple
|
# http://georss.org/1.0#simple
|
||||||
if gtype in ('linestring', 'linearring'):
|
if gtype in ('linestring', 'linearring'):
|
||||||
|
|
|
@ -19,8 +19,10 @@ class GDALBase(object):
|
||||||
# Raise an exception if the pointer isn't valid don't
|
# Raise an exception if the pointer isn't valid don't
|
||||||
# want to be passing NULL pointers to routines --
|
# want to be passing NULL pointers to routines --
|
||||||
# that's very bad.
|
# that's very bad.
|
||||||
if self._ptr: return self._ptr
|
if self._ptr:
|
||||||
else: raise GDALException('GDAL %s pointer no longer valid.' % self.__class__.__name__)
|
return self._ptr
|
||||||
|
else:
|
||||||
|
raise GDALException('GDAL %s pointer no longer valid.' % self.__class__.__name__)
|
||||||
|
|
||||||
def _set_ptr(self, ptr):
|
def _set_ptr(self, ptr):
|
||||||
# Only allow the pointer to be set with pointers of the
|
# Only allow the pointer to be set with pointers of the
|
||||||
|
|
|
@ -95,7 +95,8 @@ class DataSource(GDALBase):
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"Destroys this DataStructure object."
|
"Destroys this DataStructure object."
|
||||||
if self._ptr: capi.destroy_ds(self._ptr)
|
if self._ptr:
|
||||||
|
capi.destroy_ds(self._ptr)
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
"Allows for iteration over the layers in a data source."
|
"Allows for iteration over the layers in a data source."
|
||||||
|
@ -106,7 +107,8 @@ class DataSource(GDALBase):
|
||||||
"Allows use of the index [] operator to get a layer at the index."
|
"Allows use of the index [] operator to get a layer at the index."
|
||||||
if isinstance(index, six.string_types):
|
if isinstance(index, six.string_types):
|
||||||
l = capi.get_layer_by_name(self.ptr, force_bytes(index))
|
l = capi.get_layer_by_name(self.ptr, force_bytes(index))
|
||||||
if not l: raise OGRIndexError('invalid OGR Layer name given: "%s"' % index)
|
if not l:
|
||||||
|
raise OGRIndexError('invalid OGR Layer name given: "%s"' % index)
|
||||||
elif isinstance(index, int):
|
elif isinstance(index, int):
|
||||||
if index < 0 or index >= self.layer_count:
|
if index < 0 or index >= self.layer_count:
|
||||||
raise OGRIndexError('index out of range')
|
raise OGRIndexError('index out of range')
|
||||||
|
|
|
@ -59,7 +59,8 @@ class Driver(GDALBase):
|
||||||
"Attempts to register all the data source drivers."
|
"Attempts to register all the data source drivers."
|
||||||
# Only register all if the driver count is 0 (or else all drivers
|
# Only register all if the driver count is 0 (or else all drivers
|
||||||
# will be registered over and over again)
|
# will be registered over and over again)
|
||||||
if not self.driver_count: capi.register_all()
|
if not self.driver_count:
|
||||||
|
capi.register_all()
|
||||||
|
|
||||||
# Driver properties
|
# Driver properties
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -4,9 +4,15 @@
|
||||||
OGR methods.
|
OGR methods.
|
||||||
"""
|
"""
|
||||||
#### OGR & SRS Exceptions ####
|
#### OGR & SRS Exceptions ####
|
||||||
class GDALException(Exception): pass
|
class GDALException(Exception):
|
||||||
class OGRException(Exception): pass
|
pass
|
||||||
class SRSException(Exception): pass
|
|
||||||
|
class OGRException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class SRSException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
class OGRIndexError(OGRException, KeyError):
|
class OGRIndexError(OGRException, KeyError):
|
||||||
"""
|
"""
|
||||||
This exception is raised when an invalid index is encountered, and has
|
This exception is raised when an invalid index is encountered, and has
|
||||||
|
|
|
@ -33,7 +33,8 @@ class Feature(GDALBase):
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"Releases a reference to this object."
|
"Releases a reference to this object."
|
||||||
if self._ptr: capi.destroy_feature(self._ptr)
|
if self._ptr:
|
||||||
|
capi.destroy_feature(self._ptr)
|
||||||
|
|
||||||
def __getitem__(self, index):
|
def __getitem__(self, index):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -132,9 +132,14 @@ class OFTReal(Field):
|
||||||
return self.as_double()
|
return self.as_double()
|
||||||
|
|
||||||
# String & Binary fields, just subclasses
|
# String & Binary fields, just subclasses
|
||||||
class OFTString(Field): pass
|
class OFTString(Field):
|
||||||
class OFTWideString(Field): pass
|
pass
|
||||||
class OFTBinary(Field): pass
|
|
||||||
|
class OFTWideString(Field):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class OFTBinary(Field):
|
||||||
|
pass
|
||||||
|
|
||||||
# OFTDate, OFTTime, OFTDateTime fields.
|
# OFTDate, OFTTime, OFTDateTime fields.
|
||||||
class OFTDate(Field):
|
class OFTDate(Field):
|
||||||
|
@ -172,10 +177,17 @@ class OFTTime(Field):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# List fields are also just subclasses
|
# List fields are also just subclasses
|
||||||
class OFTIntegerList(Field): pass
|
class OFTIntegerList(Field):
|
||||||
class OFTRealList(Field): pass
|
pass
|
||||||
class OFTStringList(Field): pass
|
|
||||||
class OFTWideStringList(Field): pass
|
class OFTRealList(Field):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class OFTStringList(Field):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class OFTWideStringList(Field):
|
||||||
|
pass
|
||||||
|
|
||||||
# Class mapping dictionary for OFT Types and reverse mapping.
|
# Class mapping dictionary for OFT Types and reverse mapping.
|
||||||
OGRFieldTypes = {
|
OGRFieldTypes = {
|
||||||
|
|
|
@ -122,14 +122,16 @@ class OGRGeometry(GDALBase):
|
||||||
self.ptr = g
|
self.ptr = g
|
||||||
|
|
||||||
# Assigning the SpatialReference object to the geometry, if valid.
|
# Assigning the SpatialReference object to the geometry, if valid.
|
||||||
if bool(srs): self.srs = srs
|
if bool(srs):
|
||||||
|
self.srs = srs
|
||||||
|
|
||||||
# Setting the class depending upon the OGR Geometry Type
|
# Setting the class depending upon the OGR Geometry Type
|
||||||
self.__class__ = GEO_CLASSES[self.geom_type.num]
|
self.__class__ = GEO_CLASSES[self.geom_type.num]
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"Deletes this Geometry."
|
"Deletes this Geometry."
|
||||||
if self._ptr: capi.destroy_geom(self._ptr)
|
if self._ptr:
|
||||||
|
capi.destroy_geom(self._ptr)
|
||||||
|
|
||||||
# Pickle routines
|
# Pickle routines
|
||||||
def __getstate__(self):
|
def __getstate__(self):
|
||||||
|
@ -143,7 +145,8 @@ class OGRGeometry(GDALBase):
|
||||||
def __setstate__(self, state):
|
def __setstate__(self, state):
|
||||||
wkb, srs = state
|
wkb, srs = state
|
||||||
ptr = capi.from_wkb(wkb, None, byref(c_void_p()), len(wkb))
|
ptr = capi.from_wkb(wkb, None, byref(c_void_p()), len(wkb))
|
||||||
if not ptr: raise OGRException('Invalid OGRGeometry loaded from pickled state.')
|
if not ptr:
|
||||||
|
raise OGRException('Invalid OGRGeometry loaded from pickled state.')
|
||||||
self.ptr = ptr
|
self.ptr = ptr
|
||||||
self.srs = srs
|
self.srs = srs
|
||||||
|
|
||||||
|
@ -285,7 +288,8 @@ class OGRGeometry(GDALBase):
|
||||||
# The SRID property
|
# The SRID property
|
||||||
def _get_srid(self):
|
def _get_srid(self):
|
||||||
srs = self.srs
|
srs = self.srs
|
||||||
if srs: return srs.srid
|
if srs:
|
||||||
|
return srs.srid
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _set_srid(self, srid):
|
def _set_srid(self, srid):
|
||||||
|
@ -602,7 +606,8 @@ class LineString(OGRGeometry):
|
||||||
return self._listarr(capi.getz)
|
return self._listarr(capi.getz)
|
||||||
|
|
||||||
# LinearRings are used in Polygons.
|
# LinearRings are used in Polygons.
|
||||||
class LinearRing(LineString): pass
|
class LinearRing(LineString):
|
||||||
|
pass
|
||||||
|
|
||||||
class Polygon(OGRGeometry):
|
class Polygon(OGRGeometry):
|
||||||
|
|
||||||
|
@ -673,7 +678,8 @@ class GeometryCollection(OGRGeometry):
|
||||||
"Add the geometry to this Geometry Collection."
|
"Add the geometry to this Geometry Collection."
|
||||||
if isinstance(geom, OGRGeometry):
|
if isinstance(geom, OGRGeometry):
|
||||||
if isinstance(geom, self.__class__):
|
if isinstance(geom, self.__class__):
|
||||||
for g in geom: capi.add_geom(self.ptr, g.ptr)
|
for g in geom:
|
||||||
|
capi.add_geom(self.ptr, g.ptr)
|
||||||
else:
|
else:
|
||||||
capi.add_geom(self.ptr, geom.ptr)
|
capi.add_geom(self.ptr, geom.ptr)
|
||||||
elif isinstance(geom, six.string_types):
|
elif isinstance(geom, six.string_types):
|
||||||
|
@ -695,9 +701,14 @@ class GeometryCollection(OGRGeometry):
|
||||||
coords = tuple
|
coords = tuple
|
||||||
|
|
||||||
# Multiple Geometry types.
|
# Multiple Geometry types.
|
||||||
class MultiPoint(GeometryCollection): pass
|
class MultiPoint(GeometryCollection):
|
||||||
class MultiLineString(GeometryCollection): pass
|
pass
|
||||||
class MultiPolygon(GeometryCollection): pass
|
|
||||||
|
class MultiLineString(GeometryCollection):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class MultiPolygon(GeometryCollection):
|
||||||
|
pass
|
||||||
|
|
||||||
# Class mapping dictionary (using the OGRwkbGeometryType as the key)
|
# Class mapping dictionary (using the OGRwkbGeometryType as the key)
|
||||||
GEO_CLASSES = {1 : Point,
|
GEO_CLASSES = {1 : Point,
|
||||||
|
|
|
@ -36,7 +36,8 @@ class OGRGeomType(object):
|
||||||
num = type_input.num
|
num = type_input.num
|
||||||
elif isinstance(type_input, six.string_types):
|
elif isinstance(type_input, six.string_types):
|
||||||
type_input = type_input.lower()
|
type_input = type_input.lower()
|
||||||
if type_input == 'geometry': type_input='unknown'
|
if type_input == 'geometry':
|
||||||
|
type_input='unknown'
|
||||||
num = self._str_types.get(type_input, None)
|
num = self._str_types.get(type_input, None)
|
||||||
if num is None:
|
if num is None:
|
||||||
raise OGRException('Invalid OGR String Type "%s"' % type_input)
|
raise OGRException('Invalid OGR String Type "%s"' % type_input)
|
||||||
|
|
|
@ -47,7 +47,8 @@ class Layer(GDALBase):
|
||||||
# An integer index was given -- we cannot do a check based on the
|
# An integer index was given -- we cannot do a check based on the
|
||||||
# number of features because the beginning and ending feature IDs
|
# number of features because the beginning and ending feature IDs
|
||||||
# are not guaranteed to be 0 and len(layer)-1, respectively.
|
# are not guaranteed to be 0 and len(layer)-1, respectively.
|
||||||
if index < 0: raise OGRIndexError('Negative indices are not allowed on OGR Layers.')
|
if index < 0:
|
||||||
|
raise OGRIndexError('Negative indices are not allowed on OGR Layers.')
|
||||||
return self._make_feature(index)
|
return self._make_feature(index)
|
||||||
elif isinstance(index, slice):
|
elif isinstance(index, slice):
|
||||||
# A slice was given
|
# A slice was given
|
||||||
|
@ -88,7 +89,8 @@ class Layer(GDALBase):
|
||||||
# Random access isn't supported, have to increment through
|
# Random access isn't supported, have to increment through
|
||||||
# each feature until the given feature ID is encountered.
|
# each feature until the given feature ID is encountered.
|
||||||
for feat in self:
|
for feat in self:
|
||||||
if feat.fid == feat_id: return feat
|
if feat.fid == feat_id:
|
||||||
|
return feat
|
||||||
# Should have returned a Feature, raise an OGRIndexError.
|
# Should have returned a Feature, raise an OGRIndexError.
|
||||||
raise OGRIndexError('Invalid feature id: %s.' % feat_id)
|
raise OGRIndexError('Invalid feature id: %s.' % feat_id)
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,8 @@ else:
|
||||||
if lib_names:
|
if lib_names:
|
||||||
for lib_name in lib_names:
|
for lib_name in lib_names:
|
||||||
lib_path = find_library(lib_name)
|
lib_path = find_library(lib_name)
|
||||||
if not lib_path is None: break
|
if not lib_path is None:
|
||||||
|
break
|
||||||
|
|
||||||
if lib_path is None:
|
if lib_path is None:
|
||||||
raise OGRException('Could not find the GDAL library (tried "%s"). '
|
raise OGRException('Could not find the GDAL library (tried "%s"). '
|
||||||
|
@ -83,7 +84,8 @@ version_regex = re.compile(r'^(?P<major>\d+)\.(?P<minor>\d+)(\.(?P<subminor>\d+)
|
||||||
def gdal_version_info():
|
def gdal_version_info():
|
||||||
ver = gdal_version().decode()
|
ver = gdal_version().decode()
|
||||||
m = version_regex.match(ver)
|
m = version_regex.match(ver)
|
||||||
if not m: raise OGRException('Could not parse GDAL version string "%s"' % ver)
|
if not m:
|
||||||
|
raise OGRException('Could not parse GDAL version string "%s"' % ver)
|
||||||
return dict((key, m.group(key)) for key in ('major', 'minor', 'subminor'))
|
return dict((key, m.group(key)) for key in ('major', 'minor', 'subminor'))
|
||||||
|
|
||||||
_verinfo = gdal_version_info()
|
_verinfo = gdal_version_info()
|
||||||
|
|
|
@ -19,8 +19,10 @@ def ptr_byref(args, offset=-1):
|
||||||
|
|
||||||
def check_bool(result, func, cargs):
|
def check_bool(result, func, cargs):
|
||||||
"Returns the boolean evaluation of the value."
|
"Returns the boolean evaluation of the value."
|
||||||
if bool(result): return True
|
if bool(result):
|
||||||
else: return False
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
### String checking Routines ###
|
### String checking Routines ###
|
||||||
def check_const_string(result, func, cargs, offset=None):
|
def check_const_string(result, func, cargs, offset=None):
|
||||||
|
@ -46,8 +48,10 @@ def check_string(result, func, cargs, offset=-1, str_result=False):
|
||||||
if str_result:
|
if str_result:
|
||||||
# For routines that return a string.
|
# For routines that return a string.
|
||||||
ptr = result
|
ptr = result
|
||||||
if not ptr: s = None
|
if not ptr:
|
||||||
else: s = string_at(result)
|
s = None
|
||||||
|
else:
|
||||||
|
s = string_at(result)
|
||||||
else:
|
else:
|
||||||
# Error-code return specified.
|
# Error-code return specified.
|
||||||
check_err(result)
|
check_err(result)
|
||||||
|
@ -56,7 +60,8 @@ def check_string(result, func, cargs, offset=-1, str_result=False):
|
||||||
s = ptr.value
|
s = ptr.value
|
||||||
# Correctly freeing the allocated memory beind GDAL pointer
|
# Correctly freeing the allocated memory beind GDAL pointer
|
||||||
# w/the VSIFree routine.
|
# w/the VSIFree routine.
|
||||||
if ptr: lgdal.VSIFree(ptr)
|
if ptr:
|
||||||
|
lgdal.VSIFree(ptr)
|
||||||
return s
|
return s
|
||||||
|
|
||||||
### DataSource, Layer error-checking ###
|
### DataSource, Layer error-checking ###
|
||||||
|
|
|
@ -15,8 +15,10 @@ def double_output(func, argtypes, errcheck=False, strarg=False):
|
||||||
"Generates a ctypes function that returns a double value."
|
"Generates a ctypes function that returns a double value."
|
||||||
func.argtypes = argtypes
|
func.argtypes = argtypes
|
||||||
func.restype = c_double
|
func.restype = c_double
|
||||||
if errcheck: func.errcheck = check_arg_errcode
|
if errcheck:
|
||||||
if strarg: func.errcheck = check_str_arg
|
func.errcheck = check_arg_errcode
|
||||||
|
if strarg:
|
||||||
|
func.errcheck = check_str_arg
|
||||||
return func
|
return func
|
||||||
|
|
||||||
def geom_output(func, argtypes, offset=None):
|
def geom_output(func, argtypes, offset=None):
|
||||||
|
@ -106,7 +108,8 @@ def void_output(func, argtypes, errcheck=True):
|
||||||
For functions that don't only return an error code that needs to
|
For functions that don't only return an error code that needs to
|
||||||
be examined.
|
be examined.
|
||||||
"""
|
"""
|
||||||
if argtypes: func.argtypes = argtypes
|
if argtypes:
|
||||||
|
func.argtypes = argtypes
|
||||||
if errcheck:
|
if errcheck:
|
||||||
# `errcheck` keyword may be set to False for routines that
|
# `errcheck` keyword may be set to False for routines that
|
||||||
# return void, rather than a status code.
|
# return void, rather than a status code.
|
||||||
|
|
|
@ -97,7 +97,8 @@ class SpatialReference(GDALBase):
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"Destroys this spatial reference."
|
"Destroys this spatial reference."
|
||||||
if self._ptr: capi.release_srs(self._ptr)
|
if self._ptr:
|
||||||
|
capi.release_srs(self._ptr)
|
||||||
|
|
||||||
def __getitem__(self, target):
|
def __getitem__(self, target):
|
||||||
"""
|
"""
|
||||||
|
@ -176,10 +177,14 @@ class SpatialReference(GDALBase):
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
"Returns the name of this Spatial Reference."
|
"Returns the name of this Spatial Reference."
|
||||||
if self.projected: return self.attr_value('PROJCS')
|
if self.projected:
|
||||||
elif self.geographic: return self.attr_value('GEOGCS')
|
return self.attr_value('PROJCS')
|
||||||
elif self.local: return self.attr_value('LOCAL_CS')
|
elif self.geographic:
|
||||||
else: return None
|
return self.attr_value('GEOGCS')
|
||||||
|
elif self.local:
|
||||||
|
return self.attr_value('LOCAL_CS')
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def srid(self):
|
def srid(self):
|
||||||
|
@ -336,7 +341,8 @@ class CoordTransform(GDALBase):
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"Deletes this Coordinate Transformation object."
|
"Deletes this Coordinate Transformation object."
|
||||||
if self._ptr: capi.destroy_ct(self._ptr)
|
if self._ptr:
|
||||||
|
capi.destroy_ct(self._ptr)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return 'Transform from "%s" to "%s"' % (self._srs1_name, self._srs2_name)
|
return 'Transform from "%s" to "%s"' % (self._srs1_name, self._srs2_name)
|
||||||
|
|
|
@ -93,7 +93,8 @@ class DataSourceTest(unittest.TestCase):
|
||||||
|
|
||||||
# Now checking the field names.
|
# Now checking the field names.
|
||||||
flds = layer.fields
|
flds = layer.fields
|
||||||
for f in flds: self.assertEqual(True, f in source.fields)
|
for f in flds:
|
||||||
|
self.assertEqual(True, f in source.fields)
|
||||||
|
|
||||||
# Negative FIDs are not allowed.
|
# Negative FIDs are not allowed.
|
||||||
self.assertRaises(OGRIndexError, layer.__getitem__, -1)
|
self.assertRaises(OGRIndexError, layer.__getitem__, -1)
|
||||||
|
|
|
@ -418,7 +418,8 @@ class OGRGeomTest(unittest.TestCase, TestDataMixin):
|
||||||
mp1.add(poly) # Adding a geometry at a time
|
mp1.add(poly) # Adding a geometry at a time
|
||||||
mp2.add(poly.wkt) # Adding WKT
|
mp2.add(poly.wkt) # Adding WKT
|
||||||
mp3.add(mpoly) # Adding a MultiPolygon's entire contents at once.
|
mp3.add(mpoly) # Adding a MultiPolygon's entire contents at once.
|
||||||
for tmp in (mp1, mp2, mp3): self.assertEqual(mpoly, tmp)
|
for tmp in (mp1, mp2, mp3):
|
||||||
|
self.assertEqual(mpoly, tmp)
|
||||||
|
|
||||||
def test15_extent(self):
|
def test15_extent(self):
|
||||||
"Testing `extent` property."
|
"Testing `extent` property."
|
||||||
|
|
|
@ -89,7 +89,8 @@ class GeoIP(object):
|
||||||
# Getting the GeoIP data path.
|
# Getting the GeoIP data path.
|
||||||
if not path:
|
if not path:
|
||||||
path = GEOIP_SETTINGS.get('GEOIP_PATH', None)
|
path = GEOIP_SETTINGS.get('GEOIP_PATH', None)
|
||||||
if not path: raise GeoIPException('GeoIP path must be provided via parameter or the GEOIP_PATH setting.')
|
if not path:
|
||||||
|
raise GeoIPException('GeoIP path must be provided via parameter or the GEOIP_PATH setting.')
|
||||||
if not isinstance(path, six.string_types):
|
if not isinstance(path, six.string_types):
|
||||||
raise TypeError('Invalid path type: %s' % type(path).__name__)
|
raise TypeError('Invalid path type: %s' % type(path).__name__)
|
||||||
|
|
||||||
|
@ -129,8 +130,10 @@ class GeoIP(object):
|
||||||
# Cleaning any GeoIP file handles lying around.
|
# Cleaning any GeoIP file handles lying around.
|
||||||
if GeoIP_delete is None:
|
if GeoIP_delete is None:
|
||||||
return
|
return
|
||||||
if self._country: GeoIP_delete(self._country)
|
if self._country:
|
||||||
if self._city: GeoIP_delete(self._city)
|
GeoIP_delete(self._country)
|
||||||
|
if self._city:
|
||||||
|
GeoIP_delete(self._city)
|
||||||
|
|
||||||
def _check_query(self, query, country=False, city=False, city_or_country=False):
|
def _check_query(self, query, country=False, city=False, city_or_country=False):
|
||||||
"Helper routine for checking the query and database availability."
|
"Helper routine for checking the query and database availability."
|
||||||
|
@ -199,8 +202,10 @@ class GeoIP(object):
|
||||||
#### Coordinate retrieval routines ####
|
#### Coordinate retrieval routines ####
|
||||||
def coords(self, query, ordering=('longitude', 'latitude')):
|
def coords(self, query, ordering=('longitude', 'latitude')):
|
||||||
cdict = self.city(query)
|
cdict = self.city(query)
|
||||||
if cdict is None: return None
|
if cdict is None:
|
||||||
else: return tuple(cdict[o] for o in ordering)
|
return None
|
||||||
|
else:
|
||||||
|
return tuple(cdict[o] for o in ordering)
|
||||||
|
|
||||||
def lon_lat(self, query):
|
def lon_lat(self, query):
|
||||||
"Returns a tuple of the (longitude, latitude) for the given query."
|
"Returns a tuple of the (longitude, latitude) for the given query."
|
||||||
|
|
|
@ -18,8 +18,10 @@ else:
|
||||||
lib_name = 'GeoIP'
|
lib_name = 'GeoIP'
|
||||||
|
|
||||||
# Getting the path to the GeoIP library.
|
# Getting the path to the GeoIP library.
|
||||||
if lib_name: lib_path = find_library(lib_name)
|
if lib_name:
|
||||||
if lib_path is None: raise RuntimeError('Could not find the GeoIP library (tried "%s"). '
|
lib_path = find_library(lib_name)
|
||||||
|
if lib_path is None:
|
||||||
|
raise RuntimeError('Could not find the GeoIP library (tried "%s"). '
|
||||||
'Try setting GEOIP_LIBRARY_PATH in your settings.' % lib_name)
|
'Try setting GEOIP_LIBRARY_PATH in your settings.' % lib_name)
|
||||||
lgeoip = CDLL(lib_path)
|
lgeoip = CDLL(lib_path)
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,8 @@ geoip_encodings = {
|
||||||
1: 'utf8',
|
1: 'utf8',
|
||||||
}
|
}
|
||||||
|
|
||||||
class GeoIPTag(Structure): pass
|
class GeoIPTag(Structure):
|
||||||
|
pass
|
||||||
|
|
||||||
RECTYPE = POINTER(GeoIPRecord)
|
RECTYPE = POINTER(GeoIPRecord)
|
||||||
DBTYPE = POINTER(GeoIPTag)
|
DBTYPE = POINTER(GeoIPTag)
|
||||||
|
|
|
@ -34,8 +34,10 @@ class GEOSBase(object):
|
||||||
# Raise an exception if the pointer isn't valid don't
|
# Raise an exception if the pointer isn't valid don't
|
||||||
# want to be passing NULL pointers to routines --
|
# want to be passing NULL pointers to routines --
|
||||||
# that's very bad.
|
# that's very bad.
|
||||||
if self._ptr: return self._ptr
|
if self._ptr:
|
||||||
else: raise GEOSException('NULL GEOS %s pointer encountered.' % self.__class__.__name__)
|
return self._ptr
|
||||||
|
else:
|
||||||
|
raise GEOSException('NULL GEOS %s pointer encountered.' % self.__class__.__name__)
|
||||||
|
|
||||||
def _set_ptr(self, ptr):
|
def _set_ptr(self, ptr):
|
||||||
# Only allow the pointer to be set with pointers of the
|
# Only allow the pointer to be set with pointers of the
|
||||||
|
|
|
@ -73,7 +73,8 @@ class GeometryCollection(GEOSGeometry):
|
||||||
prev_ptr = self.ptr
|
prev_ptr = self.ptr
|
||||||
srid = self.srid
|
srid = self.srid
|
||||||
self.ptr = self._create_collection(length, items)
|
self.ptr = self._create_collection(length, items)
|
||||||
if srid: self.srid = srid
|
if srid:
|
||||||
|
self.srid = srid
|
||||||
capi.destroy_geom(prev_ptr)
|
capi.destroy_geom(prev_ptr)
|
||||||
|
|
||||||
_set_single = GEOSGeometry._set_single_rebuild
|
_set_single = GEOSGeometry._set_single_rebuild
|
||||||
|
|
|
@ -64,7 +64,8 @@ class GEOSCoordSeq(GEOSBase):
|
||||||
# Setting the X, Y, Z
|
# Setting the X, Y, Z
|
||||||
self.setX(index, value[0])
|
self.setX(index, value[0])
|
||||||
self.setY(index, value[1])
|
self.setY(index, value[1])
|
||||||
if set_3d: self.setZ(index, value[2])
|
if set_3d:
|
||||||
|
self.setZ(index, value[2])
|
||||||
|
|
||||||
#### Internal Routines ####
|
#### Internal Routines ####
|
||||||
def _checkindex(self, index):
|
def _checkindex(self, index):
|
||||||
|
@ -144,8 +145,10 @@ class GEOSCoordSeq(GEOSBase):
|
||||||
"Returns the KML representation for the coordinates."
|
"Returns the KML representation for the coordinates."
|
||||||
# Getting the substitution string depending on whether the coordinates have
|
# Getting the substitution string depending on whether the coordinates have
|
||||||
# a Z dimension.
|
# a Z dimension.
|
||||||
if self.hasz: substr = '%s,%s,%s '
|
if self.hasz:
|
||||||
else: substr = '%s,%s,0 '
|
substr = '%s,%s,%s '
|
||||||
|
else:
|
||||||
|
substr = '%s,%s,0 '
|
||||||
return '<coordinates>%s</coordinates>' % \
|
return '<coordinates>%s</coordinates>' % \
|
||||||
''.join(substr % self[i] for i in xrange(len(self))).strip()
|
''.join(substr % self[i] for i in xrange(len(self))).strip()
|
||||||
|
|
||||||
|
@ -153,5 +156,7 @@ class GEOSCoordSeq(GEOSBase):
|
||||||
def tuple(self):
|
def tuple(self):
|
||||||
"Returns a tuple version of this coordinate sequence."
|
"Returns a tuple version of this coordinate sequence."
|
||||||
n = self.size
|
n = self.size
|
||||||
if n == 1: return self[0]
|
if n == 1:
|
||||||
else: return tuple(self[i] for i in xrange(n))
|
return self[0]
|
||||||
|
else:
|
||||||
|
return tuple(self[i] for i in xrange(n))
|
||||||
|
|
|
@ -66,7 +66,8 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||||
wkt_m = wkt_regex.match(geo_input)
|
wkt_m = wkt_regex.match(geo_input)
|
||||||
if wkt_m:
|
if wkt_m:
|
||||||
# Handling WKT input.
|
# Handling WKT input.
|
||||||
if wkt_m.group('srid'): srid = int(wkt_m.group('srid'))
|
if wkt_m.group('srid'):
|
||||||
|
srid = int(wkt_m.group('srid'))
|
||||||
g = wkt_r().read(force_bytes(wkt_m.group('wkt')))
|
g = wkt_r().read(force_bytes(wkt_m.group('wkt')))
|
||||||
elif hex_regex.match(geo_input):
|
elif hex_regex.match(geo_input):
|
||||||
# Handling HEXEWKB input.
|
# Handling HEXEWKB input.
|
||||||
|
@ -100,7 +101,8 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||||
def _post_init(self, srid):
|
def _post_init(self, srid):
|
||||||
"Helper routine for performing post-initialization setup."
|
"Helper routine for performing post-initialization setup."
|
||||||
# Setting the SRID, if given.
|
# Setting the SRID, if given.
|
||||||
if srid and isinstance(srid, int): self.srid = srid
|
if srid and isinstance(srid, int):
|
||||||
|
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]
|
self.__class__ = GEOS_CLASSES[self.geom_typeid]
|
||||||
|
@ -114,7 +116,8 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||||
Destroys this Geometry; in other words, frees the memory used by the
|
Destroys this Geometry; in other words, frees the memory used by the
|
||||||
GEOS C++ object.
|
GEOS C++ object.
|
||||||
"""
|
"""
|
||||||
if self._ptr: capi.destroy_geom(self._ptr)
|
if self._ptr:
|
||||||
|
capi.destroy_geom(self._ptr)
|
||||||
|
|
||||||
def __copy__(self):
|
def __copy__(self):
|
||||||
"""
|
"""
|
||||||
|
@ -149,7 +152,8 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||||
# Instantiating from the tuple state that was pickled.
|
# Instantiating from the tuple state that was pickled.
|
||||||
wkb, srid = state
|
wkb, srid = state
|
||||||
ptr = wkb_r().read(memoryview(wkb))
|
ptr = wkb_r().read(memoryview(wkb))
|
||||||
if not ptr: raise GEOSException('Invalid Geometry loaded from pickled state.')
|
if not ptr:
|
||||||
|
raise GEOSException('Invalid Geometry loaded from pickled state.')
|
||||||
self.ptr = ptr
|
self.ptr = ptr
|
||||||
self._post_init(srid)
|
self._post_init(srid)
|
||||||
|
|
||||||
|
@ -361,8 +365,10 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||||
def get_srid(self):
|
def get_srid(self):
|
||||||
"Gets the SRID for the geometry, returns None if no SRID is set."
|
"Gets the SRID for the geometry, returns None if no SRID is set."
|
||||||
s = capi.geos_get_srid(self.ptr)
|
s = capi.geos_get_srid(self.ptr)
|
||||||
if s == 0: return None
|
if s == 0:
|
||||||
else: return s
|
return None
|
||||||
|
else:
|
||||||
|
return s
|
||||||
|
|
||||||
def set_srid(self, srid):
|
def set_srid(self, srid):
|
||||||
"Sets the SRID for the geometry."
|
"Sets the SRID for the geometry."
|
||||||
|
@ -377,8 +383,10 @@ class GEOSGeometry(GEOSBase, ListMixin):
|
||||||
are *not* included in this representation because GEOS does not yet
|
are *not* included in this representation because GEOS does not yet
|
||||||
support serializing them.
|
support serializing them.
|
||||||
"""
|
"""
|
||||||
if self.get_srid(): return 'SRID=%s;%s' % (self.srid, self.wkt)
|
if self.get_srid():
|
||||||
else: return self.wkt
|
return 'SRID=%s;%s' % (self.srid, self.wkt)
|
||||||
|
else:
|
||||||
|
return self.wkt
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def wkt(self):
|
def wkt(self):
|
||||||
|
|
|
@ -43,7 +43,8 @@ else:
|
||||||
if lib_names:
|
if lib_names:
|
||||||
for lib_name in lib_names:
|
for lib_name in lib_names:
|
||||||
lib_path = find_library(lib_name)
|
lib_path = find_library(lib_name)
|
||||||
if not lib_path is None: break
|
if not lib_path is None:
|
||||||
|
break
|
||||||
|
|
||||||
# No GEOS library could be found.
|
# No GEOS library could be found.
|
||||||
if lib_path is None:
|
if lib_path is None:
|
||||||
|
@ -83,10 +84,17 @@ error_h = ERRORFUNC(error_h)
|
||||||
#### GEOS Geometry C data structures, and utility functions. ####
|
#### GEOS Geometry C data structures, and utility functions. ####
|
||||||
|
|
||||||
# Opaque GEOS geometry structures, used for GEOM_PTR and CS_PTR
|
# Opaque GEOS geometry structures, used for GEOM_PTR and CS_PTR
|
||||||
class GEOSGeom_t(Structure): pass
|
class GEOSGeom_t(Structure):
|
||||||
class GEOSPrepGeom_t(Structure): pass
|
pass
|
||||||
class GEOSCoordSeq_t(Structure): pass
|
|
||||||
class GEOSContextHandle_t(Structure): pass
|
class GEOSPrepGeom_t(Structure):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class GEOSCoordSeq_t(Structure):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class GEOSContextHandle_t(Structure):
|
||||||
|
pass
|
||||||
|
|
||||||
# Pointers to opaque GEOS geometry structures.
|
# Pointers to opaque GEOS geometry structures.
|
||||||
GEOM_PTR = POINTER(GEOSGeom_t)
|
GEOM_PTR = POINTER(GEOSGeom_t)
|
||||||
|
|
|
@ -24,25 +24,31 @@ class LineString(GEOSGeometry):
|
||||||
ls = LineString(Point(1, 1), Point(2, 2))
|
ls = LineString(Point(1, 1), Point(2, 2))
|
||||||
"""
|
"""
|
||||||
# If only one argument provided, set the coords array appropriately
|
# If only one argument provided, set the coords array appropriately
|
||||||
if len(args) == 1: coords = args[0]
|
if len(args) == 1:
|
||||||
else: coords = args
|
coords = args[0]
|
||||||
|
else:
|
||||||
|
coords = args
|
||||||
|
|
||||||
if isinstance(coords, (tuple, list)):
|
if isinstance(coords, (tuple, list)):
|
||||||
# Getting the number of coords and the number of dimensions -- which
|
# Getting the number of coords and the number of dimensions -- which
|
||||||
# must stay the same, e.g., no LineString((1, 2), (1, 2, 3)).
|
# must stay the same, e.g., no LineString((1, 2), (1, 2, 3)).
|
||||||
ncoords = len(coords)
|
ncoords = len(coords)
|
||||||
if coords: ndim = len(coords[0])
|
if coords:
|
||||||
else: raise TypeError('Cannot initialize on empty sequence.')
|
ndim = len(coords[0])
|
||||||
|
else:
|
||||||
|
raise TypeError('Cannot initialize on empty sequence.')
|
||||||
self._checkdim(ndim)
|
self._checkdim(ndim)
|
||||||
# Incrementing through each of the coordinates and verifying
|
# Incrementing through each of the coordinates and verifying
|
||||||
for i in xrange(1, ncoords):
|
for i in xrange(1, ncoords):
|
||||||
if not isinstance(coords[i], (tuple, list, Point)):
|
if not isinstance(coords[i], (tuple, list, Point)):
|
||||||
raise TypeError('each coordinate should be a sequence (list or tuple)')
|
raise TypeError('each coordinate should be a sequence (list or tuple)')
|
||||||
if len(coords[i]) != ndim: raise TypeError('Dimension mismatch.')
|
if len(coords[i]) != ndim:
|
||||||
|
raise TypeError('Dimension mismatch.')
|
||||||
numpy_coords = False
|
numpy_coords = False
|
||||||
elif numpy and isinstance(coords, numpy.ndarray):
|
elif numpy and isinstance(coords, numpy.ndarray):
|
||||||
shape = coords.shape # Using numpy's shape.
|
shape = coords.shape # Using numpy's shape.
|
||||||
if len(shape) != 2: raise TypeError('Too many dimensions.')
|
if len(shape) != 2:
|
||||||
|
raise TypeError('Too many dimensions.')
|
||||||
self._checkdim(shape[1])
|
self._checkdim(shape[1])
|
||||||
ncoords = shape[0]
|
ncoords = shape[0]
|
||||||
ndim = shape[1]
|
ndim = shape[1]
|
||||||
|
@ -55,9 +61,12 @@ class LineString(GEOSGeometry):
|
||||||
cs = GEOSCoordSeq(capi.create_cs(ncoords, ndim), z=bool(ndim==3))
|
cs = GEOSCoordSeq(capi.create_cs(ncoords, ndim), z=bool(ndim==3))
|
||||||
|
|
||||||
for i in xrange(ncoords):
|
for i in xrange(ncoords):
|
||||||
if numpy_coords: cs[i] = coords[i,:]
|
if numpy_coords:
|
||||||
elif isinstance(coords[i], Point): cs[i] = coords[i].tuple
|
cs[i] = coords[i,:]
|
||||||
else: cs[i] = coords[i]
|
elif isinstance(coords[i], Point):
|
||||||
|
cs[i] = coords[i].tuple
|
||||||
|
else:
|
||||||
|
cs[i] = coords[i]
|
||||||
|
|
||||||
# If SRID was passed in with the keyword arguments
|
# If SRID was passed in with the keyword arguments
|
||||||
srid = kwargs.get('srid', None)
|
srid = kwargs.get('srid', None)
|
||||||
|
@ -103,7 +112,8 @@ class LineString(GEOSGeometry):
|
||||||
self._cs[index] = value
|
self._cs[index] = value
|
||||||
|
|
||||||
def _checkdim(self, dim):
|
def _checkdim(self, dim):
|
||||||
if dim not in (2, 3): raise TypeError('Dimension mismatch.')
|
if dim not in (2, 3):
|
||||||
|
raise TypeError('Dimension mismatch.')
|
||||||
|
|
||||||
#### Sequence Properties ####
|
#### Sequence Properties ####
|
||||||
@property
|
@property
|
||||||
|
@ -118,8 +128,10 @@ class LineString(GEOSGeometry):
|
||||||
the given function. Will return a numpy array if possible.
|
the given function. Will return a numpy array if possible.
|
||||||
"""
|
"""
|
||||||
lst = [func(i) for i in xrange(len(self))]
|
lst = [func(i) for i in xrange(len(self))]
|
||||||
if numpy: return numpy.array(lst) # ARRRR!
|
if numpy:
|
||||||
else: return lst
|
return numpy.array(lst) # ARRRR!
|
||||||
|
else:
|
||||||
|
return lst
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def array(self):
|
def array(self):
|
||||||
|
@ -144,8 +156,10 @@ class LineString(GEOSGeometry):
|
||||||
@property
|
@property
|
||||||
def z(self):
|
def z(self):
|
||||||
"Returns a list or numpy array of the Z variable."
|
"Returns a list or numpy array of the Z variable."
|
||||||
if not self.hasz: return None
|
if not self.hasz:
|
||||||
else: return self._listarr(self._cs.getZ)
|
return None
|
||||||
|
else:
|
||||||
|
return self._listarr(self._cs.getZ)
|
||||||
|
|
||||||
# LinearRings are LineStrings used within Polygons.
|
# LinearRings are LineStrings used within Polygons.
|
||||||
class LinearRing(LineString):
|
class LinearRing(LineString):
|
||||||
|
|
|
@ -180,13 +180,15 @@ class ListMixin(object):
|
||||||
"Standard list count method"
|
"Standard list count method"
|
||||||
count = 0
|
count = 0
|
||||||
for i in self:
|
for i in self:
|
||||||
if val == i: count += 1
|
if val == i:
|
||||||
|
count += 1
|
||||||
return count
|
return count
|
||||||
|
|
||||||
def index(self, val):
|
def index(self, val):
|
||||||
"Standard list index method"
|
"Standard list index method"
|
||||||
for i in xrange(0, len(self)):
|
for i in xrange(0, len(self)):
|
||||||
if self[i] == val: return i
|
if self[i] == val:
|
||||||
|
return i
|
||||||
raise ValueError('%s not found in object' % str(val))
|
raise ValueError('%s not found in object' % str(val))
|
||||||
|
|
||||||
## Mutating ##
|
## Mutating ##
|
||||||
|
|
|
@ -50,7 +50,8 @@ class Point(GEOSGeometry):
|
||||||
i = iter(coords)
|
i = iter(coords)
|
||||||
capi.cs_setx(cs, 0, next(i))
|
capi.cs_setx(cs, 0, next(i))
|
||||||
capi.cs_sety(cs, 0, next(i))
|
capi.cs_sety(cs, 0, next(i))
|
||||||
if ndim == 3: capi.cs_setz(cs, 0, next(i))
|
if ndim == 3:
|
||||||
|
capi.cs_setz(cs, 0, next(i))
|
||||||
|
|
||||||
return capi.create_point(cs)
|
return capi.create_point(cs)
|
||||||
|
|
||||||
|
@ -74,9 +75,12 @@ class Point(GEOSGeometry):
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
"Returns the number of dimensions for this Point (either 0, 2 or 3)."
|
"Returns the number of dimensions for this Point (either 0, 2 or 3)."
|
||||||
if self.empty: return 0
|
if self.empty:
|
||||||
if self.hasz: return 3
|
return 0
|
||||||
else: return 2
|
if self.hasz:
|
||||||
|
return 3
|
||||||
|
else:
|
||||||
|
return 2
|
||||||
|
|
||||||
def _get_single_external(self, index):
|
def _get_single_external(self, index):
|
||||||
if index == 0:
|
if index == 0:
|
||||||
|
|
|
@ -99,7 +99,8 @@ class Polygon(GEOSGeometry):
|
||||||
|
|
||||||
def _construct_ring(self, param, msg='Parameter must be a sequence of LinearRings or objects that can initialize to LinearRings'):
|
def _construct_ring(self, param, msg='Parameter must be a sequence of LinearRings or objects that can initialize to LinearRings'):
|
||||||
"Helper routine for trying to construct a ring from the given parameter."
|
"Helper routine for trying to construct a ring from the given parameter."
|
||||||
if isinstance(param, LinearRing): return param
|
if isinstance(param, LinearRing):
|
||||||
|
return param
|
||||||
try:
|
try:
|
||||||
ring = LinearRing(param)
|
ring = LinearRing(param)
|
||||||
return ring
|
return ring
|
||||||
|
@ -112,7 +113,8 @@ class Polygon(GEOSGeometry):
|
||||||
prev_ptr = self.ptr
|
prev_ptr = self.ptr
|
||||||
srid = self.srid
|
srid = self.srid
|
||||||
self.ptr = self._create_polygon(length, items)
|
self.ptr = self._create_polygon(length, items)
|
||||||
if srid: self.srid = srid
|
if srid:
|
||||||
|
self.srid = srid
|
||||||
capi.destroy_geom(prev_ptr)
|
capi.destroy_geom(prev_ptr)
|
||||||
|
|
||||||
def _get_single_internal(self, index):
|
def _get_single_internal(self, index):
|
||||||
|
|
|
@ -11,11 +11,13 @@ class PreparedGeometry(GEOSBase):
|
||||||
ptr_type = capi.PREPGEOM_PTR
|
ptr_type = capi.PREPGEOM_PTR
|
||||||
|
|
||||||
def __init__(self, geom):
|
def __init__(self, geom):
|
||||||
if not isinstance(geom, GEOSGeometry): raise TypeError
|
if not isinstance(geom, GEOSGeometry):
|
||||||
|
raise TypeError
|
||||||
self.ptr = capi.geos_prepare(geom.ptr)
|
self.ptr = capi.geos_prepare(geom.ptr)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
if self._ptr: capi.prepared_destroy(self._ptr)
|
if self._ptr:
|
||||||
|
capi.prepared_destroy(self._ptr)
|
||||||
|
|
||||||
def contains(self, other):
|
def contains(self, other):
|
||||||
return capi.prepared_contains(self.ptr, other.ptr)
|
return capi.prepared_contains(self.ptr, other.ptr)
|
||||||
|
|
|
@ -33,7 +33,8 @@ def last_arg_byref(args):
|
||||||
def check_dbl(result, func, cargs):
|
def check_dbl(result, func, cargs):
|
||||||
"Checks the status code and returns the double value passed in by reference."
|
"Checks the status code and returns the double value passed in by reference."
|
||||||
# Checking the status code
|
# Checking the status code
|
||||||
if result != 1: return None
|
if result != 1:
|
||||||
|
return None
|
||||||
# Double passed in by reference, return its value.
|
# Double passed in by reference, return its value.
|
||||||
return last_arg_byref(cargs)
|
return last_arg_byref(cargs)
|
||||||
|
|
||||||
|
@ -53,8 +54,10 @@ def check_minus_one(result, func, cargs):
|
||||||
def check_predicate(result, func, cargs):
|
def check_predicate(result, func, cargs):
|
||||||
"Error checking for unary/binary predicate functions."
|
"Error checking for unary/binary predicate functions."
|
||||||
val = ord(result) # getting the ordinal from the character
|
val = ord(result) # getting the ordinal from the character
|
||||||
if val == 1: return True
|
if val == 1:
|
||||||
elif val == 0: return False
|
return True
|
||||||
|
elif val == 0:
|
||||||
|
return False
|
||||||
else:
|
else:
|
||||||
raise GEOSException('Error encountered on GEOS C predicate function "%s".' % func.__name__)
|
raise GEOSException('Error encountered on GEOS C predicate function "%s".' % func.__name__)
|
||||||
|
|
||||||
|
@ -80,7 +83,8 @@ def check_string(result, func, cargs):
|
||||||
|
|
||||||
This frees the memory allocated by GEOS at the result pointer.
|
This frees the memory allocated by GEOS at the result pointer.
|
||||||
"""
|
"""
|
||||||
if not result: raise GEOSException('Error encountered checking string return value in GEOS C function "%s".' % func.__name__)
|
if not result:
|
||||||
|
raise GEOSException('Error encountered checking string return value in GEOS C function "%s".' % func.__name__)
|
||||||
# Getting the string value at the pointer address.
|
# Getting the string value at the pointer address.
|
||||||
s = string_at(result)
|
s = string_at(result)
|
||||||
# Freeing the memory allocated within GEOS
|
# Freeing the memory allocated within GEOS
|
||||||
|
|
|
@ -35,7 +35,8 @@ def bin_output(func):
|
||||||
|
|
||||||
def geom_output(func, argtypes):
|
def geom_output(func, argtypes):
|
||||||
"For GEOS routines that return a geometry."
|
"For GEOS routines that return a geometry."
|
||||||
if argtypes: func.argtypes = argtypes
|
if argtypes:
|
||||||
|
func.argtypes = argtypes
|
||||||
func.restype = GEOM_PTR
|
func.restype = GEOM_PTR
|
||||||
func.errcheck = check_geom
|
func.errcheck = check_geom
|
||||||
return func
|
return func
|
||||||
|
|
|
@ -11,10 +11,17 @@ from django.utils import six
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
|
|
||||||
### The WKB/WKT Reader/Writer structures and pointers ###
|
### The WKB/WKT Reader/Writer structures and pointers ###
|
||||||
class WKTReader_st(Structure): pass
|
class WKTReader_st(Structure):
|
||||||
class WKTWriter_st(Structure): pass
|
pass
|
||||||
class WKBReader_st(Structure): pass
|
|
||||||
class WKBWriter_st(Structure): pass
|
class WKTWriter_st(Structure):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WKBReader_st(Structure):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class WKBWriter_st(Structure):
|
||||||
|
pass
|
||||||
|
|
||||||
WKT_READ_PTR = POINTER(WKTReader_st)
|
WKT_READ_PTR = POINTER(WKTReader_st)
|
||||||
WKT_WRITE_PTR = POINTER(WKTWriter_st)
|
WKT_WRITE_PTR = POINTER(WKTWriter_st)
|
||||||
|
@ -121,7 +128,8 @@ class IOBase(GEOSBase):
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
# Cleaning up with the appropriate destructor.
|
# Cleaning up with the appropriate destructor.
|
||||||
if self._ptr: self._destructor(self._ptr)
|
if self._ptr:
|
||||||
|
self._destructor(self._ptr)
|
||||||
|
|
||||||
### Base WKB/WKT Reading and Writing objects ###
|
### Base WKB/WKT Reading and Writing objects ###
|
||||||
|
|
||||||
|
@ -194,7 +202,8 @@ class WKBWriter(IOBase):
|
||||||
return wkb_writer_get_byteorder(self.ptr)
|
return wkb_writer_get_byteorder(self.ptr)
|
||||||
|
|
||||||
def _set_byteorder(self, order):
|
def _set_byteorder(self, order):
|
||||||
if not order in (0, 1): raise ValueError('Byte order parameter must be 0 (Big Endian) or 1 (Little Endian).')
|
if not order in (0, 1):
|
||||||
|
raise ValueError('Byte order parameter must be 0 (Big Endian) or 1 (Little Endian).')
|
||||||
wkb_writer_set_byteorder(self.ptr, order)
|
wkb_writer_set_byteorder(self.ptr, order)
|
||||||
|
|
||||||
byteorder = property(_get_byteorder, _set_byteorder)
|
byteorder = property(_get_byteorder, _set_byteorder)
|
||||||
|
@ -204,7 +213,8 @@ class WKBWriter(IOBase):
|
||||||
return wkb_writer_get_outdim(self.ptr)
|
return wkb_writer_get_outdim(self.ptr)
|
||||||
|
|
||||||
def _set_outdim(self, new_dim):
|
def _set_outdim(self, new_dim):
|
||||||
if not new_dim in (2, 3): raise ValueError('WKB output dimension must be 2 or 3')
|
if not new_dim in (2, 3):
|
||||||
|
raise ValueError('WKB output dimension must be 2 or 3')
|
||||||
wkb_writer_set_outdim(self.ptr, new_dim)
|
wkb_writer_set_outdim(self.ptr, new_dim)
|
||||||
|
|
||||||
outdim = property(_get_outdim, _set_outdim)
|
outdim = property(_get_outdim, _set_outdim)
|
||||||
|
@ -214,8 +224,10 @@ class WKBWriter(IOBase):
|
||||||
return bool(ord(wkb_writer_get_include_srid(self.ptr)))
|
return bool(ord(wkb_writer_get_include_srid(self.ptr)))
|
||||||
|
|
||||||
def _set_include_srid(self, include):
|
def _set_include_srid(self, include):
|
||||||
if bool(include): flag = b'\x01'
|
if bool(include):
|
||||||
else: flag = b'\x00'
|
flag = b'\x01'
|
||||||
|
else:
|
||||||
|
flag = b'\x00'
|
||||||
wkb_writer_set_include_srid(self.ptr, flag)
|
wkb_writer_set_include_srid(self.ptr, flag)
|
||||||
|
|
||||||
srid = property(_get_include_srid, _set_include_srid)
|
srid = property(_get_include_srid, _set_include_srid)
|
||||||
|
|
|
@ -11,7 +11,8 @@ from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc
|
||||||
def binary_predicate(func, *args):
|
def binary_predicate(func, *args):
|
||||||
"For GEOS binary predicate functions."
|
"For GEOS binary predicate functions."
|
||||||
argtypes = [GEOM_PTR, GEOM_PTR]
|
argtypes = [GEOM_PTR, GEOM_PTR]
|
||||||
if args: argtypes += args
|
if args:
|
||||||
|
argtypes += args
|
||||||
func.argtypes = argtypes
|
func.argtypes = argtypes
|
||||||
func.restype = c_char
|
func.restype = c_char
|
||||||
func.errcheck = check_predicate
|
func.errcheck = check_predicate
|
||||||
|
|
|
@ -11,7 +11,8 @@ class GEOSContextHandle(object):
|
||||||
self.ptr = lgeos.initGEOS_r(notice_h, error_h)
|
self.ptr = lgeos.initGEOS_r(notice_h, error_h)
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
if self.ptr: lgeos.finishGEOS_r(self.ptr)
|
if self.ptr:
|
||||||
|
lgeos.finishGEOS_r(self.ptr)
|
||||||
|
|
||||||
# Defining a thread-local object and creating an instance
|
# Defining a thread-local object and creating an instance
|
||||||
# to hold a reference to GEOSContextHandle for this thread.
|
# to hold a reference to GEOSContextHandle for this thread.
|
||||||
|
|
|
@ -16,7 +16,8 @@ from django.contrib.gis.geos.prototypes.threadsafe import GEOSFunc
|
||||||
def topology(func, *args, **kwargs):
|
def topology(func, *args, **kwargs):
|
||||||
"For GEOS unary topology functions."
|
"For GEOS unary topology functions."
|
||||||
argtypes = [GEOM_PTR]
|
argtypes = [GEOM_PTR]
|
||||||
if args: argtypes += args
|
if args:
|
||||||
|
argtypes += args
|
||||||
func.argtypes = argtypes
|
func.argtypes = argtypes
|
||||||
func.restype = kwargs.get('restype', GEOM_PTR)
|
func.restype = kwargs.get('restype', GEOM_PTR)
|
||||||
func.errcheck = kwargs.get('errcheck', check_geom)
|
func.errcheck = kwargs.get('errcheck', check_geom)
|
||||||
|
|
|
@ -143,7 +143,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
for tg in self.geometries.wkt_out:
|
for tg in self.geometries.wkt_out:
|
||||||
geom = fromstr(tg.wkt)
|
geom = fromstr(tg.wkt)
|
||||||
kml = getattr(tg, 'kml', False)
|
kml = getattr(tg, 'kml', False)
|
||||||
if kml: self.assertEqual(kml, geom.kml)
|
if kml:
|
||||||
|
self.assertEqual(kml, geom.kml)
|
||||||
|
|
||||||
def test_errors(self):
|
def test_errors(self):
|
||||||
"Testing the Error handlers."
|
"Testing the Error handlers."
|
||||||
|
@ -338,7 +339,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
self.assertEqual(ls, LineString(*ls.tuple)) # as individual arguments
|
self.assertEqual(ls, LineString(*ls.tuple)) # as individual arguments
|
||||||
self.assertEqual(ls, LineString([list(tup) for tup in ls.tuple])) # as list
|
self.assertEqual(ls, LineString([list(tup) for tup in ls.tuple])) # as list
|
||||||
self.assertEqual(ls.wkt, LineString(*tuple(Point(tup) for tup in ls.tuple)).wkt) # Point individual arguments
|
self.assertEqual(ls.wkt, LineString(*tuple(Point(tup) for tup in ls.tuple)).wkt) # Point individual arguments
|
||||||
if numpy: self.assertEqual(ls, LineString(numpy.array(ls.tuple))) # as numpy array
|
if numpy:
|
||||||
|
self.assertEqual(ls, LineString(numpy.array(ls.tuple))) # as numpy array
|
||||||
|
|
||||||
def test_multilinestring(self):
|
def test_multilinestring(self):
|
||||||
"Testing MultiLineString objects."
|
"Testing MultiLineString objects."
|
||||||
|
@ -378,7 +380,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
self.assertEqual(lr, LinearRing(lr.tuple))
|
self.assertEqual(lr, LinearRing(lr.tuple))
|
||||||
self.assertEqual(lr, LinearRing(*lr.tuple))
|
self.assertEqual(lr, LinearRing(*lr.tuple))
|
||||||
self.assertEqual(lr, LinearRing([list(tup) for tup in lr.tuple]))
|
self.assertEqual(lr, LinearRing([list(tup) for tup in lr.tuple]))
|
||||||
if numpy: self.assertEqual(lr, LinearRing(numpy.array(lr.tuple)))
|
if numpy:
|
||||||
|
self.assertEqual(lr, LinearRing(numpy.array(lr.tuple)))
|
||||||
|
|
||||||
def test_polygons_from_bbox(self):
|
def test_polygons_from_bbox(self):
|
||||||
"Testing `from_bbox` class method."
|
"Testing `from_bbox` class method."
|
||||||
|
@ -528,8 +531,10 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
self.assertEqual(c1, c2)
|
self.assertEqual(c1, c2)
|
||||||
|
|
||||||
# Constructing the test value to set the coordinate sequence with
|
# Constructing the test value to set the coordinate sequence with
|
||||||
if len(c1) == 2: tset = (5, 23)
|
if len(c1) == 2:
|
||||||
else: tset = (5, 23, 8)
|
tset = (5, 23)
|
||||||
|
else:
|
||||||
|
tset = (5, 23, 8)
|
||||||
cs[i] = tset
|
cs[i] = tset
|
||||||
|
|
||||||
# Making sure every set point matches what we expect
|
# Making sure every set point matches what we expect
|
||||||
|
@ -636,14 +641,16 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
# Testing SRID keyword on fromstr(), and on Polygon rings.
|
# Testing SRID keyword on fromstr(), and on Polygon rings.
|
||||||
poly = fromstr(self.geometries.polygons[1].wkt, srid=4269)
|
poly = fromstr(self.geometries.polygons[1].wkt, srid=4269)
|
||||||
self.assertEqual(4269, poly.srid)
|
self.assertEqual(4269, poly.srid)
|
||||||
for ring in poly: self.assertEqual(4269, ring.srid)
|
for ring in poly:
|
||||||
|
self.assertEqual(4269, ring.srid)
|
||||||
poly.srid = 4326
|
poly.srid = 4326
|
||||||
self.assertEqual(4326, poly.shell.srid)
|
self.assertEqual(4326, poly.shell.srid)
|
||||||
|
|
||||||
# Testing SRID keyword on GeometryCollection
|
# Testing SRID keyword on GeometryCollection
|
||||||
gc = GeometryCollection(Point(5, 23), LineString((0, 0), (1.5, 1.5), (3, 3)), srid=32021)
|
gc = GeometryCollection(Point(5, 23), LineString((0, 0), (1.5, 1.5), (3, 3)), srid=32021)
|
||||||
self.assertEqual(32021, gc.srid)
|
self.assertEqual(32021, gc.srid)
|
||||||
for i in range(len(gc)): self.assertEqual(32021, gc[i].srid)
|
for i in range(len(gc)):
|
||||||
|
self.assertEqual(32021, gc[i].srid)
|
||||||
|
|
||||||
# GEOS may get the SRID from HEXEWKB
|
# GEOS may get the SRID from HEXEWKB
|
||||||
# 'POINT(5 23)' at SRID=4326 in hex form -- obtained from PostGIS
|
# 'POINT(5 23)' at SRID=4326 in hex form -- obtained from PostGIS
|
||||||
|
@ -691,7 +698,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
# Constructing the new shell by adding 500 to every point in the old shell.
|
# Constructing the new shell by adding 500 to every point in the old shell.
|
||||||
shell_tup = poly.shell.tuple
|
shell_tup = poly.shell.tuple
|
||||||
new_coords = []
|
new_coords = []
|
||||||
for point in shell_tup: new_coords.append((point[0] + 500., point[1] + 500.))
|
for point in shell_tup:
|
||||||
|
new_coords.append((point[0] + 500., point[1] + 500.))
|
||||||
new_shell = LinearRing(*tuple(new_coords))
|
new_shell = LinearRing(*tuple(new_coords))
|
||||||
|
|
||||||
# Assigning polygon's exterior ring w/the new shell
|
# Assigning polygon's exterior ring w/the new shell
|
||||||
|
@ -724,7 +732,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
# Offsetting the each ring in the polygon by 500.
|
# Offsetting the each ring in the polygon by 500.
|
||||||
for j in xrange(len(poly)):
|
for j in xrange(len(poly)):
|
||||||
r = poly[j]
|
r = poly[j]
|
||||||
for k in xrange(len(r)): r[k] = (r[k][0] + 500., r[k][1] + 500.)
|
for k in xrange(len(r)):
|
||||||
|
r[k] = (r[k][0] + 500., r[k][1] + 500.)
|
||||||
poly[j] = r
|
poly[j] = r
|
||||||
|
|
||||||
self.assertNotEqual(mpoly[i], poly)
|
self.assertNotEqual(mpoly[i], poly)
|
||||||
|
@ -1017,7 +1026,8 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
g1, g2 = cPickle.loads(s1), pickle.loads(s2)
|
g1, g2 = cPickle.loads(s1), pickle.loads(s2)
|
||||||
for tmpg in (g1, g2):
|
for tmpg in (g1, g2):
|
||||||
self.assertEqual(geom, tmpg)
|
self.assertEqual(geom, tmpg)
|
||||||
if not no_srid: self.assertEqual(geom.srid, tmpg.srid)
|
if not no_srid:
|
||||||
|
self.assertEqual(geom.srid, tmpg.srid)
|
||||||
|
|
||||||
@skipUnless(HAS_GEOS and GEOS_PREPARE, "geos >= 3.1.0 is required")
|
@skipUnless(HAS_GEOS and GEOS_PREPARE, "geos >= 3.1.0 is required")
|
||||||
def test_prepared(self):
|
def test_prepared(self):
|
||||||
|
|
|
@ -12,26 +12,57 @@ if HAS_GEOS:
|
||||||
from ..error import GEOSIndexError
|
from ..error import GEOSIndexError
|
||||||
|
|
||||||
|
|
||||||
def getItem(o,i): return o[i]
|
def getItem(o,i):
|
||||||
def delItem(o,i): del o[i]
|
return o[i]
|
||||||
def setItem(o,i,v): o[i] = v
|
|
||||||
|
def delItem(o,i):
|
||||||
|
del o[i]
|
||||||
|
|
||||||
|
def setItem(o,i,v):
|
||||||
|
o[i] = v
|
||||||
|
|
||||||
if HAS_GEOS:
|
if HAS_GEOS:
|
||||||
def api_get_distance(x): return x.distance(Point(-200,-200))
|
def api_get_distance(x):
|
||||||
|
return x.distance(Point(-200,-200))
|
||||||
|
|
||||||
def api_get_buffer(x): return x.buffer(10)
|
def api_get_buffer(x):
|
||||||
def api_get_geom_typeid(x): return x.geom_typeid
|
return x.buffer(10)
|
||||||
def api_get_num_coords(x): return x.num_coords
|
|
||||||
def api_get_centroid(x): return x.centroid
|
def api_get_geom_typeid(x):
|
||||||
def api_get_empty(x): return x.empty
|
return x.geom_typeid
|
||||||
def api_get_valid(x): return x.valid
|
|
||||||
def api_get_simple(x): return x.simple
|
def api_get_num_coords(x):
|
||||||
def api_get_ring(x): return x.ring
|
return x.num_coords
|
||||||
def api_get_boundary(x): return x.boundary
|
|
||||||
def api_get_convex_hull(x): return x.convex_hull
|
def api_get_centroid(x):
|
||||||
def api_get_extent(x): return x.extent
|
return x.centroid
|
||||||
def api_get_area(x): return x.area
|
|
||||||
def api_get_length(x): return x.length
|
def api_get_empty(x):
|
||||||
|
return x.empty
|
||||||
|
|
||||||
|
def api_get_valid(x):
|
||||||
|
return x.valid
|
||||||
|
|
||||||
|
def api_get_simple(x):
|
||||||
|
return x.simple
|
||||||
|
|
||||||
|
def api_get_ring(x):
|
||||||
|
return x.ring
|
||||||
|
|
||||||
|
def api_get_boundary(x):
|
||||||
|
return x.boundary
|
||||||
|
|
||||||
|
def api_get_convex_hull(x):
|
||||||
|
return x.convex_hull
|
||||||
|
|
||||||
|
def api_get_extent(x):
|
||||||
|
return x.extent
|
||||||
|
|
||||||
|
def api_get_area(x):
|
||||||
|
return x.area
|
||||||
|
|
||||||
|
def api_get_length(x):
|
||||||
|
return x.length
|
||||||
|
|
||||||
geos_function_tests = [val for name, val in vars().items()
|
geos_function_tests = [val for name, val in vars().items()
|
||||||
if hasattr(val, '__call__')
|
if hasattr(val, '__call__')
|
||||||
|
@ -48,7 +79,8 @@ class GEOSMutationTest(unittest.TestCase):
|
||||||
def test00_GEOSIndexException(self):
|
def test00_GEOSIndexException(self):
|
||||||
'Testing Geometry GEOSIndexError'
|
'Testing Geometry GEOSIndexError'
|
||||||
p = Point(1,2)
|
p = Point(1,2)
|
||||||
for i in range(-2,2): p._checkindex(i)
|
for i in range(-2,2):
|
||||||
|
p._checkindex(i)
|
||||||
self.assertRaises(GEOSIndexError, p._checkindex, 2)
|
self.assertRaises(GEOSIndexError, p._checkindex, 2)
|
||||||
self.assertRaises(GEOSIndexError, p._checkindex, -3)
|
self.assertRaises(GEOSIndexError, p._checkindex, -3)
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,8 @@ class ListMixinTest(unittest.TestCase):
|
||||||
listType = UserListA
|
listType = UserListA
|
||||||
|
|
||||||
def lists_of_len(self, length=None):
|
def lists_of_len(self, length=None):
|
||||||
if length is None: length = self.limit
|
if length is None:
|
||||||
|
length = self.limit
|
||||||
pl = list(range(length))
|
pl = list(range(length))
|
||||||
return pl, self.listType(pl)
|
return pl, self.listType(pl)
|
||||||
|
|
||||||
|
@ -90,7 +91,8 @@ class ListMixinTest(unittest.TestCase):
|
||||||
|
|
||||||
def test02_setslice(self):
|
def test02_setslice(self):
|
||||||
'Slice assignment'
|
'Slice assignment'
|
||||||
def setfcn(x,i,j,k,L): x[i:j:k] = range(L)
|
def setfcn(x,i,j,k,L):
|
||||||
|
x[i:j:k] = range(L)
|
||||||
pl, ul = self.lists_of_len()
|
pl, ul = self.lists_of_len()
|
||||||
for slen in range(self.limit + 1):
|
for slen in range(self.limit + 1):
|
||||||
ssl = nextRange(slen)
|
ssl = nextRange(slen)
|
||||||
|
@ -208,9 +210,12 @@ class ListMixinTest(unittest.TestCase):
|
||||||
|
|
||||||
def test05_out_of_range_exceptions(self):
|
def test05_out_of_range_exceptions(self):
|
||||||
'Out of range exceptions'
|
'Out of range exceptions'
|
||||||
def setfcn(x, i): x[i] = 20
|
def setfcn(x, i):
|
||||||
def getfcn(x, i): return x[i]
|
x[i] = 20
|
||||||
def delfcn(x, i): del x[i]
|
def getfcn(x, i):
|
||||||
|
return x[i]
|
||||||
|
def delfcn(x, i):
|
||||||
|
del x[i]
|
||||||
pl, ul = self.lists_of_len()
|
pl, ul = self.lists_of_len()
|
||||||
for i in (-1 - self.limit, self.limit):
|
for i in (-1 - self.limit, self.limit):
|
||||||
self.assertRaises(IndexError, setfcn, ul, i) # 'set index %d' % i)
|
self.assertRaises(IndexError, setfcn, ul, i) # 'set index %d' % i)
|
||||||
|
@ -248,7 +253,8 @@ class ListMixinTest(unittest.TestCase):
|
||||||
self.assertEqual(pl[:], ul[:], 'after pop')
|
self.assertEqual(pl[:], ul[:], 'after pop')
|
||||||
|
|
||||||
pl, ul = self.lists_of_len()
|
pl, ul = self.lists_of_len()
|
||||||
def popfcn(x, i): x.pop(i)
|
def popfcn(x, i):
|
||||||
|
x.pop(i)
|
||||||
self.assertRaises(IndexError, popfcn, ul, self.limit)
|
self.assertRaises(IndexError, popfcn, ul, self.limit)
|
||||||
self.assertRaises(IndexError, popfcn, ul, -1 - self.limit)
|
self.assertRaises(IndexError, popfcn, ul, -1 - self.limit)
|
||||||
|
|
||||||
|
@ -265,8 +271,10 @@ class ListMixinTest(unittest.TestCase):
|
||||||
ul.remove(val)
|
ul.remove(val)
|
||||||
self.assertEqual(pl[:], ul[:], 'after remove val %d' % val)
|
self.assertEqual(pl[:], ul[:], 'after remove val %d' % val)
|
||||||
|
|
||||||
def indexfcn(x, v): return x.index(v)
|
def indexfcn(x, v):
|
||||||
def removefcn(x, v): return x.remove(v)
|
return x.index(v)
|
||||||
|
def removefcn(x, v):
|
||||||
|
return x.remove(v)
|
||||||
self.assertRaises(ValueError, indexfcn, ul, 40)
|
self.assertRaises(ValueError, indexfcn, ul, 40)
|
||||||
self.assertRaises(ValueError, removefcn, ul, 40)
|
self.assertRaises(ValueError, removefcn, ul, 40)
|
||||||
|
|
||||||
|
@ -276,7 +284,8 @@ class ListMixinTest(unittest.TestCase):
|
||||||
ul._allowed = six.integer_types
|
ul._allowed = six.integer_types
|
||||||
ul[1] = 50
|
ul[1] = 50
|
||||||
ul[:2] = [60, 70, 80]
|
ul[:2] = [60, 70, 80]
|
||||||
def setfcn(x, i, v): x[i] = v
|
def setfcn(x, i, v):
|
||||||
|
x[i] = v
|
||||||
self.assertRaises(TypeError, setfcn, ul, 2, 'hello')
|
self.assertRaises(TypeError, setfcn, ul, 2, 'hello')
|
||||||
self.assertRaises(TypeError, setfcn, ul, slice(0,3,2), ('hello','goodbye'))
|
self.assertRaises(TypeError, setfcn, ul, slice(0,3,2), ('hello','goodbye'))
|
||||||
|
|
||||||
|
@ -284,8 +293,10 @@ class ListMixinTest(unittest.TestCase):
|
||||||
'Length limits'
|
'Length limits'
|
||||||
pl, ul = self.lists_of_len()
|
pl, ul = self.lists_of_len()
|
||||||
ul._minlength = 1
|
ul._minlength = 1
|
||||||
def delfcn(x,i): del x[:i]
|
def delfcn(x,i):
|
||||||
def setfcn(x,i): x[:i] = []
|
del x[:i]
|
||||||
|
def setfcn(x,i):
|
||||||
|
x[:i] = []
|
||||||
for i in range(self.limit - ul._minlength + 1, self.limit + 1):
|
for i in range(self.limit - ul._minlength + 1, self.limit + 1):
|
||||||
self.assertRaises(ValueError, delfcn, ul, i)
|
self.assertRaises(ValueError, delfcn, ul, i)
|
||||||
self.assertRaises(ValueError, setfcn, ul, i)
|
self.assertRaises(ValueError, setfcn, ul, i)
|
||||||
|
@ -299,7 +310,8 @@ class ListMixinTest(unittest.TestCase):
|
||||||
def test09_iterable_check(self):
|
def test09_iterable_check(self):
|
||||||
'Error on assigning non-iterable to slice'
|
'Error on assigning non-iterable to slice'
|
||||||
pl, ul = self.lists_of_len(self.limit + 1)
|
pl, ul = self.lists_of_len(self.limit + 1)
|
||||||
def setfcn(x, i, v): x[i] = v
|
def setfcn(x, i, v):
|
||||||
|
x[i] = v
|
||||||
self.assertRaises(TypeError, setfcn, ul, slice(0,3,2), 2)
|
self.assertRaises(TypeError, setfcn, ul, slice(0,3,2), 2)
|
||||||
|
|
||||||
def test10_checkindex(self):
|
def test10_checkindex(self):
|
||||||
|
|
|
@ -87,9 +87,11 @@ class GoogleMap(object):
|
||||||
|
|
||||||
# Defaults for the zoom level and center coordinates if the zoom
|
# Defaults for the zoom level and center coordinates if the zoom
|
||||||
# is not automatically calculated.
|
# is not automatically calculated.
|
||||||
if zoom is None: zoom = 4
|
if zoom is None:
|
||||||
|
zoom = 4
|
||||||
self.zoom = zoom
|
self.zoom = zoom
|
||||||
if center is None: center = (0, 0)
|
if center is None:
|
||||||
|
center = (0, 0)
|
||||||
self.center = center
|
self.center = center
|
||||||
|
|
||||||
def render(self):
|
def render(self):
|
||||||
|
@ -229,5 +231,6 @@ class GoogleMapSet(GoogleMap):
|
||||||
def icons(self):
|
def icons(self):
|
||||||
"Returns a sequence of all icons in each map of the set."
|
"Returns a sequence of all icons in each map of the set."
|
||||||
icons = set()
|
icons = set()
|
||||||
for map in self.maps: icons |= map.icons
|
for map in self.maps:
|
||||||
|
icons |= map.icons
|
||||||
return icons
|
return icons
|
||||||
|
|
|
@ -102,8 +102,10 @@ class GPolygon(GOverlayBase):
|
||||||
fill_opacity:
|
fill_opacity:
|
||||||
The opacity of the polygon fill. Defaults to 0.4.
|
The opacity of the polygon fill. Defaults to 0.4.
|
||||||
"""
|
"""
|
||||||
if isinstance(poly, six.string_types): poly = fromstr(poly)
|
if isinstance(poly, six.string_types):
|
||||||
if isinstance(poly, (tuple, list)): poly = Polygon(poly)
|
poly = fromstr(poly)
|
||||||
|
if isinstance(poly, (tuple, list)):
|
||||||
|
poly = Polygon(poly)
|
||||||
if not isinstance(poly, Polygon):
|
if not isinstance(poly, Polygon):
|
||||||
raise TypeError('GPolygon may only initialize on GEOS Polygons.')
|
raise TypeError('GPolygon may only initialize on GEOS Polygons.')
|
||||||
|
|
||||||
|
@ -152,8 +154,10 @@ class GPolyline(GOverlayBase):
|
||||||
The opacity of the polyline, between 0 and 1. Defaults to 1.
|
The opacity of the polyline, between 0 and 1. Defaults to 1.
|
||||||
"""
|
"""
|
||||||
# If a GEOS geometry isn't passed in, try to contsruct one.
|
# If a GEOS geometry isn't passed in, try to contsruct one.
|
||||||
if isinstance(geom, six.string_types): geom = fromstr(geom)
|
if isinstance(geom, six.string_types):
|
||||||
if isinstance(geom, (tuple, list)): geom = Polygon(geom)
|
geom = fromstr(geom)
|
||||||
|
if isinstance(geom, (tuple, list)):
|
||||||
|
geom = Polygon(geom)
|
||||||
# Generating the lat/lng coordinate pairs.
|
# Generating the lat/lng coordinate pairs.
|
||||||
if isinstance(geom, (LineString, LinearRing)):
|
if isinstance(geom, (LineString, LinearRing)):
|
||||||
self.latlngs = self.latlng_from_coords(geom.coords)
|
self.latlngs = self.latlng_from_coords(geom.coords)
|
||||||
|
@ -282,8 +286,10 @@ class GMarker(GOverlayBase):
|
||||||
Draggable option for GMarker, disabled by default.
|
Draggable option for GMarker, disabled by default.
|
||||||
"""
|
"""
|
||||||
# If a GEOS geometry isn't passed in, try to construct one.
|
# If a GEOS geometry isn't passed in, try to construct one.
|
||||||
if isinstance(geom, six.string_types): geom = fromstr(geom)
|
if isinstance(geom, six.string_types):
|
||||||
if isinstance(geom, (tuple, list)): geom = Point(geom)
|
geom = fromstr(geom)
|
||||||
|
if isinstance(geom, (tuple, list)):
|
||||||
|
geom = Point(geom)
|
||||||
if isinstance(geom, Point):
|
if isinstance(geom, Point):
|
||||||
self.latlng = self.latlng_from_coords(geom.coords)
|
self.latlng = self.latlng_from_coords(geom.coords)
|
||||||
else:
|
else:
|
||||||
|
@ -301,9 +307,12 @@ class GMarker(GOverlayBase):
|
||||||
|
|
||||||
def options(self):
|
def options(self):
|
||||||
result = []
|
result = []
|
||||||
if self.title: result.append('title: "%s"' % self.title)
|
if self.title:
|
||||||
if self.icon: result.append('icon: %s' % self.icon.varname)
|
result.append('title: "%s"' % self.title)
|
||||||
if self.draggable: result.append('draggable: true')
|
if self.icon:
|
||||||
|
result.append('icon: %s' % self.icon.varname)
|
||||||
|
if self.draggable:
|
||||||
|
result.append('draggable: true')
|
||||||
return '{%s}' % ','.join(result)
|
return '{%s}' % ','.join(result)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -179,7 +179,8 @@ class MeasureBase(object):
|
||||||
val = 0.0
|
val = 0.0
|
||||||
default_unit = self.STANDARD_UNIT
|
default_unit = self.STANDARD_UNIT
|
||||||
for unit, value in six.iteritems(kwargs):
|
for unit, value in six.iteritems(kwargs):
|
||||||
if not isinstance(value, float): value = float(value)
|
if not isinstance(value, float):
|
||||||
|
value = float(value)
|
||||||
if unit in self.UNITS:
|
if unit in self.UNITS:
|
||||||
val += self.UNITS[unit] * value
|
val += self.UNITS[unit] * value
|
||||||
default_unit = unit
|
default_unit = unit
|
||||||
|
|
|
@ -27,7 +27,8 @@ class GeoRSSSitemap(Sitemap):
|
||||||
# Setting up.
|
# Setting up.
|
||||||
self.feed_dict = feed_dict
|
self.feed_dict = feed_dict
|
||||||
self.locations = []
|
self.locations = []
|
||||||
if slug_dict is None: slug_dict = {}
|
if slug_dict is None:
|
||||||
|
slug_dict = {}
|
||||||
# Getting the feed locations.
|
# Getting the feed locations.
|
||||||
for section in feed_dict.keys():
|
for section in feed_dict.keys():
|
||||||
if slug_dict.get(section, False):
|
if slug_dict.get(section, False):
|
||||||
|
@ -42,7 +43,8 @@ class GeoRSSSitemap(Sitemap):
|
||||||
is placed on each URL element.
|
is placed on each URL element.
|
||||||
"""
|
"""
|
||||||
urls = Sitemap.get_urls(self, page=page, site=site)
|
urls = Sitemap.get_urls(self, page=page, site=site)
|
||||||
for url in urls: url['geo_format'] = 'georss'
|
for url in urls:
|
||||||
|
url['geo_format'] = 'georss'
|
||||||
return urls
|
return urls
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
|
|
|
@ -46,7 +46,8 @@ class KMLSitemap(Sitemap):
|
||||||
is placed on each URL element.
|
is placed on each URL element.
|
||||||
"""
|
"""
|
||||||
urls = Sitemap.get_urls(self, page=page, site=site)
|
urls = Sitemap.get_urls(self, page=page, site=site)
|
||||||
for url in urls: url['geo_format'] = self.geo_format
|
for url in urls:
|
||||||
|
url['geo_format'] = self.geo_format
|
||||||
return urls
|
return urls
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
|
|
|
@ -7,7 +7,9 @@ class SouthTexasCity(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
point = models.PointField(srid=32140)
|
point = models.PointField(srid=32140)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class SouthTexasCityFt(models.Model):
|
class SouthTexasCityFt(models.Model):
|
||||||
|
@ -15,7 +17,9 @@ class SouthTexasCityFt(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
point = models.PointField(srid=2278)
|
point = models.PointField(srid=2278)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class AustraliaCity(models.Model):
|
class AustraliaCity(models.Model):
|
||||||
|
@ -23,7 +27,9 @@ class AustraliaCity(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
point = models.PointField()
|
point = models.PointField()
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class CensusZipcode(models.Model):
|
class CensusZipcode(models.Model):
|
||||||
|
@ -31,7 +37,9 @@ class CensusZipcode(models.Model):
|
||||||
name = models.CharField(max_length=5)
|
name = models.CharField(max_length=5)
|
||||||
poly = models.PolygonField(srid=4269)
|
poly = models.PolygonField(srid=4269)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class SouthTexasZipcode(models.Model):
|
class SouthTexasZipcode(models.Model):
|
||||||
|
@ -39,7 +47,9 @@ class SouthTexasZipcode(models.Model):
|
||||||
name = models.CharField(max_length=5)
|
name = models.CharField(max_length=5)
|
||||||
poly = models.PolygonField(srid=32140, null=True)
|
poly = models.PolygonField(srid=32140, null=True)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class Interstate(models.Model):
|
class Interstate(models.Model):
|
||||||
|
@ -47,7 +57,9 @@ class Interstate(models.Model):
|
||||||
name = models.CharField(max_length=10)
|
name = models.CharField(max_length=10)
|
||||||
path = models.LineStringField()
|
path = models.LineStringField()
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class SouthTexasInterstate(models.Model):
|
class SouthTexasInterstate(models.Model):
|
||||||
|
@ -55,4 +67,6 @@ class SouthTexasInterstate(models.Model):
|
||||||
name = models.CharField(max_length=10)
|
name = models.CharField(max_length=10)
|
||||||
path = models.LineStringField(srid=32140)
|
path = models.LineStringField(srid=32140)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
|
@ -66,8 +66,10 @@ class DistanceTest(TestCase):
|
||||||
# Performing distance queries on two projected coordinate systems one
|
# Performing distance queries on two projected coordinate systems one
|
||||||
# with units in meters and the other in units of U.S. survey feet.
|
# with units in meters and the other in units of U.S. survey feet.
|
||||||
for dist in tx_dists:
|
for dist in tx_dists:
|
||||||
if isinstance(dist, tuple): dist1, dist2 = dist
|
if isinstance(dist, tuple):
|
||||||
else: dist1 = dist2 = dist
|
dist1, dist2 = dist
|
||||||
|
else:
|
||||||
|
dist1 = dist2 = dist
|
||||||
qs1 = SouthTexasCity.objects.filter(point__dwithin=(self.stx_pnt, dist1))
|
qs1 = SouthTexasCity.objects.filter(point__dwithin=(self.stx_pnt, dist1))
|
||||||
qs2 = SouthTexasCityFt.objects.filter(point__dwithin=(self.stx_pnt, dist2))
|
qs2 = SouthTexasCityFt.objects.filter(point__dwithin=(self.stx_pnt, dist2))
|
||||||
for qs in qs1, qs2:
|
for qs in qs1, qs2:
|
||||||
|
@ -75,12 +77,16 @@ class DistanceTest(TestCase):
|
||||||
|
|
||||||
# Now performing the `dwithin` queries on a geodetic coordinate system.
|
# Now performing the `dwithin` queries on a geodetic coordinate system.
|
||||||
for dist in au_dists:
|
for dist in au_dists:
|
||||||
if isinstance(dist, D) and not oracle: type_error = True
|
if isinstance(dist, D) and not oracle:
|
||||||
else: type_error = False
|
type_error = True
|
||||||
|
else:
|
||||||
|
type_error = False
|
||||||
|
|
||||||
if isinstance(dist, tuple):
|
if isinstance(dist, tuple):
|
||||||
if oracle: dist = dist[1]
|
if oracle:
|
||||||
else: dist = dist[0]
|
dist = dist[1]
|
||||||
|
else:
|
||||||
|
dist = dist[0]
|
||||||
|
|
||||||
# Creating the query set.
|
# Creating the query set.
|
||||||
qs = AustraliaCity.objects.order_by('name')
|
qs = AustraliaCity.objects.order_by('name')
|
||||||
|
|
|
@ -7,6 +7,8 @@ class City(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
point = models.PointField()
|
point = models.PointField()
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
admin.site.register(City, admin.OSMGeoAdmin)
|
admin.site.register(City, admin.OSMGeoAdmin)
|
||||||
|
|
|
@ -10,14 +10,18 @@ class Country(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
mpoly = models.MultiPolygonField() # SRID, by default, is 4326
|
mpoly = models.MultiPolygonField() # SRID, by default, is 4326
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class City(models.Model):
|
class City(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
point = models.PointField()
|
point = models.PointField()
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
# This is an inherited model from City
|
# This is an inherited model from City
|
||||||
class PennsylvaniaCity(City):
|
class PennsylvaniaCity(City):
|
||||||
|
@ -30,14 +34,18 @@ class State(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
poly = models.PolygonField(null=null_flag) # Allowing NULL geometries here.
|
poly = models.PolygonField(null=null_flag) # Allowing NULL geometries here.
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class Track(models.Model):
|
class Track(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
line = models.LineStringField()
|
line = models.LineStringField()
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
class Truth(models.Model):
|
class Truth(models.Model):
|
||||||
val = models.BooleanField(default=False)
|
val = models.BooleanField(default=False)
|
||||||
|
@ -49,7 +57,9 @@ if not spatialite:
|
||||||
name = models.CharField(max_length=20)
|
name = models.CharField(max_length=20)
|
||||||
geom = models.GeometryField()
|
geom = models.GeometryField()
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
class MinusOneSRID(models.Model):
|
class MinusOneSRID(models.Model):
|
||||||
geom = models.PointField(srid=-1) # Minus one SRID.
|
geom = models.PointField(srid=-1) # Minus one SRID.
|
||||||
|
|
|
@ -190,7 +190,8 @@ class GeoModelTest(TestCase):
|
||||||
qs = PennsylvaniaCity.objects.transform(32128)
|
qs = PennsylvaniaCity.objects.transform(32128)
|
||||||
|
|
||||||
self.assertEqual(1, qs.count())
|
self.assertEqual(1, qs.count())
|
||||||
for pc in qs: self.assertEqual(32128, pc.point.srid)
|
for pc in qs:
|
||||||
|
self.assertEqual(32128, pc.point.srid)
|
||||||
|
|
||||||
def test_raw_sql_query(self):
|
def test_raw_sql_query(self):
|
||||||
"Testing raw SQL query."
|
"Testing raw SQL query."
|
||||||
|
@ -229,7 +230,8 @@ class GeoLookupTest(TestCase):
|
||||||
qs = City.objects.filter(point__contained=texas.mpoly)
|
qs = City.objects.filter(point__contained=texas.mpoly)
|
||||||
self.assertEqual(3, qs.count())
|
self.assertEqual(3, qs.count())
|
||||||
cities = ['Houston', 'Dallas', 'Oklahoma City']
|
cities = ['Houston', 'Dallas', 'Oklahoma City']
|
||||||
for c in qs: self.assertEqual(True, c.name in cities)
|
for c in qs:
|
||||||
|
self.assertEqual(True, c.name in cities)
|
||||||
|
|
||||||
# Pulling out some cities.
|
# Pulling out some cities.
|
||||||
houston = City.objects.get(name='Houston')
|
houston = City.objects.get(name='Houston')
|
||||||
|
@ -284,13 +286,15 @@ class GeoLookupTest(TestCase):
|
||||||
'Lawrence', 'Chicago', 'Wellington']
|
'Lawrence', 'Chicago', 'Wellington']
|
||||||
qs = City.objects.filter(point__right=co_border)
|
qs = City.objects.filter(point__right=co_border)
|
||||||
self.assertEqual(6, len(qs))
|
self.assertEqual(6, len(qs))
|
||||||
for c in qs: self.assertEqual(True, c.name in cities)
|
for c in qs:
|
||||||
|
self.assertEqual(True, c.name in cities)
|
||||||
|
|
||||||
# These cities should be strictly to the right of the KS border.
|
# These cities should be strictly to the right of the KS border.
|
||||||
cities = ['Chicago', 'Wellington']
|
cities = ['Chicago', 'Wellington']
|
||||||
qs = City.objects.filter(point__right=ks_border)
|
qs = City.objects.filter(point__right=ks_border)
|
||||||
self.assertEqual(2, len(qs))
|
self.assertEqual(2, len(qs))
|
||||||
for c in qs: self.assertEqual(True, c.name in cities)
|
for c in qs:
|
||||||
|
self.assertEqual(True, c.name in cities)
|
||||||
|
|
||||||
# Note: Wellington has an 'X' value of 174, so it will not be considered
|
# Note: Wellington has an 'X' value of 174, so it will not be considered
|
||||||
# to the left of CO.
|
# to the left of CO.
|
||||||
|
@ -300,7 +304,8 @@ class GeoLookupTest(TestCase):
|
||||||
cities = ['Pueblo', 'Victoria']
|
cities = ['Pueblo', 'Victoria']
|
||||||
qs = City.objects.filter(point__left=ks_border)
|
qs = City.objects.filter(point__left=ks_border)
|
||||||
self.assertEqual(2, len(qs))
|
self.assertEqual(2, len(qs))
|
||||||
for c in qs: self.assertEqual(True, c.name in cities)
|
for c in qs:
|
||||||
|
self.assertEqual(True, c.name in cities)
|
||||||
|
|
||||||
# The left/right lookup tests are known failures on PostGIS 2.0/2.0.1
|
# The left/right lookup tests are known failures on PostGIS 2.0/2.0.1
|
||||||
# http://trac.osgeo.org/postgis/ticket/2035
|
# http://trac.osgeo.org/postgis/ticket/2035
|
||||||
|
@ -313,7 +318,8 @@ class GeoLookupTest(TestCase):
|
||||||
c1 = City.objects.get(point=pnt)
|
c1 = City.objects.get(point=pnt)
|
||||||
c2 = City.objects.get(point__same_as=pnt)
|
c2 = City.objects.get(point__same_as=pnt)
|
||||||
c3 = City.objects.get(point__equals=pnt)
|
c3 = City.objects.get(point__equals=pnt)
|
||||||
for c in [c1, c2, c3]: self.assertEqual('Houston', c.name)
|
for c in [c1, c2, c3]:
|
||||||
|
self.assertEqual('Houston', c.name)
|
||||||
|
|
||||||
@no_mysql
|
@no_mysql
|
||||||
def test_null_geometries(self):
|
def test_null_geometries(self):
|
||||||
|
@ -476,7 +482,8 @@ class GeoQuerySetTest(TestCase):
|
||||||
@no_spatialite
|
@no_spatialite
|
||||||
def test_geohash(self):
|
def test_geohash(self):
|
||||||
"Testing GeoQuerySet.geohash()."
|
"Testing GeoQuerySet.geohash()."
|
||||||
if not connection.ops.geohash: return
|
if not connection.ops.geohash:
|
||||||
|
return
|
||||||
# Reference query:
|
# Reference query:
|
||||||
# SELECT ST_GeoHash(point) FROM geoapp_city WHERE name='Houston';
|
# SELECT ST_GeoHash(point) FROM geoapp_city WHERE name='Houston';
|
||||||
# SELECT ST_GeoHash(point, 5) FROM geoapp_city WHERE name='Houston';
|
# SELECT ST_GeoHash(point, 5) FROM geoapp_city WHERE name='Houston';
|
||||||
|
@ -619,7 +626,8 @@ class GeoQuerySetTest(TestCase):
|
||||||
|
|
||||||
if not oracle:
|
if not oracle:
|
||||||
# Oracle cannot count vertices in Point geometries.
|
# Oracle cannot count vertices in Point geometries.
|
||||||
for c in City.objects.num_points(): self.assertEqual(1, c.num_points)
|
for c in City.objects.num_points():
|
||||||
|
self.assertEqual(1, c.num_points)
|
||||||
|
|
||||||
@no_mysql
|
@no_mysql
|
||||||
def test_point_on_surface(self):
|
def test_point_on_surface(self):
|
||||||
|
|
|
@ -6,14 +6,18 @@ class City(models.Model):
|
||||||
name = models.CharField(max_length=30)
|
name = models.CharField(max_length=30)
|
||||||
point = models.PointField(geography=True)
|
point = models.PointField(geography=True)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class Zipcode(models.Model):
|
class Zipcode(models.Model):
|
||||||
code = models.CharField(max_length=10)
|
code = models.CharField(max_length=10)
|
||||||
poly = models.PolygonField(geography=True)
|
poly = models.PolygonField(geography=True)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.code
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.code
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class County(models.Model):
|
class County(models.Model):
|
||||||
|
@ -21,4 +25,6 @@ class County(models.Model):
|
||||||
state = models.CharField(max_length=20)
|
state = models.CharField(max_length=20)
|
||||||
mpoly = models.MultiPolygonField(geography=True)
|
mpoly = models.MultiPolygonField(geography=True)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return ' County, '.join([self.name, self.state])
|
|
||||||
|
def __str__(self):
|
||||||
|
return ' County, '.join([self.name, self.state])
|
||||||
|
|
|
@ -208,7 +208,8 @@ class LayerMapTest(TestCase):
|
||||||
def test_test_fid_range_step(self):
|
def test_test_fid_range_step(self):
|
||||||
"Tests the `fid_range` keyword and the `step` keyword of .save()."
|
"Tests the `fid_range` keyword and the `step` keyword of .save()."
|
||||||
# Function for clearing out all the counties before testing.
|
# Function for clearing out all the counties before testing.
|
||||||
def clear_counties(): County.objects.all().delete()
|
def clear_counties():
|
||||||
|
County.objects.all().delete()
|
||||||
|
|
||||||
State.objects.bulk_create([
|
State.objects.bulk_create([
|
||||||
State(name='Colorado'), State(name='Hawaii'), State(name='Texas')
|
State(name='Colorado'), State(name='Hawaii'), State(name='Texas')
|
||||||
|
|
|
@ -5,7 +5,9 @@ from django.utils.encoding import python_2_unicode_compatible
|
||||||
class Location(models.Model):
|
class Location(models.Model):
|
||||||
point = models.PointField()
|
point = models.PointField()
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.point.wkt
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.point.wkt
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class City(models.Model):
|
class City(models.Model):
|
||||||
|
@ -13,7 +15,9 @@ class City(models.Model):
|
||||||
state = models.CharField(max_length=2)
|
state = models.CharField(max_length=2)
|
||||||
location = models.ForeignKey(Location)
|
location = models.ForeignKey(Location)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
class AugmentedLocation(Location):
|
class AugmentedLocation(Location):
|
||||||
extra_text = models.TextField(blank=True)
|
extra_text = models.TextField(blank=True)
|
||||||
|
@ -34,7 +38,9 @@ class Parcel(models.Model):
|
||||||
border1 = models.PolygonField()
|
border1 = models.PolygonField()
|
||||||
border2 = models.PolygonField(srid=2276)
|
border2 = models.PolygonField(srid=2276)
|
||||||
objects = models.GeoManager()
|
objects = models.GeoManager()
|
||||||
def __str__(self): return self.name
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
# These use the GeoManager but do not have any geographic fields.
|
# These use the GeoManager but do not have any geographic fields.
|
||||||
class Author(models.Model):
|
class Author(models.Model):
|
||||||
|
|
|
@ -79,7 +79,8 @@ class RelatedGeoModelTest(TestCase):
|
||||||
# between the Oracle and PostGIS spatial backends on the extent calculation.
|
# between the Oracle and PostGIS spatial backends on the extent calculation.
|
||||||
tol = 4
|
tol = 4
|
||||||
for ref, e in [(all_extent, e1), (txpa_extent, e2), (all_extent, e3)]:
|
for ref, e in [(all_extent, e1), (txpa_extent, e2), (all_extent, e3)]:
|
||||||
for ref_val, e_val in zip(ref, e): self.assertAlmostEqual(ref_val, e_val, tol)
|
for ref_val, e_val in zip(ref, e):
|
||||||
|
self.assertAlmostEqual(ref_val, e_val, tol)
|
||||||
|
|
||||||
@no_mysql
|
@no_mysql
|
||||||
def test04b_related_union_aggregate(self):
|
def test04b_related_union_aggregate(self):
|
||||||
|
|
|
@ -16,10 +16,17 @@ def no_backend(test_func, backend):
|
||||||
|
|
||||||
# Decorators to disable entire test functions for specific
|
# Decorators to disable entire test functions for specific
|
||||||
# spatial backends.
|
# spatial backends.
|
||||||
def no_oracle(func): return no_backend(func, 'oracle')
|
def no_oracle(func):
|
||||||
def no_postgis(func): return no_backend(func, 'postgis')
|
return no_backend(func, 'oracle')
|
||||||
def no_mysql(func): return no_backend(func, 'mysql')
|
|
||||||
def no_spatialite(func): return no_backend(func, 'spatialite')
|
def no_postgis(func):
|
||||||
|
return no_backend(func, 'postgis')
|
||||||
|
|
||||||
|
def no_mysql(func):
|
||||||
|
return no_backend(func, 'mysql')
|
||||||
|
|
||||||
|
def no_spatialite(func):
|
||||||
|
return no_backend(func, 'spatialite')
|
||||||
|
|
||||||
# Shortcut booleans to omit only portions of tests.
|
# Shortcut booleans to omit only portions of tests.
|
||||||
_default_db = settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'].rsplit('.')[-1]
|
_default_db = settings.DATABASES[DEFAULT_DB_ALIAS]['ENGINE'].rsplit('.')[-1]
|
||||||
|
|
|
@ -21,11 +21,20 @@ from django.utils.encoding import force_text
|
||||||
|
|
||||||
|
|
||||||
# LayerMapping exceptions.
|
# LayerMapping exceptions.
|
||||||
class LayerMapError(Exception): pass
|
class LayerMapError(Exception):
|
||||||
class InvalidString(LayerMapError): pass
|
pass
|
||||||
class InvalidDecimal(LayerMapError): pass
|
|
||||||
class InvalidInteger(LayerMapError): pass
|
class InvalidString(LayerMapError):
|
||||||
class MissingForeignKey(LayerMapError): pass
|
pass
|
||||||
|
|
||||||
|
class InvalidDecimal(LayerMapError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class InvalidInteger(LayerMapError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class MissingForeignKey(LayerMapError):
|
||||||
|
pass
|
||||||
|
|
||||||
class LayerMapping(object):
|
class LayerMapping(object):
|
||||||
"A class that maps OGR Layers to GeoDjango Models."
|
"A class that maps OGR Layers to GeoDjango Models."
|
||||||
|
@ -263,10 +272,12 @@ class LayerMapping(object):
|
||||||
if isinstance(unique, (list, tuple)):
|
if isinstance(unique, (list, tuple)):
|
||||||
# List of fields to determine uniqueness with
|
# List of fields to determine uniqueness with
|
||||||
for attr in unique:
|
for attr in unique:
|
||||||
if not attr in self.mapping: raise ValueError
|
if not attr in self.mapping:
|
||||||
|
raise ValueError
|
||||||
elif isinstance(unique, six.string_types):
|
elif isinstance(unique, six.string_types):
|
||||||
# Only a single field passed in.
|
# Only a single field passed in.
|
||||||
if unique not in self.mapping: raise ValueError
|
if unique not in self.mapping:
|
||||||
|
raise ValueError
|
||||||
else:
|
else:
|
||||||
raise TypeError('Unique keyword argument must be set with a tuple, list, or string.')
|
raise TypeError('Unique keyword argument must be set with a tuple, list, or string.')
|
||||||
|
|
||||||
|
@ -413,7 +424,8 @@ class LayerMapping(object):
|
||||||
# Transforming the geometry with our Coordinate Transformation object,
|
# Transforming the geometry with our Coordinate Transformation object,
|
||||||
# but only if the class variable `transform` is set w/a CoordTransform
|
# but only if the class variable `transform` is set w/a CoordTransform
|
||||||
# object.
|
# object.
|
||||||
if self.transform: g.transform(self.transform)
|
if self.transform:
|
||||||
|
g.transform(self.transform)
|
||||||
|
|
||||||
# Returning the WKT of the geometry.
|
# Returning the WKT of the geometry.
|
||||||
return g.wkt
|
return g.wkt
|
||||||
|
@ -512,7 +524,8 @@ class LayerMapping(object):
|
||||||
kwargs = self.feature_kwargs(feat)
|
kwargs = self.feature_kwargs(feat)
|
||||||
except LayerMapError as msg:
|
except LayerMapError as msg:
|
||||||
# Something borked the validation
|
# Something borked the validation
|
||||||
if strict: raise
|
if strict:
|
||||||
|
raise
|
||||||
elif not silent:
|
elif not silent:
|
||||||
stream.write('Ignoring Feature ID %s because: %s\n' % (feat.fid, msg))
|
stream.write('Ignoring Feature ID %s because: %s\n' % (feat.fid, msg))
|
||||||
else:
|
else:
|
||||||
|
@ -534,7 +547,8 @@ class LayerMapping(object):
|
||||||
# just-updated geometry WKT.
|
# just-updated geometry WKT.
|
||||||
geom = getattr(m, self.geom_field).ogr
|
geom = getattr(m, self.geom_field).ogr
|
||||||
new = OGRGeometry(kwargs[self.geom_field])
|
new = OGRGeometry(kwargs[self.geom_field])
|
||||||
for g in new: geom.add(g)
|
for g in new:
|
||||||
|
geom.add(g)
|
||||||
setattr(m, self.geom_field, geom.wkt)
|
setattr(m, self.geom_field, geom.wkt)
|
||||||
except ObjectDoesNotExist:
|
except ObjectDoesNotExist:
|
||||||
# No unique model exists yet, create.
|
# No unique model exists yet, create.
|
||||||
|
@ -546,7 +560,8 @@ class LayerMapping(object):
|
||||||
# Attempting to save.
|
# Attempting to save.
|
||||||
m.save(using=self.using)
|
m.save(using=self.using)
|
||||||
num_saved += 1
|
num_saved += 1
|
||||||
if verbose: stream.write('%s: %s\n' % ('Updated' if is_update else 'Saved', m))
|
if verbose:
|
||||||
|
stream.write('%s: %s\n' % ('Updated' if is_update else 'Saved', m))
|
||||||
except Exception as msg:
|
except Exception as msg:
|
||||||
if strict:
|
if strict:
|
||||||
# Bailing out if the `strict` keyword is set.
|
# Bailing out if the `strict` keyword is set.
|
||||||
|
@ -580,8 +595,10 @@ class LayerMapping(object):
|
||||||
for i, end in enumerate(indices):
|
for i, end in enumerate(indices):
|
||||||
# Constructing the slice to use for this step; the last slice is
|
# Constructing the slice to use for this step; the last slice is
|
||||||
# special (e.g, [100:] instead of [90:100]).
|
# special (e.g, [100:] instead of [90:100]).
|
||||||
if i+1 == n_i: step_slice = slice(beg, None)
|
if i+1 == n_i:
|
||||||
else: step_slice = slice(beg, end)
|
step_slice = slice(beg, None)
|
||||||
|
else:
|
||||||
|
step_slice = slice(beg, end)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
num_feat, num_saved = _save(step_slice, num_feat, num_saved)
|
num_feat, num_saved = _save(step_slice, num_feat, num_saved)
|
||||||
|
|
|
@ -37,11 +37,14 @@ def mapping(data_source, geom_name='geom', layer_key=0, multi_geom=False):
|
||||||
# Generating the field name for each field in the layer.
|
# Generating the field name for each field in the layer.
|
||||||
for field in data_source[layer_key].fields:
|
for field in data_source[layer_key].fields:
|
||||||
mfield = field.lower()
|
mfield = field.lower()
|
||||||
if mfield[-1:] == '_': mfield += 'field'
|
if mfield[-1:] == '_':
|
||||||
|
mfield += 'field'
|
||||||
_mapping[mfield] = field
|
_mapping[mfield] = field
|
||||||
gtype = data_source[layer_key].geom_type
|
gtype = data_source[layer_key].geom_type
|
||||||
if multi_geom and gtype.num in (1, 2, 3): prefix = 'MULTI'
|
if multi_geom and gtype.num in (1, 2, 3):
|
||||||
else: prefix = ''
|
prefix = 'MULTI'
|
||||||
|
else:
|
||||||
|
prefix = ''
|
||||||
_mapping[geom_name] = prefix + str(gtype).upper()
|
_mapping[geom_name] = prefix + str(gtype).upper()
|
||||||
return _mapping
|
return _mapping
|
||||||
|
|
||||||
|
@ -151,10 +154,14 @@ def _ogrinspect(data_source, model_name, geom_name='geom', layer_key=0, srid=Non
|
||||||
# Gets the `null` and `blank` keywords for the given field name.
|
# Gets the `null` and `blank` keywords for the given field name.
|
||||||
def get_kwargs_str(field_name):
|
def get_kwargs_str(field_name):
|
||||||
kwlist = []
|
kwlist = []
|
||||||
if field_name.lower() in null_fields: kwlist.append('null=True')
|
if field_name.lower() in null_fields:
|
||||||
if field_name.lower() in blank_fields: kwlist.append('blank=True')
|
kwlist.append('null=True')
|
||||||
if kwlist: return ', ' + ', '.join(kwlist)
|
if field_name.lower() in blank_fields:
|
||||||
else: return ''
|
kwlist.append('blank=True')
|
||||||
|
if kwlist:
|
||||||
|
return ', ' + ', '.join(kwlist)
|
||||||
|
else:
|
||||||
|
return ''
|
||||||
|
|
||||||
# For those wishing to disable the imports.
|
# For those wishing to disable the imports.
|
||||||
if imports:
|
if imports:
|
||||||
|
@ -167,7 +174,8 @@ def _ogrinspect(data_source, model_name, geom_name='geom', layer_key=0, srid=Non
|
||||||
for field_name, width, precision, field_type in zip(ogr_fields, layer.field_widths, layer.field_precisions, layer.field_types):
|
for field_name, width, precision, field_type in zip(ogr_fields, layer.field_widths, layer.field_precisions, layer.field_types):
|
||||||
# The model field name.
|
# The model field name.
|
||||||
mfield = field_name.lower()
|
mfield = field_name.lower()
|
||||||
if mfield[-1:] == '_': mfield += 'field'
|
if mfield[-1:] == '_':
|
||||||
|
mfield += 'field'
|
||||||
|
|
||||||
# Getting the keyword args string.
|
# Getting the keyword args string.
|
||||||
kwargs_str = get_kwargs_str(field_name)
|
kwargs_str = get_kwargs_str(field_name)
|
||||||
|
|
|
@ -27,7 +27,8 @@ def color_style():
|
||||||
DJANGO_COLORS = os.environ.get('DJANGO_COLORS', '')
|
DJANGO_COLORS = os.environ.get('DJANGO_COLORS', '')
|
||||||
color_settings = termcolors.parse_color_setting(DJANGO_COLORS)
|
color_settings = termcolors.parse_color_setting(DJANGO_COLORS)
|
||||||
if color_settings:
|
if color_settings:
|
||||||
class dummy: pass
|
class dummy:
|
||||||
|
pass
|
||||||
style = dummy()
|
style = dummy()
|
||||||
# The nocolor palette has all available roles.
|
# The nocolor palette has all available roles.
|
||||||
# Use that palette as the basis for populating
|
# Use that palette as the basis for populating
|
||||||
|
|
|
@ -48,7 +48,8 @@ class ErrorDict(dict):
|
||||||
return self.as_ul()
|
return self.as_ul()
|
||||||
|
|
||||||
def as_ul(self):
|
def as_ul(self):
|
||||||
if not self: return ''
|
if not self:
|
||||||
|
return ''
|
||||||
return format_html('<ul class="errorlist">{0}</ul>',
|
return format_html('<ul class="errorlist">{0}</ul>',
|
||||||
format_html_join('', '<li>{0}{1}</li>',
|
format_html_join('', '<li>{0}{1}</li>',
|
||||||
((k, force_text(v))
|
((k, force_text(v))
|
||||||
|
@ -67,7 +68,8 @@ class ErrorList(list):
|
||||||
return self.as_ul()
|
return self.as_ul()
|
||||||
|
|
||||||
def as_ul(self):
|
def as_ul(self):
|
||||||
if not self: return ''
|
if not self:
|
||||||
|
return ''
|
||||||
return format_html('<ul class="errorlist">{0}</ul>',
|
return format_html('<ul class="errorlist">{0}</ul>',
|
||||||
format_html_join('', '<li>{0}</li>',
|
format_html_join('', '<li>{0}</li>',
|
||||||
((force_text(e),) for e in self)
|
((force_text(e),) for e in self)
|
||||||
|
@ -75,7 +77,8 @@ class ErrorList(list):
|
||||||
)
|
)
|
||||||
|
|
||||||
def as_text(self):
|
def as_text(self):
|
||||||
if not self: return ''
|
if not self:
|
||||||
|
return ''
|
||||||
return '\n'.join('* %s' % force_text(e) for e in self)
|
return '\n'.join('* %s' % force_text(e) for e in self)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
|
|
@ -273,7 +273,8 @@ class PasswordInput(TextInput):
|
||||||
self.render_value = render_value
|
self.render_value = render_value
|
||||||
|
|
||||||
def render(self, name, value, attrs=None):
|
def render(self, name, value, attrs=None):
|
||||||
if not self.render_value: value=None
|
if not self.render_value:
|
||||||
|
value=None
|
||||||
return super(PasswordInput, self).render(name, value, attrs)
|
return super(PasswordInput, self).render(name, value, attrs)
|
||||||
|
|
||||||
class HiddenInput(Input):
|
class HiddenInput(Input):
|
||||||
|
@ -291,7 +292,8 @@ class MultipleHiddenInput(HiddenInput):
|
||||||
self.choices = choices
|
self.choices = choices
|
||||||
|
|
||||||
def render(self, name, value, attrs=None, choices=()):
|
def render(self, name, value, attrs=None, choices=()):
|
||||||
if value is None: value = []
|
if value is None:
|
||||||
|
value = []
|
||||||
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
|
final_attrs = self.build_attrs(attrs, type=self.input_type, name=name)
|
||||||
id_ = final_attrs.get('id', None)
|
id_ = final_attrs.get('id', None)
|
||||||
inputs = []
|
inputs = []
|
||||||
|
@ -394,7 +396,8 @@ class Textarea(Widget):
|
||||||
super(Textarea, self).__init__(default_attrs)
|
super(Textarea, self).__init__(default_attrs)
|
||||||
|
|
||||||
def render(self, name, value, attrs=None):
|
def render(self, name, value, attrs=None):
|
||||||
if value is None: value = ''
|
if value is None:
|
||||||
|
value = ''
|
||||||
final_attrs = self.build_attrs(attrs, name=name)
|
final_attrs = self.build_attrs(attrs, name=name)
|
||||||
return format_html('<textarea{0}>\r\n{1}</textarea>',
|
return format_html('<textarea{0}>\r\n{1}</textarea>',
|
||||||
flatatt(final_attrs),
|
flatatt(final_attrs),
|
||||||
|
@ -469,7 +472,8 @@ class Select(Widget):
|
||||||
self.choices = list(choices)
|
self.choices = list(choices)
|
||||||
|
|
||||||
def render(self, name, value, attrs=None, choices=()):
|
def render(self, name, value, attrs=None, choices=()):
|
||||||
if value is None: value = ''
|
if value is None:
|
||||||
|
value = ''
|
||||||
final_attrs = self.build_attrs(attrs, name=name)
|
final_attrs = self.build_attrs(attrs, name=name)
|
||||||
output = [format_html('<select{0}>', flatatt(final_attrs))]
|
output = [format_html('<select{0}>', flatatt(final_attrs))]
|
||||||
options = self.render_options(choices, [value])
|
options = self.render_options(choices, [value])
|
||||||
|
@ -539,7 +543,8 @@ class SelectMultiple(Select):
|
||||||
allow_multiple_selected = True
|
allow_multiple_selected = True
|
||||||
|
|
||||||
def render(self, name, value, attrs=None, choices=()):
|
def render(self, name, value, attrs=None, choices=()):
|
||||||
if value is None: value = []
|
if value is None:
|
||||||
|
value = []
|
||||||
final_attrs = self.build_attrs(attrs, name=name)
|
final_attrs = self.build_attrs(attrs, name=name)
|
||||||
output = [format_html('<select multiple="multiple"{0}>', flatatt(final_attrs))]
|
output = [format_html('<select multiple="multiple"{0}>', flatatt(final_attrs))]
|
||||||
options = self.render_options(choices, value)
|
options = self.render_options(choices, value)
|
||||||
|
|
|
@ -234,8 +234,10 @@ def get_text_list(list_, last_word=ugettext_lazy('or')):
|
||||||
>>> get_text_list([])
|
>>> get_text_list([])
|
||||||
''
|
''
|
||||||
"""
|
"""
|
||||||
if len(list_) == 0: return ''
|
if len(list_) == 0:
|
||||||
if len(list_) == 1: return force_text(list_[0])
|
return ''
|
||||||
|
if len(list_) == 1:
|
||||||
|
return force_text(list_[0])
|
||||||
return '%s %s %s' % (
|
return '%s %s %s' % (
|
||||||
# Translators: This string is used as a separator between list elements
|
# Translators: This string is used as a separator between list elements
|
||||||
_(', ').join(force_text(i) for i in list_[:-1]),
|
_(', ').join(force_text(i) for i in list_[:-1]),
|
||||||
|
|
|
@ -7,7 +7,8 @@ from django.utils.encoding import force_text
|
||||||
from django.utils.safestring import mark_safe, SafeData
|
from django.utils.safestring import mark_safe, SafeData
|
||||||
|
|
||||||
def ngettext(singular, plural, number):
|
def ngettext(singular, plural, number):
|
||||||
if number == 1: return singular
|
if number == 1:
|
||||||
|
return singular
|
||||||
return plural
|
return plural
|
||||||
ngettext_lazy = ngettext
|
ngettext_lazy = ngettext
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,8 @@ from xml.sax.saxutils import XMLGenerator
|
||||||
class SimplerXMLGenerator(XMLGenerator):
|
class SimplerXMLGenerator(XMLGenerator):
|
||||||
def addQuickElement(self, name, contents=None, attrs=None):
|
def addQuickElement(self, name, contents=None, attrs=None):
|
||||||
"Convenience method for adding an element with no children"
|
"Convenience method for adding an element with no children"
|
||||||
if attrs is None: attrs = {}
|
if attrs is None:
|
||||||
|
attrs = {}
|
||||||
self.startElement(name, attrs)
|
self.startElement(name, attrs)
|
||||||
if contents is not None:
|
if contents is not None:
|
||||||
self.characters(contents)
|
self.characters(contents)
|
||||||
|
|
|
@ -4,7 +4,7 @@ install-script = scripts/rpm-install.sh
|
||||||
|
|
||||||
[flake8]
|
[flake8]
|
||||||
exclude=./django/utils/dictconfig.py,./django/contrib/comments/*,./django/utils/unittest.py,./tests/comment_tests/*,./django/test/_doctest.py
|
exclude=./django/utils/dictconfig.py,./django/contrib/comments/*,./django/utils/unittest.py,./tests/comment_tests/*,./django/test/_doctest.py
|
||||||
ignore=E123,E124,E125,E126,E127,E128,E225,E226,E241,E251,E302,E501,E121,E122,E203,E221,E227,E231,E261,E301,E303,E502,E701,F401,F403,F841,W601
|
ignore=E123,E124,E125,E126,E127,E128,E225,E226,E241,E251,E302,E501,E121,E122,E203,E221,E227,E231,E261,E301,E303,E502,F401,F403,F841,W601
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
license-file = LICENSE
|
license-file = LICENSE
|
||||||
|
|
|
@ -94,8 +94,11 @@ class DecoratorsTest(TestCase):
|
||||||
callback = user_passes_test(test1)(callback)
|
callback = user_passes_test(test1)(callback)
|
||||||
callback = user_passes_test(test2)(callback)
|
callback = user_passes_test(test2)(callback)
|
||||||
|
|
||||||
class DummyUser(object): pass
|
class DummyUser(object):
|
||||||
class DummyRequest(object): pass
|
pass
|
||||||
|
|
||||||
|
class DummyRequest(object):
|
||||||
|
pass
|
||||||
|
|
||||||
request = DummyRequest()
|
request = DummyRequest()
|
||||||
request.user = DummyUser()
|
request.user = DummyUser()
|
||||||
|
|
|
@ -224,7 +224,8 @@ class FormsErrorMessagesTestCase(TestCase, AssertFormErrorsMixin):
|
||||||
return self.as_divs()
|
return self.as_divs()
|
||||||
|
|
||||||
def as_divs(self):
|
def as_divs(self):
|
||||||
if not self: return ''
|
if not self:
|
||||||
|
return ''
|
||||||
return mark_safe('<div class="error">%s</div>' % ''.join('<p>%s</p>' % e for e in self))
|
return mark_safe('<div class="error">%s</div>' % ''.join('<p>%s</p>' % e for e in self))
|
||||||
|
|
||||||
# This form should print errors the default way.
|
# This form should print errors the default way.
|
||||||
|
|
|
@ -727,7 +727,8 @@ class FormsExtraTestCase(TestCase, AssertFormErrorsMixin):
|
||||||
return self.as_divs()
|
return self.as_divs()
|
||||||
|
|
||||||
def as_divs(self):
|
def as_divs(self):
|
||||||
if not self: return ''
|
if not self:
|
||||||
|
return ''
|
||||||
return '<div class="errorlist">%s</div>' % ''.join('<div class="error">%s</div>' % force_text(e) for e in self)
|
return '<div class="errorlist">%s</div>' % ''.join('<div class="error">%s</div>' % force_text(e) for e in self)
|
||||||
|
|
||||||
class CommentForm(Form):
|
class CommentForm(Form):
|
||||||
|
|
|
@ -49,7 +49,8 @@ class FormsUtilTestCase(TestCase):
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class VeryBadError:
|
class VeryBadError:
|
||||||
def __str__(self): return "A very bad error."
|
def __str__(self):
|
||||||
|
return "A very bad error."
|
||||||
|
|
||||||
# Can take a non-string.
|
# Can take a non-string.
|
||||||
self.assertHTMLEqual(str(ErrorList(ValidationError(VeryBadError()).messages)),
|
self.assertHTMLEqual(str(ErrorList(ValidationError(VeryBadError()).messages)),
|
||||||
|
|
Loading…
Reference in New Issue