{ "cells": [ { "cell_type": "markdown", "id": "e9045413", "metadata": {}, "source": [ "## Exploring Xarray-spatial Local Tools Functions" ] }, { "cell_type": "markdown", "id": "32b5e1bf", "metadata": {}, "source": [ "Local tools operate at the cell level, where values with the same position from a set of input rasters are used to calculate the values of the cells at the output raster.\n", "Some examples of the application of local tools are:\n", "- Change over time: You can use local tools to identify places where a value like land use or temperature changed over time.\n", "- Aggregate over time: You can use local tools to aggregate values over time, for example calculating the average rainfall or hours of sunshine for each cell.\n", "- Threshold over time: You can use local tools to identify places where a value is above or below a specified threshold, for example where the temperature was below a 0 °C.\n", "- Data aggregation: You can use local tools to calculate the [cost surface](http://wiki.gis.com/wiki/index.php/Cost_surface) of an area, summing up different types of cost over the same cell in different layers." ] }, { "cell_type": "markdown", "id": "ea55ffed", "metadata": {}, "source": [ "In this notebook, we'll demonstrate how to use the [Xarray-spatial](http://xarray-spatial.readthedocs.io/en/latest/index.html) local tools functions supported by [Numpy](https://numpy.org/). The spatial functions available are:\n", "- [Cell Statistics](#Cell-Statistics)\n", "- [Combine](#Combine)\n", "- [Lesser Frequency](#Lesser-Frequency)\n", "- [Equal Frequency](#Equal-Frequency)\n", "- [Greater Frequency](#Greater-Frequency)\n", "- [Lowest Position](#Lowest-Position)\n", "- [Highest Position](#Highest-Position)\n", "- [Popularity](#Popularity)\n", "- [Rank](#Rank)" ] }, { "cell_type": "markdown", "id": "b9c4ed8c", "metadata": {}, "source": [ "### Creating the sample data" ] }, { "cell_type": "markdown", "id": "af3c5207", "metadata": {}, "source": [ "In order to present the functions in a very simple and easy to understand way, we'll use 4x4 data arrays and create an `xarray.Dataset`." ] }, { "cell_type": "code", "execution_count": 1, "id": "c7945275", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import xarray as xr\n", "\n", "arr = xr.DataArray([[2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2]], name=\"arr\")\n", "\n", "arr1 = xr.DataArray(\n", " [[np.nan, 4, 2, 0], [2, 3, np.nan, 1], [5, 1, 2, 0], [1, 3, 2, np.nan]], name=\"arr1\"\n", ")\n", "\n", "arr2 = xr.DataArray(\n", " [[3, 1, 1, 2], [4, 1, 2, 5], [0, 0, 0, 0], [np.nan, 1, 1, 1]], name=\"arr2\"\n", ")\n", "\n", "arr3 = xr.DataArray(\n", " [[3, 3, 2, 0], [4, 1, 3, 1], [6, 1, 2, 2], [0, 0, 1, 1]], name=\"arr3\"\n", ")\n", "\n", "raster_ds = xr.merge([arr, arr1, arr2, arr3])" ] }, { "cell_type": "markdown", "id": "d12080a6", "metadata": {}, "source": [ "### Helping function" ] }, { "cell_type": "markdown", "id": "17d54999", "metadata": {}, "source": [ "This function will be used to plot the arrays for all the examples in this notebook." ] }, { "cell_type": "code", "execution_count": 2, "id": "9ce0bf94", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "\n", "def plot_arrays(arr_list, title_list):\n", " fig, ax = plt.subplots(nrows=1, ncols=len(arr_list), figsize=(15, 10))\n", "\n", " for idx, arr in zip(range(0, len(arr_list)), arr_list):\n", " for i in range(arr.shape[0]):\n", " for j in range(arr.shape[1]):\n", " ax[idx].text(\n", " j,\n", " i,\n", " int(arr.data[i, j]) if str(arr.data[i, j]) != \"nan\" else np.nan,\n", " ha=\"center\",\n", " va=\"center\",\n", " color=\"black\",\n", " )\n", "\n", " ax[idx].imshow(arr.values, cmap=\"tab20c_r\")\n", " ax[idx].set_xticks([])\n", " ax[idx].set_yticks([])\n", " ax[idx].set_title(title_list[idx])\n", "\n", " plt.show()" ] }, { "cell_type": "markdown", "id": "00300315", "metadata": {}, "source": [ "### Cell Statistics" ] }, { "cell_type": "markdown", "id": "01ab159c", "metadata": {}, "source": [ "[`xrspatial.local.cell_stats`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.cell_stats.html) calculates statistics from a raster dataset on a cell-by-cell basis." ] }, { "cell_type": "code", "execution_count": 3, "id": "86353494", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import cell_stats\n", "\n", "func_list = [\"max\", \"mean\", \"median\", \"min\", \"std\", \"sum\"]\n", "statistics = [\n", " cell_stats(raster=raster_ds[[\"arr1\", \"arr2\", \"arr3\"]], func=func)\n", " for func in func_list\n", "]\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " ],\n", " [\"arr1\", \"arr2\", \"arr3\"],\n", ")\n", "\n", "plot_arrays(statistics, func_list)" ] }, { "cell_type": "markdown", "id": "b8008262", "metadata": {}, "source": [ "### Combine" ] }, { "cell_type": "markdown", "id": "87c34a83", "metadata": {}, "source": [ "[`xrspatial.local.combine`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.combine.html) combines multiple arrays from a raster dataset, assigning a unique output value to each unique combination of raster values." ] }, { "cell_type": "code", "execution_count": 4, "id": "7f1b3bfa", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import combine\n", "\n", "result_arr = combine(raster=raster_ds[[\"arr1\", \"arr2\"]])\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " result_arr,\n", " ],\n", " [\"arr1\", \"arr2\", \"result\"],\n", ")" ] }, { "cell_type": "markdown", "id": "a32b70bd", "metadata": {}, "source": [ "### Lesser-Frequency" ] }, { "cell_type": "markdown", "id": "4f6da50e", "metadata": {}, "source": [ "[`xrspatial.local.lesser_frequency`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.lesser_frequency.html) calculates, given a raster dataset, the number of times the data variables values are lower than the values of a given reference data variable on a cell-by-cell basis." ] }, { "cell_type": "code", "execution_count": 5, "id": "b95f96c7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import lesser_frequency\n", "\n", "result_arr = lesser_frequency(raster=raster_ds, ref_var=\"arr\")\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr\"],\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " result_arr,\n", " ],\n", " [\"arr_ref\", \"arr1\", \"arr2\", \"arr3\", \"result\"],\n", ")" ] }, { "cell_type": "markdown", "id": "50d97b06", "metadata": {}, "source": [ "### Equal Frequency" ] }, { "cell_type": "markdown", "id": "intelligent-philadelphia", "metadata": {}, "source": [ "[`xrspatial.local.equal_frequency`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.equal_frequency.html) calculates, given a raster dataset, the number of times the data variables values are equal than the values of a given reference data variable on a cell-by-cell basis." ] }, { "cell_type": "code", "execution_count": 6, "id": "78a7824e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import equal_frequency\n", "\n", "result_arr = equal_frequency(raster=raster_ds, ref_var=\"arr\")\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr\"],\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " result_arr,\n", " ],\n", " [\"arr_ref\", \"arr1\", \"arr2\", \"arr3\", \"result\"],\n", ")" ] }, { "cell_type": "markdown", "id": "7c97b5fd", "metadata": {}, "source": [ "### Greater Frequency" ] }, { "cell_type": "markdown", "id": "vocational-inside", "metadata": {}, "source": [ "[`xrspatial.local.greater_frequency`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.greater_frequency.html) calculates, given a raster dataset, the number of times the data variables values are greater than the values of a given reference data variable on a cell-by-cell basis." ] }, { "cell_type": "code", "execution_count": 7, "id": "1c6ab615", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import greater_frequency\n", "\n", "result_arr = greater_frequency(raster=raster_ds, ref_var=\"arr\")\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr\"],\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " result_arr,\n", " ],\n", " [\"arr_ref\", \"arr1\", \"arr2\", \"arr3\", \"result\"],\n", ")" ] }, { "cell_type": "markdown", "id": "d197be65", "metadata": {}, "source": [ "### Lowest Position" ] }, { "cell_type": "markdown", "id": "8d7235ec", "metadata": {}, "source": [ "[`xrspatial.local.lowest_position`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.lowest_position.html) calculates the data variable index of the lowest value on a cell-by-cell basis." ] }, { "cell_type": "code", "execution_count": 8, "id": "b5b7b743", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import lowest_position\n", "\n", "result_arr = lowest_position(raster=raster_ds)\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " result_arr,\n", " ],\n", " [\"arr1\", \"arr2\", \"arr3\", \"result\"],\n", ")" ] }, { "cell_type": "markdown", "id": "839530ba", "metadata": {}, "source": [ "### Highest Position" ] }, { "cell_type": "markdown", "id": "a17c6e93", "metadata": {}, "source": [ "[`xrspatial.local.highest_position`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.highest_position.html) calculates the data variable index of the highest value on a cell-by-cell basis." ] }, { "cell_type": "code", "execution_count": 9, "id": "cf614920", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import highest_position\n", "\n", "result_arr = highest_position(raster=raster_ds)\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " result_arr,\n", " ],\n", " [\"arr1\", \"arr2\", \"arr3\", \"result\"],\n", ")" ] }, { "cell_type": "markdown", "id": "2168c7dd", "metadata": {}, "source": [ "### Popularity" ] }, { "cell_type": "markdown", "id": "e5408cea", "metadata": {}, "source": [ "[`xrspatial.local.popularity`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.popularity.html) calculates the number of occurrences of each value of a raster dataset, on a cell-by-cell basis. The output value is assigned based on the reference data variable nth most popular." ] }, { "cell_type": "code", "execution_count": 10, "id": "92d44cd2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import popularity\n", "\n", "\n", "result_arr = popularity(raster=raster_ds, ref_var=\"arr\")\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr\"],\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " result_arr,\n", " ],\n", " [\"arr_ref\", \"arr1\", \"arr2\", \"arr3\", \"result\"],\n", ")" ] }, { "cell_type": "markdown", "id": "6a823a72", "metadata": {}, "source": [ "### Rank" ] }, { "cell_type": "markdown", "id": "385dac65", "metadata": {}, "source": [ "[`xrspatial.local.rank`](https://xarray-spatial.readthedocs.io/en/latest/reference/_autosummary/xrspatial.local.rank.html) calculates the rank of each value of a raster dataset, on a cell-by-cell basis. The output value is assigned based on the rank of the reference data variable rank." ] }, { "cell_type": "code", "execution_count": 11, "id": "9d10ab75", "metadata": {}, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from xrspatial.local import rank\n", "\n", "result_arr = rank(raster=raster_ds, ref_var=\"arr\")\n", "\n", "plot_arrays(\n", " [\n", " raster_ds[\"arr\"],\n", " raster_ds[\"arr1\"],\n", " raster_ds[\"arr2\"],\n", " raster_ds[\"arr3\"],\n", " result_arr,\n", " ],\n", " [\"arr_ref\", \"arr1\", \"arr2\", \"arr3\", \"result\"],\n", ")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }