fields.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import geoalchemy2
  2. from shapely.geometry import shape
  3. from sqlalchemy import func
  4. from flask_admin.form import JSONField
  5. from .widgets import LeafletWidget
  6. class GeoJSONField(JSONField):
  7. widget = LeafletWidget()
  8. def __init__(self, label=None, validators=None, geometry_type="GEOMETRY",
  9. srid='-1', session=None, **kwargs):
  10. super(GeoJSONField, self).__init__(label, validators, **kwargs)
  11. self.web_srid = 4326
  12. self.srid = srid
  13. if self.srid is -1:
  14. self.transform_srid = self.web_srid
  15. else:
  16. self.transform_srid = self.srid
  17. self.geometry_type = geometry_type.upper()
  18. self.session = session
  19. def _value(self):
  20. if self.raw_data:
  21. return self.raw_data[0]
  22. if type(self.data) is geoalchemy2.elements.WKBElement:
  23. if self.srid is -1:
  24. return self.session.scalar(func.ST_AsGeoJson(self.data))
  25. else:
  26. return self.session.scalar(
  27. func.ST_AsGeoJson(
  28. func.ST_Transform(self.data, self.web_srid)
  29. )
  30. )
  31. else:
  32. return ''
  33. def process_formdata(self, valuelist):
  34. super(GeoJSONField, self).process_formdata(valuelist)
  35. if str(self.data) is '':
  36. self.data = None
  37. if self.data is not None:
  38. web_shape = self.session.scalar(
  39. func.ST_AsText(
  40. func.ST_Transform(
  41. func.ST_GeomFromText(
  42. shape(self.data).wkt,
  43. self.web_srid
  44. ),
  45. self.transform_srid
  46. )
  47. )
  48. )
  49. self.data = 'SRID=' + str(self.srid) + ';' + str(web_shape)