def test_limited_unsupported(self):
     assert limit_srs_extents(
         {
             "EPSG:9999": DefaultMapExtent(),
             "EPSG:4326": MapExtent([0, 0, 10, 10], SRS(4326)),
         },
         ["EPSG:4326", "EPSG:3857"],
     ) == {"EPSG:4326": MapExtent([0, 0, 10, 10], SRS(4326))}
Exemple #2
0
 def test_limited_unsupported(self):
     eq_(
         limit_srs_extents(
             {
                 'EPSG:9999': DefaultMapExtent(),
                 'EPSG:4326': MapExtent([0, 0, 10, 10], SRS(4326))
             }, ['EPSG:4326', 'EPSG:3857']), {
                 'EPSG:4326': MapExtent([0, 0, 10, 10], SRS(4326)),
             })
Exemple #3
0
class TestMapExtent(object):
    def setup(self):
        self.extent = MapExtent([-10, 10, 80, 80], SRS(4326))
    
    def test_bbox(self):
        assert bbox_equals(self.extent.bbox, [-10, 10, 80, 80], 0.0001)
    
    def test_contains(self):
        assert self.extent.contains(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((15, 15, 79, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert not self.extent.contains(MapExtent((9, 9.99999999, 20, 20), SRS(4326)))
    
    def test_intersects(self):
        assert self.extent.intersects(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((15, 15, 80, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((-30, 10, -8, 70), SRS(4326)))
        assert not self.extent.intersects(MapExtent((-30, 10, -11, 70), SRS(4326)))
        
        assert not self.extent.intersects(MapExtent((0, 0, 1000, 1000), SRS(900913)))
        assert self.extent.intersects(MapExtent((0, 0, 1500000, 1500000), SRS(900913)))
    
    def test_eq(self):
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) == MapExtent([-10, 10, 80, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) == MapExtent([-10, 10.0, 80.0, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent([-10.1, 10.0, 80.0, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent([-10, 10.0, 80.0, 80], SRS(31467))
Exemple #4
0
class TestMapExtent(object):
    def setup(self):
        self.extent = MapExtent([-10, 10, 80, 80], SRS(4326))

    def test_bbox(self):
        assert bbox_equals(self.extent.bbox, [-10, 10, 80, 80], 0.0001)

    def test_contains(self):
        assert self.extent.contains(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((15, 15, 79, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert not self.extent.contains(
            MapExtent((9, 9.99999999, 20, 20), SRS(4326)))

    def test_intersects(self):
        assert self.extent.intersects(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((15, 15, 80, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((-30, 10, -8, 70), SRS(4326)))
        assert not self.extent.intersects(
            MapExtent((-30, 10, -11, 70), SRS(4326)))

        assert not self.extent.intersects(
            MapExtent((0, 0, 1000, 1000), SRS(900913)))
        assert self.extent.intersects(
            MapExtent((0, 0, 1500000, 1500000), SRS(900913)))

    def test_eq(self):
        assert MapExtent([-10, 10, 80, 80],
                         SRS(4326)) == MapExtent([-10, 10, 80, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80],
                         SRS(4326)) == MapExtent([-10, 10.0, 80.0, 80],
                                                 SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent(
            [-10.1, 10.0, 80.0, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent(
            [-10, 10.0, 80.0, 80], SRS(31467))

    def test_intersection(self):
        assert (DefaultMapExtent().intersection(
            MapExtent((0, 0, 10, 10), SRS(4326))) == MapExtent((0, 0, 10, 10),
                                                               SRS(4326)))

        assert (MapExtent(
            (0, 0, 10, 10),
            SRS(4326)).intersection(MapExtent((20, 20, 30, 30),
                                              SRS(4326))) == None)

        sub = MapExtent((0, 0, 10, 10), SRS(4326)).intersection(
            MapExtent((-1000, -1000, 100000, 100000), SRS(3857)))
        bbox = SRS(3857).transform_bbox_to(SRS(4326), (0, 0, 100000, 100000),
                                           0)
        assert bbox_equals(bbox, sub.bbox)
Exemple #5
0
    def __init__(self,
                 client,
                 image_opts=None,
                 coverage=None,
                 res_range=None,
                 transparent_color=None,
                 transparent_color_tolerance=None,
                 supported_srs=None,
                 supported_formats=None,
                 fwd_req_params=None):
        MapLayer.__init__(self, image_opts=image_opts)
        self.client = client
        self.supported_srs = supported_srs or []
        self.supported_formats = supported_formats or []
        self.fwd_req_params = fwd_req_params or set()

        self.transparent_color = transparent_color
        self.transparent_color_tolerance = transparent_color_tolerance
        if self.transparent_color:
            self.image_opts.transparent = True
        self.coverage = coverage
        self.res_range = res_range
        if self.coverage:
            self.extent = MapExtent(self.coverage.bbox, self.coverage.srs)
        else:
            self.extent = DefaultMapExtent()
Exemple #6
0
def display_grid(grid_conf, coverage=None):
    print '%s:' % (grid_conf.conf['name'], )
    print '    Configuration:'
    conf_dict = grid_conf.conf.copy()

    tile_grid = grid_conf.tile_grid()
    if 'tile_size' not in conf_dict:
        conf_dict['tile_size*'] = tile_grid.tile_size
    if 'bbox' not in conf_dict:
        conf_dict['bbox*'] = tile_grid.bbox
    if 'origin' not in conf_dict:
        conf_dict['origin*'] = tile_grid.origin or 'sw'
    area_ratio = None
    if coverage:
        bbox = conf_dict.get('bbox', tile_grid.bbox)
        area_ratio = grid_coverage_ratio(
            MapExtent(bbox, tile_grid.srs),
            MapExtent(coverage.bbox, coverage.srs))

    for key in sorted(conf_dict):
        if key == 'name':
            continue
        print '        %s: %s' % (key, format_conf_value(conf_dict[key]))
    if coverage:
        print '    Coverage: %s covers approx. %.4f%% of the grid BBOX' % (
            coverage.name, area_ratio * 100)
        print '    Levels: Resolutions, # x * y = total tiles (approx. tiles within coverage)'
    else:
        print '    Levels: Resolutions, # x * y = total tiles'
    max_digits = max([
        len("%r" % (res, )) for level, res in enumerate(tile_grid.resolutions)
    ])
    for level, res in enumerate(tile_grid.resolutions):
        tiles_in_x, tiles_in_y = tile_grid.grid_sizes[level]
        total_tiles = tiles_in_x * tiles_in_y
        spaces = max_digits - len("%r" % (res, )) + 1

        if coverage:
            coverage_tiles = total_tiles * area_ratio
            print "        %.2d:  %r,%s# %6d * %-6d = %8s (%s)" % (
                level, res, ' ' * spaces, tiles_in_x, tiles_in_y,
                human_readable_number(total_tiles),
                human_readable_number(coverage_tiles))
        else:
            print "        %.2d:  %r,%s# %6d * %-6d = %8s" % (
                level, res, ' ' * spaces, tiles_in_x, tiles_in_y,
                human_readable_number(total_tiles))
Exemple #7
0
 def test_eq(self):
     assert MapExtent([-10, 10, 80, 80],
                      SRS(4326)) == MapExtent([-10, 10, 80, 80], SRS(4326))
     assert MapExtent([-10, 10, 80, 80],
                      SRS(4326)) == MapExtent([-10, 10.0, 80.0, 80],
                                              SRS(4326))
     assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent(
         [-10.1, 10.0, 80.0, 80], SRS(4326))
     assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent(
         [-10, 10.0, 80.0, 80], SRS(31467))
Exemple #8
0
    def test_intersects(self):
        assert self.extent.intersects(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((15, 15, 80, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((-30, 10, -8, 70), SRS(4326)))
        assert not self.extent.intersects(MapExtent((-30, 10, -11, 70), SRS(4326)))

        assert not self.extent.intersects(MapExtent((0, 0, 1000, 1000), SRS(900913)))
        assert self.extent.intersects(MapExtent((0, 0, 1500000, 1500000), SRS(900913)))
Exemple #9
0
 def __init__(self, mapfile, layers=None, image_opts=None, coverage=None, res_range=None, lock=None):
     Source.__init__(self, image_opts=image_opts)
     self.mapfile = mapfile
     self.coverage = coverage
     self.res_range = res_range
     self.layers = set(layers) if layers else None
     self.lock = lock
     if self.coverage:
         self.extent = MapExtent(self.coverage.bbox, self.coverage.srs)
     else:
         self.extent = DefaultMapExtent()
Exemple #10
0
 def _get_map(self, query):
     format = self.image_opts.format
     if not format:
         format = query.format
     if self.supported_formats and format not in self.supported_formats:
         format = self.supported_formats[0]
     if self.supported_srs:
         if query.srs not in self.supported_srs:
             return self._get_transformed(query, format)
     if self.extent and not self.extent.contains(MapExtent(query.bbox, query.srs)):
         return self._get_sub_query(query, format)
     resp = self.client.retrieve(query, format)
     return ImageSource(resp, size=query.size, image_opts=self.image_opts)
Exemple #11
0
 def __init__(self, mapfile, layers=None, image_opts=None, coverage=None,
     res_range=None, lock=None, reuse_map_objects=False):
     MapLayer.__init__(self, image_opts=image_opts)
     self.mapfile = mapfile
     self.coverage = coverage
     self.res_range = res_range
     self.layers = set(layers) if layers else None
     self.lock = lock
     self._map_objs = {}
     self._map_objs_lock = threading.Lock()
     self._cache_map_obj = reuse_map_objects
     if self.coverage:
         self.extent = MapExtent(self.coverage.bbox, self.coverage.srs)
     else:
         self.extent = DefaultMapExtent()
Exemple #12
0
    def test_intersection(self):
        assert (DefaultMapExtent().intersection(MapExtent((0, 0, 10, 10), SRS(4326)))
            == MapExtent((0, 0, 10, 10), SRS(4326)))

        assert (MapExtent((0, 0, 10, 10), SRS(4326)).intersection(MapExtent((20, 20, 30, 30), SRS(4326)))
            == None)

        sub = MapExtent((0, 0, 10, 10), SRS(4326)).intersection(MapExtent((-1000, -1000, 100000, 100000), SRS(3857)))
        bbox = SRS(3857).transform_bbox_to(SRS(4326), (0, 0, 100000, 100000), 0)
        assert bbox_equals(bbox, sub.bbox)
Exemple #13
0
class TestMapExtent(object):
    def setup(self):
        self.extent = MapExtent([-10, 10, 80, 80], SRS(4326))

    def test_bbox(self):
        assert bbox_equals(self.extent.bbox, [-10, 10, 80, 80], 0.0001)

    def test_contains(self):
        assert self.extent.contains(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((15, 15, 79, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert not self.extent.contains(MapExtent((9, 9.99999999, 20, 20), SRS(4326)))

    def test_intersects(self):
        assert self.extent.intersects(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((15, 15, 80, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((-30, 10, -8, 70), SRS(4326)))
        assert not self.extent.intersects(MapExtent((-30, 10, -11, 70), SRS(4326)))

        assert not self.extent.intersects(MapExtent((0, 0, 1000, 1000), SRS(900913)))
        assert self.extent.intersects(MapExtent((0, 0, 1500000, 1500000), SRS(900913)))

    def test_eq(self):
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) == MapExtent([-10, 10, 80, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) == MapExtent([-10, 10.0, 80.0, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent([-10.1, 10.0, 80.0, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent([-10, 10.0, 80.0, 80], SRS(31467))

    def test_intersection(self):
        assert (DefaultMapExtent().intersection(MapExtent((0, 0, 10, 10), SRS(4326)))
            == MapExtent((0, 0, 10, 10), SRS(4326)))

        assert (MapExtent((0, 0, 10, 10), SRS(4326)).intersection(MapExtent((20, 20, 30, 30), SRS(4326)))
            == None)

        sub = MapExtent((0, 0, 10, 10), SRS(4326)).intersection(MapExtent((-1000, -1000, 100000, 100000), SRS(3857)))
        bbox = SRS(3857).transform_bbox_to(SRS(4326), (0, 0, 100000, 100000), 0)
        assert bbox_equals(bbox, sub.bbox)
Exemple #14
0
 def _get_map(self, query):
     format = self.image_opts.format
     if not format:
         format = query.format
     if self.supported_formats and format not in self.supported_formats:
         format = self.supported_formats[0]
     if self.supported_srs:
         if query.srs not in self.supported_srs:
             return self._get_transformed(query, format)
         # some srs are equal but not the same (e.g. 900913/3857)
         # use only supported srs so we use the right srs code.
         idx = self.supported_srs.index(query.srs)
         if self.supported_srs[idx] is not query.srs:
             query.srs = self.supported_srs[idx]
     if self.extent and not self.extent.contains(MapExtent(query.bbox, query.srs)):
         return self._get_sub_query(query, format)
     resp = self.client.retrieve(query, format)
     return ImageSource(resp, size=query.size, image_opts=self.image_opts)
Exemple #15
0
class TestMapExtent(object):
    def setup(self):
        self.extent = MapExtent([-10, 10, 80, 80], SRS(4326))

    def test_bbox(self):
        assert bbox_equals(self.extent.bbox, [-10, 10, 80, 80], 0.0001)

    def test_contains(self):
        assert self.extent.contains(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((15, 15, 79, 20), SRS(4326)))
        assert self.extent.contains(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert not self.extent.contains(
            MapExtent((9, 9.99999999, 20, 20), SRS(4326)))

    def test_intersects(self):
        assert self.extent.intersects(MapExtent((15, 15, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((15, 15, 80, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((9, 10, 20, 20), SRS(4326)))
        assert self.extent.intersects(MapExtent((-30, 10, -8, 70), SRS(4326)))
        assert not self.extent.intersects(
            MapExtent((-30, 10, -11, 70), SRS(4326)))

        assert not self.extent.intersects(
            MapExtent((0, 0, 1000, 1000), SRS(900913)))
        assert self.extent.intersects(
            MapExtent((0, 0, 1500000, 1500000), SRS(900913)))

    def test_eq(self):
        assert MapExtent([-10, 10, 80, 80],
                         SRS(4326)) == MapExtent([-10, 10, 80, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80],
                         SRS(4326)) == MapExtent([-10, 10.0, 80.0, 80],
                                                 SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent(
            [-10.1, 10.0, 80.0, 80], SRS(4326))
        assert MapExtent([-10, 10, 80, 80], SRS(4326)) != MapExtent(
            [-10, 10.0, 80.0, 80], SRS(31467))
Exemple #16
0
 def __init__(self,
              mapfile,
              layers=None,
              image_opts=None,
              coverage=None,
              res_range=None,
              lock=None,
              reuse_map_objects=None,
              scale_factor=None):
     MapLayer.__init__(self, image_opts=image_opts)
     self.mapfile = mapfile
     self.coverage = coverage
     self.res_range = res_range
     self.layers = set(layers) if layers else None
     self.scale_factor = scale_factor
     self.lock = lock
     self._map_holder = threading.local()
     self._map_holder.__dict__.setdefault('map', None)
     if self.coverage:
         self.extent = MapExtent(self.coverage.bbox, self.coverage.srs)
     else:
         self.extent = DefaultMapExtent()
     # initialize map object
     self.map_obj()
Exemple #17
0
    ResolutionConditional,
    SRSConditional,
)
from mapproxy.request.wms import WMS111MapRequest
from mapproxy.source import InvalidSourceQuery, SourceError
from mapproxy.source.tile import TiledSource
from mapproxy.source.wms import WMSSource
from mapproxy.source.error import HTTPSourceErrorHandler
from mapproxy.srs import SRS, SupportedSRS, PreferredSrcSRS
from mapproxy.test.http import assert_query_eq, wms_query_eq, query_eq, mock_httpd
from mapproxy.test.image import create_debug_img, is_png, tmp_image, create_tmp_image_buf
from mapproxy.util.coverage import BBOXCoverage


TEST_SERVER_ADDRESS = ('127.0.0.1', 56413)
GLOBAL_GEOGRAPHIC_EXTENT = MapExtent((-180, -90, 180, 90), SRS(4326))

tmp_lock_dir = None
def setup():
    global tmp_lock_dir
    tmp_lock_dir = tempfile.mkdtemp()

def teardown():
    shutil.rmtree(tmp_lock_dir)

class counting_set(object):
    def __init__(self, items):
        self.data = defaultdict(int)
        for item in items:
            self.data[item] += 1
    def add(self, item):
Exemple #18
0
 def __init__(self, coverage=None):
     MapLayer.__init__(self)
     self.extent = MapExtent((-180, -90, 180, 90), SRS(4326))
     self.extent = MapExtent(coverage.bbox, coverage.srs) if coverage else DefaultMapExtent()
Exemple #19
0
 def test_contains(self):
     assert self.extent.contains(MapExtent((15, 15, 20, 20), SRS(4326)))
     assert self.extent.contains(MapExtent((15, 15, 79, 20), SRS(4326)))
     assert self.extent.contains(MapExtent((9, 10, 20, 20), SRS(4326)))
     assert not self.extent.contains(
         MapExtent((9, 9.99999999, 20, 20), SRS(4326)))
Exemple #20
0
 def setup(self):
     self.extent = MapExtent([-10, 10, 80, 80], SRS(4326))
Exemple #21
0
 def __init__(self, coverage=None):
     Source.__init__(self)
     self.extent = MapExtent((-180, -90, 180, 90), SRS(4326))
     self.transparent = True
     self.extent = MapExtent(
         coverage.bbox, coverage.srs) if coverage else DefaultMapExtent()
Exemple #22
0
 def setup(self):
     self.extent = MapExtent([-10, 10, 80, 80], SRS(4326))
Exemple #23
0
    def map(self, map_request):
        self.check_map_request(map_request)

        params = map_request.params
        query = MapQuery(params.bbox, params.size, SRS(params.srs),
                         params.format)

        if map_request.params.get('tiled', 'false').lower() == 'true':
            query.tiled_only = True
        orig_query = query

        if self.srs_extents and params.srs in self.srs_extents:
            # limit query to srs_extent if query is larger
            query_extent = MapExtent(params.bbox, SRS(params.srs))
            if not self.srs_extents[params.srs].contains(query_extent):
                limited_extent = self.srs_extents[params.srs].intersection(
                    query_extent)
                if not limited_extent:
                    img_opts = self.image_formats[
                        params.format_mime_type].copy()
                    img_opts.bgcolor = params.bgcolor
                    img_opts.transparent = params.transparent
                    img = BlankImageSource(size=params.size,
                                           image_opts=img_opts,
                                           cacheable=True)
                    return Response(img.as_buffer(),
                                    content_type=img_opts.format.mime_type)
                sub_size, offset, sub_bbox = bbox_position_in_image(
                    params.bbox, params.size, limited_extent.bbox)
                query = MapQuery(sub_bbox, sub_size, SRS(params.srs),
                                 params.format)

        actual_layers = odict()
        for layer_name in map_request.params.layers:
            layer = self.layers[layer_name]
            # only add if layer renders the query
            if layer.renders_query(query):
                # if layer is not transparent and will be rendered,
                # remove already added (then hidden) layers
                if not layer.transparent:
                    actual_layers = odict()
                for layer_name, map_layers in layer.map_layers_for_query(
                        query):
                    actual_layers[layer_name] = map_layers

        authorized_layers, coverage = self.authorized_layers(
            'map',
            actual_layers.keys(),
            map_request.http.environ,
            query_extent=(query.srs.srs_code, query.bbox))

        self.filter_actual_layers(actual_layers, map_request.params.layers,
                                  authorized_layers)

        render_layers = []
        for layers in actual_layers.values():
            render_layers.extend(layers)

        self.update_query_with_fwd_params(query,
                                          params=params,
                                          layers=render_layers)

        raise_source_errors = True if self.on_error == 'raise' else False
        renderer = LayerRenderer(
            render_layers,
            query,
            map_request,
            raise_source_errors=raise_source_errors,
            concurrent_rendering=self.concurrent_layer_renderer)

        merger = LayerMerger()
        renderer.render(merger)

        if self.attribution and self.attribution.get(
                'text') and not query.tiled_only:
            merger.add(attribution_image(self.attribution['text'], query.size))
        img_opts = self.image_formats[params.format_mime_type].copy()
        img_opts.bgcolor = params.bgcolor
        img_opts.transparent = params.transparent
        result = merger.merge(size=query.size,
                              image_opts=img_opts,
                              bbox=query.bbox,
                              bbox_srs=params.srs,
                              coverage=coverage)

        if query != orig_query:
            result = SubImageSource(result,
                                    size=orig_query.size,
                                    offset=offset,
                                    image_opts=img_opts)

        # Provide the wrapping WSGI app or filter the opportunity to process the
        # image before it's wrapped up in a response
        result = self.decorate_img(result, 'wms.map', actual_layers.keys(),
                                   map_request.http.environ,
                                   (query.srs.srs_code, query.bbox))

        try:
            result_buf = result.as_buffer(img_opts)
        except IOError as ex:
            raise RequestError('error while processing image file: %s' % ex,
                               request=map_request)

        resp = Response(result_buf, content_type=img_opts.format.mime_type)

        if query.tiled_only and isinstance(result.cacheable, CacheInfo):
            cache_info = result.cacheable
            resp.cache_headers(cache_info.timestamp,
                               etag_data=(cache_info.timestamp,
                                          cache_info.size),
                               max_age=self.max_tile_age)
            resp.make_conditional(map_request.http)

        if not result.cacheable:
            resp.cache_headers(no_cache=True)

        return resp
Exemple #24
0
 def extent(self):
     from mapproxy.layer import MapExtent
     return MapExtent(self.bbox, self.srs)