Suite

Déterminer les points de départ/fin pour le calcul de la pente de la ligne

Déterminer les points de départ/fin pour le calcul de la pente de la ligne


Il s'agit d'une question de suivi basée sur cette question.

J'ai une classe d'entités linéaires représentant les égouts pluviaux et une classe d'entités ponctuelles représentant l'endroit où les égouts pluviaux sont connectés. La classe d'entités ponctuelles a une élévation pour chaque point, ce qui me permet de déterminer la pente du collecteur d'eaux pluviales comme la différence d'élévation du début à la fin divisée par la longueur du collecteur d'eaux pluviales. Cependant, la plupart de mes points servent de points de départ pour un collecteur d'eaux pluviales et de points d'arrivée pour un autre en même temps. Je sais que le point de départ doit toujours être le point avec une altitude plus élevée pour faciliter l'écoulement de l'eau.

Comment puis-je calculer la pente pour chaque segment de ligne et désigner quels points sont les points de départ/fin de chaque ligne ?

Serait-il préférable de calculer de nouvelles lignes basées sur ma couche de points qui incluraient un champ de pente ou existe-t-il un moyen d'automatiser ce calcul entre les deux couches ?

J'ai une licence ArcMap Advanced mais pas d'extensions 3D ou Spatial analyst. Je suis ouvert aux solutions Python et QGIS. Je ne veux pas avoir à entrer ces valeurs manuellement car je sais qu'il doit y avoir un moyen de l'automatiser.


Pour énoncer simplement votre problème, vous avez une ensemble de points avec une valeur mais ces points/valeurs s'appliquent à tous les deux extrémités d'une ligne; vous souhaitez ajouter deux valeurs de points différentes en tant qu'attributs distincts sur une ligne. Il y a (au moins) deux façons de le faire.


La première consiste à extraire les nœuds de début et de fin de toutes vos lignes sous forme de points. Puisque vous avez une licence avancée, c'est facile à faire avec Feature Vertices to Points. Vous devrez extraire les nœuds de début et de fin pour séparer les fichiers de points, car aucun attribut n'est créé pour les distinguer et vous auriez des points empilés. Ce processus est ce qui vous permet d'attribuer la même valeur de point à deux lignes différentes en tant qu'attributs différents - les deux fichiers auront en grande partie les mêmes points, mais chaque ensemble définit si ce point est le début ou la fin de la ligne.

Une fois que vous avez fait cela, vous pouvez utiliser une jointure spatiale entre vos points avec des valeurs et les nouveaux points de début/fin pour transférer les valeurs (deux jointures). Ensuite, vous pouvez effectuer des jointures régulières ou Join Field (encore une fois, deux fois) en fonction de l'ID de ligne (qui est un attribut de leurs points extraits) pour transférer les valeurs de début/fin vers deux nouveaux champs dans les données de ligne. Il s'agit de la méthode décrite dans Comment attribuer des ID de nœud aux liens d'un réseau ?


La deuxième méthode, la solution de Felix d'Attribuer des identifiants de point aux attributs de début et de fin respectifs d'une polyligne, a potentiellement beaucoup plus de calculs et de manipulations de champs, mais moins de jointures et n'a pas l'exigence de licence avancée pour extraire les nœuds. Au lieu de cela, il consiste à créer un champ d'identification unique pour les points en fonction des coordonnées et à le faire correspondre aux nouveaux champs du fichier de ligne qui identifient les coordonnées des points de début et de fin.

Pour commencer, vous avez besoin d'un identifiant pour les points de valeur. Ajoutez deux nouveaux champs à ce fichier de points, X et Y (flotte pour contenir les décimales si nécessaire). Ajoutez un troisième appelé XY mais faites-en une chaîne. En utilisant Calculer la géométrie dans la table attributaire (clic droit sur l'en-tête du champ), vous pouvez ajouter les valeurs de coordonnées x et y à ces deux nouveaux champs, puis utiliser un calcul de champ sur le troisième pour combiner (concaténer) les valeurs en une seule chaîne - quelque chose aimer734.54,234.87. En théorie, cela devrait identifier chaque point de manière unique.

Vous allez maintenant faire la même chose dans votre fichier de ligne, sauf que vous devez effectuer toutes ces étapes deux fois - une fois (trois champs) pour les points de départ et une fois (trois champs supplémentaires) pour les points de fin. Il existe une syntaxe spéciale que vous pouvez utiliser pour accéder à la géométrie de la ligne dans le calculateur de champ. D'après le commentaire de Michael sur la réponse de Felix à l'autre question, un exemple serait :

str(round(!Forme!.firstPoint.X,3)) + "," + str(round(!Shape!.firstPoint.Y,3))

La syntaxe à laquelle je fais référence est la!forme!.premierPoint.Xpartie. Il est abordé dans les fichiers d'aide de l'outil Calculer le champ. Vous remarquerez également que la formule de Michael est configurée pour tout faire en un seul calcul, vous n'auriez donc vraiment besoin que de deux champs au lieu de six car elle combine des étapes. La même chose pourrait s'appliquer aux points si vous n'utilisez pas l'outil Calculer la géométrie. Le reste de la syntaxe consiste à convertir les valeurs numériques en chaînes et à arrondir. Notez les commentaires de Felix sur votre question concernant la troncature et l'arrondi et la tolérance xy de la source. Le problème soulevé est de s'assurer que la chaîne d'identification générée correspond réellement lorsque vous le faites pour les points et les lignes, car elle est basée sur des valeurs mathématiques pour coordonner.

Vous devriez vous retrouver avec trois champs attributaires de chaîne qui ont des valeurs correspondantes dans les deux classes d'entités -identifiantdans les points, et unIDdébutetID de findans les lignes. Vous allez ajouter deux champs supplémentaires aux lignes -startelevetendelevÀ ce stade, vous pouvez faire deux ordinaire jointures (ou utilisez l'outil Join Field comme mentionné ci-dessus) en fonction des champs ID. L'un transférera vos valeurs de points dans les champs de début et l'autre se chargera des champs de fin.

Une fois cela terminé, vous pouvez ajouter votre nouveau champ de pente et exécuter le calcul en fonction de lastartelevetendelevdes champs.


Voir la vidéo: La pente - théorie