GeometryField.get_final_value() for comparing new values with old values
This commit is contained in:
parent
b30fbe90d0
commit
9ffdf2052a
3 changed files with 22 additions and 16 deletions
|
@ -78,23 +78,28 @@ class GeometryField(models.TextField):
|
|||
elif self.geomtype == 'point' and not isinstance(value, Point):
|
||||
raise exception('Expected Point instance, got %s instead.' % repr(value))
|
||||
|
||||
def get_final_value(self, value, as_json=False):
|
||||
json_value = format_geojson(mapping(value))
|
||||
rounded_value = shape(json_value)
|
||||
|
||||
shapely_logger.setLevel('ERROR')
|
||||
if rounded_value.is_valid:
|
||||
return json_value if as_json else rounded_value
|
||||
shapely_logger.setLevel('INFO')
|
||||
|
||||
rounded_value = rounded_value.buffer(0)
|
||||
if not rounded_value.is_empty:
|
||||
value = rounded_value
|
||||
else:
|
||||
logging.debug('Fixing rounded geometry failed, saving it to the database without rounding.')
|
||||
|
||||
return format_geojson(mapping(value), round=False) if as_json else value
|
||||
|
||||
def get_prep_value(self, value):
|
||||
if value is None:
|
||||
return None
|
||||
self._validate_geomtype(value, exception=TypeError)
|
||||
json_value = format_geojson(mapping(value))
|
||||
shapely_logger.setLevel('ERROR')
|
||||
rounded_value = shape(json_value)
|
||||
if not rounded_value.is_valid:
|
||||
logging.debug('Rounded geometry is invalid, trying to fix this...')
|
||||
rounded_value = rounded_value.buffer(0)
|
||||
if not rounded_value.is_empty:
|
||||
json_value = format_geojson(mapping(rounded_value), round=False)
|
||||
else:
|
||||
logging.debug('Fixing failed, saving it to the database without rounding.')
|
||||
json_value = format_geojson(mapping(value), round=False)
|
||||
shapely_logger.setLevel('INFO')
|
||||
return json.dumps(json_value)
|
||||
return json.dumps(self.get_final_value(value, as_json=True))
|
||||
|
||||
def value_to_string(self, obj):
|
||||
value = self.value_from_object(obj)
|
||||
|
|
|
@ -119,8 +119,7 @@ class GeometryMixin(SerializableMixin):
|
|||
|
||||
def get_changed_geometry(self):
|
||||
field = self._meta.get_field('geometry')
|
||||
new_geometry = self.geometry
|
||||
new_geometry = field.to_python(field.get_prep_value(new_geometry))
|
||||
new_geometry = field.get_final_value(self.geometry)
|
||||
if self.orig_geometry is None:
|
||||
return new_geometry
|
||||
difference = new_geometry.symmetric_difference(self.orig_geometry)
|
||||
|
|
|
@ -496,6 +496,8 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
|||
num_deleted = 0
|
||||
num_created = 0
|
||||
|
||||
field = AltitudeArea._meta.get_field('geometry')
|
||||
|
||||
for candidate in all_candidates:
|
||||
new_area = None
|
||||
|
||||
|
@ -516,7 +518,7 @@ class AltitudeArea(LevelGeometryMixin, models.Model):
|
|||
if potential_areas:
|
||||
new_area = max(potential_areas, key=itemgetter(1))[0]
|
||||
|
||||
if not new_area.geometry.almost_equals(candidate.geometry):
|
||||
if not field.get_final_value(new_area.geometry).almost_equals(candidate.geometry):
|
||||
num_modified += 1
|
||||
|
||||
if new_area is None:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue