def read_singleband_geotrellis(self, options=None):
        if options is None:
            result = get(LayerType.SPATIAL, self.dir_path)
        else:
            result = get(LayerType.SPATIAL, self.dir_path, max_tile_size=256)

        return [tile[1] for tile in result.to_numpy_rdd().collect()]
Example #2
0
def test_s3_uri_type_and_credential_mismatch():
    local_path = file_path("all-ones.tif")

    with pytest.raises(RuntimeError):
        get(LayerType.SPATIAL,
            local_path,
            max_tile_size=256,
            s3_credentials=Credentials('123', 'abc'))
Example #3
0
class BaseTestClass(unittest.TestCase):
    if 'TRAVIS' in os.environ:
        master_str = "local[2]"
    else:
        master_str = "local[*]"

    conf = geopyspark_conf(master=master_str, appName="test")
    conf.set('spark.kryoserializer.buffer.max', value='1G')
    conf.set('spark.ui.enabled', True)

    if 'TRAVIS' in os.environ:
        conf.set(key='spark.driver.memory', value='1G')
        conf.set(key='spark.executor.memory', value='1G')

    pysc = SparkContext(conf=conf)

    dir_path = file_path("all-ones.tif")

    rdd = get(LayerType.SPATIAL, dir_path, max_tile_size=1024)
    value = rdd.to_numpy_rdd().collect()[0]

    projected_extent = value[0]
    extent = projected_extent.extent

    expected_tile = value[1].cells
    (_, rows, cols) = expected_tile.shape

    layout = TileLayout(1, 1, cols, rows)
    def read_multiband_geotrellis(self, opt=options):
        self.client.putObject(self.bucket, self.key, self.cells)
        result = get(LayerType.SPATIAL,
                     self.uri,
                     s3_client=opt['s3Client'],
                     max_tile_size=opt.get('maxTileSize'))

        return result
Example #5
0
class TiledRasterLayerTest(BaseTestClass):
    dir_path = file_path("all-ones.tif")
    result = get(LayerType.SPATIAL, dir_path)
    tiled_layer = result.tile_to_layout()

    @pytest.fixture(autouse=True)
    def tearDown(self):
        yield
        BaseTestClass.pysc._gateway.close()

    def test_tile_to_layout_layout_definition(self):
        layout_definition = self.tiled_layer.layer_metadata.layout_definition
        new_extent = Extent(layout_definition.extent.xmin,
                            layout_definition.extent.ymin,
                            layout_definition.extent.xmax + 15.0,
                            layout_definition.extent.ymax + 15.0)

        new_layout_definition = LayoutDefinition(
            extent=new_extent, tileLayout=layout_definition.tileLayout)

        actual = self.tiled_layer.tile_to_layout(
            new_layout_definition).layer_metadata.layout_definition.extent

        self.assertEqual(actual, new_extent)

    def test_tile_to_layout_tiled_layer(self):
        actual = self.tiled_layer.tile_to_layout(
            self.tiled_layer).layer_metadata
        expected = self.tiled_layer.layer_metadata

        self.assertDictEqual(actual.to_dict(), expected.to_dict())

    def test_tile_to_layout_global_layout(self):
        actual = self.tiled_layer.tile_to_layout(layout=GlobalLayout(zoom=5))

        self.assertEqual(actual.zoom_level, 5)

    def test_tile_to_layout_with_reproject(self):
        proj4 = crs_to_proj4(3857)
        actual = self.result.tile_to_layout(
            layout=GlobalLayout(), target_crs=proj4).layer_metadata.crs

        self.assertEqual(proj4, actual)

    def test_tile_to_layout_bad_crs(self):
        with pytest.raises(ValueError):
            self.result.tile_to_layout(layout=self.tiled_layer,
                                       target_crs=3857)
class PartitionPreservationTest(BaseTestClass):
    rdd = get(LayerType.SPATIAL,
              file_path("srtm_52_11.tif"),
              max_tile_size=6001)

    @pytest.fixture(autouse=True)
    def tearDown(self):
        yield
        BaseTestClass.pysc._gateway.close()

    def test_partition_preservation(self):
        partition_states = []
        strategy = SpatialPartitionStrategy(16)

        tiled = self.rdd.tile_to_layout()

        tiled2 = self.rdd.tile_to_layout(partition_strategy=strategy)
        partition_states.append(tiled2.get_partition_strategy())

        added_layer = (tiled + tiled2) * 0.75
        partition_states.append(added_layer.get_partition_strategy())

        local_max_layer = added_layer.local_max(tiled)
        partition_states.append(local_max_layer.get_partition_strategy())

        focal_layer = local_max_layer.focal(Operation.MAX, Square(1))
        partition_states.append(focal_layer.get_partition_strategy())

        reprojected_layer = focal_layer.tile_to_layout(
            layout=LocalLayout(), target_crs=3857, partition_strategy=strategy)
        partition_states.append(reprojected_layer.get_partition_strategy())

        pyramided = reprojected_layer.pyramid()
        partition_states.append(
            pyramided.levels[pyramided.max_zoom].get_partition_strategy())

        self.assertTrue(all(x == partition_states[0]
                            for x in partition_states))
