@radiantearth/stac-migrate 2.1.1 → 2.2.0
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 +24 -5
- package/migrate.js +100 -9
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,6 +57,10 @@ The commands follow the different methods above and has the same "restrictions"
|
|
|
57
57
|
|
|
58
58
|
_A non-standalone Collection (with `child`/`item` links) migrated on its own drops its shared `properties`; pass the Items via `Migrate.item(item, collection)` to keep them._
|
|
59
59
|
|
|
60
|
+
- Contacts 1.0.1
|
|
61
|
+
|
|
62
|
+
_Migrates from 0.1.0 onwards. The structure of 0.0.1 is not converted._
|
|
63
|
+
|
|
60
64
|
- Data Cube 2.3.0
|
|
61
65
|
|
|
62
66
|
_A `cube:dimensions` `reference_system` given as a PROJ4 or WKT string is not converted to the 2.0.0 representation._
|
|
@@ -70,7 +74,7 @@ The commands follow the different methods above and has the same "restrictions"
|
|
|
70
74
|
|
|
71
75
|
_`file:nodata` maps to the single-valued `nodata` (first value kept); extra values are copied to a non-standard `nodata:values`._
|
|
72
76
|
|
|
73
|
-
- Instruments 0.
|
|
77
|
+
- Instruments 0.2.0
|
|
74
78
|
- Item Asset Definition 1.0.0 (legacy)
|
|
75
79
|
- Label 1.0.1
|
|
76
80
|
- Order 1.1.0
|
|
@@ -78,15 +82,30 @@ The commands follow the different methods above and has the same "restrictions"
|
|
|
78
82
|
|
|
79
83
|
_`pc:encoding` is not rewritten and left in place._
|
|
80
84
|
|
|
81
|
-
- Processing 1.
|
|
82
|
-
- Product 1.
|
|
83
|
-
|
|
85
|
+
- Processing 1.3.0
|
|
86
|
+
- Product 1.1.0
|
|
87
|
+
|
|
88
|
+
_The deprecated `product:status` value `qualitydegraded` becomes `accepted` with `product:quality_status` set to `degraded`._
|
|
89
|
+
|
|
90
|
+
- Projection 2.1.0
|
|
84
91
|
- Raster 2.0.0
|
|
85
92
|
- SAR 1.3.2
|
|
86
93
|
- Satellite 1.2.0
|
|
87
94
|
- Scientific Citation 1.0.0
|
|
95
|
+
- Sentinel-1 0.2.0
|
|
96
|
+
|
|
97
|
+
_`s1:resolution`, `s1:product_identifier` and `s1:product_timeliness` are not migrated, as they have no 1:1 replacement._
|
|
98
|
+
|
|
99
|
+
- Sentinel-3 0.2.0
|
|
100
|
+
|
|
101
|
+
_`s3:product_name`, `s3:processing_timeliness`, `s3:lrm_mode`, `s3:sar_mode` and the `s3:gsd` objects are not migrated, as they have no 1:1 replacement._
|
|
102
|
+
|
|
103
|
+
- Sentinel-5P 0.2.0
|
|
104
|
+
|
|
105
|
+
_`s5p:product_name`, `s5p:spatial_resolution` and the product-specific objects are not migrated, as they have no 1:1 replacement._
|
|
106
|
+
|
|
88
107
|
- Single Item
|
|
89
|
-
- Table 1.
|
|
108
|
+
- Table 1.3.0
|
|
90
109
|
- Timestamps 1.1.0
|
|
91
110
|
- Versioning Indicators 1.2.0
|
|
92
111
|
- View Geometry 1.1.0
|
package/migrate.js
CHANGED
|
@@ -9,26 +9,47 @@ const DONE = true; // This is used to verify in code coverage whether something
|
|
|
9
9
|
const SCHEMAS = {
|
|
10
10
|
cf: 'https://stac-extensions.github.io/cf/v1.0.0/schema.json',
|
|
11
11
|
classification: 'https://stac-extensions.github.io/classification/v2.0.0/schema.json',
|
|
12
|
+
contacts: 'https://stac-extensions.github.io/contacts/v1.0.1/schema.json',
|
|
12
13
|
datacube: 'https://stac-extensions.github.io/datacube/v2.3.0/schema.json',
|
|
13
14
|
eo: 'https://stac-extensions.github.io/eo/v2.0.0/schema.json',
|
|
14
15
|
file: 'https://stac-extensions.github.io/file/v2.1.0/schema.json',
|
|
15
|
-
instruments: 'https://stac-extensions.github.io/instruments/v0.
|
|
16
|
+
instruments: 'https://stac-extensions.github.io/instruments/v0.2.0/schema.json',
|
|
16
17
|
'item-assets': 'https://stac-extensions.github.io/item-assets/v1.0.0/schema.json',
|
|
17
18
|
label: 'https://stac-extensions.github.io/label/v1.0.1/schema.json',
|
|
18
19
|
order: 'https://stac-extensions.github.io/order/v1.1.0/schema.json',
|
|
19
20
|
pointcloud: 'https://stac-extensions.github.io/pointcloud/v2.0.0/schema.json',
|
|
20
|
-
processing: 'https://stac-extensions.github.io/processing/v1.
|
|
21
|
-
product: 'https://stac-extensions.github.io/product/v1.
|
|
22
|
-
projection: 'https://stac-extensions.github.io/projection/v2.
|
|
21
|
+
processing: 'https://stac-extensions.github.io/processing/v1.3.0/schema.json',
|
|
22
|
+
product: 'https://stac-extensions.github.io/product/v1.1.0/schema.json',
|
|
23
|
+
projection: 'https://stac-extensions.github.io/projection/v2.1.0/schema.json',
|
|
23
24
|
raster: 'https://stac-extensions.github.io/raster/v2.0.0/schema.json',
|
|
24
25
|
sar: 'https://stac-extensions.github.io/sar/v1.3.2/schema.json',
|
|
25
26
|
sat: 'https://stac-extensions.github.io/sat/v1.2.0/schema.json',
|
|
26
27
|
scientific: 'https://stac-extensions.github.io/scientific/v1.0.0/schema.json',
|
|
27
|
-
|
|
28
|
+
'sentinel-1': 'https://stac-extensions.github.io/sentinel-1/v0.2.0/schema.json',
|
|
29
|
+
'sentinel-3': 'https://stac-extensions.github.io/sentinel-3/v0.2.0/schema.json',
|
|
30
|
+
'sentinel-5p': 'https://stac-extensions.github.io/sentinel-5p/v0.2.0/schema.json',
|
|
31
|
+
table: 'https://stac-extensions.github.io/table/v1.3.0/schema.json',
|
|
28
32
|
timestamps: 'https://stac-extensions.github.io/timestamps/v1.1.0/schema.json',
|
|
29
33
|
version: 'https://stac-extensions.github.io/version/v1.2.0/schema.json',
|
|
30
34
|
view: 'https://stac-extensions.github.io/view/v1.1.0/schema.json',
|
|
31
35
|
};
|
|
36
|
+
const S3_STATISTICS = [
|
|
37
|
+
'bright',
|
|
38
|
+
'closed_sea',
|
|
39
|
+
'coastal',
|
|
40
|
+
'continental_ice',
|
|
41
|
+
'cosmetic',
|
|
42
|
+
'dubious_samples',
|
|
43
|
+
'duplicated',
|
|
44
|
+
'fresh_inland_water',
|
|
45
|
+
'invalid',
|
|
46
|
+
'land',
|
|
47
|
+
'open_ocean',
|
|
48
|
+
'out_of_range',
|
|
49
|
+
'saline_water',
|
|
50
|
+
'saturated',
|
|
51
|
+
'tidal_region',
|
|
52
|
+
];
|
|
32
53
|
const EXTENSIONS = {
|
|
33
54
|
// Add a : at the end to indicate it has a prefix, otherwise list all fields separately (see version extension for example).
|
|
34
55
|
itemAndCollection: {
|
|
@@ -37,6 +58,7 @@ const EXTENSIONS = {
|
|
|
37
58
|
'cube:': SCHEMAS.datacube,
|
|
38
59
|
'eo:': SCHEMAS.eo,
|
|
39
60
|
'file:': SCHEMAS.file,
|
|
61
|
+
'instrument:': SCHEMAS.instruments,
|
|
40
62
|
'label:': SCHEMAS.label,
|
|
41
63
|
'pc:': SCHEMAS.pointcloud,
|
|
42
64
|
'processing:': SCHEMAS.processing,
|
|
@@ -931,6 +953,12 @@ var Fields = {
|
|
|
931
953
|
_.upgradeExtension(context, SCHEMAS.cf);
|
|
932
954
|
},
|
|
933
955
|
|
|
956
|
+
contacts(obj, context) {
|
|
957
|
+
_.forAll(obj, 'contacts', (c) => _.isObject(c) && _.rename(c, 'positionName', 'position')) && DONE;
|
|
958
|
+
|
|
959
|
+
_.upgradeExtension(context, SCHEMAS.contacts);
|
|
960
|
+
},
|
|
961
|
+
|
|
934
962
|
cube(obj, context) {
|
|
935
963
|
// We'd need to convert proj strings to something else for v1.0 -> v2.0, but that's unfeasible here.
|
|
936
964
|
// Nothing else to do here.
|
|
@@ -978,6 +1006,12 @@ var Fields = {
|
|
|
978
1006
|
_.upgradeExtension(context, SCHEMAS.file);
|
|
979
1007
|
},
|
|
980
1008
|
|
|
1009
|
+
instruments(obj, context) {
|
|
1010
|
+
_.rename(obj, 'instrument_modes', 'instrument:modes') && _.addExtension(context, SCHEMAS.instruments) && DONE;
|
|
1011
|
+
|
|
1012
|
+
_.upgradeExtension(context, SCHEMAS.instruments);
|
|
1013
|
+
},
|
|
1014
|
+
|
|
981
1015
|
label(obj, context) {
|
|
982
1016
|
// Migrate 0.8.0-rc1 non-pluralized forms
|
|
983
1017
|
if (V.before('0.8.0')) {
|
|
@@ -1015,8 +1049,18 @@ var Fields = {
|
|
|
1015
1049
|
_.upgradeExtension(context, SCHEMAS.processing);
|
|
1016
1050
|
},
|
|
1017
1051
|
|
|
1018
|
-
product(obj, context) {
|
|
1019
|
-
|
|
1052
|
+
product(obj, context, summaries) {
|
|
1053
|
+
const status = obj['product:status'];
|
|
1054
|
+
if (status === 'qualitydegraded' && !_.isDefined(obj['product:quality_status'])) {
|
|
1055
|
+
obj['product:status'] = 'accepted';
|
|
1056
|
+
obj['product:quality_status'] = 'degraded';
|
|
1057
|
+
DONE;
|
|
1058
|
+
} else if (summaries && Array.isArray(status) && status.includes('qualitydegraded')) {
|
|
1059
|
+
obj['product:status'] = [...new Set(status.map((s) => (s === 'qualitydegraded' ? 'accepted' : s)))];
|
|
1060
|
+
_.ensure(obj, 'product:quality_status', []);
|
|
1061
|
+
!obj['product:quality_status'].includes('degraded') && obj['product:quality_status'].push('degraded');
|
|
1062
|
+
DONE;
|
|
1063
|
+
}
|
|
1020
1064
|
|
|
1021
1065
|
_.upgradeExtension(context, SCHEMAS.product);
|
|
1022
1066
|
},
|
|
@@ -1070,8 +1114,8 @@ var Fields = {
|
|
|
1070
1114
|
|
|
1071
1115
|
_.rename(obj, 'sar:product_type', 'product:type') && _.addExtension(context, SCHEMAS.product) && DONE;
|
|
1072
1116
|
|
|
1073
|
-
if (_.rename(obj, 'sar:instrument_mode', '
|
|
1074
|
-
!summary && _.toArray(obj, '
|
|
1117
|
+
if (_.rename(obj, 'sar:instrument_mode', 'instrument:modes')) {
|
|
1118
|
+
!summary && _.toArray(obj, 'instrument:modes');
|
|
1075
1119
|
_.addExtension(context, SCHEMAS.instruments) && DONE;
|
|
1076
1120
|
}
|
|
1077
1121
|
|
|
@@ -1090,6 +1134,53 @@ var Fields = {
|
|
|
1090
1134
|
_.upgradeExtension(context, SCHEMAS.sat);
|
|
1091
1135
|
},
|
|
1092
1136
|
|
|
1137
|
+
s1(obj, context) {
|
|
1138
|
+
_.rename(obj, 's1:processing_datetime', 'processing:datetime') &&
|
|
1139
|
+
_.addExtension(context, SCHEMAS.processing) &&
|
|
1140
|
+
DONE;
|
|
1141
|
+
_.rename(obj, 's1:processing_level', 'processing:level') &&
|
|
1142
|
+
_.mapValues(obj, 'processing:level', ['0', '1', '2'], ['L0', 'L1', 'L2']) &&
|
|
1143
|
+
_.addExtension(context, SCHEMAS.processing) &&
|
|
1144
|
+
DONE;
|
|
1145
|
+
_.rename(obj, 's1:shape', 'proj:shape') && _.addExtension(context, SCHEMAS.projection) && DONE;
|
|
1146
|
+
|
|
1147
|
+
_.upgradeExtension(context, SCHEMAS['sentinel-1']);
|
|
1148
|
+
},
|
|
1149
|
+
|
|
1150
|
+
s3(obj, context, summaries) {
|
|
1151
|
+
_.rename(obj, 's3:product_type', 'product:type') && _.addExtension(context, SCHEMAS.product) && DONE;
|
|
1152
|
+
_.rename(obj, 's3:snow_or_ice', 'eo:snow_cover') && _.addExtension(context, SCHEMAS.eo) && DONE;
|
|
1153
|
+
|
|
1154
|
+
// Only the numeric GSD maps to gsd, the GSD objects of the other products are ambiguous
|
|
1155
|
+
const gsd = obj['s3:gsd'];
|
|
1156
|
+
if (_.is(gsd, 'number') || (summaries && Array.isArray(gsd) && gsd.every((v) => _.is(v, 'number')))) {
|
|
1157
|
+
_.rename(obj, 's3:gsd', 'gsd') && DONE;
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
if (!summaries) {
|
|
1161
|
+
for (let key of S3_STATISTICS) {
|
|
1162
|
+
let oldKey = 's3:' + key;
|
|
1163
|
+
if (_.is(obj[oldKey], 'number')) {
|
|
1164
|
+
_.ensure(obj, 'statistics', {});
|
|
1165
|
+
if (!_.isDefined(obj.statistics[key])) {
|
|
1166
|
+
obj.statistics[key] = obj[oldKey];
|
|
1167
|
+
delete obj[oldKey];
|
|
1168
|
+
DONE;
|
|
1169
|
+
}
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
|
|
1174
|
+
_.upgradeExtension(context, SCHEMAS['sentinel-3']);
|
|
1175
|
+
},
|
|
1176
|
+
|
|
1177
|
+
s5p(obj, context) {
|
|
1178
|
+
_.rename(obj, 's5p:product_type', 'product:type') && _.addExtension(context, SCHEMAS.product) && DONE;
|
|
1179
|
+
_.rename(obj, 's5p:shape', 'proj:shape') && _.addExtension(context, SCHEMAS.projection) && DONE;
|
|
1180
|
+
|
|
1181
|
+
_.upgradeExtension(context, SCHEMAS['sentinel-5p']);
|
|
1182
|
+
},
|
|
1183
|
+
|
|
1093
1184
|
sci(obj, context) {
|
|
1094
1185
|
// Nothing to do
|
|
1095
1186
|
|