summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-15 07:32:41 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-15 07:32:41 +0000
commit701448f1df3c891e3f81aeb2d575a2ac92c923aa (patch)
treed61a617d30ed3e2adaffaa0c6a0618d3a336597c
parentc1f8d8224f686b73ae562cb0316d8754340a7b1f (diff)
automatic import of python-rgd-client
-rw-r--r--.gitignore1
-rw-r--r--python-rgd-client.spec582
-rw-r--r--sources1
3 files changed, 584 insertions, 0 deletions
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 <Python_Bot@openeuler.org> - 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