KML vers couche (Conversion)

Synthèse

Convertit un fichier .kml ou .kmz en classes d’entités et en un fichier de couche. Le fichier de couche conserve la symbologie du fichier .kml ou .kmz en entrée.

En savoir plus sur la prise en charge de KML dans ArcGIS

Utilisation

  • Cet outil crée une géodatabase fichier qui contient une classe d’entités dans un jeu de classes d’entités. La classe d’entités est nommée point, line, polygon ou multipatches en fonction des entités d’origine du fichier en entrée. Il existe, au même niveau de dossier que la géodatabase fichier, un fichier de couche qui peut être ajouté à une carte pour dessiner les entités. Ce fichier de couche dessine les entités en fonction de leur structure ponctuelle, linéaire ou surfacique, tout en conservant la symbologie KML d’origine.

    Chaque classe d’entités créée présente des attributs qui contiennent des informations sur le fichier en entrée. La structure des dossiers d’origine, le nom et les informations contextuelles, ainsi que les champs qui permettent de définir la position des entités sur une surface, constituent les attributs de chaque entité.

  • Les rasters ou les superpositions au sol sont convertis en jeu de données mosaïque dans la géodatabase fichier. Le raster source au format natif figure dans le dossier GroundOverlays au même niveau que la géodatabase fichier en sortie. Les superpositions au sol ne sont pas converties par défaut. Utilisez le paramètre Inclure la superposition au sol pour créer des rasters.

    Licence :

    L’utilisation du paramètre Inclure la superposition au sol pour créer un jeu de données mosaïque nécessite une licence Desktop Standard.

    Remarque :

    La conversion de superpositions avec l’outil KML vers couche peut prendre du temps, selon les données sources. Tous les rasters et toutes les superpositions disponibles dans le fichier KML sont convertis. Toute l’imagerie est convertie si un fichier KML fait référence à un service qui propose de l’imagerie. La conversion d’une imagerie très détaillée peut prendre beaucoup de temps en raison de la taille des fichiers.

  • La sortie est générée dans le système de coordonnées WGS84. Il est possible de reprojeter les entités en sortie dans un autre système de coordonnées à l’aide de l’outil Projeter.

  • Il est possible de spécifier en entrée des fichiers KMZ dans la version 2.2 et les versions antérieures de la norme OGC KML. Les localisations ponctuelles qui font appel à des balises d’adresse (par géocodage) ne sont pas pris en charge. La localisation doit être spécifiée selon sa latitude et sa longitude dans le fichier KML source.

  • AllSource 1.3 intègre la prise en charge native des formats KML et KMZ comme sources de données. Pour effectuer des opérations de géotraitement sur des couches KML, vous devez les convertir en entités dans une géodatabase fichier. À l’aide de l’outil KML vers couche, sélectionnez la couche KML dans le menu Contenu et faites-la glisser vers le paramètre Fichier KML en entrée de l’outil. Après la conversion, effectuez l’opération de géotraitement sur la nouvelle sortie.

Paramètres

ÉtiquetteExplicationType de données
Fichier KML en entrée

Fichier .kml ou .kmz à convertir.

File; KML Layer
Emplacement en sortie

Dossier de destination de la géodatabase fichier et du fichier de couche (.lyrx).

Folder
Nom des données en sortie
(Facultatif)

Nom de la géodatabase fichier et du fichier de couche en sortie. Le nom par défaut est celui du fichier en entrée.

String
Inclure la superposition au sol
(Facultatif)

Spécifie si les superpositions au sol du fichier KML (raster, photos aériennes, etc.) sont incluse dans la sortie.

Soyez prudent si le fichier KMZ désigne un service qui propose de l’imagerie raster. L’outil tente de convertir l’imagerie raster à toutes les échelles disponibles. Ce processus risque de prendre du temps et de surcharger le service.

  • Activé : les superpositions au sol sont incluses dans la sortie.
  • Désactivé : les superpositions au sol ne sont pas incluses dans la sortie. Il s’agit de l’option par défaut.
