コード例 #1
0
ファイル: ogr.py プロジェクト: Castronova/hydroshare2
    def get_2d_dataset(self, **kwargs):
        # TODO apply filtering.  Should start supporting CQL soon.
        layers, srs, bbox, width, height, styles, bgcolor, transparent, time, elevation, v, filter = [kwargs[k] if k in kwargs else None for k in ['layers', 'srs', 'bbox', 'width', 'height', 'styles', 'bgcolor', 'transparent', 'time', 'elevation', 'v', 'filter']]
        ds = self.dataset.Clone()
        minx,miny,maxx,maxy = bbox
        if filter is None:
            filter = {}

        if self.requires_time and not time:
            raise Exception("this service requires a time parameter")
        if self.requires_elevation and not elevation:
            raise Exception('this service requires an elevation')

        ss = None
        if type(self.styles) is dict:
            if not styles and 'default' in self.styles:
                ss = self.styles['default']
            elif styles:
                ss = self.styles[styles]
        else:
            ss = self.styles

        ctx = RenderingContext(ss, minx, miny, maxx, maxy, width, height)

        t_srs = osr.SpatialReference()
        t_srs.ImportFromEPSG(int(srs))
        l0 = self.dataset.GetLayer(0)
        s_srs = l0.GetSpatialRef()

        s_mins = Point(minx, miny, srid=t_srs.wkt)
        s_maxs = Point(maxx, maxy, srid=t_srs.wkt)
        s_mins.transform(s_srs.wkt)
        s_maxs.transform(s_srs.wkt)

        ls = {}
        crx = osr.CoordinateTransformation(s_srs, t_srs)

        def xform(f):
            f.SetGeometry(f.geometry().Transform(crx))

        for query_layer in layers:
            ls[query_layer] = ds.GetLayerByName(query_layer)
            ls[query_layer].ResetReading()
            ls[query_layer].SetSpatialFilterRect(s_mins.x, s_mins.y, s_maxs.x, s_maxs.y)

        for query_layer in layers:
            mysrs = self.nativesrs(query_layer)
            if mysrs == srs:
                ctx.render(ls[query_layer], lambda k: k[query_layer])
            else:
                ctx.render(ls[query_layer], lambda k: xform(k[query_layer]))

        return ctx.surface
コード例 #2
0
ファイル: wms.py プロジェクト: gijs/ga_ows
    def get_2d_dataset(self, bbox, width, height, query_layers, styles=None, **args):
        minx,miny,maxx,maxy = bbox
        if self.requires_time and 'time' not in args:
            raise Exception("this service requires a time parameter")
        if self.requires_elevation and 'elevation' not in args:
            raise Exception('this service requires an elevation')

        ss = None
        if type(self.styles) is dict:
            if not styles and 'default' in self.styles:
                ss = self.styles['default']
            elif styles:
                ss = self.styles[styles]
       
        ctx = RenderingContext(ss, minx, miny, maxx, maxy, width, height)
       
        default_srid=srid=self.cls.__dict__[query_layers[0]]._field.srid
        if 'srs' in args:
            if args['srs'].upper().startswith('EPSG'):
                srid = int(args['srs'][5:])
            else:
                srid = int(args['srs'])

        geom = GEOSGeometry('SRID={srid};POLYGON(({minx} {miny}, {maxx} {miny}, {maxx} {maxy}, {minx} {maxy}, {minx} {miny}))'.format(srid=srid,minx=minx,miny=miny,maxx=maxx,maxy=maxy))

        flt = dict([(query_layer + "__bboverlaps" , geom) for query_layer in query_layers])
        for k,v in args.items():
            if k[0] == '_':
                flt[k[1:]] = v
            if k == 'time':
                flt[self.time_property] = v
            if k == 'elevation':
                flt[self.elevation_property] = v

        for layer in query_layers:
            if default_srid != srid:
                ctx.render(self.cls.objects.transform(srid).filter(**flt), lambda k: k.__getattribute__(layer))
            else:
                ctx.render(self.cls.objects.filter(**flt), lambda k: k.__getattribute__(layer))

        return ctx.surface
コード例 #3
0
ファイル: ogr.py プロジェクト: kob-aha/hydroshare
    def get_2d_dataset(self, **kwargs):
        # TODO apply filtering.  Should start supporting CQL soon.
        layers, srs, bbox, width, height, styles, bgcolor, transparent, time, elevation, v, filter = [
            kwargs[k] if k in kwargs else None for k in [
                'layers', 'srs', 'bbox', 'width', 'height', 'styles',
                'bgcolor', 'transparent', 'time', 'elevation', 'v', 'filter'
            ]
        ]
        ds = self.dataset.Clone()
        minx, miny, maxx, maxy = bbox
        if filter is None:
            filter = {}

        if self.requires_time and not time:
            raise Exception("this service requires a time parameter")
        if self.requires_elevation and not elevation:
            raise Exception('this service requires an elevation')

        ss = None
        if type(self.styles) is dict:
            if not styles and 'default' in self.styles:
                ss = self.styles['default']
            elif styles:
                ss = self.styles[styles]
        else:
            ss = self.styles

        ctx = RenderingContext(ss, minx, miny, maxx, maxy, width, height)

        t_srs = osr.SpatialReference()
        t_srs.ImportFromEPSG(int(srs))
        l0 = self.dataset.GetLayer(0)
        s_srs = l0.GetSpatialRef()

        s_mins = Point(minx, miny, srid=t_srs.wkt)
        s_maxs = Point(maxx, maxy, srid=t_srs.wkt)
        s_mins.transform(s_srs.wkt)
        s_maxs.transform(s_srs.wkt)

        ls = {}
        crx = osr.CoordinateTransformation(s_srs, t_srs)

        def xform(f):
            f.SetGeometry(f.geometry().Transform(crx))

        for query_layer in layers:
            ls[query_layer] = ds.GetLayerByName(query_layer)
            ls[query_layer].ResetReading()
            ls[query_layer].SetSpatialFilterRect(s_mins.x, s_mins.y, s_maxs.x,
                                                 s_maxs.y)

        for query_layer in layers:
            mysrs = self.nativesrs(query_layer)
            if mysrs == srs:
                ctx.render(ls[query_layer], lambda k: k[query_layer])
            else:
                ctx.render(ls[query_layer], lambda k: xform(k[query_layer]))

        return ctx.surface
