Bonjour, moi c’est drmm3, je souhaite écrire un script python qui me permettrait d’intégrer des données d’un fichier csv dans ArcMap avec python.
Bonjour,
et bienvenue sur le forum
A+
Pour commencer,
Je travail sur ArcMap, pour faire des cartes des îles de la Polynésie, et pour certaines d’entre elles, je dois insérer des données qui nous a été transmises. Le souci c’est qu’il y en a un paquet juste pour une île, c’est pour cela que je fais script qui pourrait le faire automatiquement.
j’ai des couches BAT d’une île qui contiennent les profils de relevé bathymétrique réalisé par Friot.
1- je dois insérer les champs X et Y (en mètre) ainsi que la date_relevé, nébuleuse, mer, vent
2-insérer le fichier .csv dans la carte
3-projeter en X, Y et Z( sur le champs profondeur, depth)
4- et exporter les données vers la classe d’entité de l’île dans une couche BAT_[ile]
Voici mon code :
import arcpy
import arcpy.da #pour utiliser les curseurs
import csv #lire le fichier bathy en entrée
import os #gestion des fichiers dur le disque
import datetime #convertir une chaine en date heure(date_releve)
arcpy.env.workspace = r"L:/spe/echange/Hereiti FANIU/Cours Python/test bathymetrie-27-11-2018.mdb" #initialisation de l'environnement de travail arcgis
#PARAMÈTRES EN ENTRÉE
#nom de ile
p_nom_ile = arcpy.GetParameterAsText(0)
ile = p_nom_ile.upper()
#chemin du fichier bat
p_chemin_bat = arcpy.GetParameterAsText(1)
#nom du fichier en csv
p_fichier_bat = arcpy.GetParameterAsText(2)
#position X en metre du point de relevé bathymétrie
p_X = arcpy.GetParameterAsText(3)
#position Y en mètre du point
p_Y = arcpy.GetParameterAsText(4)
#date_relevé
def StrToDateTime( Str, Format = '%d/%m/%Y %H:%M:%S'):
return datetime.datetime.fromtimestamp(
time.mktime(
time.strptime( Str, Format)))
p_date_relevé = StrToDateTime(arcpy.GetParameterAsText(5), '%d/%m/%Y %H:%M:%S')
#nébuleuse (entier court)
p_nébuleuse = int(arcpy.GetParameterAsText(6))
#mer (entier court)
p_mer = int(arcpy.GetParameterAsText(7))
#vent direction et force (texte 50)
p_vent = arcpy.GetParameterAsText(8)
#houle direction et période (texte 50)
p_houle = arcpy.GetParameterAsText(9)
#TRAITEMENTS
# 1 - Cherche si classe d’entité BAT_[ile] est dans le jeu de classe de l'ile
#l'ile ou il faut créer la couche est passée en paramètre
# 1-1 recherche si la couche existe
#p_objectid = 0
p_objectid = 0
if arcpy.Exists("BAT_"+ile):
#curseur de lecture pour récupérer le dernier ObjectID
with arcpy.da.SearchCursor(arcpy.env.workspace+"/"+ile+"/BAT_"+ile,["OID@"]) as recherche_oid :
#récupère le dernier objectid
for row in sorted(recherche_oid):
objectoid_exist = row[0]
if p_objectid < objectoid_exist:
p_objectid = objectoid_exist
print ('la couche BAT existe déjà pour l ile' +ile+ 'le dernier objectid est de' + str(p_objectid))
# 1-2 si elle n'existe pas alors création de la couche selon le modèle de bora avec z
else:
#set local variables
out_path = "L:/spe/echange/Hereiti FANIU/Cours Python/test bathymetrie-27-11-2018.mdb/"+ile
out_name = "BAT_"+ile
geometry_type = "POINT"
template = "X:/PERLISIG_DRMM.mdb/BORA_BORA/BAT_BORA_BORA"
has_m = "DISABLED"
has_Z = "ENABLED"
spatial_reference = arcpy.Describe(out_path).spatialReference
arcpy.CreateFeatureclass_management(out_path, out_name, geometry_type, template, has_m, has_Z, spatial_reference)
p_objectid = 0
print ("Une nouvelle classe d'entité BAT a été créée pour l'île"+ile)
#VARIABLES
#curseur d'ajout à la table bat_ile
#variable pour le curseur
in_table = "L:/spe/echange/Hereiti FANIU/Cours Python/test bathymetrie-27-11-2018.mdb/"+ile+"/BAT_"+ile
field_names = ["OID@", "Forme", "X", "Y", "Pressure_Decibar_", "SHAPE@Z", "Temperature_Celsius_", "Conductivity_MicroSiemensperCentimeter_", "Specificconductance_MicrosiemensperCentimeter_", "Salinity_PracticalSalinityScale_", "Soundvelocity_MetersperSecond_", "Density_KilogramsperCubicMeter_", "Date_releve", "Nebuleuse", "Mer", "Vent", "Houle"]
curseur_ecriture = arcpy.da.InsertCursor(in_table, field_names)
with open(p_fichier_bat, "r") as mon_csv:
mon_csv.readline()
mon_csv.readline()
for line in mon_csv:
linelist = line.split(";")
nums = [float(i) for i in linelist]
p_pressure = nums[0]
print(str(p_pressure))
p_depth = nums[1]
p_temp = nums[2]
p_conduct = nums[3]
p_specific = nums[4]
p_sal = nums[5]
p_sound = nums[6]
p_density = nums[7]
p_forme = "Point Z"
p_forme = float
a = (p_objectid,p_forme,p_X,p_Y,p_pressure,p_depth,p_temp,p_conduct,p_specific,p_sal,p_sound,p_density,p_date_releve,p_nebuleuse,p_mer,p_vent,p_houle)
curseur_ecriture.insertRow([a])
recherche_oid.reset()
mon_csv.close()
print ("Le script a été executé")`
Je bloque au niveau du « curseur_ecriture.insertRow([a]) », où il m’affiche l’erreur suivante :
Traceback (most recent call last):
File « L:\spe\echange\Hereiti FANIU\Cours Python\hereiti test bathymetrie-28-11.py », line 141, in
curseur_ecriture.insertRow([a])
TypeError: sequence size must match size of the row
Je m’excuse d’avance si j’ai mal exposé mon problème.
C’est vrai que mon code est un vrai cafouillis et je suis réceptive à toutes modifications.
Merci de m’avoir lu et de m’aider!
Bonjour,
Ton sujet est bien trop complexe pour moi, la seule aide que je peux apporter c’est sur l’erreur en elle même.
Un petit copié/collé de l’erreur sur un moteur de recherche sur le net pointe sur cette page en premier https://support.esri.com/en/technical-article/000011654
Je propose d’ajouter des lignes « print » pour visualiser ce qu’il se passe autour de « curseur_ecriture.insertRow([a]) »
Bonne recherches.
A+
Bonjour,
Je te remercie, cela m’aide beaucoup !
j’essaierai avec ce que tu m’a donné et je reviendrai vers toi, si j’ai d’autres questions ou t’informer de l’évolution de mon script.
Merci Cordialement.