geotiff
A noGDAL tool for reading geotiff files
Warning This package is under development and some features are unstable. Proceed with caution.
Please support this project be giving it a star on GitHub!
What is noGDAL?
noGDAL is a philosophy for developing geospatial programs in Python without using GDAL.
Installation
Installing this package is as easy as:
pip install geotiff
There is also an Anaconda-based package available, published on conda-forge:
conda install -c conda-forge python-geotiff
For local development from sources, you can install geotiff with its development requirements using:
git clone git@github.com:KipCrossing/geotiff.git
cd geotiff
pip install -e .[dev]
Usage
Making the GeoTiff object
from geotiff import GeoTiff
tiff_file = "path/to/tiff/file"
geo_tiff = GeoTiff(tiff_file)
This will detect the crs code. If it's 'user defined' and you know what it should be, you may supply a crs code:
geo_tiff = GeoTiff(tiff_file, crs_code=4326)
By default, the coordinates will be in WGS 84, however they can be specified by using the as_crs param:
geo_tiff = GeoTiff(tiff_file, as_crs=7844)
Or you can use the original crs by setting as_crs to None:
geo_tiff = GeoTiff(tiff_file, as_crs=None)
If the geotiff file has multiple bands, you can specify which band to use:
geo_tiff = GeoTiff(tiff_file, band=1)
The default band is 0
Get information (properties) about the geotiff:
# the original crs code
geo_tiff.crs_code
# the current crs code
geo_tiff.as_crs
# the shape of the tiff
geo_tiff.tif_shape
# the bounding box in the as_crs CRS
geo_tiff.tif_bBox
# the bounding box as WGS 84
geo_tiff.tif_bBox_wgs_84
# the bounding box in the as_crs converted coordinates
geo_tiff.tif_bBox_converted
Get coordinates of a point/pixel:
i=5
j=6
# in the as_crs coords
geo_tiff.get_coords(i, j)
# in WGS 84 coords
geo_tiff.get_wgs_84_coords(i, j)
Read the data
To read the data, use the .read() method. This will return a Zarr array as often geotiff files cannot fit into memory.
zarr_array = geo_tiff.read()
If you are confident that the data will fit into memory, you can convert it to a numpy array:
import numpy as np
array = np.array(zarr_array)
Read a section of a large tiff
In many cases, you are only interested in a section of the tiff. For convenience, you can use the .read_box() method. This will return a numpy array.
Warning This will fail if the box you are using is too large and the data cannot fit into memory.
from geotiff import GeoTiff
# in WGS 84
area_box = [(138.632071411, -32.447310785), (138.644218874, -32.456979174)]
geo_tiff = GeoTiff(tiff_file)
array = geo_tiff.read_box(area_box)
Note For the
area_box, use the same crs asas_crs.
In some cases, you may want some extra points/pixels around the outside of your area_box. This may be useful if you want to interpolate to points near the area_box boundary. To achieve this, use the outer_points param:
array = geo_tiff.read_box(area_box, outer_points=2)
This will get 2 extra perimeters of points around the outside of the the area_box.
Getting bounding box information
There are also some helper methods to get the bounding box of the resulting cut array:
# col and row indexes of the cut area
int_box = geo_tiff.get_int_box(area_box)
# lon and lat coords of the cut points/pixels
wgs_84_box = geo_tiff.get_bBox_wgs_84(area_box)
Again, you can also get bounding box for an extra n layers of points/pixels that directly surround the area_box:
# col and row indexes of the cut area
int_box = geo_tiff.get_int_box(area_box, outer_points = 2)
# lon and lat coords of the cut points/pixels
wgs_84_box = geo_tiff.get_bBox_wgs_84(area_box, outer_points = 2)
Get coordinates of a point/pixel
You may want to get the coordinates of a value in your array:
i=int_box[0][0] + 5
j=int_box[0][1] + 6
geo_tiff.get_wgs_84_coords(i, j)
Get coordinates of an array
You may want to simply get all the coordinates in the array:
array = geo_tiff.read_box(area_box, outer_points=2)
lon_array, lat_array = geo_tiff.get_coord_arrays(area_box, outer_points=2)
This will return two arrays that are in the same shape as the array from the read_box() method. The output coords will be in the as_crs crs.
If your tiff file is small and can fit into memory, simply:
lon_array, lat_array = geo_tiff.get_coord_arrays()
Contributing
If you would like to contribute to this project, please fork this repo and make a PR with your patches.
You can join the conversation by saying "hi" in the project discussion board.
To help users and other contributes, be sure to:
- Make docstrings and documentation blocks, if appropriate
- Use Python typing wherever possible
- Format your code with Black
Note The continuous integration has lint checking with mypy, so be sure to check it yourself before making a PR.
Project Road Map
Core Features
- read tiff files (including BigTiff)
- write tiff files (including BigTiff)
- convert between epsg coordinate systems
- read a user defined CRS
32767from tiff file - cut a section (bounding box) of the tiff file
- convert the data to numpy arrays
Additional features
- (50%) Full test coverage
- Typing with lint checking using mypy
- Formatted with black
- Documentation: doc blocs
- Documentation: readthedocs
Metadata
Release files for geotiff 0.2.10
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| geotiff-0.2.10.tar.gz | 2.2 MB | Without provenance | Details for geotiff-0.2.10.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| geotiff-0.2.10-py3-none-any.whl | Python 3 | none | any | Details for geotiff-0.2.10-py3-none-any.whl |
Total release size: 2.3 MB
Release files / geotiff-0.2.10.tar.gz
| Download URL | geotiff-0.2.10.tar.gz |
|---|---|
| Size | 2.2 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
36da356d3e2f6e3719bad32212283fe99049373391c7f576c2d6022642ad88d6
|
|
BLAKE2b-256 checksum How to use checksums |
ba6e00d51cd7ade2fd0e960722f090cd3bad0dbbc7206baf2871448a903e40f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/63.2.0 requests-toolbelt/0.9.1 tqdm/4.64.0 CPython/3.8.10
|
Release files / geotiff-0.2.10-py3-none-any.whl
| Download URL | geotiff-0.2.10-py3-none-any.whl |
|---|---|
| Size | 19.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1c238b1115884a82b0e8b462384828b1bfe2819194f9f16384f517d07ab12e68
|
|
BLAKE2b-256 checksum How to use checksums |
42451f3fd283de696f421f99dc04d23251dfd10204c098684c3267935118b1cc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/63.2.0 requests-toolbelt/0.9.1 tqdm/4.64.0 CPython/3.8.10
|
Security for geotiff 0.2.10
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.