Si vous avez besoin de plus de flexibilité pour importer des tables dans Google Earth Engine (EE) que celle proposée par l'interface utilisateur de l'éditeur de code ou par la commande upload
de l'outil de ligne de commande "earthengine", vous pouvez décrire une importation de table à l'aide d'un fichier JSON appelé "fichier manifeste" et à l'aide de la commande upload table --manifest
de l'outil de ligne de commande.
Configuration unique
- Les importations de fichiers manifestes ne fonctionnent qu'avec les fichiers situés dans Google Cloud Storage. Pour commencer à utiliser Google Cloud Storage, créez un projet Google Cloud, si vous n'en avez pas déjà un. Notez que la configuration nécessite de spécifier une carte de crédit pour la facturation. EE ne facture rien à ce stade, mais le transfert de fichiers vers Google Cloud Storage avant de les importer dans EE entraîne un petit coût. Pour les tailles de données d'importation typiques (dizaines ou centaines de gigaoctets), le coût est assez faible.
- Dans votre projet, activez l'API Cloud Storage et créez un bucket.
- Installez le client Python Earth Engine. Il inclut l'outil de ligne de commande
earthengine
, que nous utiliserons pour importer des données. - Pour les importations automatisées, vous pouvez utiliser un compte de service Google Cloud associé à votre projet. Vous n'avez pas besoin d'un compte de service pour les tests, mais lorsque vous avez le temps, veuillez commencer à vous familiariser avec leur utilisation.
ID et noms des éléments
Pour les composants de projets Cloud, utilisez projects/my_cloud_project/assets/my_asset
.
Pour les anciens projets, le nom de l'élément dans le fichier manifeste doit être légèrement différent de l'ID de l'élément visible ailleurs dans Earth Engine. Pour importer des composants dont les ID commencent par users/some_user
ou projects/some_project
, la chaîne projects/earthengine-legacy/assets/
doit être ajoutée au nom de l'élément dans le fichier manifeste. Par exemple, l'ID d'élément EE users/username/my_table
doit être importé avec le nom projects/earthengine-legacy/assets/users/username/my_table
.
Oui, cela signifie que les ID tels que projects/some_projects/some_asset
sont convertis en noms dans lesquels projects
est mentionné deux fois : projects/earthengine-legacy/assets/projects/some_projects/some_asset
.
Cette situation est déroutante, mais nécessaire pour se conformer aux normes de l'API Google Cloud.
Utiliser des fichiers manifestes
Le fichier manifeste le plus simple possible est présenté ci-dessous. Il importe un fichier nommé small.csv
à partir d'un bucket Google Cloud Storage nommé gs://earthengine-test
.
{ "name": "projects/some-project-id/assets/some-asset-id", "sources": [ { "uris": [ "gs://earthengine-test/small.csv" ] } ] }
Pour l'utiliser, enregistrez-le dans un fichier nommé manifest.json
, puis exécutez:
earthengine upload table --manifest /path/to/manifest.json
(Le fichier gs://earthengine-test/small.csv
existe et est lisible publiquement. Vous pouvez l'utiliser pour les tests.)
Pour les importations de fichiers de forme, spécifiez uniquement le fichier .shp. Les autres fichiers seront détectés automatiquement.
Sources multiples
Vous pouvez spécifier plusieurs sources CSV ou de fichiers de forme, avec un fichier par source. Dans ce cas, chaque fichier CSV doit avoir la même structure. Par exemple, nous avons deux fichiers CSV, region1.csv
et region2.csv
:
id | shape |
---|---|
1 | {"type":"Point","coordinates":[-119,36]} |
2 | {"type":"Point","coordinates":[-118,37]} |
3 | {"type":"Point","coordinates":[-117,38]} |
id | shape |
---|---|
4 | {"type":"Point","coordinates":[-112,40]} |
5 | {"type":"Point","coordinates":[-111,41]} |
6 | {"type":"Point","coordinates":[-110,42]} |
Elles ont la même structure, mais des contenus différents. Ils ont été importés dans un bucket Cloud Storage: gs://earthengine-test/region1.csv
gs://earthengine-test/region2.csv
sources
, comme suit:
{ "name": "projects/some-project-id/assets/some-asset-id", "sources": [ { "uris": [ "gs://earthengine-test/region1.csv" ] }, { "uris": [ "gs://earthengine-test/region2.csv" ] } ] }
Heures de début et de fin
Toutes les ressources doivent spécifier une heure de début et de fin pour donner plus de contexte aux données, en particulier si elles sont incluses dans des collections. Ces champs ne sont pas obligatoires, mais nous vous recommandons vivement de les utiliser dans la mesure du possible.
L'heure de début et de fin désigne généralement l'heure de l'observation, et non l'heure à laquelle le fichier source a été créé.
Pour simplifier, l'heure de fin est considérée comme une limite exclusive. Par exemple, pour les composants couvrant exactement une journée, utilisez minuit de deux jours consécutifs (par exemple, 1980-01-31T00:00:00 et 1980-02-01T00:00:00) pour l'heure de début et de fin. Si l'élément n'a pas de durée, définissez l'heure de fin sur la même que l'heure de début. Représentez les heures dans les fichiers manifestes sous forme de chaînes ISO 8601. Nous vous recommandons de supposer que l'heure de fin est exclusive (par exemple, minuit du jour suivant pour les composants quotidiens) afin de simplifier les valeurs de date.
Exemple :
{ "name": "projects/some-project-id/assets/some-asset-id", "sources": [ { "uris": [ "gs://bucket/table_20190612.csv" ] } ], "startTime": "1980-01-31T00:00:00Z", "endTime": "1980-02-01T00:00:00Z" }
Référence de la structure du fichier manifeste
La structure JSON suivante inclut tous les champs de fichier manifeste d'importation de table possibles. Vous trouverez les définitions des champs dans la section Définitions des champs du fichier manifeste suivante.
{ "name": <string>, "sources": [ { "uris": [ <string> ], "charset": <string>, "maxErrorMeters": <double>, "maxVertices": <int32>, "crs": <string>, "geodesic": <boolean>, "primaryGeometryColumn": <string>, "xColumn": <string>, "yColumn": <string>, "dateFormat": <string>, "csvDelimiter": <string>, "csvQualifier": <string>, } ], "uriPrefix": <string>, "startTime": { "seconds": <integer> }, "endTime": { "seconds": <integer> }, "properties": { <unspecified> } }
Définitions des champs du fichier manifeste
nom
string
Nom de l'asset à créer.
name
est au format "projects/*/assets/**" (par exemple, projects/earthengine-legacy/assets/users/USER/ASSET
).
sources
list
Liste des champs définissant les propriétés d'un fichier de table et de ses fichiers associés. Pour en savoir plus, consultez les champs d'élément de dictionnaire sources
suivants.
sources[i].uris
list
Liste des URI des données à ingérer. Pour le moment, seuls les URI Google Cloud Storage sont acceptés. Chaque URI doit être spécifié au format suivant : gs://bucket-id/object-id
.
L'objet principal doit être le premier élément de la liste, et les sidecars doivent être listés ensuite. Chaque URI est précédé de TableManifest.uri_prefix
, le cas échéant.
sources[i].charset
string
Nom du jeu de caractères par défaut à utiliser pour décoder les chaînes. Si cet élément est vide, le jeu de caractères "UTF-8" est utilisé par défaut.
sources[i].maxErrorMeters
double
Erreur maximale autorisée en mètres lors de la transformation de la géométrie entre les systèmes de coordonnées. Si ce champ est vide, l'erreur maximale est de 1 mètre par défaut.
sources[i].maxVertices
int32
Nombre maximal de sommets. Si la valeur n'est pas nulle, la géométrie sera subdivisée en éléments spatialement disjoints, chacun inférieur à cette limite.
sources[i].crs
string
Code de système de coordonnées de référence (CRS) ou chaîne WKT par défaut spécifiant le système de coordonnées de référence de toute géométrie pour laquelle aucun n'est spécifié. Si vous ne renseignez pas ce champ, la valeur par défaut est EPSG:4326. Pour les sources CSV/TFRecord uniquement.
sources[i].geodesic
boolean
Stratégie par défaut pour l'interprétation des arêtes dans une géométrie pour laquelle aucune autre stratégie n'est spécifiée. Si la valeur est "false", les arêtes sont droites dans la projection. Si la valeur est "true", les arêtes sont incurvées pour suivre le chemin le plus court à la surface de la Terre. Si ce champ est vide, la valeur par défaut est "false" si le CRS est un système de coordonnées projeté. Pour les sources CSV/TFRecord uniquement.
sources[i].primaryGeometryColumn
string
Colonne de géométrie à utiliser comme géométrie principale d'une ligne lorsqu'il existe plusieurs colonnes de géométrie.
Si vous ne renseignez pas ce champ et qu'il existe plusieurs colonnes de géométrie, la première colonne de géométrie rencontrée est utilisée. Pour les sources CSV/TFRecord uniquement.
sources[i].xColumn
string
Nom de la colonne de coordonnées X numériques pour déduire la géométrie des points. Si yColumn
est également spécifié et que les deux colonnes contiennent des valeurs numériques, une colonne de géométrie de point est créée avec des valeurs x,y dans le système de coordonnées indiqué dans le CRS. Si ce champ est laissé vide et que le système de coordonnées projeté n'est pas spécifié dans le système de coordonnées projeté, la valeur par défaut est "longitude". Si ce champ est laissé vide et que le système de coordonnées projeté est spécifié dans le SR, une chaîne vide est utilisée par défaut et aucune géométrie de point n'est générée.
Une colonne de géométrie de point générée sera nommée {xColumn}_{yColumn}_N
, où N est ajouté de sorte que {xColumn}_{yColumn}_N
soit unique si une colonne nommée {xColumn}_{yColumn}
existe déjà. Pour les sources CSV/TFRecord uniquement.
sources[i].yColumn
string
Nom de la colonne de coordonnées Y numériques pour déduire la géométrie des points. Si xColumn
est également spécifié et que les deux colonnes contiennent des valeurs numériques, une colonne de géométrie de point est créée avec des valeurs x,y dans le système de coordonnées indiqué dans le CRS. Si ce champ est laissé vide et que le système de coordonnées projeté n'est pas spécifié, la valeur par défaut est "latitude". Si ce champ est laissé vide et que le système de coordonnées projeté est spécifié dans le SRF, une chaîne vide est utilisée par défaut et aucune géométrie de point n'est générée.
Une colonne de géométrie de point générée sera nommée {xColumn}_{yColumn}_N
, où N est ajouté de sorte que {xColumn}_{yColumn}_N
soit unique si une colonne nommée {xColumn}_{yColumn}
existe déjà. Pour les sources CSV/TFRecord uniquement.
sources[i].dateFormat
string
Format permettant d'analyser les champs encodant des dates. Le format doit être conforme à la documentation de la classe DateTimeFormat de Joda-Time. Si vous ne renseignez pas ce champ, les dates seront importées sous forme de chaînes. Pour les sources CSV/TFRecord uniquement.
sources[i].csvDelimiter
string
Lors de l'ingestion de fichiers CSV, un seul caractère est utilisé comme séparateur entre les valeurs des colonnes d'une ligne. Si vous ne renseignez pas ce champ, la valeur par défaut est ','
.
Pour les sources CSV uniquement.
sources[i].csvQualifier
string
Lors de l'ingestion de fichiers CSV, caractère qui entoure les valeurs de colonne (également appelé "caractère de guillemet"). Si vous ne renseignez pas ce champ, la valeur par défaut est "
.
Pour les sources CSV uniquement.
Si une valeur de colonne n'est pas entourée de qualificatifs, les espaces de début et de fin sont supprimés. Exemple :
..., test,... <== this value is not qualified becomes the string value: "test" <== leading whitespace is stripped
...," test",... <== this value IS qualified with quotes becomes the string value: " test" <== leading whitespace remains!
uriPrefix
string
Préfixe facultatif ajouté au début de tous les uris
définis dans le fichier manifeste.
startTime
integer
Code temporel associé à l'élément, le cas échéant. Cela correspond généralement à l'heure à laquelle les données ont été collectées. Pour les composants qui correspondent à un intervalle de temps, comme les valeurs moyennes sur un mois ou une année, ce code temporel correspond au début de cet intervalle. Spécifié en secondes et (facultatif) en nanosecondes depuis l'epoch (1970-01-01). Supposé être dans le fuseau horaire UTC.
endTime
integer
Pour les composants qui correspondent à un intervalle de temps, comme les valeurs moyennes sur un mois ou une année, cet horodatage correspond à la fin de cet intervalle (exclusif). Spécifié en secondes et (facultatif) en nanosecondes depuis l'epoch (1970-01-01). Supposé être dans le fuseau horaire UTC.
du bucket
dictionary
Dictionnaire plat arbitraire de paires clé-valeur. Les clés doivent être des chaînes, et les valeurs peuvent être des nombres ou des chaînes. Les valeurs de liste ne sont pas encore acceptées pour les composants importés par l'utilisateur.
columnDataTypeOverrides
dictionary
Si la détection automatique des types ne fonctionne pas correctement, utilisez ce champ avec des noms de colonnes comme clés et l'une des constantes suivantes comme valeurs: COLUMN_DATA_TYPE_STRING, COLUMN_DATA_TYPE_NUMERIC ou COLUMN_DATA_TYPE_LONG.
Limites
Taille du fichier manifeste JSON
La taille maximale du fichier manifeste JSON est de 10 Mo. Si vous devez importer de nombreux fichiers, envisagez de réduire le nombre de caractères nécessaires pour décrire l'ensemble de données. Par exemple, utilisez le champ uriPrefix
pour ne pas avoir à fournir le chemin d'accès au bucket GCP pour chaque URI de la liste uris
. Si une réduction supplémentaire de la taille est nécessaire, essayez de raccourcir les noms de fichiers.