Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

+= datacube 🧊 #3

Merged
merged 60 commits into from
Jul 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
08bdc1e
fascinating feature 🪄 - kamangir/bolt#746
kamangir Jul 19, 2024
62137f0
❗️ untested - towards datacube browse and ingest 🚀 - kamangir/bolt#746
kamangir Jul 19, 2024
2eeeedb
rebuild - kamangir/bolt#746
kamangir Jul 19, 2024
8e4fb11
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 19, 2024
e72190b
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 19, 2024
58e4ba3
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 19, 2024
4c3a663
QGIS -= select - kamangir/bolt#746
kamangir Jul 20, 2024
5bc50e4
QGIS refactor - kamangir/bolt#746
kamangir Jul 20, 2024
7f77cfb
firms ingest - kamangir/bolt#746
kamangir Jul 20, 2024
944b10c
datacube refactors - kamangir/bolt#746
kamangir Jul 20, 2024
02ac376
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 20, 2024
0f4fc74
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 20, 2024
65ce42e
datacube refactor - kamangir/bolt#746
kamangir Jul 20, 2024
8b70c5d
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 20, 2024
1b023ef
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 20, 2024
58926da
pipeline fix, hopefully - kamangir/bolt#746
kamangir Jul 20, 2024
b3f5ba8
firms refactor - kamangir/bolt#746
kamangir Jul 20, 2024
24daba5
firms refactor - kamangir/bolt#746
kamangir Jul 20, 2024
de6d861
generic datacube refactor - kamangir/bolt#746
kamangir Jul 20, 2024
0dd0c1c
datacube refactor - kamangir/bolt#746
kamangir Jul 20, 2024
7808d76
rebuild - kamangir/bolt#746
kamangir Jul 20, 2024
04c4033
+= catalog - kamangir/bolt#746
kamangir Jul 20, 2024
52c54cd
datacube refactor - kamangir/bolt#746
kamangir Jul 20, 2024
a04a813
untested code ❗️ - kamangir/bolt#746
kamangir Jul 20, 2024
4906a49
untested code ❗️ - kamangir/bolt#746
kamangir Jul 20, 2024
b4025df
failures expected ❗️ - kamangir/bolt#746
kamangir Jul 20, 2024
5280aef
datacube browse refactor - kamangir/bolt#746
kamangir Jul 20, 2024
8cccb74
README refactors - kamangir/bolt#746
kamangir Jul 20, 2024
bf81882
datacube refactor - kamangir/bolt#746
kamangir Jul 20, 2024
c3c19c7
untested code ❗️ - kamangir/bolt#746
kamangir Jul 20, 2024
b4c19fb
datacube refactor - kamangir/bolt#746
kamangir Jul 20, 2024
0683b5c
@datacube query refactor - kamangir/bolt#746
kamangir Jul 20, 2024
038d97e
untested code ❗️ - kamangir/bolt#746
kamangir Jul 20, 2024
08f35e0
datacube ingest refactor - kamangir/bolt#746
kamangir Jul 20, 2024
ad4ecc6
datacube refactor - kamangir/bolt#746
kamangir Jul 20, 2024
7644780
datacube refactor - kamangir/bolt#746
kamangir Jul 21, 2024
9395605
datacube refactor - kamangir/bolt#746
kamangir Jul 21, 2024
23db7a8
datacube query refactor - kamangir/bolt#746
kamangir Jul 21, 2024
4245e17
datacube query refactor - kamangir/bolt#746
kamangir Jul 21, 2024
167b8b9
datacube query refactor - kamangir/bolt#746
kamangir Jul 21, 2024
746a168
datacube query refactor - kamangir/bolt#746
kamangir Jul 21, 2024
6a8e725
datacube query refactor - kamangir/bolt#746
kamangir Jul 21, 2024
f1fba1f
Datacube refactor - kamangir/bolt#746
kamangir Jul 21, 2024
987c7c8
datacube ingest refactor - kamangir/bolt#746
kamangir Jul 21, 2024
6e65c24
firms_area refactor - kamangir/bolt#746
kamangir Jul 21, 2024
36e7872
firms_area refactor - kamangir/bolt#746
kamangir Jul 21, 2024
e2d3252
firms_area query fix - kamangir/bolt#746
kamangir Jul 21, 2024
f6024e7
pylint fix, hopefuly - kamangir/bolt#746
kamangir Jul 21, 2024
18b833f
doc refactor - kamangir/bolt#746
kamangir Jul 21, 2024
914411f
test refactors - kamangir/bolt#746
kamangir Jul 22, 2024
e9122fe
test refactors - kamangir/bolt#746
kamangir Jul 22, 2024
28d4f90
test refactors - kamangir/bolt#746
kamangir Jul 22, 2024
bb79157
test refactors - kamangir/bolt#746
kamangir Jul 22, 2024
ba52fd6
pytest fix, hopefully - kamangir/bolt#746
kamangir Jul 22, 2024
bed24c8
pylint fix, hopefully - kamangir/bolt#746
kamangir Jul 22, 2024
dad5792
pytest fix, hopefully - kamangir/bolt#746
kamangir Jul 22, 2024
c17597d
pytest fix, hopefully - kamangir/bolt#746
kamangir Jul 22, 2024
b6abcb1
rebuild - kamangir/bolt#746
kamangir Jul 22, 2024
7c3ba15
bas test refactors - kamangir/bolt#746
kamangir Jul 22, 2024
5dc1661
bashtest fix, hopefuly - kamangir/bolt#746
kamangir Jul 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ AI for precise geospatial data analysis and visualization.
pip install blue-geo
```

🔹 🧊 [datacube](https://github.com/kamangir/blue-geo/tree/2024-07-18-datacubes-a/blue_geo/.abcli/datacube) 🔹

| | | |
|-|-|-|
| 🌐 [QGIS](https://github.com/kamangir/blue-geo/blob/main/blue_geo/.abcli/QGIS/README.md) | 🇺🇦 [ukraine-timemap](https://github.com/kamangir/blue-geo/blob/main/blue_geo/.abcli/ukraine-timemap/README.md) | 🌈 [vancouver-watching](https://github.com/kamangir/Vancouver-Watching) |
| [![image](https://raw.githubusercontent.com/kamangir/assets/main/blue-geo/QGIS.jpg)](https://github.com/kamangir/blue-geo/blob/main/blue_geo/.abcli/QGIS/README.md) | [![image](https://github.com/kamangir/assets/blob/main/nbs/ukraine-timemap/QGIS.png?raw=true)](https://github.com/kamangir/blue-geo/blob/main/blue_geo/.abcli/ukraine-timemap/README.md) | [![image](https://kamangir-public.s3.ca-central-1.amazonaws.com/test_vancouver_watching_ingest/animation.gif?raw=true)](https://github.com/kamangir/Vancouver-Watching) |
| an AI terraform for [QGIS](https://www.qgis.org/). | `ingest` for the [Bellingcat](https://www.bellingcat.com/) [Civilian Harm in Ukraine TimeMap](https://github.com/bellingcat/ukraine-timemap) dataset, available through [this UI](https://ukraine.bellingcat.com/) and [this API](https://bellingcat-embeds.ams3.cdn.digitaloceanspaces.com/production/ukr/timemap/api.json). | 🌈 Vancouver watching with AI, last build: [🔗](https://kamangir-public.s3.ca-central-1.amazonaws.com/test_vancouver_watching_ingest/animation.gif). | |
| | | |
| 🌐 [firms](https://github.com/kamangir/blue-geo/blob/main/blue_geo/firms/README.md) | | |
| [![image](https://raw.githubusercontent.com/kamangir/assets/main/blue-geo/firms.jpg)](https://github.com/kamangir/blue-geo/blob/main/blue_geo/firms/README.md) | | |
| 🌐 [firms](https://github.com/kamangir/blue-geo/blob/main/blue_geo/.abcli/datacube/firms/README.md) | | |
| [![image](https://raw.githubusercontent.com/kamangir/assets/main/blue-geo/firms.jpg)](https://github.com/kamangir/blue-geo/blob/main/blue_geo/.abcli/datacube/firms/README.md) | | |
| `ingest` for [FIRMS](https://firms.modaps.eosdis.nasa.gov): Fire Information for Resource Management System. | | |

---
Expand Down
3 changes: 3 additions & 0 deletions blue_geo/.abcli/alias.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#! /usr/bin/env bash

alias @datacube=blue_geo_datacube
25 changes: 25 additions & 0 deletions blue_geo/.abcli/datacube.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#! /usr/bin/env bash

function blue_geo_datacube() {
local task=$(abcli_unpack_keyword $1 help)

if [ "$task" == "help" ]; then
blue_geo_datacube_browse "$@"
blue_geo_datacube_get "$@"
blue_geo_datacube_ingest "$@"
blue_geo_datacube_list "$@"
blue_geo_datacube_query "$@"
return
fi

local function_name=blue_geo_datacube_$task
if [[ $(type -t $function_name) == "function" ]]; then
$function_name "${@:2}"
return
fi

abcli_log_error "-blue_geo: datacube: $task: command not found."
return 1
}

abcli_source_path - caller,suffix=/datacube
44 changes: 44 additions & 0 deletions blue_geo/.abcli/datacube/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# 🧊

`datacube`s are [objects](https://kamangir-public.s3.ca-central-1.amazonaws.com/giza-v1/giza.pdf) that can be [queried](#query) and [ingested](#ingest).

## query

run an `@datacube query`, then `@datacube query read` the `datacube-id`(s) as object names and use them with commands.

```bash
> @datacube query help
@datacube query \
<catalog> \
download,ingest,select,upload \
-|<object-name> \
<query-options> \
<args>
. <catalog> -query-> <object-name>.
@datacube query read \
[all,download,len] \
[.|<object-name>] \
[--count <count>] \
[--delim <delim>] \
[--index <index>] \
[--prefix <prefix>] \
[--suffix <suffix>] \
[--contains <contains>] \
[--notcontains <not-contains>]
. read query results in <object-name>.
```

supported `<catalog>`s: [firms_area](./firms_area/).

## ingest

run `@datacube ingest` to ingest a datacube, or `@datacube query <catalog> ingest,...`.

```bash
> @datacube ingest help
@datacube ingest \
[assets=all|<item-1+item-2>,dryrun,suffix=<suffix>,upload] \
[.|<object-name>] \
<args>
. ingest <object-name>.
```
18 changes: 18 additions & 0 deletions blue_geo/.abcli/datacube/browse.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#! /usr/bin/env bash

function blue_geo_datacube_browse() {
local catalog=${1:firms_area}

if [ $(abcli_option_int "$catalog" help 0) == 1 ]; then
abcli_show_usage "@datacube browse$ABCUL<catalog>$ABCUL<args>" \
"browse <catalog>."
return
fi

if [[ ",$blue_geo_datacube_list_of_catalogs," != *",$catalog,"* ]]; then
abcli_log_error "-@datacube: browse: $catalog: catalog not found."
return 1
fi

blue_geo_datacube_${catalog}_browse "${@:2}"
}
40 changes: 40 additions & 0 deletions blue_geo/.abcli/datacube/catalogs.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#! /usr/bin/env bash

function blue_geo_datacube_list() {
local options=$1

if [ $(abcli_option_int "$options" help 0) == 1 ]; then
options="catalogs"
local args="[--delim space]$ABCUL[--log 0]"
abcli_show_usage "@datacube list$ABCUL[$options]$ABCUL$args" \
"list catalogs."
return
fi

python3 -m blue_geo.datacube \
list_of_catalogs \
"${@:2}"
}

function blue_geo_datacube_ls() {
blue_geo_datacube_list "$@"
}

function blue_geo_datacube_load_catalogs() {
abcli_log_list $blue_geo_datacube_list_of_catalogs \
--delim , \
--before "🌐 loading" \
--after "datacube catalog(s)"

local catalog
for catalog in $(echo $blue_geo_datacube_list_of_catalogs | tr , " "); do
abcli_log "🧊 $catalog"
abcli_source_path - caller,civilized,suffix=/$catalog
done

return 0
}

export blue_geo_datacube_list_of_catalogs=$(blue_geo_datacube_list catalogs --log 0)

blue_geo_datacube_load_catalogs
53 changes: 53 additions & 0 deletions blue_geo/.abcli/datacube/firms_area/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# 🌐 firms-area

the `firms-area` catalog covers [FIRMS](https://firms.modaps.eosdis.nasa.gov): Fire Information for Resource Management System. see [datacube](../README.md) for usage instructions.

## query

```bash
> @datacube query firms_area help
@datacube query firms_area \
[download,ingest,select,upload] \
[-|<object-name>] \
[dryrun] \
[--date 2024-07-21] \
[--depth 1] \
[--area east|north|south|west|world] \
[--source LANDSAT_NRT|MODIS_NRT|MODIS_SP|VIIRS_NOAA20_NRT|VIIRS_NOAA21_NRT|VIIRS_SNPP_NRT|VIIRS_SNPP_SP] \
[--log 1]
. firms_area -query-> <object-name>.
```

## example use

```bash
@datacube query firms_area \
ingest,select - - \
--date 2024-07-18

