diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-15 07:32:41 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-15 07:32:41 +0000 |
commit | 701448f1df3c891e3f81aeb2d575a2ac92c923aa (patch) | |
tree | d61a617d30ed3e2adaffaa0c6a0618d3a336597c | |
parent | c1f8d8224f686b73ae562cb0316d8754340a7b1f (diff) |
automatic import of python-rgd-client
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-rgd-client.spec | 582 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 584 insertions, 0 deletions
@@ -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 +[](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 +[](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 +[](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 <Python_Bot@openeuler.org> - 0.3.11-1 +- Package Spec generated @@ -0,0 +1 @@ +67cb15edd3762e3ca64126891897af23 rgd-client-0.3.11.tar.gz |