From 701448f1df3c891e3f81aeb2d575a2ac92c923aa Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Mon, 15 May 2023 07:32:41 +0000 Subject: automatic import of python-rgd-client --- .gitignore | 1 + python-rgd-client.spec | 582 +++++++++++++++++++++++++++++++++++++++++++++++++ sources | 1 + 3 files changed, 584 insertions(+) create mode 100644 python-rgd-client.spec create mode 100644 sources diff --git a/.gitignore b/.gitignore index e69de29..b36366d 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1 @@ +/rgd-client-0.3.11.tar.gz diff --git a/python-rgd-client.spec b/python-rgd-client.spec new file mode 100644 index 0000000..440851f --- /dev/null +++ b/python-rgd-client.spec @@ -0,0 +1,582 @@ +%global _empty_manifest_terminate_build 0 +Name: python-rgd-client +Version: 0.3.11 +Release: 1 +Summary: Make web requests to a Resonant GeoData instance. +License: Apache 2.0 +URL: https://github.com/ResonantGeoData/ResonantGeoData +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/7c/0b/a8c071361bb5d2cd7630c8cb9bb59563318e4a9643b2bad04f6de675c25b/rgd-client-0.3.11.tar.gz +BuildArch: noarch + +Requires: python3-requests +Requires: python3-requests-toolbelt +Requires: python3-geomet +Requires: python3-tqdm +Requires: python3-validators +Requires: python3-ipython + +%description +[![logo](https://raw.githubusercontent.com/ResonantGeoData/ResonantGeoData/main/logos/RGD_Logo.png)](https://github.com/ResonantGeoData/ResonantGeoData/) + +# rgd_client - Resonant GeoDataClient + +The **rgd_client** Python package is a well typed, easy to use, and extendable Python client for Resonant GeoData APIs. + + +# Installation + +To install the core client +``` +pip install rgd-client +``` + +To use other core modules or plugins, install the corresponding client packages. For example, the imagery client plugin is installed with +``` +pip install rgd-imagery-client +``` + +All the functions added via a plugin are namespaced under a name defined by that plugin. For the imagery client plugin, this is `imagery`, so all of these plugin's features are accessed through `client.imagery.*`. Examples of this are shown below. + +# Usage +### Search and display results +```python +import json +import matplotlib.pyplot as plt +import numpy as np + +from rgd_client import create_rgd_client + +def plot_geojson(gjs, *args, **kwargs): + points = np.array(gjs['coordinates']) + if points.ndim == 3: + points = points[0] + if points.ndim == 1: + points = points.reshape((1, points.size, )) + return plt.plot(points[:,0], points[:,1], *args, **kwargs) + +client = create_rgd_client(username='username', password='password') +bbox = { + "type":"Polygon", + "coordinates":[ + [ + [-105.45091240368326,39.626245373878696], + [-105.45091240368326,39.929904289147274], + [-104.88775649170178,39.929904289147274], + [-104.88775649170178,39.626245373878696], + [-105.45091240368326,39.626245373878696] + ] + ] +} + +q = client.rgd.search(query=json.dumps(bbox), predicate='intersects') + +for s in q: + print(s['subentry_name']) + +plot_geojson(bbox, 'k--', label='Search Region') + +for s in q: + plot_geojson(s['footprint'], label=s['subentry_name']) + +plt.legend() +plt.title(f'Count: {len(q)}') +``` + +### Inspect raster + +Preview thumbnails of the raster + +```python +import imageio +from io import BytesIO + +raster = client.imagery.get_raster(q[0]) +plot_geojson(bbox, 'k--') +plot_geojson(raster['outline'], 'r') +load_image = lambda imbytes: imageio.imread(BytesIO(imbytes)) + +count = len(raster['parent_raster']['image_set']['images']) +for i in range(count): + thumb_bytes = client.imagery.download_raster_thumbnail(q[0], band=i) + thumb = load_image(thumb_bytes) + plt.subplot(1, count, i+1) + plt.imshow(thumb) + +plt.tight_layout() +plt.show() +``` + +### Download Raster + +Download the entire image set of the raster + +```python +import rasterio +from rasterio.plot import show + +paths = client.imagery.download_raster(q[0]) +rasters = [rasterio.open(im) for im in paths.images] +for i, src in enumerate(rasters): + plt.subplot(1, len(rasters), i+1) + ax = plt.gca() + show(src, ax=ax) +plt.tight_layout() +plt.show() +``` + + +### STAC Item Support + +The Python client has a search endpoint specifically for Raster data that +returns each record in the search results as a STAC Item. + +```py + +q = client.imagery.search_raster_stac(query=json.dumps(bbox), predicate='intersects') + +print(q[0]) # view result as STAC Item + +# Download using the search result +paths = client.imagery.download_raster(q[0]) +print(paths) + +``` + +We can also upload new data in the STAC Item format. Here we simply pass back +the same STAC Item JSON which will not actually do anything because RGD +recognizes that these files are already present with a Raster. + +```py +client.imagery.create_raster_stac(q[0]) +``` + +Please note that the assets in the STAC Item must already be uploaded to a +cloud storage provider with either `s3://` or `https://` URLs. Further, the +images must have the `data` tag on each asset. e.g.: + +```py +{ + ... # other STAC Item fields + 'assets': { + 'image-15030': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2', + 'eo:bands': [{'name': 'B1'}], + 'roles': ['data'], + }, + 'image-15041': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2', + 'eo:bands': [{'name': 'B1'}], + 'roles': ['data'], + }, + ... # ancillary files can lack a role but we like to see `metadata` used. + 'ancillary-30687': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/QI_DATA/MSK_TECQUA_B03.gml', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/QI_DATA/MSK_TECQUA_B03.gml', + 'roles': ['metadata'], + }, + } +} +``` + +# Plugin Development +For instructions on how to develop a plugin for `rgd_client`, see `PLUGINS.md`. + + + + +%package -n python3-rgd-client +Summary: Make web requests to a Resonant GeoData instance. +Provides: python-rgd-client +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-rgd-client +[![logo](https://raw.githubusercontent.com/ResonantGeoData/ResonantGeoData/main/logos/RGD_Logo.png)](https://github.com/ResonantGeoData/ResonantGeoData/) + +# rgd_client - Resonant GeoDataClient + +The **rgd_client** Python package is a well typed, easy to use, and extendable Python client for Resonant GeoData APIs. + + +# Installation + +To install the core client +``` +pip install rgd-client +``` + +To use other core modules or plugins, install the corresponding client packages. For example, the imagery client plugin is installed with +``` +pip install rgd-imagery-client +``` + +All the functions added via a plugin are namespaced under a name defined by that plugin. For the imagery client plugin, this is `imagery`, so all of these plugin's features are accessed through `client.imagery.*`. Examples of this are shown below. + +# Usage +### Search and display results +```python +import json +import matplotlib.pyplot as plt +import numpy as np + +from rgd_client import create_rgd_client + +def plot_geojson(gjs, *args, **kwargs): + points = np.array(gjs['coordinates']) + if points.ndim == 3: + points = points[0] + if points.ndim == 1: + points = points.reshape((1, points.size, )) + return plt.plot(points[:,0], points[:,1], *args, **kwargs) + +client = create_rgd_client(username='username', password='password') +bbox = { + "type":"Polygon", + "coordinates":[ + [ + [-105.45091240368326,39.626245373878696], + [-105.45091240368326,39.929904289147274], + [-104.88775649170178,39.929904289147274], + [-104.88775649170178,39.626245373878696], + [-105.45091240368326,39.626245373878696] + ] + ] +} + +q = client.rgd.search(query=json.dumps(bbox), predicate='intersects') + +for s in q: + print(s['subentry_name']) + +plot_geojson(bbox, 'k--', label='Search Region') + +for s in q: + plot_geojson(s['footprint'], label=s['subentry_name']) + +plt.legend() +plt.title(f'Count: {len(q)}') +``` + +### Inspect raster + +Preview thumbnails of the raster + +```python +import imageio +from io import BytesIO + +raster = client.imagery.get_raster(q[0]) +plot_geojson(bbox, 'k--') +plot_geojson(raster['outline'], 'r') +load_image = lambda imbytes: imageio.imread(BytesIO(imbytes)) + +count = len(raster['parent_raster']['image_set']['images']) +for i in range(count): + thumb_bytes = client.imagery.download_raster_thumbnail(q[0], band=i) + thumb = load_image(thumb_bytes) + plt.subplot(1, count, i+1) + plt.imshow(thumb) + +plt.tight_layout() +plt.show() +``` + +### Download Raster + +Download the entire image set of the raster + +```python +import rasterio +from rasterio.plot import show + +paths = client.imagery.download_raster(q[0]) +rasters = [rasterio.open(im) for im in paths.images] +for i, src in enumerate(rasters): + plt.subplot(1, len(rasters), i+1) + ax = plt.gca() + show(src, ax=ax) +plt.tight_layout() +plt.show() +``` + + +### STAC Item Support + +The Python client has a search endpoint specifically for Raster data that +returns each record in the search results as a STAC Item. + +```py + +q = client.imagery.search_raster_stac(query=json.dumps(bbox), predicate='intersects') + +print(q[0]) # view result as STAC Item + +# Download using the search result +paths = client.imagery.download_raster(q[0]) +print(paths) + +``` + +We can also upload new data in the STAC Item format. Here we simply pass back +the same STAC Item JSON which will not actually do anything because RGD +recognizes that these files are already present with a Raster. + +```py +client.imagery.create_raster_stac(q[0]) +``` + +Please note that the assets in the STAC Item must already be uploaded to a +cloud storage provider with either `s3://` or `https://` URLs. Further, the +images must have the `data` tag on each asset. e.g.: + +```py +{ + ... # other STAC Item fields + 'assets': { + 'image-15030': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2', + 'eo:bands': [{'name': 'B1'}], + 'roles': ['data'], + }, + 'image-15041': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2', + 'eo:bands': [{'name': 'B1'}], + 'roles': ['data'], + }, + ... # ancillary files can lack a role but we like to see `metadata` used. + 'ancillary-30687': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/QI_DATA/MSK_TECQUA_B03.gml', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/QI_DATA/MSK_TECQUA_B03.gml', + 'roles': ['metadata'], + }, + } +} +``` + +# Plugin Development +For instructions on how to develop a plugin for `rgd_client`, see `PLUGINS.md`. + + + + +%package help +Summary: Development documents and examples for rgd-client +Provides: python3-rgd-client-doc +%description help +[![logo](https://raw.githubusercontent.com/ResonantGeoData/ResonantGeoData/main/logos/RGD_Logo.png)](https://github.com/ResonantGeoData/ResonantGeoData/) + +# rgd_client - Resonant GeoDataClient + +The **rgd_client** Python package is a well typed, easy to use, and extendable Python client for Resonant GeoData APIs. + + +# Installation + +To install the core client +``` +pip install rgd-client +``` + +To use other core modules or plugins, install the corresponding client packages. For example, the imagery client plugin is installed with +``` +pip install rgd-imagery-client +``` + +All the functions added via a plugin are namespaced under a name defined by that plugin. For the imagery client plugin, this is `imagery`, so all of these plugin's features are accessed through `client.imagery.*`. Examples of this are shown below. + +# Usage +### Search and display results +```python +import json +import matplotlib.pyplot as plt +import numpy as np + +from rgd_client import create_rgd_client + +def plot_geojson(gjs, *args, **kwargs): + points = np.array(gjs['coordinates']) + if points.ndim == 3: + points = points[0] + if points.ndim == 1: + points = points.reshape((1, points.size, )) + return plt.plot(points[:,0], points[:,1], *args, **kwargs) + +client = create_rgd_client(username='username', password='password') +bbox = { + "type":"Polygon", + "coordinates":[ + [ + [-105.45091240368326,39.626245373878696], + [-105.45091240368326,39.929904289147274], + [-104.88775649170178,39.929904289147274], + [-104.88775649170178,39.626245373878696], + [-105.45091240368326,39.626245373878696] + ] + ] +} + +q = client.rgd.search(query=json.dumps(bbox), predicate='intersects') + +for s in q: + print(s['subentry_name']) + +plot_geojson(bbox, 'k--', label='Search Region') + +for s in q: + plot_geojson(s['footprint'], label=s['subentry_name']) + +plt.legend() +plt.title(f'Count: {len(q)}') +``` + +### Inspect raster + +Preview thumbnails of the raster + +```python +import imageio +from io import BytesIO + +raster = client.imagery.get_raster(q[0]) +plot_geojson(bbox, 'k--') +plot_geojson(raster['outline'], 'r') +load_image = lambda imbytes: imageio.imread(BytesIO(imbytes)) + +count = len(raster['parent_raster']['image_set']['images']) +for i in range(count): + thumb_bytes = client.imagery.download_raster_thumbnail(q[0], band=i) + thumb = load_image(thumb_bytes) + plt.subplot(1, count, i+1) + plt.imshow(thumb) + +plt.tight_layout() +plt.show() +``` + +### Download Raster + +Download the entire image set of the raster + +```python +import rasterio +from rasterio.plot import show + +paths = client.imagery.download_raster(q[0]) +rasters = [rasterio.open(im) for im in paths.images] +for i, src in enumerate(rasters): + plt.subplot(1, len(rasters), i+1) + ax = plt.gca() + show(src, ax=ax) +plt.tight_layout() +plt.show() +``` + + +### STAC Item Support + +The Python client has a search endpoint specifically for Raster data that +returns each record in the search results as a STAC Item. + +```py + +q = client.imagery.search_raster_stac(query=json.dumps(bbox), predicate='intersects') + +print(q[0]) # view result as STAC Item + +# Download using the search result +paths = client.imagery.download_raster(q[0]) +print(paths) + +``` + +We can also upload new data in the STAC Item format. Here we simply pass back +the same STAC Item JSON which will not actually do anything because RGD +recognizes that these files are already present with a Raster. + +```py +client.imagery.create_raster_stac(q[0]) +``` + +Please note that the assets in the STAC Item must already be uploaded to a +cloud storage provider with either `s3://` or `https://` URLs. Further, the +images must have the `data` tag on each asset. e.g.: + +```py +{ + ... # other STAC Item fields + 'assets': { + 'image-15030': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B01.jp2', + 'eo:bands': [{'name': 'B1'}], + 'roles': ['data'], + }, + 'image-15041': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/IMG_DATA/T17SMS_20210302T161201_B02.jp2', + 'eo:bands': [{'name': 'B1'}], + 'roles': ['data'], + }, + ... # ancillary files can lack a role but we like to see `metadata` used. + 'ancillary-30687': { + 'href': 'http://storage.googleapis.com/gcp-public-data-sentinel-2/tiles/17/S/MS/S2A_MSIL1C_20210302T161201_N0209_R140_T17SMS_20210302T200521.SAFE/GRANULE/L1C_T17SMS_A029738_20210302T161751/QI_DATA/MSK_TECQUA_B03.gml', + 'title': 'GRANULE/L1C_T17SMS_A029738_20210302T161751/QI_DATA/MSK_TECQUA_B03.gml', + 'roles': ['metadata'], + }, + } +} +``` + +# Plugin Development +For instructions on how to develop a plugin for `rgd_client`, see `PLUGINS.md`. + + + + +%prep +%autosetup -n rgd-client-0.3.11 + +%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-rgd-client -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Mon May 15 2023 Python_Bot - 0.3.11-1 +- Package Spec generated diff --git a/sources b/sources new file mode 100644 index 0000000..9b30666 --- /dev/null +++ b/sources @@ -0,0 +1 @@ +67cb15edd3762e3ca64126891897af23 rgd-client-0.3.11.tar.gz -- cgit v1.2.3