Boolean

Sortie obtenue

ÉtiquetteExplicationType de données
Fichier de couche en sortie

Fichier de couche en sortie.

Group Layer
Géodatabase fichier en sortie

Géodatabase en sortie contenant une classe d’entités dans un jeu de classes d’entités.

Workspace

arcpy.conversion.KMLToLayer(in_kml_file, output_folder, {output_data}, {include_groundoverlay})
NomExplicationType de données
in_kml_file

Fichier .kml ou .kmz à convertir.

File; KML Layer
output_folder

Dossier de destination de la géodatabase fichier et du fichier de couche (.lyrx).

Folder
output_data
(Facultatif)

Nom de la géodatabase fichier et du fichier de couche en sortie. Le nom par défaut est celui du fichier en entrée.

String
include_groundoverlay
(Facultatif)

Spécifie si les superpositions au sol (raster, photos aériennes, etc.) sont utilisées.

Soyez prudent si le fichier KMZ désigne un service qui propose de l’imagerie raster. L’outil tente de convertir l’imagerie raster à toutes les échelles disponibles. Ce processus risque de prendre du temps et de surcharger le service.

  • GROUNDOVERLAYLes superpositions au sol sont incluses dans la sortie.
  • NO_GROUNDOVERLAYLes superpositions au sol ne sont pas incluses dans la sortie. Il s’agit de l’option par défaut.
Boolean

Sortie obtenue

NomExplicationType de données
output_layer

Fichier de couche en sortie.

Group Layer
out_geodatabase

Géodatabase en sortie contenant une classe d’entités dans un jeu de classes d’entités.

Workspace

Exemple de code

Exemple 1 d’utilisation de la fonction KMLToLayer (fenêtre Python)

Convertir un fichier KMZ en géodatabase fichier à partir de la fenêtre Python.

import arcpy

arcpy.KMLToLayer_conversion(r'C:\kmls\earthquakes.kml',r'C:\gisdata\fromkmls','earthquake_09')
Exemple 2 d’utilisation de la fonction KMLToLayer (script autonome)

Le script suivant convertit un dossier de fichiers .kmz et .kml vers leurs géodatabases fichier respectives. Les classes d’entités figurant dans ces géodatabases fichier sont alors regroupées en une seule géodatabase fichier.

Remarque :
Ce script ne permet pas de conserver les fichiers de couche de la fonction KMLToLayer.

# Name: BatchKML_to_GDB.py
# Description: Convert a directory of KMLs and copies the output into a single 
#              fGDB. A 2-step process: first convert the KML files; then 
#              copy the feature classes.

# Import system modules
import arcpy
import os

# Set workspace (where all the KMLs are)
arcpy.env.workspace = "C:/VancouverData/KML"

# Set local variables and location for the consolidated file geodatabase
out_location = "C:/WorkingData/fGDBs"
gdb = 'AllKMLLayers.gdb'
gdb_location = os.path.join(out_location, gdb)

# Create the primary file geodatabase
arcpy.management.CreateFileGDB(out_location, gdb)

# Convert all KMZ and KML files found in the current workspace
for kmz in arcpy.ListFiles('*.KM*'):
    print("CONVERTING: {0}".format(os.path.join(arcpy.env.workspace, kmz)))
    arcpy.conversion.KMLToLayer(kmz, out_location)

# Change the workspace to fGDB location
arcpy.env.workspace = out_location

# Loop through all the file geodatabases in the workspace
wks = arcpy.ListWorkspaces('*', 'FileGDB')
# Skip the primary GDB
wks.remove(gdb_location)

