Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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