def geom_filter(cls, geometry, geometryType, imageDisplay, mapExtent, tolerance): myFilter = None tolerance = tolerance*0.0254 scale = getScale(imageDisplay, mapExtent) if scale is None or (scale >= cls.__minscale__ and scale <= cls.__maxscale__): geom = esriRest2Shapely(geometry, geometryType) wkb_geometry = WKBSpatialElement(buffer(geom.wkb), 21781) geom_column = cls.geometry_column() myFilter = functions.within_distance(geom_column, wkb_geometry, tolerance) return myFilter
def bbox_filter(cls, scale, bbox, tolerance=0): myFilter = None if scale is None or (scale >= cls.__minscale__ and scale <= cls.__maxscale__): geom = Polygon(((bbox[0], bbox[1]), (bbox[0], bbox[3]), (bbox[2], bbox[3]), (bbox[2], bbox[1]), (bbox[0], bbox[1]))) wkb_geometry = WKBSpatialElement(buffer(geom.wkb), 21781) geom_column = cls.__table__.columns['the_geom'] myFilter = functions.within_distance(geom_column, wkb_geometry, tolerance) return myFilter
def geom_filter(cls, geometry, geometryType, imageDisplay, mapExtent, tolerance): toleranceMeters = getToleranceMeters(imageDisplay, mapExtent, tolerance) scale = None minScale = cls.__minscale__ if hasattr(cls, '__minscale__') else None maxScale = cls.__maxscale__ if hasattr(cls, '__maxscale__') else None if minScale is not None and maxScale is not None and toleranceMeters != 0.0: scale = getScale(imageDisplay, mapExtent) if scale is None or (scale > cls.__minscale__ and scale <= cls.__maxscale__): geom = esriRest2Shapely(geometry, geometryType) wkbGeometry = WKBSpatialElement(buffer(geom.wkb), 21781) geomColumn = cls.geometry_column() geomFilter = functions.within_distance(geomColumn, wkbGeometry, toleranceMeters) return geomFilter return None
def search_location(): latitude = request.args['latitude'] longitude = request.args['longitude'] radius = int(request.args['radius']) primary = True if (request.args['primary'] == 'primary') else False page = int(request.args.get('page', '1')) format = request.args.get('format', 'html') radius_m = radius * 1000 wkt = "POINT(%s %s)" % (longitude, latitude) location = WKTSpatialElement(wkt) loc = sql.cast(LocationBase.location, Geography) q_loc = sql.cast(location, Geography) query = CadorsReport.query.join(LocationRef).join(LocationBase).filter( functions.within_distance(loc, q_loc, radius_m)) if primary: query = query.filter(LocationRef.primary == True) if format == 'html': query = query.add_column(functions.distance(loc, q_loc).label('distance')) query = query.add_column( func.ST_Azimuth(location, LocationBase.location.RAW) * (180/func.pi())) query = query.add_column(LocationBase.name) query = query.order_by('distance ASC', CadorsReport.timestamp.desc()) pagination = query.paginate(page) response = make_response( render_template('sr_loc.html', reports=pagination.items, pagination=pagination, get_direction=get_direction, radius=radius, latitude=latitude, longitude=longitude)) return prepare_response(response, 300) else: pagination = query.paginate(page) title = "Events within %s km of %s, %s" % (radius, latitude, longitude) return render_list(pagination, title, format)
def within_filter(cls, lon, lat, column, tolerance=0): geom = Point(lon, lat) wkb_geometry = WKBSpatialElement(buffer(geom.wkb), 21781) geom_column = cls.__table__.columns.get(column) return functions.within_distance(geom_column, wkb_geometry, tolerance)