Importer un fichier manifeste de table

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

  1. 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.
  2. Dans votre projet, activez l'API Cloud Storage et créez un bucket.
  3. Installez le client Python Earth Engine. Il inclut l'outil de ligne de commande earthengine, que nous utiliserons pour importer des données.
  4. 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 et gs://earthengine-test/region2.csv. Pour les ingérer en tant qu'éléments Earth Engine, créez un fichier manifeste avec deux entrées dans la liste 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
while:
    ...," 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.