Demo code... This simple sample code should give you some ideas. In this version, edge considerations are not accounted for, so should that be an issue, you can pad the array with an appropriate collar. <SPAN class="string token">""</SPAN>"
Script<SPAN class="punctuation token">:</SPAN> aggregate_demo<SPAN class="punctuation token">.</SPAN>py
Modified<SPAN class="punctuation token">:</SPAN> <SPAN class="number token">2016</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">01</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">30</SPAN>
Author<SPAN class="punctuation token">:</SPAN> Dan<SPAN class="punctuation token">.</SPAN>Patterson AT carleton<SPAN class="punctuation token">.</SPAN>ca
Purpose<SPAN class="punctuation token">:</SPAN> To demonstrate aggregation of raster data without the
spatial analyst extension<SPAN class="punctuation token">.</SPAN> A sample raster <SPAN class="keyword token">is</SPAN> created <SPAN class="operator token">and</SPAN> methods
to convert an array to a raster <SPAN class="operator token">and</SPAN> vice versa are shown<SPAN class="punctuation token">.</SPAN>
Notes<SPAN class="punctuation token">:</SPAN>
<SPAN class="operator token">-</SPAN> RasterToNumPyArray<SPAN class="punctuation token">(</SPAN>in_raster<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">{</SPAN>lower_left_corner<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">{</SPAN>ncols<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">{</SPAN>nrows<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">{</SPAN>nodata_to_value<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN>
arr <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>RasterToNumPyArray<SPAN class="punctuation token">(</SPAN>rast<SPAN class="punctuation token">)</SPAN>
<SPAN class="operator token">-</SPAN> NumPyArrayToRaster<SPAN class="punctuation token">(</SPAN>in_array<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">{</SPAN>lower_left_corner<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">{</SPAN>x_cell_size<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="punctuation token">{</SPAN>y_cell_size<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">{</SPAN>value_to_nodata<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN>
rast <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>NumPyArrayToRaster<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Point<SPAN class="punctuation token">(</SPAN><SPAN class="number token">300000</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">5025000</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN>
<SPAN class="number token">10</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">10</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="operator token">-</SPAN><SPAN class="number token">9999</SPAN><SPAN class="punctuation token">)</SPAN>
rast<SPAN class="punctuation token">.</SPAN>save<SPAN class="punctuation token">(</SPAN>r<SPAN class="string token">"F:\Demos\raster_ops\test_agg"</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># esri grid, or add tif, jpg etc</SPAN>
<SPAN class="string token">"""
import numpy as np
from numpy.lib.stride_tricks import as_strided
np.set_printoptions(edgeitems=3,linewidth=80,precision=2,
suppress=True,threshold=50)
from textwrap import dedent
import arcpy
arcpy.env.overwriteOutput = True
def block_a(a, block=(3,3)):
"""</SPAN>Provide a <SPAN class="number token">2D</SPAN> block view of a <SPAN class="number token">2D</SPAN> array<SPAN class="punctuation token">.</SPAN> No error checking made<SPAN class="punctuation token">.</SPAN>
Columns <SPAN class="operator token">and</SPAN> rows outside of the block are truncated<SPAN class="punctuation token">.</SPAN>
<SPAN class="string token">"""
a = np.ascontiguousarray(a)
r, c = block
shape = (a.shape[0]/r, a.shape[1]/c) + block
strides = (r*a.strides[0], c*a.strides[1]) + a.strides
b_a = as_strided(a, shape=shape, strides=strides)
return b_a
def agg_demo(n):
"""</SPAN>Run the demo <SPAN class="keyword token">with</SPAN> a preset array shape <SPAN class="operator token">and</SPAN> content<SPAN class="punctuation token">.</SPAN>
See the header<SPAN class="punctuation token">.</SPAN>
<SPAN class="string token">""</SPAN>"
a <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>random<SPAN class="punctuation token">.</SPAN>random_integers<SPAN class="punctuation token">(</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">,</SPAN>high<SPAN class="operator token">=</SPAN><SPAN class="number token">5</SPAN><SPAN class="punctuation token">,</SPAN>size<SPAN class="operator token">=</SPAN>n<SPAN class="operator token">*</SPAN>n<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>reshape<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>n<SPAN class="punctuation token">,</SPAN>n<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
rast <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>NumPyArrayToRaster<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN>x_cell_size<SPAN class="operator token">=</SPAN><SPAN class="number token">10</SPAN><SPAN class="punctuation token">)</SPAN>
agg_rast <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>sa<SPAN class="punctuation token">.</SPAN>Aggregate<SPAN class="punctuation token">(</SPAN>rast<SPAN class="punctuation token">,</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="string token">"MAXIMUM"</SPAN><SPAN class="punctuation token">)</SPAN>
agg_arr <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>RasterToNumPyArray<SPAN class="punctuation token">(</SPAN>agg_rast<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># --- a_s is the strided array, a_agg_max is the strided array max</SPAN>
a_s <SPAN class="operator token">=</SPAN> block_a<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> block<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
a_agg_max <SPAN class="operator token">=</SPAN> a_s<SPAN class="punctuation token">.</SPAN>max<SPAN class="punctuation token">(</SPAN>axis<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">,</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token"># ---</SPAN>
frmt <SPAN class="operator token">=</SPAN> <SPAN class="string token">"\nInput array..\n{}\n\n"</SPAN> \
<SPAN class="string token">"Arcpy.sa aggregate..\n{}\n\n"</SPAN> \
<SPAN class="string token">"Numpy aggregate..\n{}\n\n"</SPAN> \
<SPAN class="string token">"All close? {}"</SPAN>
yup <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>allclose<SPAN class="punctuation token">(</SPAN>agg_arr<SPAN class="punctuation token">,</SPAN>a_agg_max<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">print</SPAN><SPAN class="punctuation token">(</SPAN>dedent<SPAN class="punctuation token">(</SPAN>frmt<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> agg_arr<SPAN class="punctuation token">,</SPAN> a_agg_max<SPAN class="punctuation token">,</SPAN> yup<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> a<SPAN class="punctuation token">,</SPAN> agg_arr<SPAN class="punctuation token">,</SPAN> a_s<SPAN class="punctuation token">,</SPAN> a_agg_max
<SPAN class="keyword token">if</SPAN> __name__<SPAN class="operator token">==</SPAN><SPAN class="string token">"__main__"</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">""" Returns the input array, it's aggregation raster from
arcpy.sa, the raster representation of the raster and the
block representation and the aggregation array.
"""</SPAN>
n<SPAN class="operator token">=</SPAN><SPAN class="number token">10</SPAN>
a<SPAN class="punctuation token">,</SPAN> agg_arr<SPAN class="punctuation token">,</SPAN> a_s<SPAN class="punctuation token">,</SPAN> a_agg_max <SPAN class="operator token">=</SPAN> agg_demo<SPAN class="punctuation token">(</SPAN>n<SPAN class="punctuation token">)</SPAN>
<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN> | This is a sample ascii file so that you can see the numeric inputs and structure of the ascii header and its data. ncols <SPAN class="number token">10</SPAN>
nrows <SPAN class="number token">10</SPAN>
xllcorner <SPAN class="number token">300000</SPAN>
yllcorner <SPAN class="number token">5025000</SPAN>
cellsize <SPAN class="number token">10</SPAN>
NODATA_value <SPAN class="operator token">-</SPAN><SPAN class="number token">9999</SPAN>
<SPAN class="number token">0</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">0</SPAN>
<SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="number token">4</SPAN>
<SPAN class="number token">4</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">2</SPAN>
<SPAN class="number token">1</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">3</SPAN>
<SPAN class="number token">1</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN>
<SPAN class="number token">2</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">1</SPAN>
<SPAN class="number token">3</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN>
<SPAN class="number token">1</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN>
<SPAN class="number token">5</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">0</SPAN>
<SPAN class="number token">1</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">5</SPAN>
<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN> Does it work with big rasters? Does it support other summary statistics? Of course, I covered the details of raster statistics in an earlier post. |