diff options
| author | Daniel Wiesmann <daniel.wiesmann@gmail.com> | 2016-01-22 11:03:05 +0000 |
|---|---|---|
| committer | Claude Paroz <claude@2xlibre.net> | 2016-01-22 19:38:34 +0100 |
| commit | a08d2463d2674b95f5a995f77cd9596168378a4f (patch) | |
| tree | 0f3d36935ba125847311ab10fe3b5e16d6d8ff30 /django | |
| parent | 16baec5c8a24ea4bf1bfc27a4c8fea7d0ff4860f (diff) | |
Fixed #26112 -- Error when computing aggregate of GIS areas.
Thanks Simon Charette and Claude Paroz for the reviews.
Diffstat (limited to 'django')
| -rw-r--r-- | django/contrib/gis/db/models/functions.py | 25 | ||||
| -rw-r--r-- | django/contrib/gis/db/models/sql/conversion.py | 5 |
2 files changed, 15 insertions, 15 deletions
diff --git a/django/contrib/gis/db/models/functions.py b/django/contrib/gis/db/models/functions.py index 17847bdc5c..4f76c155f2 100644 --- a/django/contrib/gis/db/models/functions.py +++ b/django/contrib/gis/db/models/functions.py @@ -117,24 +117,23 @@ class OracleToleranceMixin(object): class Area(OracleToleranceMixin, GeoFunc): + output_field_class = AreaField arity = 1 def as_sql(self, compiler, connection): if connection.ops.geography: - # Geography fields support area calculation, returns square meters. - self.output_field = AreaField('sq_m') - elif not self.output_field.geodetic(connection): - # Getting the area units of the geographic field. - units = self.output_field.units_name(connection) - if units: - self.output_field = AreaField( - AreaMeasure.unit_attname(self.output_field.units_name(connection)) - ) - else: - self.output_field = FloatField() + self.output_field.area_att = 'sq_m' else: - # TODO: Do we want to support raw number areas for geodetic fields? - raise NotImplementedError('Area on geodetic coordinate systems not supported.') + # Getting the area units of the geographic field. + source_fields = self.get_source_fields() + if len(source_fields): + source_field = source_fields[0] + if source_field.geodetic(connection): + # TODO: Do we want to support raw number areas for geodetic fields? + raise NotImplementedError('Area on geodetic coordinate systems not supported.') + units_name = source_field.units_name(connection) + if units_name: + self.output_field.area_att = AreaMeasure.unit_attname(units_name) return super(Area, self).as_sql(compiler, connection) def as_oracle(self, compiler, connection): diff --git a/django/contrib/gis/db/models/sql/conversion.py b/django/contrib/gis/db/models/sql/conversion.py index dbbdb8b338..afc1053790 100644 --- a/django/contrib/gis/db/models/sql/conversion.py +++ b/django/contrib/gis/db/models/sql/conversion.py @@ -21,13 +21,14 @@ class BaseField(object): class AreaField(BaseField): "Wrapper for Area values." - def __init__(self, area_att): + def __init__(self, area_att=None): self.area_att = area_att def from_db_value(self, value, expression, connection, context): if connection.features.interprets_empty_strings_as_nulls and value == '': value = None - if value is not None: + # If the units are known, convert value into area measure. + if value is not None and self.area_att: value = Area(**{self.area_att: value}) return value |
