Les statistiques zonales 2 finissent par provoquer une erreur fatale. Existe-t-il une alternative ?
Je suis récemment passé à l'utilisation de l'outil supplémentaire "statistiques zonales en tant que tableau 2" au lieu des "statistiques zonales" habituelles car j'ai des polygones qui se chevauchent que les statistiques zonales ne traitent pas. Cependant, j'ai essayé d'exécuter les statistiques zonales 2 à quelques reprises maintenant et après avoir fonctionné pendant de nombreuses heures toute la nuit, il finit par rencontrer une erreur fatale et ne se terminera pas. Je ne sais pas comment améliorer ce problème. J'essaie de calculer l'élévation moyenne dans plus de 100 000 polygones tampons et je devrai le faire plusieurs fois avec d'autres couches raster. Existe-t-il une alternative ou un moyen d'obtenir l'outil pour terminer la commande ?
Réponses
Pour résoudre ce problème, vous devrez diviser vos polygones en groupes sans chevauchement. C'est ce qu'on appelle la coloration graphique .
Pour que le script ci-dessous fonctionne, a) installez le package networkx et b) exécutez :
PolygonNeighbors("POLYGONS", "neighbours", area_overlap="AREA_OVERLAP")
Scénario:
'''
creates non-adjacent groups of polygons
'''
import arcpy
import networkx as nx
infc = arcpy.GetParameterAsText(0)
table = arcpy.GetParameterAsText(1)
sourceList=[f.name for f in arcpy.ListFields(table)]
FTO=sourceList[1:3]
fromto=arcpy.da.TableToNumPyArray(table,FTO)
try:arcpy.AddField_management(infc, "COLOR","Short")
except:pass
G=nx.Graph()
G.add_edges_from(fromto)
allGroups=sorted(nx.connected_components(G), key = len, reverse=True)
arcpy.AddMessage("%i connected groups found" %len(allGroups))
D={}
for item in allGroups:
arcpy.AddMessage(len(item))
subG=G.subgraph(item)
d = nx.coloring.greedy_color(subG, strategy=nx.coloring.strategy_largest_first)
D.update(d)
with arcpy.da.UpdateCursor(infc,("OID@","COLOR")) as cursor:
for row in cursor:
if row[0] not in item:continue
row[1]=D[row[0]]+1
cursor.updateRow(row)
arcpy.AddMessage("Done")
ajoutera et remplira le champ "COLOR" avec des nombres dans la plage (1..4). Il s'agit d'une plage théorique, attendez-vous à quelque chose de plus grand, en fonction de l'étendue des chevauchements. Je dirais que le pire scénario est 7 couleurs. Vous pouvez coder en dur la classe d'entités d'entrée (infc) et la table de contiguïté (table) si vous ne souhaitez pas attribuer de script à l'outil avec 2 paramètres.
Notez que le script ignore les polygones d'île, cela se traduira par la valeur Aucune ou 0 dans le champ COULEUR selon la source de la classe d'entités :

Vous avez plusieurs options sur la façon de procéder :
- définir manuellement n couches à partir de POLYGONS à l'aide de requêtes de définition, par exemple "COLOR" = 1, exécuter des statistiques zonales sur chacune. Fusionner les résultats.
- Rédigez un script ou développez un modèle pour automatiser les tâches ci-dessus.
Je soupçonne que c'est exactement ce que font les statistiques zonales 2 dans les coulisses, je ne sais pas pourquoi cela échoue, à moins que vous n'ayez gâché l'étendue du traitement et les paramètres d'environnement de taille de cellule ou que vous utilisiez des projections différentes sur le raster et les tampons.