1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import geoalchemy2
- from shapely.geometry import shape
- from sqlalchemy import func
- from flask_admin.form import JSONField
- from .widgets import LeafletWidget
- class GeoJSONField(JSONField):
- widget = LeafletWidget()
- def __init__(self, label=None, validators=None, geometry_type="GEOMETRY",
- srid='-1', session=None, **kwargs):
- super(GeoJSONField, self).__init__(label, validators, **kwargs)
- self.web_srid = 4326
- self.srid = srid
- if self.srid is -1:
- self.transform_srid = self.web_srid
- else:
- self.transform_srid = self.srid
- self.geometry_type = geometry_type.upper()
- self.session = session
- def _value(self):
- if self.raw_data:
- return self.raw_data[0]
- if type(self.data) is geoalchemy2.elements.WKBElement:
- if self.srid is -1:
- return self.session.scalar(func.ST_AsGeoJson(self.data))
- else:
- return self.session.scalar(
- func.ST_AsGeoJson(
- func.ST_Transform(self.data, self.web_srid)
- )
- )
- else:
- return ''
- def process_formdata(self, valuelist):
- super(GeoJSONField, self).process_formdata(valuelist)
- if str(self.data) is '':
- self.data = None
- if self.data is not None:
- web_shape = self.session.scalar(
- func.ST_AsText(
- func.ST_Transform(
- func.ST_GeomFromText(
- shape(self.data).wkt,
- self.web_srid
- ),
- self.transform_srid
- )
- )
- )
- self.data = 'SRID=' + str(self.srid) + ';' + str(web_shape)
|