Commit 933ea265 authored by Alex Kerney's avatar Alex Kerney

Changes to use Geoalchemy2/PostGIS functions. Doesn't currently work as it...

Changes to use Geoalchemy2/PostGIS functions. Doesn't currently work as it requires access to the db.session.
parent f5748f25
...@@ -2,6 +2,9 @@ import json ...@@ -2,6 +2,9 @@ import json
from wtforms.fields import TextAreaField from wtforms.fields import TextAreaField
from shapely.geometry import shape, mapping from shapely.geometry import shape, mapping
from .widgets import LeafletWidget from .widgets import LeafletWidget
from sqlalchemy import func
import geoalchemy2
#from .. import db how do you get db.session in a Field?
class JSONField(TextAreaField): class JSONField(TextAreaField):
...@@ -9,7 +12,7 @@ class JSONField(TextAreaField): ...@@ -9,7 +12,7 @@ class JSONField(TextAreaField):
if self.raw_data: if self.raw_data:
return self.raw_data[0] return self.raw_data[0]
if self.data: if self.data:
return self.to_json(self.data) return self.data
return "" return ""
def process_formdata(self, valuelist): def process_formdata(self, valuelist):
...@@ -34,18 +37,21 @@ class JSONField(TextAreaField): ...@@ -34,18 +37,21 @@ class JSONField(TextAreaField):
class GeoJSONField(JSONField): class GeoJSONField(JSONField):
widget = LeafletWidget() widget = LeafletWidget()
def __init__(self, label=None, validators=None, geometry_type="GEOMETRY", **kwargs): def __init__(self, label=None, validators=None, geometry_type="GEOMETRY", srid='-1', **kwargs):
super(GeoJSONField, self).__init__(label, validators, **kwargs) super(GeoJSONField, self).__init__(label, validators, **kwargs)
self.web_srid = 4326
self.srid = srid
self.geometry_type = geometry_type.upper() self.geometry_type = geometry_type.upper()
def _value(self): def _value(self):
if self.raw_data: if self.raw_data:
return self.raw_data[0] return self.raw_data[0]
if self.data: if type(self.data) is geoalchemy2.elements.WKBElement:
self.data = mapping(self.data) self.data = db.session.scalar(func.ST_AsGeoJson(func.ST_Transform(self.data, self.web_srid)))
return super(GeoJSONField, self)._value() return super(GeoJSONField, self)._value()
def process_formdata(self, valuelist): def process_formdata(self, valuelist):
super(GeoJSONField, self).process_formdata(valuelist) super(GeoJSONField, self).process_formdata(valuelist)
if self.data: web_shape = db.session.scalar(func.ST_AsText(func.ST_Transform(func.ST_GeomFromText(shape(self.data).wkt, self.web_srid), self.srid)))
self.data = shape(self.data) if type(self.data):
self.data = 'SRID='+str(self.srid)+';'+web_shape
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment