Suite

Définir les données manquantes du réseau de canalisations (âge, taille) en fonction des canalisations voisines ou de connexion les plus proches

Définir les données manquantes du réseau de canalisations (âge, taille) en fonction des canalisations voisines ou de connexion les plus proches


J'ai des données de réseau de canalisations (polylignes) avec des attributs d'âge et de taille manquants. Pour l'âge des tuyaux, j'ai 10779 tuyaux dont 1034 ayant des valeurs NODATA. Pour la taille des tuyaux, j'ai 10779 tuyaux dont 738 ont des valeurs NODATA.

Quel outil puis-je utiliser pour définir les valeurs manquantes en fonction des informations d'attribut de canalisation la plus proche (ou de connexion) ?

EDIT 1 : Dans mon esprit, j'ai l'impression que je pourrais mettre en place quelque chose comme ce pseudo code :

pour chaque tuyau si le tuyau[age]==NODATA trouve le tuyau_le plus proche tuyau[age] = tuyau_le plus proche[age] si le tuyau[taille]==NODATA trouve le tuyau_le plus proche du tuyau[taille] = tuyau_le plus proche[taille]

Et puis tout serait fini. Je ne peux tout simplement pas comprendre comment déterminer la polyligne la plus proche de la polyligne actuelle.

Edit 2 : Tentative d'utilisation de la solution de FelixIP. Tout d'abord, j'ai eu accès à une autre copie de l'ensemble de données avec les tuyaux clairement connectés les uns aux autres - j'ai des champs de et vers les nœuds (FNODE_1 et TNODE_1), et les tuyaux sont clairement accrochés les uns aux autres. J'ai copié ma couche initiale deux fois, en créant des couches has_X et Missing_X pour les informations d'âge (YEAR_) et de diamètre (DIAM).

En commençant par le diamètre d'abord, j'ai ajusté le script pour les noms de mes propres calques, donc il se lit comme suit :

def fillGap (d,fr): mxd = arcpy.mapping.MapDocument("CURRENT") lyr=arcpy.mapping.ListLayers(mxd,"Has_Diam")[0]TNODE_1"=%s%s%s" %(r "'",fr,"'") tbl=arcpy.da.TableToNumPyArray(lyr,"DIAM",q) if len(tbl)==0:return d return tbl[0][0] fillGap (!DIAM! ,!FNODE_1!)

mais pour une raison quelconque, j'obtiens cette erreur lors de l'exécution :

J'essaie de faire le tri, mais comme je ne connais pas complètement le code Python utilisé pour calculer l'expression, cela s'avère un peu difficile.


La méthode ci-dessous fonctionne pour les tuyaux dont les extrémités sont accrochées à d'autres extrémités de tuyaux, j'utilise fichier de formes par exemple.

Ajoutez 2 champs de texte (FROMN, TON) de 50 caractères à votre table et exécutez ce script sur le champ FROMN

def truncate(f, n): s = '{}'.format(f) i, p, d = s.partition('.') return '.'.join([i, (d+'0'*n )[:n]]) def fromto(shp,ft): p=shp.firstPoint if ft>0:p=shp.lastPoint return truncate(pX,2)+"-"+truncate(pY,2)

En utilisant

deà( !Forme!,0 )

Exécutez le même script sur le champ TON, en utilisant

deà( !Forme!,1 )

Votre tableau ressemblera à ceci.

Notez que le diamètre manquant a la valeur -1 dans mon exemple.

Créez des clones de votre couche de tuyaux dans la table des matières en utilisant le copier-coller. Appelez une couche MISSING et utilisez la requête de définition

"DIAMÈTRE" = -1

Appelez une couche DISPONIBLE et utilisez la requête de définition

"DIAMÈTRE" <> -1

Votre table des matières ressemblera à ceci :

Notez le nombre d'enregistrements dans la couche MANQUANTE et exécutez ce script sur le champ DIAMÈTRE de la couche MANQUANTE :

def fillGap (d,fr): mxd = arcpy.mapping.MapDocument("CURRENT") lyr=arcpy.mapping.ListLayers(mxd,"AVAILABLE")[0]TON"=%s%s%s" %(r "'",fr,"'") tbl=arcpy.da.TableToNumPyArray(lyr,"DIAMETER",q) if len(tbl)==0:return d return tbl[0][0] fillGap (!DIAMETER! ,!DE!)

Fermez la table et ouvrez-la à nouveau. Vous remarquerez une réduction des enregistrements dans la table MISSING. Exécutez le script encore et encore jusqu'à ce qu'aucune réduction ne se produise. Cela comble les lacunes dans la direction aval. En général, c'est une bonne idée de trouver le maximum de diamètres IN, de trier tbl dans le script par ordre décroissant, mais cela ne s'applique qu'aux réseaux topologiquement corrects, c'est-à-dire direction de la ligne = direction du flux

Le script vous fait gagner du temps en joignant les tables MISSING et AVAILABLE en utilisant les champs FROMN et TON en conséquence.

Si, après plusieurs exécutions, vous avez toujours des enregistrements dans la couche MANQUANTE, vous devez combler les lacunes en amont. Pour ce faire, remplacez la ligne de requête dans le script

q='"FROMN"=%s%s%s' %(r"'",fr,"'")

et exécutez-le en utilisant

fillGap (!DIAMETRE!, !tonne! )

Si vos tuyaux ne sont pas cassés aux extrémités, faites-moi savoir que je mettrai à jour ma réponse.

En attendant essayez ceci :

La table de sortie ressemblera à ceci

C'est la réponse à ta question :

pour chaque tuyau (manquant) trouver le tuyau le plus proche avec la taille disponible

n'est-ce pas ?

Une approche très rapide et très sale consiste à le joindre à la table MISSING (PIPE_ID à PIPE_ID) et à calculer DIAMETER dans la table MISSING à l'aide de DIAMETER_1 Et cela équivaut à

si le tuyau[taille]==NODATA : tuyau[taille] = tuyau_le plus proche[taille]


Voir la vidéo: Canalisation deau usée