Skip to content

Proximity hot fix_issue44 #45

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
353 changes: 201 additions & 152 deletions examples/user-guide.ipynb

Large diffs are not rendered by default.

11 changes: 6 additions & 5 deletions xrspatial/proximity.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ def _proximity(img, x_coords, y_coords, target_values, distance_metric):

# ported from
# https://github.com/OSGeo/gdal/blob/master/gdal/alg/gdalproximity.cpp
def proximity(raster, target_values=[], distance_metric='EUCLIDEAN'):
def proximity(raster, x='x', y='y', target_values=[], distance_metric='EUCLIDEAN'):
"""Compute the proximity of all pixels in the image to a set of pixels in
the source image.

Expand All @@ -333,6 +333,7 @@ def proximity(raster, target_values=[], distance_metric='EUCLIDEAN'):
----------
raster: xarray.DataArray
Input raster image with shape=(height, width)
x, y: 'x' and 'y' coordinates
target_values: list
Target pixel values to measure the distance from. If this option is
not provided, proximity will be computed from non-zero pixel values.
Expand All @@ -349,10 +350,10 @@ def proximity(raster, target_values=[], distance_metric='EUCLIDEAN'):
"""

raster_dims = raster.dims
if raster_dims != ('y', 'x'):
if raster_dims != (y, x):
raise ValueError("In function proximity(). "
"raster.coords should be named as coordinates:"
"('y', 'x')")
"(%s, %s)".format(y, x))

# convert distance metric from string to integer, the correct type
# of argument for function _distance()
Expand All @@ -364,8 +365,8 @@ def proximity(raster, target_values=[], distance_metric='EUCLIDEAN'):
target_values = np.asarray(target_values).astype(np.uint8)

img = raster.values
y_coords = raster.coords['y'].values
x_coords = raster.coords['x'].values
y_coords = raster.coords[y].values
x_coords = raster.coords[x].values

proximity_img = _proximity(img, x_coords, y_coords, target_values,
distance_metric)
Expand Down
30 changes: 15 additions & 15 deletions xrspatial/tests/test_proximity.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@


df = pd.DataFrame({
'x': [-10, -10, -4, -4, 1, 3, 7, 7, 7],
'y': [-5, -10, -5, -5, 0, 5, 10, 10, 10]
'lat': [-10, -10, -4, -4, 1, 3, 7, 7, 7],
'lon': [-5, -10, -5, -5, 0, 5, 10, 10, 10]
})

cvs = ds.Canvas(plot_width=width,
plot_height=height,
x_range=(-20, 20),
y_range=(-20, 20))

raster = cvs.points(df, x='x', y='y')
raster = cvs.points(df, x='lat', y='lon')
raster_image = raster.values
nonzeros_raster = np.count_nonzero(raster_image)
zeros_raster = width * height - nonzeros_raster
Expand All @@ -33,7 +33,7 @@ def test_proximity_default():
# DEFAULT SETTINGS
# proximity(img, max_distance=None, target_values=[], dist_units=PIXEL,
# nodata=np.nan)
default_proximity = proximity(raster)
default_proximity = proximity(raster, x='lat', y='lon')
default_proximity_img = default_proximity.values
zeros_default = (default_proximity_img == 0).sum()

Expand All @@ -54,7 +54,7 @@ def test_proximity_target_value():
# TARGET VALUES SETTING
target_values = [2, 3]
num_target = (raster == 2).sum() + (raster == 3).sum()
tv_proximity = proximity(raster, target_values=target_values)
tv_proximity = proximity(raster, x='lat', y='lon', target_values=target_values)
tv_proximity_img = tv_proximity.values
tv_zeros = (tv_proximity_img == 0).sum()

Expand All @@ -71,7 +71,7 @@ def test_proximity_target_value():
def test_proximity_manhattan():

# distance_metric SETTING
dm_proximity = proximity(raster, distance_metric='MANHATTAN')
dm_proximity = proximity(raster, 'lat', 'lon', distance_metric='MANHATTAN')

# output must be an xarray DataArray
assert isinstance(dm_proximity, xa.DataArray)
Expand All @@ -80,18 +80,18 @@ def test_proximity_manhattan():
assert dm_proximity.values.shape[0] == height
assert dm_proximity.values.shape[1] == width
# all output values must be in range [0, max_possible_distance]
max_possible_distance = manhattan_distance(raster.coords['x'].values[0],
raster.coords['x'].values[-1],
raster.coords['y'].values[0],
raster.coords['y'].values[-1])
max_possible_distance = manhattan_distance(raster.coords['lat'].values[0],
raster.coords['lat'].values[-1],
raster.coords['lon'].values[0],
raster.coords['lon'].values[-1])
assert np.nanmax(dm_proximity.values) <= max_possible_distance
assert np.nanmin(dm_proximity.values) == 0


def test_proximity_great_circle():

# distance_metric SETTING
dm_proximity = proximity(raster, distance_metric='GREAT_CIRCLE')
dm_proximity = proximity(raster, 'lat', 'lon', distance_metric='GREAT_CIRCLE')

# output must be an xarray DataArray
assert isinstance(dm_proximity, xa.DataArray)
Expand All @@ -100,10 +100,10 @@ def test_proximity_great_circle():
assert dm_proximity.values.shape[0] == height
assert dm_proximity.values.shape[1] == width
# all output values must be in range [0, max_possible_distance]
max_possible_distance = great_circle_distance(raster.coords['x'].values[0],
raster.coords['x'].values[-1],
raster.coords['y'].values[0],
raster.coords['y'].values[-1])
max_possible_distance = great_circle_distance(raster.coords['lat'].values[0],
raster.coords['lat'].values[-1],
raster.coords['lon'].values[0],
raster.coords['lon'].values[-1])
assert np.nanmax(dm_proximity.values) <= max_possible_distance
assert np.nanmin(dm_proximity.values) == 0

Expand Down