diff options
Diffstat (limited to 'python-aiocogeo.spec')
-rw-r--r-- | python-aiocogeo.spec | 598 |
1 files changed, 598 insertions, 0 deletions
diff --git a/python-aiocogeo.spec b/python-aiocogeo.spec new file mode 100644 index 0000000..18b63fa --- /dev/null +++ b/python-aiocogeo.spec @@ -0,0 +1,598 @@ +%global _empty_manifest_terminate_build 0 +Name: python-aiocogeo +Version: 0.3.0 +Release: 1 +Summary: Asynchronous cogeotiff reader +License: mit +URL: https://github.com/geospatial-jeff/aiocogeo +Source0: https://mirrors.aliyun.com/pypi/web/packages/d7/a9/57bb107272c09dd275332e83076523e9d6bcf8d5d182f30affd37714af6e/aiocogeo-0.3.0.tar.gz +BuildArch: noarch + +Requires: python3-aiofiles +Requires: python3-aiohttp +Requires: python3-aiocache +Requires: python3-affine +Requires: python3-imagecodecs +Requires: python3-typer +Requires: python3-Pillow +Requires: python3-stac-pydantic +Requires: python3-geojson-pydantic +Requires: python3-xmltodict +Requires: python3-mercantile +Requires: python3-morecantile +Requires: python3-rasterio +Requires: python3-rio-tiler +Requires: python3-pytest +Requires: python3-pytest-asyncio +Requires: python3-pytest-cov +Requires: python3-shapely +Requires: python3-botocore +Requires: python3-boto3 +Requires: python3-aioboto3 +Requires: python3-aioboto3 + +%description +# aiocogeo [](https://circleci.com/gh/geospatial-jeff/aiocogeo/tree/master)[](https://codecov.io/gh/geospatial-jeff/aiocogeo) + +## Installation +``` +pip install aiocogeo + +# With S3 filesystem +pip install aiocogeo[s3] +``` + +## Usage +COGs are opened using the `COGReader` asynchronous context manager: + +```python +from aiocogeo import COGReader + +async with COGReader("http://cog.tif") as cog: + ... +``` + +Several filesystems are supported: +- **HTTP/HTTPS** (`http://`, `https://`) +- **S3** (`s3://`) +- **File** (`/`) + +### Metadata +Generating a [rasterio-style profile](https://rasterio.readthedocs.io/en/latest/topics/profiles.html) for the COG: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + print(cog.profile) + +>>> {'driver': 'GTiff', 'width': 10280, 'height': 12190, 'count': 3, 'dtype': 'uint8', 'transform': Affine(0.6, 0.0, 367188.0, + 0.0, -0.6, 3777102.0), 'blockxsize': 512, 'blockysize': 512, 'compress': 'lzw', 'interleave': 'pixel', 'crs': 'EPSG:26911', 'tiled': True, 'photometric': 'rgb'} +``` + +#### Lower Level Metadata +A COG is composed of several IFDs, each with many TIFF tags: + +```python +from aiocogeo.ifd import IFD +from aiocogeo.tag import Tag + +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + for ifd in cog: + assert isinstance(ifd, IFD) + for tag in ifd: + assert isinstance(tag, Tag) +``` + +Each IFD contains more granular metadata about the image than what is included in the profile. For example, finding the +tilesize for each IFD: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + for ifd in cog: + print(ifd.TileWidth.value, ifd.TileHeight.value) + +>>> 512 512 + 128 128 + 128 128 + 128 128 + 128 128 + 128 128 +``` + +More advanced use cases may need access to tag-level metadata: +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + first_ifd = cog.ifds[0] + assert first_ifd.tag_count == 24 + + for tag in first_ifd: + print(tag) + +>>> Tag(code=258, name='BitsPerSample', tag_type=TagType(format='H', size=2), count=3, length=6, value=(8, 8, 8)) + Tag(code=259, name='Compression', tag_type=TagType(format='H', size=2), count=1, length=2, value=5) + Tag(code=257, name='ImageHeight', tag_type=TagType(format='H', size=2), count=1, length=2, value=12190) + Tag(code=256, name='ImageWidth', tag_type=TagType(format='H', size=2), count=1, length=2, value=10280) + ... +``` + +### Image Data +The reader also has methods for reading internal image tiles and performing partial reads. Currently only jpeg, lzw, deflate, packbits, and webp compressions are supported. + +#### Image Tiles +Reading the top left tile of an image at native resolution: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/webp_cog.tif") as cog: + x = y = z = 0 + tile = await cog.get_tile(x, y, z) + + ifd = cog.ifds[z] + assert tile.shape == (ifd.bands, ifd.TileHeight.value, ifd.TileWidth.value) +``` + +<p align="center"> + <img width="300" height="300" src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/naip_top_left_tile.jpg"> +</p> + + +#### Partial Read +You can read a portion of the image by specifying a bounding box in the native crs of the image and an output shape: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/webp_cog.tif") as cog: + assert cog.epsg == 26911 + partial_data = await cog.read(bounds=(368461,3770591,368796,3770921), shape=(512,512)) +``` + +<p align="center"> + <img width="300" height="300" src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/partial_read.jpeg"> +</p> + +#### Internal Masks +If the COG has an internal mask, the returned array will be a masked array: + +```python +import numpy as np + +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/naip_image_masked.tif") as cog: + assert cog.is_masked + + tile = await cog.get_tile(0,0,0) + assert np.ma.is_masked(tile) +``` + +<p align="center"> + <img src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/masked_tile.jpg" width="300" /> + <img src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/mask.jpg" width="300" /> +</p> + +### Configuration +Configuration options are exposed through environment variables: +- **INGESTED_BYTES_AT_OPEN** - defines the number of bytes in the first GET request at file opening (defaults to 16KB) +- **HEADER_CHUNK_SIZE** - chunk size used to read header (defaults to 16KB) +- **ENABLE_BLOCK_CACHE** - determines if image blocks are cached in memory (defaults to TRUE) +- **ENABLE_HEADER_CACHE** - determines if COG headers are cached in memory (defaults to TRUE) +- **HTTP_MERGE_CONSECUTIVE_RANGES** - determines if consecutive ranges are merged into a single request (defaults to FALSE) +- **BOUNDLESS_READ** - determines if internal tiles outside the bounds of the IFD are read (defaults to TRUE) +- **BOUNDLESS_READ_FILL_VALUE** - determines the value used to fill boundless reads (defaults to 0) +- **LOG_LEVEL** - determines the log level used by the package (defaults to ERROR) +- **VERBOSE_LOGS** - enables verbose logging, designed for use when `LOG_LEVEL=DEBUG` (defaults to FALSE) +- **AWS_REQUEST_PAYER** - set to `requester` to enable reading from S3 RequesterPays buckets. + +Refer to [`aiocogeo/config.py`](https://github.com/geospatial-jeff/aiocogeo/blob/master/aiocogeo/config.py) for more details about configuration options. + +## CLI +``` +$ aiocogeo --help +Usage: aiocogeo [OPTIONS] COMMAND [ARGS]... + +Options: + --install-completion [bash|zsh|fish|powershell|pwsh] + Install completion for the specified shell. + --show-completion [bash|zsh|fish|powershell|pwsh] + Show completion for the specified shell, to + copy it or customize the installation. + + --help Show this message and exit. + +Commands: + create-tms Create OGC TileMatrixSet. + info Read COG metadata. + +``` + + + +%package -n python3-aiocogeo +Summary: Asynchronous cogeotiff reader +Provides: python-aiocogeo +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-aiocogeo +# aiocogeo [](https://circleci.com/gh/geospatial-jeff/aiocogeo/tree/master)[](https://codecov.io/gh/geospatial-jeff/aiocogeo) + +## Installation +``` +pip install aiocogeo + +# With S3 filesystem +pip install aiocogeo[s3] +``` + +## Usage +COGs are opened using the `COGReader` asynchronous context manager: + +```python +from aiocogeo import COGReader + +async with COGReader("http://cog.tif") as cog: + ... +``` + +Several filesystems are supported: +- **HTTP/HTTPS** (`http://`, `https://`) +- **S3** (`s3://`) +- **File** (`/`) + +### Metadata +Generating a [rasterio-style profile](https://rasterio.readthedocs.io/en/latest/topics/profiles.html) for the COG: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + print(cog.profile) + +>>> {'driver': 'GTiff', 'width': 10280, 'height': 12190, 'count': 3, 'dtype': 'uint8', 'transform': Affine(0.6, 0.0, 367188.0, + 0.0, -0.6, 3777102.0), 'blockxsize': 512, 'blockysize': 512, 'compress': 'lzw', 'interleave': 'pixel', 'crs': 'EPSG:26911', 'tiled': True, 'photometric': 'rgb'} +``` + +#### Lower Level Metadata +A COG is composed of several IFDs, each with many TIFF tags: + +```python +from aiocogeo.ifd import IFD +from aiocogeo.tag import Tag + +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + for ifd in cog: + assert isinstance(ifd, IFD) + for tag in ifd: + assert isinstance(tag, Tag) +``` + +Each IFD contains more granular metadata about the image than what is included in the profile. For example, finding the +tilesize for each IFD: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + for ifd in cog: + print(ifd.TileWidth.value, ifd.TileHeight.value) + +>>> 512 512 + 128 128 + 128 128 + 128 128 + 128 128 + 128 128 +``` + +More advanced use cases may need access to tag-level metadata: +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + first_ifd = cog.ifds[0] + assert first_ifd.tag_count == 24 + + for tag in first_ifd: + print(tag) + +>>> Tag(code=258, name='BitsPerSample', tag_type=TagType(format='H', size=2), count=3, length=6, value=(8, 8, 8)) + Tag(code=259, name='Compression', tag_type=TagType(format='H', size=2), count=1, length=2, value=5) + Tag(code=257, name='ImageHeight', tag_type=TagType(format='H', size=2), count=1, length=2, value=12190) + Tag(code=256, name='ImageWidth', tag_type=TagType(format='H', size=2), count=1, length=2, value=10280) + ... +``` + +### Image Data +The reader also has methods for reading internal image tiles and performing partial reads. Currently only jpeg, lzw, deflate, packbits, and webp compressions are supported. + +#### Image Tiles +Reading the top left tile of an image at native resolution: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/webp_cog.tif") as cog: + x = y = z = 0 + tile = await cog.get_tile(x, y, z) + + ifd = cog.ifds[z] + assert tile.shape == (ifd.bands, ifd.TileHeight.value, ifd.TileWidth.value) +``` + +<p align="center"> + <img width="300" height="300" src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/naip_top_left_tile.jpg"> +</p> + + +#### Partial Read +You can read a portion of the image by specifying a bounding box in the native crs of the image and an output shape: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/webp_cog.tif") as cog: + assert cog.epsg == 26911 + partial_data = await cog.read(bounds=(368461,3770591,368796,3770921), shape=(512,512)) +``` + +<p align="center"> + <img width="300" height="300" src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/partial_read.jpeg"> +</p> + +#### Internal Masks +If the COG has an internal mask, the returned array will be a masked array: + +```python +import numpy as np + +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/naip_image_masked.tif") as cog: + assert cog.is_masked + + tile = await cog.get_tile(0,0,0) + assert np.ma.is_masked(tile) +``` + +<p align="center"> + <img src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/masked_tile.jpg" width="300" /> + <img src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/mask.jpg" width="300" /> +</p> + +### Configuration +Configuration options are exposed through environment variables: +- **INGESTED_BYTES_AT_OPEN** - defines the number of bytes in the first GET request at file opening (defaults to 16KB) +- **HEADER_CHUNK_SIZE** - chunk size used to read header (defaults to 16KB) +- **ENABLE_BLOCK_CACHE** - determines if image blocks are cached in memory (defaults to TRUE) +- **ENABLE_HEADER_CACHE** - determines if COG headers are cached in memory (defaults to TRUE) +- **HTTP_MERGE_CONSECUTIVE_RANGES** - determines if consecutive ranges are merged into a single request (defaults to FALSE) +- **BOUNDLESS_READ** - determines if internal tiles outside the bounds of the IFD are read (defaults to TRUE) +- **BOUNDLESS_READ_FILL_VALUE** - determines the value used to fill boundless reads (defaults to 0) +- **LOG_LEVEL** - determines the log level used by the package (defaults to ERROR) +- **VERBOSE_LOGS** - enables verbose logging, designed for use when `LOG_LEVEL=DEBUG` (defaults to FALSE) +- **AWS_REQUEST_PAYER** - set to `requester` to enable reading from S3 RequesterPays buckets. + +Refer to [`aiocogeo/config.py`](https://github.com/geospatial-jeff/aiocogeo/blob/master/aiocogeo/config.py) for more details about configuration options. + +## CLI +``` +$ aiocogeo --help +Usage: aiocogeo [OPTIONS] COMMAND [ARGS]... + +Options: + --install-completion [bash|zsh|fish|powershell|pwsh] + Install completion for the specified shell. + --show-completion [bash|zsh|fish|powershell|pwsh] + Show completion for the specified shell, to + copy it or customize the installation. + + --help Show this message and exit. + +Commands: + create-tms Create OGC TileMatrixSet. + info Read COG metadata. + +``` + + + +%package help +Summary: Development documents and examples for aiocogeo +Provides: python3-aiocogeo-doc +%description help +# aiocogeo [](https://circleci.com/gh/geospatial-jeff/aiocogeo/tree/master)[](https://codecov.io/gh/geospatial-jeff/aiocogeo) + +## Installation +``` +pip install aiocogeo + +# With S3 filesystem +pip install aiocogeo[s3] +``` + +## Usage +COGs are opened using the `COGReader` asynchronous context manager: + +```python +from aiocogeo import COGReader + +async with COGReader("http://cog.tif") as cog: + ... +``` + +Several filesystems are supported: +- **HTTP/HTTPS** (`http://`, `https://`) +- **S3** (`s3://`) +- **File** (`/`) + +### Metadata +Generating a [rasterio-style profile](https://rasterio.readthedocs.io/en/latest/topics/profiles.html) for the COG: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + print(cog.profile) + +>>> {'driver': 'GTiff', 'width': 10280, 'height': 12190, 'count': 3, 'dtype': 'uint8', 'transform': Affine(0.6, 0.0, 367188.0, + 0.0, -0.6, 3777102.0), 'blockxsize': 512, 'blockysize': 512, 'compress': 'lzw', 'interleave': 'pixel', 'crs': 'EPSG:26911', 'tiled': True, 'photometric': 'rgb'} +``` + +#### Lower Level Metadata +A COG is composed of several IFDs, each with many TIFF tags: + +```python +from aiocogeo.ifd import IFD +from aiocogeo.tag import Tag + +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + for ifd in cog: + assert isinstance(ifd, IFD) + for tag in ifd: + assert isinstance(tag, Tag) +``` + +Each IFD contains more granular metadata about the image than what is included in the profile. For example, finding the +tilesize for each IFD: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + for ifd in cog: + print(ifd.TileWidth.value, ifd.TileHeight.value) + +>>> 512 512 + 128 128 + 128 128 + 128 128 + 128 128 + 128 128 +``` + +More advanced use cases may need access to tag-level metadata: +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: + first_ifd = cog.ifds[0] + assert first_ifd.tag_count == 24 + + for tag in first_ifd: + print(tag) + +>>> Tag(code=258, name='BitsPerSample', tag_type=TagType(format='H', size=2), count=3, length=6, value=(8, 8, 8)) + Tag(code=259, name='Compression', tag_type=TagType(format='H', size=2), count=1, length=2, value=5) + Tag(code=257, name='ImageHeight', tag_type=TagType(format='H', size=2), count=1, length=2, value=12190) + Tag(code=256, name='ImageWidth', tag_type=TagType(format='H', size=2), count=1, length=2, value=10280) + ... +``` + +### Image Data +The reader also has methods for reading internal image tiles and performing partial reads. Currently only jpeg, lzw, deflate, packbits, and webp compressions are supported. + +#### Image Tiles +Reading the top left tile of an image at native resolution: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/webp_cog.tif") as cog: + x = y = z = 0 + tile = await cog.get_tile(x, y, z) + + ifd = cog.ifds[z] + assert tile.shape == (ifd.bands, ifd.TileHeight.value, ifd.TileWidth.value) +``` + +<p align="center"> + <img width="300" height="300" src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/naip_top_left_tile.jpg"> +</p> + + +#### Partial Read +You can read a portion of the image by specifying a bounding box in the native crs of the image and an output shape: + +```python +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/webp_cog.tif") as cog: + assert cog.epsg == 26911 + partial_data = await cog.read(bounds=(368461,3770591,368796,3770921), shape=(512,512)) +``` + +<p align="center"> + <img width="300" height="300" src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/partial_read.jpeg"> +</p> + +#### Internal Masks +If the COG has an internal mask, the returned array will be a masked array: + +```python +import numpy as np + +async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/naip_image_masked.tif") as cog: + assert cog.is_masked + + tile = await cog.get_tile(0,0,0) + assert np.ma.is_masked(tile) +``` + +<p align="center"> + <img src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/masked_tile.jpg" width="300" /> + <img src="https://async-cog-reader-test-data.s3.amazonaws.com/readme/mask.jpg" width="300" /> +</p> + +### Configuration +Configuration options are exposed through environment variables: +- **INGESTED_BYTES_AT_OPEN** - defines the number of bytes in the first GET request at file opening (defaults to 16KB) +- **HEADER_CHUNK_SIZE** - chunk size used to read header (defaults to 16KB) +- **ENABLE_BLOCK_CACHE** - determines if image blocks are cached in memory (defaults to TRUE) +- **ENABLE_HEADER_CACHE** - determines if COG headers are cached in memory (defaults to TRUE) +- **HTTP_MERGE_CONSECUTIVE_RANGES** - determines if consecutive ranges are merged into a single request (defaults to FALSE) +- **BOUNDLESS_READ** - determines if internal tiles outside the bounds of the IFD are read (defaults to TRUE) +- **BOUNDLESS_READ_FILL_VALUE** - determines the value used to fill boundless reads (defaults to 0) +- **LOG_LEVEL** - determines the log level used by the package (defaults to ERROR) +- **VERBOSE_LOGS** - enables verbose logging, designed for use when `LOG_LEVEL=DEBUG` (defaults to FALSE) +- **AWS_REQUEST_PAYER** - set to `requester` to enable reading from S3 RequesterPays buckets. + +Refer to [`aiocogeo/config.py`](https://github.com/geospatial-jeff/aiocogeo/blob/master/aiocogeo/config.py) for more details about configuration options. + +## CLI +``` +$ aiocogeo --help +Usage: aiocogeo [OPTIONS] COMMAND [ARGS]... + +Options: + --install-completion [bash|zsh|fish|powershell|pwsh] + Install completion for the specified shell. + --show-completion [bash|zsh|fish|powershell|pwsh] + Show completion for the specified shell, to + copy it or customize the installation. + + --help Show this message and exit. + +Commands: + create-tms Create OGC TileMatrixSet. + info Read COG metadata. + +``` + + + +%prep +%autosetup -n aiocogeo-0.3.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-aiocogeo -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Tue Jun 20 2023 Python_Bot <Python_Bot@openeuler.org> - 0.3.0-1 +- Package Spec generated |