Create MapFish geometry filter based on the request params. Either
    a box or within or geometry filter, depending on the request params.
    Additional named arguments are passed to the spatial filter.

    Arguments:

    request
        the request.

    mapped_class
        the SQLAlchemy mapped class.

    geom_attr
        the key of the geometry property as defined in the SQLAlchemy
        mapper. If you use ``declarative_base`` this is the name of
        the geometry attribute as defined in the mapped class.

def create_geom_filter(request, mapped_class, geom_attr):
    """Create MapFish geometry filter based on the request params. Either
    a box or within or geometry filter, depending on the request params.
    Additional named arguments are passed to the spatial filter.

    Arguments:

    request
        the request.

    mapped_class
        the SQLAlchemy mapped class.

    geom_attr
        the key of the geometry property as defined in the SQLAlchemy
        mapper. If you use ``declarative_base`` this is the name of
        the geometry attribute as defined in the mapped class.
    """
    tolerance = float(request.params.get('tolerance', 0.0))
    epsg = None
    if 'epsg' in request.params:
        epsg = int(request.params['epsg'])
    box = request.params.get('bbox')
    shape = None
    if box is not None:
        box = [float(x) for x in box.split(',')]
        shape = Polygon(((box[0], box[1]), (box[0], box[3]),
                         (box[2], box[3]), (box[2], box[1]),
                         (box[0], box[1])))
    elif 'lon' in request.params and 'lat' in request.params:
        shape = Point(float(request.params['lon']),
                      float(request.params['lat']))
    elif 'geometry' in request.params:
        shape = loads(request.params['geometry'],
                      object_hook=GeoJSON.to_instance)
        shape = asShape(shape)
    if shape is None:
        return None
    column_epsg = _get_col_epsg(mapped_class, geom_attr)
    geom_attr = getattr(mapped_class, geom_attr)
    epsg = column_epsg if epsg is None else epsg
    if epsg != column_epsg:
        geom_attr = func.ST_Transform(geom_attr, epsg)
    geometry = from_shape(shape, srid=epsg)
    return func.ST_DWITHIN(geom_attr, geometry, tolerance)