for fgdb in wks:
    # Change the workspace to the current file geodatabase
    arcpy.env.workspace = fgdb

    # For every feature class inside, copy it to the primary and use the name 
    # from the original fGDB  
    feature_classes = arcpy.ListFeatureClasses('*', '', 'Placemarks')
    for fc in feature_classes:
        print("COPYING: {} FROM: {}".format(fc, fgdb))
        fcCopy = os.path.join(fgdb, 'Placemarks', fc)
        arcpy.conversion.FeatureClassToFeatureClass(
            fcCopy, gdb_location, fgdb[fgdb.rfind(os.sep) + 1:-4])
Exemple 3 d’utilisation de la fonction KMLToLayer (script autonome)

Le script suivant convertit un fichier .kmz et extrait les données contextuelles HTML vers des attributs de champ.

Remarque :
Ce script ne permet pas de conserver les fichiers de couche de la fonction KMLToLayer.

# Name: Extract_KML_popup_table.py
# Description: Convert a .kmz file and transfer a 2-column table from the pop-up 
#              to the field attributes.

# Import system modules
import arcpy
import os

# Set local variables and location for the consolidated file geodatabase
out_location = "C:/WorkingData/fGDBs"
gdb = 'SCP BoardDistricts.gdb'
gdb_location = os.path.join(out_location, gdb)

# Set kmz path
kmz = os.path.join(out_location, "SCP BoardDistricts.kmz")

# Convert all KMZ files to feature in the current workspace
arcpy.conversion.KMLToLayer(kmz, out_location)
    
# Change the workspace to fGDB location
arcpy.env.workspace = gdb_location

# Loop through all the file geodatabases in the workspace
feature_classes = arcpy.ListFeatureClasses('*', '', 'Placemarks')
for fc in feature_classes:
    popup_info_field_name = 'PopupInfo'
    field_names = [['gs_guid', 'TEXT', '#', 255, None, ''], 
                   ['gs_vc_revision', 'TEXT', '#', 255, None, ''], 
                   ['gs_vc_modified_sw', 'TEXT', '#', 255, None, ''], 
                   ['gs_old_objectid', 'TEXT', '#', 255, None, ''], 
                   ['gs_date_created', 'TEXT', '#', 255, None, ''], 
                   ['gs_date_modified', 'TEXT', '#', 255, None, ''], 
                   ['gs_code', 'TEXT', '#', 255, None, ''], 
                   ['gs_reference_scale', 'TEXT', '#', 255, None, ''], 
                   ['gs_description', 'TEXT', '#', 255, None, ''], 
                   ['gs_plot_scale', 'TEXT', '#', 255, None, ''], 
                   ['gs_nisc_guid', 'TEXT', '#', 255, None, ''], 
                   ['gs_mapped_by', 'TEXT', '#', 255, None, ''], 
                   ['gs_district', 'TEXT', 'Name', 255, None, ''], 
                   ['gs_boardmember', 'TEXT', '#', 255, None, ''], 
                   ['gs_servicetype', 'TEXT', 'Name', 255, None, ''], 
                   ['gs_legacy_futuraguid', 'TEXT', '#', 255, None, ''], 
                   ['gs_last_modified_by', 'TEXT', '#', 255, None, ''], 
                   ['gs_shape_from_gps_sw', 'TEXT', '#', 255, None, ''], 
                   ['gs_district_code', 'TEXT', '#', 255, None, ''], 
                   ['gs_district_name', 'TEXT', '#', 255, None, '']]
    arcpy.management.AddFields(fc, field_names, None)
    field_calculation = [[calc[0], f"extract_field(!{popup_info_field_name}!, '{calc[0]}')"] for calc in field_names]
    arcpy.management.CalculateFields(
        fc, "PYTHON3", field_calculation, 
"""from lxml import etree as _etree
def extract_field(s, field):
    ''' Extract fields from pop-up from each record within the calculate field tool '''
    html = _etree.HTML(s)

    # Get all 'td'
    rows = html.xpath('//table/tr/td')
    next_value = False
    for row in rows:
        c = row.text
        if next_value:
            return c
        if c == field:
            next_value = True
    return None""", 
        "NO_ENFORCE_DOMAINS")