1111from sqlalchemy .ext .compiler import compiles
1212
1313
14- class _SpatialElement (object ):
14+ class _SpatialElement (functions . Function ):
1515 """
1616 The base class for :class:`geoalchemy2.elements.WKTElement` and
1717 :class:`geoalchemy2.elements.WKBElement`.
@@ -43,6 +43,13 @@ def __init__(self, data, srid=-1, extended=False, use_st_prefix=True):
4343 self .data = data
4444 self .extended = extended
4545 self .use_st_prefix = use_st_prefix
46+ if self .extended :
47+ args = [self .geom_from_extended_version , self .data ]
48+ else :
49+ args = [self .geom_from , self .data , self .srid ]
50+ if not self .use_st_prefix :
51+ args [0 ] = args [0 ].lstrip ('ST_' )
52+ functions .Function .__init__ (self , * args )
4653
4754 def __str__ (self ):
4855 return self .desc
@@ -68,23 +75,30 @@ def __getattr__(self, name):
6875
6976 def __getstate__ (self ):
7077 state = {
71- 'data' : str (self ),
7278 'srid' : self .srid ,
79+ 'data' : str (self ),
7380 'extended' : self .extended ,
81+ 'use_st_prefix' : self .use_st_prefix ,
82+ 'name' : self .name ,
7483 }
7584 return state
7685
7786 def __setstate__ (self , state ):
78- self .srid = state ['srid' ]
79- self .extended = state ['extended' ]
87+ self .__dict__ .update (state )
8088 self .data = self ._data_from_desc (state ['data' ])
89+ args = [self .name , self .data ]
90+ if not self .extended :
91+ args .append (self .srid )
92+ # we need to call Function.__init__ to properly initialize SQLAlchemy's
93+ # internal states
94+ functions .Function .__init__ (self , * args )
8195
8296 @staticmethod
8397 def _data_from_desc (desc ):
8498 raise NotImplementedError ()
8599
86100
87- class WKTElement (_SpatialElement , functions . Function ):
101+ class WKTElement (_SpatialElement ):
88102 """
89103 Instances of this class wrap a WKT or EWKT value.
90104
@@ -93,17 +107,10 @@ class WKTElement(_SpatialElement, functions.Function):
93107 wkt_element_1 = WKTElement('POINT(5 45)')
94108 wkt_element_2 = WKTElement('POINT(5 45)', srid=4326)
95109 wkt_element_3 = WKTElement('SRID=4326;POINT(5 45)', extended=True)
96-
97110 """
98111
99- def __init__ (self , * args , ** kwargs ):
100- _SpatialElement .__init__ (self , * args , ** kwargs )
101- if self .extended :
102- f = "ST_GeomFromEWKT" if self .use_st_prefix else "GeomFromEWKT"
103- args = (f , self .data )
104- else :
105- args = ("ST_GeomFromText" , self .data , self .srid )
106- functions .Function .__init__ (self , * args )
112+ geom_from = 'ST_GeomFromText'
113+ geom_from_extended_version = 'ST_GeomFromEWKT'
107114
108115 @property
109116 def desc (self ):
@@ -117,7 +124,7 @@ def _data_from_desc(desc):
117124 return desc
118125
119126
120- class WKBElement (_SpatialElement , functions . Function ):
127+ class WKBElement (_SpatialElement ):
121128 """
122129 Instances of this class wrap a WKB or EWKB value.
123130
@@ -129,14 +136,8 @@ class WKBElement(_SpatialElement, functions.Function):
129136 using the :func:`geoalchemy2.shape.from_shape` function.
130137 """
131138
132- def __init__ (self , * args , ** kwargs ):
133- _SpatialElement .__init__ (self , * args , ** kwargs )
134- if self .extended :
135- f = "ST_GeomFromEWKB" if self .use_st_prefix else "GeomFromEWKB"
136- args = (f , self .data )
137- else :
138- args = ("ST_GeomFromWKB" , self .data , self .srid )
139- functions .Function .__init__ (self , * args )
139+ geom_from = 'ST_GeomFromWKB'
140+ geom_from_extended_version = 'ST_GeomFromEWKB'
140141
141142 @property
142143 def desc (self ):
0 commit comments