class Multiband(BaseTestClass):
    dir_path = geotiff_test_path("all-ones.tif")
    result = get(LayerType.SPATIAL, dir_path, max_tile_size=256)

    @pytest.fixture(autouse=True)
    def tearDown(self):
        yield
        BaseTestClass.pysc._gateway.close()

    def test_to_numpy_rdd(self, option=None):
        pyrdd = self.result.to_numpy_rdd()
        (key, tile) = pyrdd.first()
        self.assertEqual(tile.cells.shape, (1, 256, 256))

    def test_collect_metadata(self, options=None):
        md = self.result.collect_metadata()
        self.assertTrue('+proj=longlat' in md.crs)
        self.assertTrue('+datum=WGS84' in md.crs)

    def test_reproject(self, options=None):
        tiles = self.result.reproject("EPSG:3857")
        md = tiles.collect_metadata()
        self.assertTrue('+proj=merc' in md.crs)

    def test_to_ud_ubyte(self):
        arr = np.array([[0.4324323432124, 0.0, 0.0], [1.0, 1.0, 1.0]],
                       dtype=float)

        epsg_code = 3857
        extent = Extent(0.0, 0.0, 10.0, 10.0)
        projected_extent = ProjectedExtent(extent, epsg_code)

        tile = Tile(arr, 'FLOAT', float('nan'))
        rdd = BaseTestClass.pysc.parallelize([(projected_extent, tile)])
        raster_rdd = RasterLayer.from_numpy_rdd(LayerType.SPATIAL, rdd)

        converted = raster_rdd.convert_data_type(CellType.UINT8,
                                                 no_data_value=-1)
        tile = converted.to_numpy_rdd().first()
        no_data = tile[1].no_data_value

        self.assertEqual(no_data, -1)

    def test_no_data_deserialization(self):
        arr = np.int16([[[-32768, -32768, -32768, -32768],
                         [-32768, -32768, -32768, -32768],
                         [-32768, -32768, -32768, -32768],
                         [-32768, -32768, -32768, -32768]]])

        epsg_code = 3857
        extent = Extent(0.0, 0.0, 10.0, 10.0)
        projected_extent = ProjectedExtent(extent, epsg_code)

        tile = Tile(arr, 'SHORT', -32768)
        rdd = BaseTestClass.pysc.parallelize([(projected_extent, tile)])
        raster_layer = RasterLayer.from_numpy_rdd(LayerType.SPATIAL, rdd)

        actual_tile = raster_layer.to_numpy_rdd().first()[1]

        self.assertEqual(actual_tile.cell_type, tile.cell_type)
        self.assertEqual(actual_tile.no_data_value, tile.no_data_value)
        self.assertTrue((actual_tile.cells == tile.cells).all())