コード例 #4
0
ファイル: wms.py プロジェクト: jmwenda/ga_ows
    def get_2d_dataset(self, layers, srs, bbox, width, height, styles, bgcolor, transparent, time, elevation, v, filter):
        minx,miny,maxx,maxy = bbox
        if filter is None:
            filter = {}

        if self.requires_time and not time:
            raise Exception("this service requires a time parameter")
        if self.requires_elevation and not elevation:
            raise Exception('this service requires an elevation')

        ss = None
        required_fields = tuple()
        if type(self.styles) is dict:
            if not styles and 'default' in self.styles:
                ss = self.styles['default']
            elif styles:
                ss = self.styles[styles]
        else:
            ss = self.styles
            required_fields = ss.required_fields

        ctx = RenderingContext(ss, minx, miny, maxx, maxy, width, height)

        t_srs = djgdal.SpatialReference(srs)
        s_srs = djgdal.SpatialReference(self.nativesrs(layers[0]))

        s_mins = Point(minx, miny, srid=t_srs.wkt)
        s_maxs = Point(maxx, maxy, srid=t_srs.wkt)
        s_mins.transform(s_srs.wkt)
        s_maxs.transform(s_srs.wkt)

        geom = GEOSGeometry('POLYGON(({minx} {miny}, {maxx} {miny}, {maxx} {maxy}, {minx} {maxy}, {minx} {miny}))'.format(
            minx=s_mins.x,
            miny=s_mins.y,
            maxx=s_maxs.x,
            maxy=s_maxs.y
        ))

        for query_layer in layers:
            filter[query_layer + "__bboverlaps"] = geom


        def xform(g):
            if self.simplify:
                k = g.simplify((maxx-minx) / width)
                if k:
                    g = k
            g.transform(t_srs.wkt)
            return g

        for query_layer in layers:
            qs = self.cls.objects.filter(**filter)
            if required_fields:
                qs = qs.only(*required_fields).values(*required_fields)
            else:
                qs = qs.values()

            mysrs = self.nativesrs(query_layer)
            if mysrs == srs:
                ctx.render(qs, lambda k: k[query_layer])
            else:
                ctx.render(qs, lambda k: xform(k[query_layer]))

        return ctx.surface
コード例 #5
0
ファイル: wms.py プロジェクト: demiurg/ga_ows
    def get_2d_dataset(self, layers, srs, bbox, width, height, styles, bgcolor, transparent, time, elevation, v, filter):
        minx,miny,maxx,maxy = bbox
        if filter is None:
            filter = {}

        if self.requires_time and not time:
            raise Exception("this service requires a time parameter")
        if self.requires_elevation and not elevation:
            raise Exception('this service requires an elevation')

        ss = None
        required_fields = tuple()
        if type(self.styles) is dict:
            if not styles and 'default' in self.styles:
                ss = self.styles['default']
            elif styles:
                ss = self.styles[styles]
        else:
            ss = self.styles
            required_fields = ss.required_fields

        ctx = RenderingContext(ss, minx, miny, maxx, maxy, width, height)

        t_srs = djgdal.SpatialReference(srs)
        s_srs = djgdal.SpatialReference(self.nativesrs(layers[0]))

        s_mins = Point(minx, miny, srid=t_srs.wkt)
        s_maxs = Point(maxx, maxy, srid=t_srs.wkt)
        s_mins.transform(s_srs.wkt)
        s_maxs.transform(s_srs.wkt)

        geom = GEOSGeometry('POLYGON(({minx} {miny}, {maxx} {miny}, {maxx} {maxy}, {minx} {maxy}, {minx} {miny}))'.format(
            minx=s_mins.x,
            miny=s_mins.y,
            maxx=s_maxs.x,
            maxy=s_maxs.y
        ))

        for query_layer in layers:
            filter[query_layer + "__bboverlaps"] = geom


        def xform(g):
            if self.simplify:
                k = g.simplify((maxx-minx) / width)
                if k:
                    g = k
            g.transform(t_srs.wkt)
            return g

        for query_layer in layers:
            qs = self.cls.objects.filter(**filter)
            if required_fields:
                qs = qs.only(*required_fields).values(*required_fields)
            else:
                qs = qs.values()

            mysrs = self.nativesrs(query_layer)
            if mysrs == srs:
                ctx.render(qs, lambda k: k[query_layer])
            else:
                ctx.render(qs, lambda k: xform(k[query_layer]))

        return ctx.surface