Je vous remercie pour toutes vos réponses, cela m'a bien aidé. J'ai désormais terminé mon script (outil de clustering selon un paramètre de distance en entrée) mais je rencontre un problème quand je veux l'ajouter dans ma toolbox. Le script donne en effet les résultats escomptés lorsque je l’exécute via la console python, mais en revanche il ne ressort qu'un seul point quand je lance l'outil par la toolbox ; comme si tout mes points avaient été fusionnés.
Exemple en image :
Carte avant le traitement

Carte après traitement effectué sur la console python

Carte obtenue en utilisant la toolbox (le script est le même)

Je me demande donc si cela peut venir des paramètres (GetValueIntoText) en entrée, mais à priori non car le script s’exécute tout de même sans messages d'erreur. J'avoue sécher, donc si quelqu'un peut voir d'où vient cette différence entre les deux rendus, je lui en serais extrêmement reconnaissant.
Pour information, voila le code :
Code:
#Import des modules
import arcpy
from math import *
#Paramètres en entrée
inFeatureClass = arcpy.GetParameterAsText(0)
tolerance = arcpy.GetParameterAsText(1)
outFeatureClass = arcpy.GetParameterAsText(2)
chpval = arcpy.GetParameterAsText(3)
#Copie de la couche en sortie
FeatureClass = arcpy.CopyFeatures_management(inFeatureClass, outFeatureClass)
#Ajout des données XY
arcpy.AddXY_management(FeatureClass)
#On initialise les curseurs avant d'importer les données dans le programme
cS = arcpy.UpdateCursor(FeatureClass)
rg2 = arcpy.Row
Clist = []
objId = 1
dMin = 1
#En même temps que l'on importe les données (localisation et valeur) de la table
#celle-ci est effacée pour laisser place aux nouvelles coordonnées
for rg2 in cS:
Clist = Clist + [[objId, rg2.getValue("POINT_X"), rg2.getValue("POINT_Y"), rg2.getValue(chpval)]]
objId = objId + 1
cS.deleteRow(rg2)
#Boucle tant qu'aucune distance entre chaque point est inférieure à la tolérance
while (dMin == tolerance) is False:
dMin = tolerance
#On essaye ainsi de récupérer la distance minimale à chaque fois
for i, valeur in enumerate(Clist):
x1 = valeur[1]
y1 = valeur[2]
#Boucle pour comparer lces distance entre les points
for j in Clist[i+1:]:
x2 = j[1]
y2 = j[2]
# Appel à la fonction de distance
D = dist(x1,y1,x2,y2)
# Soit dMin la distance au point le plus proche
if D < dMin and D <> 0:
dMin = D
#ptA et ptC les points correspondants à cette distance
ptA = Clist.index(Clist[i])
ptC = Clist.index(j)
#On ajoute une nouvelle liste fruit des deux points fusionnés
#tandis que ces deux points sont supprimés de la liste
Clist.append([0, (Clist[ptC][1] + Clist[ptA][1])/2, (Clist[ptC][2] + Clist[ptA][2])/2, (Clist[ptC][3] + Clist[ptA][3])])
Clist.remove(Clist[ptA])
#Manip pour se retrouver dans la liste
if ptC > ptA:
Clist.remove(Clist[ptC-1])
else:
Clist.remove(Clist[ptC])
print Clist
#Ajout du curseur pour écrire dans la table
rowInsert = arcpy.InsertCursor(outFeatureClass)
#Ecriture des points à partir des coordonnées générées.
for row in Clist:
inPoint = arcpy.CreateObject("Point")
inPoint.X = row[1]
inPoint.Y = row[2]
newPoint = rowInsert.newRow()
newPoint.SHAPE = inPoint
newPoint.setValue(chpval, row[3])
rowInsert.insertRow(newPoint)
del cS
del rg2
del rowInsert
#La fonction de distance
def dist(x1,y1,x2,y2):
return sqrt(((x2-x1)**2)+((y2-y1)**2))
Liens sociaux