Skip to content

Commit

Permalink
Merge pull request #11 from nens/casper-elemwise-projection
Browse files Browse the repository at this point in the history
Fix projection and geo_transform attributes of raster.elemwise
  • Loading branch information
arjanverkerk committed Oct 21, 2019
2 parents dc8ce3c + b1c3f1e commit 8cc2b6f
Show file tree
Hide file tree
Showing 3 changed files with 106 additions and 5 deletions.
5 changes: 5 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ Changelog of dask-geomodeling
When taking the difference of a geometry with a missing geometry (A - None),
geopandas < 0.6 returned A as result, while >= 0.6 returns None as result.

- Fixed the projection attribute of elementwise raster blocks in case one of
the arguments is a number and not a Block instance.

- Implemented the geo_transform attribute of elementwise raster blocks.


2.0.3 (2019-10-08)
------------------
Expand Down
18 changes: 13 additions & 5 deletions dask_geomodeling/raster/elemwise.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import numpy as np

from dask_geomodeling.utils import get_dtype_max, get_index
from dask_geomodeling.utils import get_dtype_max, get_index, GeoTransform

from .base import RasterBlock, BaseSingle

Expand Down Expand Up @@ -147,7 +147,7 @@ def fillvalue(self):
def geometry(self):
"""Intersection of geometries in the projection of the first store
geometry. """
geometries = [x.geometry for x in self.args]
geometries = [x.geometry for x in self._sources]
if any(x is None for x in geometries):
return
if len(geometries) == 1:
Expand All @@ -166,17 +166,25 @@ def geometry(self):
@property
def projection(self):
"""Projection of the data if they match, else None"""
projection = self.args[0].projection
projection = self._sources[0].projection
if projection is None:
return
for arg in self.args[1:]:
for arg in self._sources[1:]:
if projection != arg.projection:
return
return projection

@property
def geo_transform(self):
return # TODO: Propagate geo_transform if the sources match
geo_transform = self._sources[0].geo_transform
if geo_transform is None:
return
geo_transform = GeoTransform(geo_transform)
for arg in self._sources[1:]:
other = arg.geo_transform
if other is None or not geo_transform.aligns_with(other):
return
return geo_transform


class BaseMath(BaseElementwise):
Expand Down
88 changes: 88 additions & 0 deletions dask_geomodeling/tests/test_raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,94 @@ def test_propagate_geometry_different_projection(self):
args[0].projection, get_epsg_or_wkt(geometry.GetSpatialReference())
)

def test_propagate_projection(self):
self.assertEqual(
self.klass(MockRaster(value=1, projection="EPSG:3857"), 1).projection,
"EPSG:3857",
)

self.assertEqual(
self.klass(1, MockRaster(value=1, projection="EPSG:3857")).projection,
"EPSG:3857",
)

self.assertEqual(
self.klass(
MockRaster(value=1, projection="EPSG:3857"),
MockRaster(value=2, projection="EPSG:3857"),
).projection,
"EPSG:3857",
)

self.assertIsNone(
self.klass(
MockRaster(value=1, projection="EPSG:3857"),
MockRaster(value=2, projection="EPSG:4326"),
).projection
)

self.assertIsNone(
self.klass(
MockRaster(value=1, projection="EPSG:3857"),
MockRaster(value=2, projection=None),
).projection
)

self.assertIsNone(
self.klass(
MockRaster(value=1, projection=None),
MockRaster(value=2, projection=None),
).projection
)

def test_propagate_geo_transform(self):
# single geo-transform propagates
self.assertTupleEqual(
self.klass(
MockRasterWithGeotransform(geo_transform=(0, 1, 0, 1, 0, -1)), 1
).geo_transform,
(0, 1, 0, 1, 0, -1),
)

self.assertTupleEqual(
self.klass(
1, MockRasterWithGeotransform(geo_transform=(0, 1, 0, 1, 0, -1))
).geo_transform,
(0, 1, 0, 1, 0, -1),
)

# matching geotransform propagates
self.assertTupleEqual(
self.klass(
MockRasterWithGeotransform(geo_transform=(0, 1, 0, 1, 0, -1)),
MockRasterWithGeotransform(geo_transform=(5, 1, 0, -8, 0, -1)),
).geo_transform,
(0, 1, 0, 1, 0, -1),
)

# non-matching results in None
self.assertIsNone(
self.klass(
MockRasterWithGeotransform(geo_transform=(0, 1, 0, 1, 0, -1)),
MockRasterWithGeotransform(geo_transform=(0, 2, 0, 1, 0, -2)),
).geo_transform
)

# check None propagation
self.assertIsNone(
self.klass(
MockRasterWithGeotransform(geo_transform=None),
MockRasterWithGeotransform(geo_transform=(0, 1, 0, 1, 0, -1)),
).geo_transform
)

self.assertIsNone(
self.klass(
MockRasterWithGeotransform(geo_transform=(0, 1, 0, 1, 0, -1)),
MockRasterWithGeotransform(geo_transform=None),
).geo_transform
)


class TestMath(unittest.TestCase):
klass = raster.elemwise.BaseMath
Expand Down

0 comments on commit 8cc2b6f

Please sign in to comment.