@hestia-earth/caching-api 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -1
- package/index.d.ts +163 -0
- package/openapi.json +221 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,4 +2,68 @@
|
|
|
2
2
|
|
|
3
3
|
## Getting started
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
To use this API and querying the raster files, you need to download the assets first:
|
|
6
|
+
|
|
7
|
+
### 1. Download the HESTIA assets (~1.9 GB, required)
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
mkdir -p assets
|
|
11
|
+
curl -O https://hestia.earth/data/hestia-geospatial-assets.zip
|
|
12
|
+
unzip hestia-geospatial-assets.zip -d assets
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
### 2. Download GADM boundaries (only for `gadm-ids` queries)
|
|
16
|
+
|
|
17
|
+
**HESTIA cannot redistribute GADM**, so it comes from the source. Below is a script to run in your terminal to download the files:
|
|
18
|
+
```bash
|
|
19
|
+
mkdir -p assets/gadm
|
|
20
|
+
|
|
21
|
+
for country in \
|
|
22
|
+
ABW AFG AGO AIA ALA ALB AND ARE ARG ARM ASM ATA ATF ATG AUS AUT AZE \
|
|
23
|
+
BDI BEL BEN BES BFA BGD BGR BHR BHS BIH BLM BLR BLZ BMU BOL BRA BRB \
|
|
24
|
+
BRN BTN BVT BWA CAF CAN CCK CHE CHL CHN CIV CMR COD COG COK COL COM \
|
|
25
|
+
CPV CRI CUB CUW CXR CYM CYP CZE DEU DJI DMA DNK DOM DZA ECU EGY ERI \
|
|
26
|
+
ESH ESP EST ETH FIN FJI FLK FRA FRO FSM GAB GBR GEO GGY GHA GIB GIN \
|
|
27
|
+
GLP GMB GNB GNQ GRC GRD GRL GTM GUF GUM GUY HKG HMD HND HRV HTI HUN \
|
|
28
|
+
IDN IMN IND IOT IRL IRN IRQ ISL ISR ITA JAM JEY JOR JPN KAZ KEN KGZ \
|
|
29
|
+
KHM KIR KNA KOR KWT LAO LBN LBR LBY LCA LIE LKA LSO LTU LUX LVA MAC \
|
|
30
|
+
MAF MAR MCO MDA MDG MDV MEX MHL MKD MLI MLT MMR MNE MNG MNP MOZ MRT \
|
|
31
|
+
MSR MTQ MUS MWI MYS MYT NAM NCL NER NFK NGA NIC NIU NLD NOR NPL NRU \
|
|
32
|
+
NZL OMN PAK PAN PCN PER PHL PLW PNG POL PRI PRK PRT PRY PSE PYF QAT \
|
|
33
|
+
REU ROU RUS RWA SAU SDN SEN SGP SGS SHN SJM SLB SLE SLV SMR SOM SPM \
|
|
34
|
+
SRB SSD STP SUR SVK SVN SWE SWZ SXM SYC SYR TCA TCD TGO THA TJK TKL \
|
|
35
|
+
TKM TLS TON TTO TUN TUR TUV TWN TZA UGA UKR UMI URY USA UZB VAT VCT \
|
|
36
|
+
VEN VGB VIR VNM VUT WLF WSM XAD XCA XCL XKO XNC XPI XSP YEM ZAF ZMB \
|
|
37
|
+
ZWE
|
|
38
|
+
do
|
|
39
|
+
archive="assets/gadm/gadm36_${country}_shp.zip"
|
|
40
|
+
[ -f "$archive" ] && continue
|
|
41
|
+
curl -fsS -o "$archive" \
|
|
42
|
+
"https://geodata.ucdavis.edu/gadm/gadm3.6/shp/gadm36_${country}_shp.zip" \
|
|
43
|
+
|| echo "failed: $country"
|
|
44
|
+
done
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
You can also download the files on https://gadm.org/download_country36.html (the "Shapefile").
|
|
48
|
+
|
|
49
|
+
### 3. Run the container
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
docker run -p 8000:80 \
|
|
53
|
+
-e API_TOKEN=<token> \
|
|
54
|
+
-e DATABASE_URL=<postgres-url> \
|
|
55
|
+
-v "$(pwd)/assets:/app/assets:ro" \
|
|
56
|
+
hestiae/hestia-caching-api
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Allow ~800 MB of memory.
|
|
60
|
+
|
|
61
|
+
| Variable | Default | Purpose |
|
|
62
|
+
| --- | --- | --- |
|
|
63
|
+
| `API_TOKEN` | — | Admin token. Used to limit access to the whole API. Sent as the `X-API-KEY` header |
|
|
64
|
+
| `DATABASE_URL` | — | PostgreSQL connection string |
|
|
65
|
+
| `GEOSPATIAL_FOLDER` | `assets/ee` | Where the rasters are |
|
|
66
|
+
| `GADM_FOLDER` | `assets/gadm` | Where the GADM archives are |
|
|
67
|
+
| `GDAL_CACHEMAX` | `64` | Tile cache, MB. Left unset, GDAL takes 5% of *host* RAM and ignores the container limit |
|
|
68
|
+
|
|
69
|
+
Note: the `docker-compose.yml` file is available to get started locally quicker.
|
package/index.d.ts
CHANGED
|
@@ -177,6 +177,61 @@ export interface paths {
|
|
|
177
177
|
patch?: never;
|
|
178
178
|
trace?: never;
|
|
179
179
|
};
|
|
180
|
+
"/geospatial/collections": {
|
|
181
|
+
parameters: {
|
|
182
|
+
query?: never;
|
|
183
|
+
header?: never;
|
|
184
|
+
path?: never;
|
|
185
|
+
cookie?: never;
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* List Collections
|
|
189
|
+
* @description The collections this API can answer for.
|
|
190
|
+
*
|
|
191
|
+
* Callers hold a mix: the ones HESTIA owns are served here, the public Earth
|
|
192
|
+
* Engine ones are not. Since `/run` rejects a query it cannot answer *in
|
|
193
|
+
* full*, a caller batching collections together needs to know the split up
|
|
194
|
+
* front rather than discovering it from a 422.
|
|
195
|
+
*/
|
|
196
|
+
get: operations["list_collections_geospatial_collections_get"];
|
|
197
|
+
put?: never;
|
|
198
|
+
post?: never;
|
|
199
|
+
delete?: never;
|
|
200
|
+
options?: never;
|
|
201
|
+
head?: never;
|
|
202
|
+
patch?: never;
|
|
203
|
+
trace?: never;
|
|
204
|
+
};
|
|
205
|
+
"/geospatial/run": {
|
|
206
|
+
parameters: {
|
|
207
|
+
query?: never;
|
|
208
|
+
header?: never;
|
|
209
|
+
path?: never;
|
|
210
|
+
cookie?: never;
|
|
211
|
+
};
|
|
212
|
+
get?: never;
|
|
213
|
+
put?: never;
|
|
214
|
+
/**
|
|
215
|
+
* Run Query
|
|
216
|
+
* @description Samples the exported geospatial assets at coordinates, or reduces them over
|
|
217
|
+
* boundaries or GADM regions.
|
|
218
|
+
*
|
|
219
|
+
* Accepts the same payload as ``hestia_earth.earth_engine.run`` so the models
|
|
220
|
+
* can call this instead, and returns the values in the same order:
|
|
221
|
+
* geometry-major, one value per collection.
|
|
222
|
+
*
|
|
223
|
+
* Only collections HESTIA owns are served here. Public Earth Engine
|
|
224
|
+
* collections (ERA5, TERRACLIMATE, GMTED2010) are rejected rather than
|
|
225
|
+
* silently returning nothing -- the caller is expected to route those to
|
|
226
|
+
* Earth Engine.
|
|
227
|
+
*/
|
|
228
|
+
post: operations["run_query_geospatial_run_post"];
|
|
229
|
+
delete?: never;
|
|
230
|
+
options?: never;
|
|
231
|
+
head?: never;
|
|
232
|
+
patch?: never;
|
|
233
|
+
trace?: never;
|
|
234
|
+
};
|
|
180
235
|
"/version": {
|
|
181
236
|
parameters: {
|
|
182
237
|
query?: never;
|
|
@@ -215,6 +270,61 @@ export interface paths {
|
|
|
215
270
|
export type webhooks = Record<string, never>;
|
|
216
271
|
export interface components {
|
|
217
272
|
schemas: {
|
|
273
|
+
/**
|
|
274
|
+
* Collection
|
|
275
|
+
* @description One collection to sample.
|
|
276
|
+
*
|
|
277
|
+
* Mirrors the payload ``hestia_earth.earth_engine`` accepts so the models can
|
|
278
|
+
* swap one for the other without reshaping the query. Fields beyond
|
|
279
|
+
* ``collection`` (``band_name``, ``reducer``, ``name``, depth bounds) are
|
|
280
|
+
* carried for compatibility and ignored when sampling by coordinates -- a
|
|
281
|
+
* point needs no reduction, and the soil depth is already encoded in the
|
|
282
|
+
* collection name.
|
|
283
|
+
*/
|
|
284
|
+
Collection: {
|
|
285
|
+
/** Collection */
|
|
286
|
+
collection: string;
|
|
287
|
+
} & {
|
|
288
|
+
[key: string]: unknown;
|
|
289
|
+
};
|
|
290
|
+
/** Coordinate */
|
|
291
|
+
Coordinate: {
|
|
292
|
+
/** Latitude */
|
|
293
|
+
latitude: number;
|
|
294
|
+
/** Longitude */
|
|
295
|
+
longitude: number;
|
|
296
|
+
};
|
|
297
|
+
/**
|
|
298
|
+
* GeospatialQuery
|
|
299
|
+
* @description One of ``coordinates``, ``boundaries`` or ``gadm-ids``.
|
|
300
|
+
*
|
|
301
|
+
* ``hestia_earth.earth_engine.run`` picks its mode from whichever key is
|
|
302
|
+
* present, so the same payload works against either backend.
|
|
303
|
+
*/
|
|
304
|
+
GeospatialQuery: {
|
|
305
|
+
/** Ee Type */
|
|
306
|
+
ee_type?: string | null;
|
|
307
|
+
/** Collections */
|
|
308
|
+
collections: components["schemas"]["Collection"][];
|
|
309
|
+
/** Coordinates */
|
|
310
|
+
coordinates?: components["schemas"]["Coordinate"][] | null;
|
|
311
|
+
/** Boundaries */
|
|
312
|
+
boundaries?: {
|
|
313
|
+
[key: string]: unknown;
|
|
314
|
+
}[] | null;
|
|
315
|
+
/** Gadm-Ids */
|
|
316
|
+
"gadm-ids"?: string[] | null;
|
|
317
|
+
/** Scale */
|
|
318
|
+
scale?: number | null;
|
|
319
|
+
};
|
|
320
|
+
/**
|
|
321
|
+
* GeospatialResults
|
|
322
|
+
* @description Values ordered coordinate-major: per coordinate, one per collection.
|
|
323
|
+
*/
|
|
324
|
+
GeospatialResults: {
|
|
325
|
+
/** Results */
|
|
326
|
+
results: (number | null)[];
|
|
327
|
+
};
|
|
218
328
|
/** HTTPValidationError */
|
|
219
329
|
HTTPValidationError: {
|
|
220
330
|
/** Detail */
|
|
@@ -822,6 +932,59 @@ export interface operations {
|
|
|
822
932
|
};
|
|
823
933
|
};
|
|
824
934
|
};
|
|
935
|
+
list_collections_geospatial_collections_get: {
|
|
936
|
+
parameters: {
|
|
937
|
+
query?: never;
|
|
938
|
+
header?: never;
|
|
939
|
+
path?: never;
|
|
940
|
+
cookie?: never;
|
|
941
|
+
};
|
|
942
|
+
requestBody?: never;
|
|
943
|
+
responses: {
|
|
944
|
+
/** @description Successful Response */
|
|
945
|
+
200: {
|
|
946
|
+
headers: {
|
|
947
|
+
[name: string]: unknown;
|
|
948
|
+
};
|
|
949
|
+
content: {
|
|
950
|
+
"application/json": unknown;
|
|
951
|
+
};
|
|
952
|
+
};
|
|
953
|
+
};
|
|
954
|
+
};
|
|
955
|
+
run_query_geospatial_run_post: {
|
|
956
|
+
parameters: {
|
|
957
|
+
query?: never;
|
|
958
|
+
header?: never;
|
|
959
|
+
path?: never;
|
|
960
|
+
cookie?: never;
|
|
961
|
+
};
|
|
962
|
+
requestBody: {
|
|
963
|
+
content: {
|
|
964
|
+
"application/json": components["schemas"]["GeospatialQuery"];
|
|
965
|
+
};
|
|
966
|
+
};
|
|
967
|
+
responses: {
|
|
968
|
+
/** @description Successful Response */
|
|
969
|
+
200: {
|
|
970
|
+
headers: {
|
|
971
|
+
[name: string]: unknown;
|
|
972
|
+
};
|
|
973
|
+
content: {
|
|
974
|
+
"application/json": components["schemas"]["GeospatialResults"];
|
|
975
|
+
};
|
|
976
|
+
};
|
|
977
|
+
/** @description Validation Error */
|
|
978
|
+
422: {
|
|
979
|
+
headers: {
|
|
980
|
+
[name: string]: unknown;
|
|
981
|
+
};
|
|
982
|
+
content: {
|
|
983
|
+
"application/json": components["schemas"]["HTTPValidationError"];
|
|
984
|
+
};
|
|
985
|
+
};
|
|
986
|
+
};
|
|
987
|
+
};
|
|
825
988
|
version_version_get: {
|
|
826
989
|
parameters: {
|
|
827
990
|
query?: never;
|
package/openapi.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "HESTIA Caching API",
|
|
5
|
-
"version": "0.1.
|
|
5
|
+
"version": "0.1.4"
|
|
6
6
|
},
|
|
7
7
|
"paths": {
|
|
8
8
|
"/sites/{key}": {
|
|
@@ -700,6 +700,78 @@
|
|
|
700
700
|
}
|
|
701
701
|
}
|
|
702
702
|
},
|
|
703
|
+
"/geospatial/collections": {
|
|
704
|
+
"get": {
|
|
705
|
+
"tags": [
|
|
706
|
+
"geospatial"
|
|
707
|
+
],
|
|
708
|
+
"summary": "List Collections",
|
|
709
|
+
"description": "The collections this API can answer for.\n\nCallers hold a mix: the ones HESTIA owns are served here, the public Earth\nEngine ones are not. Since `/run` rejects a query it cannot answer *in\nfull*, a caller batching collections together needs to know the split up\nfront rather than discovering it from a 422.",
|
|
710
|
+
"operationId": "list_collections_geospatial_collections_get",
|
|
711
|
+
"responses": {
|
|
712
|
+
"200": {
|
|
713
|
+
"description": "Successful Response",
|
|
714
|
+
"content": {
|
|
715
|
+
"application/json": {
|
|
716
|
+
"schema": {}
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
},
|
|
721
|
+
"security": [
|
|
722
|
+
{
|
|
723
|
+
"APIKeyHeader": []
|
|
724
|
+
}
|
|
725
|
+
]
|
|
726
|
+
}
|
|
727
|
+
},
|
|
728
|
+
"/geospatial/run": {
|
|
729
|
+
"post": {
|
|
730
|
+
"tags": [
|
|
731
|
+
"geospatial"
|
|
732
|
+
],
|
|
733
|
+
"summary": "Run Query",
|
|
734
|
+
"description": "Samples the exported geospatial assets at coordinates, or reduces them over\nboundaries or GADM regions.\n\nAccepts the same payload as ``hestia_earth.earth_engine.run`` so the models\ncan call this instead, and returns the values in the same order:\ngeometry-major, one value per collection.\n\nOnly collections HESTIA owns are served here. Public Earth Engine\ncollections (ERA5, TERRACLIMATE, GMTED2010) are rejected rather than\nsilently returning nothing -- the caller is expected to route those to\nEarth Engine.",
|
|
735
|
+
"operationId": "run_query_geospatial_run_post",
|
|
736
|
+
"requestBody": {
|
|
737
|
+
"content": {
|
|
738
|
+
"application/json": {
|
|
739
|
+
"schema": {
|
|
740
|
+
"$ref": "#/components/schemas/GeospatialQuery"
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
},
|
|
744
|
+
"required": true
|
|
745
|
+
},
|
|
746
|
+
"responses": {
|
|
747
|
+
"200": {
|
|
748
|
+
"description": "Successful Response",
|
|
749
|
+
"content": {
|
|
750
|
+
"application/json": {
|
|
751
|
+
"schema": {
|
|
752
|
+
"$ref": "#/components/schemas/GeospatialResults"
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
},
|
|
757
|
+
"422": {
|
|
758
|
+
"description": "Validation Error",
|
|
759
|
+
"content": {
|
|
760
|
+
"application/json": {
|
|
761
|
+
"schema": {
|
|
762
|
+
"$ref": "#/components/schemas/HTTPValidationError"
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
},
|
|
768
|
+
"security": [
|
|
769
|
+
{
|
|
770
|
+
"APIKeyHeader": []
|
|
771
|
+
}
|
|
772
|
+
]
|
|
773
|
+
}
|
|
774
|
+
},
|
|
703
775
|
"/version": {
|
|
704
776
|
"get": {
|
|
705
777
|
"tags": [
|
|
@@ -738,6 +810,154 @@
|
|
|
738
810
|
},
|
|
739
811
|
"components": {
|
|
740
812
|
"schemas": {
|
|
813
|
+
"Collection": {
|
|
814
|
+
"properties": {
|
|
815
|
+
"collection": {
|
|
816
|
+
"type": "string",
|
|
817
|
+
"title": "Collection"
|
|
818
|
+
}
|
|
819
|
+
},
|
|
820
|
+
"additionalProperties": true,
|
|
821
|
+
"type": "object",
|
|
822
|
+
"required": [
|
|
823
|
+
"collection"
|
|
824
|
+
],
|
|
825
|
+
"title": "Collection",
|
|
826
|
+
"description": "One collection to sample.\n\nMirrors the payload ``hestia_earth.earth_engine`` accepts so the models can\nswap one for the other without reshaping the query. Fields beyond\n``collection`` (``band_name``, ``reducer``, ``name``, depth bounds) are\ncarried for compatibility and ignored when sampling by coordinates -- a\npoint needs no reduction, and the soil depth is already encoded in the\ncollection name."
|
|
827
|
+
},
|
|
828
|
+
"Coordinate": {
|
|
829
|
+
"properties": {
|
|
830
|
+
"latitude": {
|
|
831
|
+
"type": "number",
|
|
832
|
+
"maximum": 90.0,
|
|
833
|
+
"minimum": -90.0,
|
|
834
|
+
"title": "Latitude"
|
|
835
|
+
},
|
|
836
|
+
"longitude": {
|
|
837
|
+
"type": "number",
|
|
838
|
+
"maximum": 180.0,
|
|
839
|
+
"minimum": -180.0,
|
|
840
|
+
"title": "Longitude"
|
|
841
|
+
}
|
|
842
|
+
},
|
|
843
|
+
"type": "object",
|
|
844
|
+
"required": [
|
|
845
|
+
"latitude",
|
|
846
|
+
"longitude"
|
|
847
|
+
],
|
|
848
|
+
"title": "Coordinate"
|
|
849
|
+
},
|
|
850
|
+
"GeospatialQuery": {
|
|
851
|
+
"properties": {
|
|
852
|
+
"ee_type": {
|
|
853
|
+
"anyOf": [
|
|
854
|
+
{
|
|
855
|
+
"type": "string"
|
|
856
|
+
},
|
|
857
|
+
{
|
|
858
|
+
"type": "null"
|
|
859
|
+
}
|
|
860
|
+
],
|
|
861
|
+
"title": "Ee Type"
|
|
862
|
+
},
|
|
863
|
+
"collections": {
|
|
864
|
+
"items": {
|
|
865
|
+
"$ref": "#/components/schemas/Collection"
|
|
866
|
+
},
|
|
867
|
+
"type": "array",
|
|
868
|
+
"minItems": 1,
|
|
869
|
+
"title": "Collections"
|
|
870
|
+
},
|
|
871
|
+
"coordinates": {
|
|
872
|
+
"anyOf": [
|
|
873
|
+
{
|
|
874
|
+
"items": {
|
|
875
|
+
"$ref": "#/components/schemas/Coordinate"
|
|
876
|
+
},
|
|
877
|
+
"type": "array"
|
|
878
|
+
},
|
|
879
|
+
{
|
|
880
|
+
"type": "null"
|
|
881
|
+
}
|
|
882
|
+
],
|
|
883
|
+
"title": "Coordinates"
|
|
884
|
+
},
|
|
885
|
+
"boundaries": {
|
|
886
|
+
"anyOf": [
|
|
887
|
+
{
|
|
888
|
+
"items": {
|
|
889
|
+
"additionalProperties": true,
|
|
890
|
+
"type": "object"
|
|
891
|
+
},
|
|
892
|
+
"type": "array"
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
"type": "null"
|
|
896
|
+
}
|
|
897
|
+
],
|
|
898
|
+
"title": "Boundaries"
|
|
899
|
+
},
|
|
900
|
+
"gadm-ids": {
|
|
901
|
+
"anyOf": [
|
|
902
|
+
{
|
|
903
|
+
"items": {
|
|
904
|
+
"type": "string"
|
|
905
|
+
},
|
|
906
|
+
"type": "array"
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
"type": "null"
|
|
910
|
+
}
|
|
911
|
+
],
|
|
912
|
+
"title": "Gadm-Ids"
|
|
913
|
+
},
|
|
914
|
+
"scale": {
|
|
915
|
+
"anyOf": [
|
|
916
|
+
{
|
|
917
|
+
"type": "number",
|
|
918
|
+
"exclusiveMinimum": 0.0
|
|
919
|
+
},
|
|
920
|
+
{
|
|
921
|
+
"type": "null"
|
|
922
|
+
}
|
|
923
|
+
],
|
|
924
|
+
"title": "Scale"
|
|
925
|
+
}
|
|
926
|
+
},
|
|
927
|
+
"type": "object",
|
|
928
|
+
"required": [
|
|
929
|
+
"collections"
|
|
930
|
+
],
|
|
931
|
+
"title": "GeospatialQuery",
|
|
932
|
+
"description": "One of ``coordinates``, ``boundaries`` or ``gadm-ids``.\n\n``hestia_earth.earth_engine.run`` picks its mode from whichever key is\npresent, so the same payload works against either backend."
|
|
933
|
+
},
|
|
934
|
+
"GeospatialResults": {
|
|
935
|
+
"properties": {
|
|
936
|
+
"results": {
|
|
937
|
+
"items": {
|
|
938
|
+
"anyOf": [
|
|
939
|
+
{
|
|
940
|
+
"type": "number"
|
|
941
|
+
},
|
|
942
|
+
{
|
|
943
|
+
"type": "integer"
|
|
944
|
+
},
|
|
945
|
+
{
|
|
946
|
+
"type": "null"
|
|
947
|
+
}
|
|
948
|
+
]
|
|
949
|
+
},
|
|
950
|
+
"type": "array",
|
|
951
|
+
"title": "Results"
|
|
952
|
+
}
|
|
953
|
+
},
|
|
954
|
+
"type": "object",
|
|
955
|
+
"required": [
|
|
956
|
+
"results"
|
|
957
|
+
],
|
|
958
|
+
"title": "GeospatialResults",
|
|
959
|
+
"description": "Values ordered coordinate-major: per coordinate, one per collection."
|
|
960
|
+
},
|
|
741
961
|
"HTTPValidationError": {
|
|
742
962
|
"properties": {
|
|
743
963
|
"detail": {
|