Example #8
0
class CatalogTest(BaseTestClass):
    rdd = get(LayerType.SPATIAL, geotiff_test_path("srtm_52_11.tif"))

    metadata = rdd.collect_metadata()
    reprojected = rdd.tile_to_layout(layout=GlobalLayout(zoom=11),
                                     target_crs="EPSG:3857")
    result = reprojected.pyramid()

    dir_path = geotiff_test_path("catalog/")
    uri = "file://{}".format(dir_path)
    layer_name = "catalog-test"

    @pytest.fixture(autouse=True)
    def tearDown(self):
        yield
        BaseTestClass.pysc._gateway.close()

    def test_read(self):
        for x in range(11, 0, -1):
            actual_layer = query(self.uri, self.layer_name, x)
            expected_layer = self.result.levels[x]

            self.assertDictEqual(actual_layer.layer_metadata.to_dict(),
                                 expected_layer.layer_metadata.to_dict())

    def test_read_value(self):
        tiled = read_value(self.uri, self.layer_name, 11, 1450, 966)

        self.assertEqual(tiled.cells.shape, (1, 256, 256))

    def test_bad_read_value(self):
        tiled = read_value(self.uri, self.layer_name, 11, 1450, 2000)

        self.assertEqual(tiled, None)

    @pytest.mark.skipif('TRAVIS' in os.environ,
                        reason="test_query_1 causes issues on Travis")
    def test_query1(self):
        intersection = box(8348915.46680623, 543988.943201519, 8348915.4669,
                           543988.943201520)
        queried = query(self.uri, self.layer_name, 11, intersection)

        self.assertEqual(queried.to_numpy_rdd().first()[0],
                         SpatialKey(1450, 996))

    def test_query2(self):
        intersection = Extent(8348915.46680623, 543988.943201519, 8348915.4669,
                              543988.943201520)
        queried = query(self.uri,
                        self.layer_name,
                        11,
                        intersection,
                        query_proj=3857)

        self.assertEqual(queried.to_numpy_rdd().first()[0],
                         SpatialKey(1450, 996))

    def test_query3(self):
        intersection = box(8348915.46680623, 543988.943201519, 8348915.4669,
                           543988.943201520).wkb
        queried = query(self.uri, self.layer_name, 11, intersection)

        self.assertEqual(queried.to_numpy_rdd().first()[0],
                         SpatialKey(1450, 996))

    def test_query4(self):
        intersection = 42
        with pytest.raises(TypeError):
            queried = query(self.uri,
                            self.layer_name,
                            11,
                            query_geom=intersection,
                            num_partitions=2)
            result = queried.to_numpy_rdd().first()[0]

    def test_query_partitions(self):
        intersection = box(8348915.46680623, 543988.943201519, 8348915.4669,
                           543988.943201520)
        queried = query(self.uri,
                        self.layer_name,
                        11,
                        intersection,
                        num_partitions=2)

        self.assertEqual(queried.to_numpy_rdd().first()[0],
                         SpatialKey(1450, 996))

    def test_query_crs(self):
        intersection = box(8348915.46680623, 543988.943201519, 8348915.4669,
                           543988.943201520)
        queried = query(self.uri,
                        self.layer_name,
                        11,
                        intersection,
                        query_proj=3857)

        self.assertEqual(queried.to_numpy_rdd().first()[0],
                         SpatialKey(1450, 996))

    def test_read_metadata_exception(self):
        uri = "abcxyz://123"
        with pytest.raises(ValueError):
            layer = read_layer_metadata(uri, self.layer_name, 5)

    def test_read_metadata1(self):
        layer = query(self.uri, self.layer_name, 5)
        actual_metadata = layer.layer_metadata

        expected_metadata = read_layer_metadata(self.uri, self.layer_name, 5)

    def test_read_metadata2(self):
        layer = query(self.uri, self.layer_name, 5)
        actual_metadata = layer.layer_metadata

        expected_metadata = read_layer_metadata(self.uri, self.layer_name, 5)

        self.assertEqual(actual_metadata.to_dict(),
                         expected_metadata.to_dict())

    def test_layer_ids(self):
        ids = AttributeStore(self.uri).layers()
        self.assertTrue(len(ids) == 11)

    def test_attributestore(self):
        store = AttributeStore(self.uri)
        layer_name = "boop-epsg-bop"
        value = {"first": 113, "second": "44two"}
        store.layer(layer_name, 34).write("val", value)
        self.assertEqual(value, store.layer(layer_name, 34).read("val"))

        self.assertEqual(value, store.layer(layer_name, 34)["val"])
        store.layer(layer_name, 34).delete("val")
        with pytest.raises(KeyError):
            store.layer(layer_name, 34)["val"]
class ToGeoTiffTest(BaseTestClass):
    dir_path = file_path("all-ones.tif")
    rdd = get(LayerType.SPATIAL, dir_path, max_tile_size=1024)
    metadata = rdd.collect_metadata()

    mapped_types = {
        'int8': 'BYTE',
        'uint8': 'UBYTE',
        'int16': 'SHORT',
        'uint16': 'USHORT',
        'int32': 'INT',
        'float': 'FLOAT',
        'float32': 'FLOAT',
        'double': 'DOUBLE'
    }

    @pytest.fixture(autouse=True)
    def tearDown(self):
        yield
        BaseTestClass.pysc._gateway.close()

    def test_to_geotiff_rdd_rasterlayer(self):
        geotiff_rdd = self.rdd.to_geotiff_rdd(storage_method="Tiled",
                                              compression="DeflateCompression",
                                              color_space=0,
                                              head_tags={'INTERLEAVE': 'BAND'})

        geotiff_bytes = geotiff_rdd.first()[1]

        with tempfile.NamedTemporaryFile() as temp:
            temp.write(geotiff_bytes)
            temp_path = pathlib.Path(temp.name)

            with rasterio.open(str(temp_path)) as src:
                self.assertTrue(src.is_tiled)

                profile = src.profile

                self.assertEqual(profile['blockxsize'], 256)
                self.assertEqual(profile['blockysize'], 256)
                self.assertEqual(profile['interleave'], 'band')
                self.assertEqual(src.compression,
                                 rasterio.enums.Compression.deflate)

    def test_to_geotiff_rdd_tiledrasterlayer(self):
        tiled_rdd = self.rdd.tile_to_layout()
        tiled_collected = tiled_rdd.to_numpy_rdd().first()[1]

        geotiff_rdd = tiled_rdd.to_geotiff_rdd()
        geotiff_collected = geotiff_rdd.first()[1]

        def to_geotiff(x):
            with tempfile.NamedTemporaryFile() as temp:
                temp.write(x)
                temp_path = pathlib.Path(temp.name)

                with rasterio.open(str(temp_path)) as src:
                    self.assertFalse(src.is_tiled)
                    data = src.read()
                    return Tile(data, self.mapped_types[str(data.dtype)],
                                src.nodata)

        rasterio_geotiff = to_geotiff(geotiff_collected)

        self.assertTrue(
            (tiled_collected.cells == rasterio_geotiff.cells).all())
        self.assertEqual(tiled_collected.cell_type, rasterio_geotiff.cell_type)
        self.assertEqual(tiled_collected.no_data_value,
                         rasterio_geotiff.no_data_value)