[Featureserver] Filter query on PostGIS layer crashes FS

Etienne Dube etienne.dube at boreal-is.com
Thu Nov 11 17:11:48 EST 2010


Hi,

I've got a problem when querying a PostGIS datasource using a queryable 
parameter to filter features by attributes. FeatureServer (got the 
latest rev from svn) crashes with the following stack trace:

An error occurred: 'NoneType' object has no attribute 'has_key'
   File 
"C:\OSGeo4W\apache\htdocs\featureserver\web_request\handlers.py", line 
219, in cgi
     accepts = accepts )
   File 
"C:\OSGeo4W\apache\htdocs\featureserver\FeatureServer\Server.py", line 
167, in dispatchRequest
     result = method(action)
   File 
"C:\OSGeo4W\apache\htdocs\featureserver\FeatureServer\DataSource\PostGIS.py", 
line 157, in select
     filters = self.feature_predicates(match)
   File 
"C:\OSGeo4W\apache\htdocs\featureserver\FeatureServer\DataSource\PostGIS.py", 
line 92, in feature_predicates
     if feature.geometry.has_key("coordinates"):

It happens systematically; I think the problem could have been 
introduced by a change to Feature.py in revision 618.

I've attached a patch for PostGIS.py that fixes the issue. It also adds 
the "eq" operator to query_action_types and query_action_sql, to make it 
work correctly with OpenLayers.Protocol.HTTP.

Regards,

-- 
Etienne Dubé
Developer

Boréal Informations Stratégiques
101, Du Moulin, bureau 202-A
Magog (Québec)
J1X 4A1

Tel. :  514.313.5951 #1131
Email: etienne.dube at boreal-is.com

-------------- next part --------------
Index: FeatureServer/DataSource/PostGIS.py
===================================================================
--- FeatureServer/DataSource/PostGIS.py	(revision 629)
+++ FeatureServer/DataSource/PostGIS.py	(working copy)
@@ -26,11 +26,12 @@
     """PostGIS datasource. Setting up the table is beyond the scope of
        FeatureServer."""
     
-    query_action_types = ['lt', 'gt', 'ilike', 'like', 'gte', 'lte']
+    query_action_types = ['lt', 'gt', 'ilike', 'like', 'gte', 'lte', 'eq']
 
     query_action_sql = {'lt': '<', 'gt': '>', 
                         'ilike': 'ilike', 'like':'like',
-                        'gte': '>=', 'lte': '<='}
+                        'gte': '>=', 'lte': '<=',
+                        'eq': '='}
      
     def __init__(self, name, srid = 4326, fid = "gid", geometry = "the_geom", order = "", attribute_cols = '*', writable = True, encoding = "utf-8", **args):
         DataSource.__init__(self, name, **args)
@@ -89,7 +90,7 @@
                                                         pair[1]['pred']))
                 else:
                     predicates.append("%s = %s" % pair)
-        if feature.geometry.has_key("coordinates"):
+        if feature.geometry and feature.geometry.has_key("coordinates"):
             predicates.append(" %s = SetSRID('%s'::geometry, %s) " % (self.geom_col, WKT.to_wkt(feature.geometry), self.srid))     
         return predicates
 


More information about the Featureserver mailing list