@open QGIS .
@publish tar .
```

```yaml
datacube:
area: WORLD
date: '2024-07-18'
depth: 1
id: datacube-firms_area-world-MODIS_NRT-2024-07-18-1
len: 23627
source: MODIS_NRT
```


![image](https://raw.githubusercontent.com/kamangir/assets/main/blue-geo/datacube-firms_area-ingest.png)

[datacube-firms_area-world-MODIS_NRT-2024-07-18-1.tar.gz](https://kamangir-public.s3.ca-central-1.amazonaws.com/datacube-firms_area-world-MODIS_NRT-2024-07-18-1.tar.gz)

![image](https://raw.githubusercontent.com/kamangir/assets/main/blue-geo/datacube-firms_area.jpg)

---

map-key: https://firms.modaps.eosdis.nasa.gov/api/map_key/

area api: https://firms.modaps.eosdis.nasa.gov/api/area/
23 changes: 23 additions & 0 deletions blue_geo/.abcli/datacube/firms_area/browse.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#! /usr/bin/env bash

function blue_geo_datacube_firms_area_browse() {
local options=$1

if [ $(abcli_option_int "$options" help 0) == 1 ]; then
options="|map_key|api"
abcli_show_usage "@datacube browse firms_area$ABCUL$options" \
"browse firms_area datacubes."
return
fi

local do_map_key=$(abcli_option_int "$options" map_key 0)
local do_area_api=$(abcli_option_int "$options" api 0)

local url="https://firms.modaps.eosdis.nasa.gov/"
[[ "$do_map_key" == 1 ]] &&
url="https://firms.modaps.eosdis.nasa.gov/api/map_key/"
[[ "$do_area_api" == 1 ]] &&
url="https://firms.modaps.eosdis.nasa.gov/api/area/"

abcli_browse $url
}
23 changes: 23 additions & 0 deletions blue_geo/.abcli/datacube/firms_area/ingest.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#! /usr/bin/env bash

function blue_geo_datacube_ingest_firms_area() {
local options=$1

if [ $(abcli_option_int "$options" help 0) == 1 ]; then
options=$blue_geo_datacube_ingest_options
"$EOP~copy_template,dryrun,$EOPE"
abcli_show_usage "blue_geo ingest firms_area$ABCUL[$options]$ABCUL[.|<object-name>]$ABCUL" \
"firms -ingest-> <object-name>."
return
fi

local do_dryrun=$(abcli_option_int "$options" dryrun 0)

local object_name=$(abcli_clarify_object $2 .)

abcli_eval dryrun=$do_dryrun \
python3 -m blue_geo.datacube.firms.area \
ingest \
--object_name $object_name \
"${@:3}"
}
40 changes: 40 additions & 0 deletions blue_geo/.abcli/datacube/firms_area/query.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#! /usr/bin/env bash

function blue_geo_datacube_firms_area_query() {
local options=$1

if [ $(abcli_option_int "$options" help 0) == 1 ]; then
options="dryrun"

local date=$(abcli_string_timestamp_short \
--include_time 0 \
--unique 0)
local area=$(python3 -m blue_geo.datacube.firms.area \
get \
--what area \
--delim \|)
local source=$(python3 -m blue_geo.datacube.firms.area \
get \
--what source \
--values 1 \
--delim \|)

local args="[--date $date]$ABCUL[--depth 1]$ABCUL[--area $area]$ABCUL[--source $source]$ABCUL[--log 1]"

abcli_show_usage "@datacube query firms_area$ABCUL[$blue_geo_datacube_query_options]$ABCUL[-|<object-name>]$ABCUL[$options]$ABCUL$args" \
"firms_area -query-> <object-name>."
return
fi

local do_dryrun=$(abcli_option_int "$options" dryrun 0)

local object_name=$(abcli_clarify_object $2 -)

abcli_eval dryrun=$do_dryrun \
python3 -m blue_geo.datacube.firms.area \
query \
--object_name $object_name \
"${@:3}"

return 0
}
39 changes: 39 additions & 0 deletions blue_geo/.abcli/datacube/get.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#! /usr/bin/env bash

function blue_geo_datacube_get() {
local what=$1

if [[ "$what" == "help" ]]; then
options="catalog"
abcli_show_usage "@datacube get$ABCUL[$options]$ABCUL.|<object-name>" \
"get <object-name> catalog."

options="template"
abcli_show_usage "@datacube get$ABCUL[$options]$ABCUL<catalog>" \
"get <catalog> template."

return
fi

local extra_args=""

if [[ "$what" == "catalog" ]]; then
local object_name=$(abcli_clarify_object $2 .)
python3 -m blue_geo.datacube \
get \
--what "$what" \
--object_name $object_name \
"${@:3}"
elif [[ "$what" == "template" ]]; then
python3 -m blue_geo.datacube \
get \
--what "$what" \
--catalog "$2" \
"${@:3}"
else
python3 -m blue_geo.datacube \
get \
--what "$what" \
"${@:2}"
fi
}
45 changes: 45 additions & 0 deletions blue_geo/.abcli/datacube/ingest.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#! /usr/bin/env bash

export blue_geo_datacube_ingest_options="assets=all|<item-1+item-2>,dryrun,suffix=<suffix>,upload"

function blue_geo_datacube_ingest() {
local options=$1

if [ $(abcli_option_int "$options" help 0) == 1 ]; then
options=$blue_geo_datacube_ingest_options
abcli_show_usage "@datacube ingest$ABCUL[$options]$ABCUL[.|<object-name>]$ABCUL<args>" \
"ingest <object-name>."
return
fi

local do_upload=$(abcli_option_int "$options" upload 0)

local object_name=$(abcli_clarify_object $2 .)

local catalog=$(blue_geo_datacube get catalog $object_name)
if [[ ",$blue_geo_datacube_list_of_catalogs," != *",$catalog,"* ]]; then
abcli_log_error "-@datacube: ingest: $catalog: catalog not found."
return 1
fi

abcli_log "🧊 catalog: $catalog"

local template_object_name=$(blue_geo_datacube get template $catalog)
local do_copy_template=1
[[ "$template_object_name" == "unknown-template" ]] &&
do_copy_template=0
do_copy_template=$(abcli_option_int "$options" copy_template $do_copy_template)

[[ "$do_copy_template" == 1 ]] &&
abcli_clone \
$template_object_name \
$object_name \
~meta

blue_geo_datacube_ingest_${catalog} "$@"

[[ "$do_upload" == 1 ]] &&
abcli_upload - $object_name

return 0
}
Loading
Loading