def _get_transformed(self, query, format): dst_srs = query.srs src_srs = self._best_supported_srs(dst_srs) dst_bbox = query.bbox src_bbox = dst_srs.transform_bbox_to(src_srs, dst_bbox) src_width, src_height = src_bbox[2] - src_bbox[0], src_bbox[ 3] - src_bbox[1] ratio = src_width / src_height dst_size = query.size xres, yres = src_width / dst_size[0], src_height / dst_size[1] if xres < yres: src_size = dst_size[0], int(dst_size[0] / ratio + 0.5) else: src_size = int(dst_size[1] * ratio + 0.5), dst_size[1] src_query = MapQuery(src_bbox, src_size, src_srs, format, dimensions=query.dimensions) if self.coverage and not self.coverage.contains(src_bbox, src_srs): img = self._get_sub_query(src_query, format) else: resp = self.client.retrieve(src_query, format) img = ImageSource(resp, size=src_size, image_opts=self.image_opts) img = ImageTransformer(src_srs, dst_srs).transform(img, src_bbox, query.size, dst_bbox, self.image_opts) img.format = format return img
def test_perfect_match(self): bbox = (-10, -5, 30, 35) transformer = ImageTransformer(SRS(4326), SRS(4326)) result = transformer.transform( self.img, bbox, (100, 100), bbox, image_opts=None ) assert self.img == result
def test_transform(self, mesh_div=4): transformer = ImageTransformer(self.src_srs, self.dst_srs, mesh_div=mesh_div) result = transformer.transform(self.src_img, self.src_bbox, self.dst_size, self.dst_bbox, image_opts=ImageOptions(resampling='nearest')) assert isinstance(result, ImageSource) assert result.as_image() != self.src_img assert result.size == (100, 150)
def _test_compare_mesh_div(self): """ Create transformations with different div values. """ for div in [1, 2, 4, 6, 8, 12, 16]: transformer = ImageTransformer(self.src_srs, self.dst_srs, mesh_div=div) result = transformer.transform(self.src_img, self.src_bbox, self.dst_size, self.dst_bbox) result.as_image().save('/tmp/transform-%d.png' % (div,))
def test_simple_resize_nearest(self): bbox = (-10, -5, 30, 35) transformer = ImageTransformer(SRS(4326), SRS(4326)) result = transformer.transform(self.img, bbox, (200, 200), bbox, image_opts=ImageOptions(resampling='nearest')) img = result.as_image() eq_(img.size, (200, 200)) eq_(len(img.getcolors()), 2)
def test_simple_resize_bilinear(self): bbox = (-10, -5, 30, 35) transformer = ImageTransformer(SRS(4326), SRS(4326)) result = transformer.transform(self.img, bbox, (200, 200), bbox, image_opts=ImageOptions(resampling='bilinear')) img = result.as_image() eq_(img.size, (200, 200)) # some shades of grey with bilinear assert len(img.getcolors()) >= 4
def test_transform(self): transformer = ImageTransformer(self.src_srs, self.dst_srs) result = transformer.transform( self.src_img, self.src_bbox, self.dst_size, self.dst_bbox, image_opts=ImageOptions(resampling="nearest"), ) assert isinstance(result, ImageSource) assert result.as_image() != self.src_img.as_image() assert result.size == (100, 150)
def transform(self, req_bbox, req_srs, out_size, image_opts): """ Return the the tiles as one merged and transformed image. :param req_bbox: the bbox of the output image :param req_srs: the srs of the req_bbox :param out_size: the size in pixel of the output image :rtype: `ImageSource` """ transformer = ImageTransformer(self.src_srs, req_srs) src_img = self.image(image_opts) return transformer.transform(src_img, self.src_bbox, out_size, req_bbox, image_opts)
def _test_compare_max_px_err(self): """ Create transformations with different div values. """ for err in [0.2, 0.5, 1, 2, 4, 6, 8, 12, 16]: transformer = ImageTransformer(self.src_srs, self.dst_srs, max_px_err=err) result = transformer.transform( self.src_img, self.src_bbox, self.dst_size, self.dst_bbox, image_opts=ImageOptions(resampling="nearest"), ) result.as_image().save("/tmp/transform-%03d.png" % (err * 10,))
def test_simple_resize_nearest(self): bbox = (-10, -5, 30, 35) transformer = ImageTransformer(SRS(4326), SRS(4326)) result = transformer.transform( self.img, bbox, (200, 200), bbox, image_opts=ImageOptions(resampling="nearest"), ) img = result.as_image() assert img.size == (200, 200) assert len(img.getcolors()) == 2 img.close()