Mask Troubleshooting#

This is a document that includes possible errors for the mask module and troubleshooting information.

No Affine Transformation#

If you run into this error when loading any tif file with the mask module:

CPLE_AppDefinedError: The transformation is already “north up” or a transformation between pixel/line and georeferenced coordinates cannot be computed There is no affine transformation and no GCPs. Specify transformation option SRC_METHOD=NO_GEOTRANSFORM to bypass this check.

Try the following code to examine the raster:

import rasterio
with rasterio.open("tests/data/RGB.byte.tif") as src:
     rasterio.plot.show(src)

<matplotlib.axes._subplots.AxesSubplot object at 0x...>

This will show the tif file with its coordinates. If you do not see appropriate latitude and longitude values on the axis, you might want to look for a tif file that has the valid coordinates information.

Object Attribute Property#

This is not important for its normal usage, but it may be helpful:

Although we have openning layers from direct input files in Rasterio, which only reads/opens/writes data on disk, sometimes we may have in-memory tif files in the layers attributes, and the product merged_mask and shape_mask are also in-memory temporary files. This is because we might create a new layer after automatic CRS conversion if we detect that the input file is not in latitude-longitude CRS, and in rasterio, a CRS conversion, merging-flattening, shapes on raster, cropping, and many other methods that make changes to the raster will requires creating a new file on disk, but we can avoid creating too many temporarily files and deleting them later by using memory files. Read more here: https://rasterio.readthedocs.io/en/latest/topics/memory-files.html

Saving the Mask#

Recall that if you want to save a mask called china, you will call the following method.

>>> china.save_mask()
INFO:geodata.mask:Mask China successfully saved at D:/Users/data/masks

Note that since “Mask has been saved”, we can now load the layers or shapes with xarray.

shape_xr_lst = china.load_shape_xr()
shape_xr_lst["Zhejiang"].plot()

Optional: closing all the files when saving the mask. This can avoid possible write permission error.

china.save_mask(close_files=True)

Loading a Previously Saved Mask#

>>> china_2 = geodata.mask.load_mask("china")
>>> china_2
Mask china:
7 layers: ['bins', 'forest', 'Jiangsu', 'modis_forest', 'Shanghai', 'slope', 'Zhejiang'] .
Merged_mask merged/flattened.
3 shape_mask: ['Jiangsu', 'Shanghai', 'Zhejiang'].
Mask has been saved.

Possible Errors to Avoid#

If you create another Mask object china_2 that opens the raster object which the china object also currently have access to, and then try to save the original china without using china_2.close_files(), you should expect an error because Python does not want you to rewrite a file that is used by another program. Therefore, china_2.close_files() or china_2.save_mask(close_files=True) make sure that only one mask is having access to the files. close_files() will close all the layers in china_2 and make that mask object un-savable. Therefore, it is best to avoid having multiple mask objects accessing the same files.