def __to_sql_expr_box(self): coords = self.values['box'] epsg = self.geom_column.type.srid if self.epsg is not None: epsg = self.epsg coords = map(float, coords) # define polygon from box point_a = (coords[0], coords[1]) point_b = (coords[0], coords[3]) point_c = (coords[2], coords[3]) point_d = (coords[2], coords[1]) point_e = point_a coords = (point_a, point_b, point_c, point_d, point_e) poly = Polygon(coords) pg_poly = func.geomfromtext(poly.wkt, epsg) if epsg != self.geom_column.type.srid: pg_poly = func.transform(pg_poly, epsg) # TODO : use st_intersects when only postgis 1.3 supported return self.geom_column.op('&&')(pg_poly) and \ func.intersects(self.geom_column, pg_poly)
def to_sql_expr(self): if self.type == self.BOX: geometry = self.__box_to_geometry() if self.type == self.WITHIN: geometry = Point(self.values['lon'], self.values['lat']) if self.type == self.GEOMETRY: factory = lambda ob: GeoJSON.to_instance(ob) geometry = loads(self.values['geometry'], object_hook=factory) geometry = asShape(geometry) if self.epsg != self.geom_column.type.srid: geom_column = func.transform(self.geom_column, self.epsg) else: geom_column = self.geom_column tolerance = self.values['tolerance'] pg_geometry = func.geomfromtext(geometry.wkt, self.epsg) return and_(func.expand(pg_geometry, tolerance).op('&&')(geom_column), func.distance(geom_column, pg_geometry) <= tolerance)
def __to_sql_expr_within(self): lon = self.values['lon'] lat = self.values['lat'] tolerance = self.values['tolerance'] epsg = self.geom_column.type.srid if self.epsg is not None: epsg = self.epsg point = Point(lon, lat) pg_point = func.pointfromtext(point.wkt, epsg) geom = self.geom_column if epsg != self.geom_column.type.srid: geom = func.transform(geom, epsg) # TODO : use st_dwithin when only Postgis 1.3 supported if tolerance is not None and tolerance > 0: e = func.expand(geom, tolerance).op('&&')(pg_point) and \ (func.distance(geom, pg_point) < tolerance) else: e = func.within(pg_point, geom) return e