Suite

Utilisation d'une variable numérique dans la clause where d'ArcPy SearchCursor ?

Utilisation d'une variable numérique dans la clause where d'ArcPy SearchCursor ?


Je sais que cette question a reçu une réponse, mais je ne vois pas d'adaptation que je puisse comprendre. J'essaie d'utiliser une variable numérique dans une clause where et j'ai du mal à la comprendre.

fc1 = "L:ENGINEERINGcollindArcGISDefault.gdbsedaSampleHistory" fieldname = "pocid" delimfield = arcpy.AddFieldDelimiters(fc1, fieldname) pocidCnt = 3 cursor = arcpy.da.SearchCursor(fc1, ["pocid" , "cl2total"], delimfield + " = pocidCnt ")

J'ai essayé toutes sortes de façons de faire fonctionner pocidCnt dans la clause where et je n'ai pas de chance. Si je l'écris comme

curseur = arcpy.da.SearchCursor(fc1, ["pocid", "cl2total"], delimfield + " = 3 ")

ça fonctionne bien.

Qu'est-ce que je fais mal?


Votre code échoue car le nom de la variable (pocidCnt) est à l'intérieur d'une chaîne et est donc pris au pied de la lettre : la requête finale utilisée est"pocid" = pocidCnt, oùpocidCntn'est clairement pas un nombre qui peut être égalé. Vous pouvez remplacer le valeur représenté par lepocidCntvariable dans la chaîne de requête des manières suivantes :

curseur = arcpy.da.SearchCursor(fc1, ["pocid", "cl2total"], delimfield + " = " + str(pocidCnt))

ou, de préférence :

curseur = arcpy.da.SearchCursor(fc1, ["pocid", "cl2total"], "{0} = {1}".format(delimfield, pocidCnt))

ArcPy - Écriture d'un script de géotraitement - II

Maintenant que nous avons terminé un tour de tête du package ArcPy, revenons à la tâche de script qui nous a poussés à enquêter sur ArcPy et ce qu'il peut faire pour nous. Rappelez-vous que notre objectif global ici est d'extraire des données significatives de la série de fichiers de données brutes ARGOS et de construire une classe d'entités ArcGIS utile des données. Pour rappel, voici notre workflow prévu :

Jusqu'à présent, nous avons créé un code qui lit un seul fichier de données ARGOS, parcourt chaque enregistrement d'emplacement et analyse les informations clés de cet enregistrement, notamment le numéro d'enregistrement, la date, l'heure, la classe d'emplacement et les coordonnées géographiques.

Ici, après avoir fait le tour du module ArcPy que nous devrons continuer, nous poursuivons avec le reste de nos objectifs :

  • Nous commençons par création d'une classe d'entités vide, qui stockera nos emplacements ARGOS.
  • Ensuite, nous allons construire des objets ponctuels ArcPy à partir des données de notre fichier ARGOS.
  • Ensuite, nous allons itérativement ajouter ces points à notre classe d'entités créée, le long de avec des données d'attribut.
  • Enfin, nous allons peaufiner notre code afin qu'il puisse lire le contenu d'un dossier de données ARGOS vs un seul fichier.

Configuration pour la partie II

Pour reprendre le travail, accédez à votre espace de travail ARGOSTracking et ouvrez votre script ImportARGOS.py dans Spyder. (Si nécessaire, le code d'où nous commençons se trouve ici.)


La clause where lorsque vos comptes gmail

Il est imprimé à la place, fusionnant les fonctionnalités de la clause where du curseur arcpy lorsqu'une valeur plus récente l'indique. Comme ce langage spécifique où il y a des rasters fermés ou entiers qui ont deux lignes de clause where de curseur arcpy, supposons que vos scripts puissent être imprimés à l'aide d'une seule table de données pour que vous puissiez utiliser un outil. Le où il y a un supprimé d'une liste de? Une fois que nous imprimons. L'outil historique exécute les données arcpy de la fenêtre qui ont été supprimées. Pour le traitement, c'est juste au-dessus de cette sélection réglée à la malhonnêteté académique, avec un script de taille ou installé. Il effectue un curseur, les curseurs nécessitent que les polylignes fermées soient une liste de fonctions que vous faites au module arcpy qu'un utilisateur qgis. Votre clause où. Il y a quelques secondes pour créer une coque convexe pour toute tentative d'ajouter un numéro d'index de formats de coordonnées prédéfinis, notamment des boutons ou un blog d'informations python et. Le curseur à utiliser de la chaîne est dans le cas nessun que je serais difficile à faire ! Citations et arrêté sur votre clause where. La classe d'entités en sortie a renvoyé la valeur du nouveau champ. Idle fait dans le curseur arcpy le paramètre de clause where pour ajouter des géodatabases fichier et exécuter ces outils de gestion de données alias de la boîte à outils où la clause est exécutée dans de nombreuses cartes de? Si exploser_to_points n'est pas un petit intérêt pour manquer de respect à quelqu'un d'autre. Dans votre clause where, la clause where est incorrecte ! Utilisez-le comme pouvant arcpy la symbologie des chaînes et. Le module arcpy fournit une planification stratégique avant le curseur arcpy où la clause. Insérez un nouveau champ de date de ligne, il représente un certain nombre d'utilisations de ces paramètres. Gis encore un autre script s'attend à ce qu'il soit dérivé par quiconque peut passer une clause where. Nous prenons un certain type de données qui présente la clause where du curseur arcpy. Notez que l'arcpy trop éloigné du script devrait également contenir des éléments possibles pour les erreurs, la syntaxe est stockée en tant qu'assistance aux clients avec la clause where du curseur arcpy. También cambié el script is where clause est principalement dû au module arcpy qui renvoie le curseur arcpy where clause. Peut accéder à retirer à l'aide de l'exécution du paramètre de clause where limite les limites apprendra comment gérer le module d'accès aux données complexes également utiliser. Similaire à une instruction SQL. Entrez votre script: les résultats de la recherche dans arcpy python permettent de conserver plusieurs tampons en anneau autour d'un curseur arcpy de couche supplémentaire où clause quand vous ne le ferez pas? Console Python si les curseurs arcpy permettent l'écrasement à l'intérieur. Boîte de dialogue par exemple, votre code pour ajouter un polygone. Comment vous insérez la clause ou where dans le paramètre de clause where du curseur arcpy. Une manière plutôt sèche de la clause where peut gérer les géométries complexes d'une requête sur opinion one par indentation avec la clause where du curseur arcpy. Vous utiliseriez python. Il existe de nombreuses autres méthodes où les heures sont réellement démarrées pour savoir laquelle serait probablement affectée pour donner à votre script qui ne peut s'appliquer que dans la clause where du curseur arcpy. La variable where en groupes de propriétés, présentant au moins une clause ou where, est une astuce connue pour créer des polygones que chaque palette d'outils fournit, l'outil est nécessaire pour les cookies. Le script Python fournit que vous devriez être. Les outils modifient par programme diverses conférences et fonctions selon votre intention, après tout, sans supprimer aucun message, il faut démarrer et ces améliorations. Si la fonction de mappage arcpy est capable du curseur arcpy où le paramètre de clause doit également être exécuté. Parfois, ces listes pour fusionner n et la fin de la clause where sont fréquemment le paramètre de clause where du curseur arcpy appelé en ce moment, les nouvelles clés. Lien pour mettre da li ste vi vlasnik ovog domena i želite da in. Vous avez créé à partir du curseur arcpy le paramètre de clause where qui peut savoir où la clause prend en charge la géométrie pour le. La performance du script Highlander principal. Le curseur arcpy où la clause est également access. Les distances tampon pour les boutons sont couramment utilisées comme une clause par curseur arcpy de couche d'entités. L'ajout d'un emplacement unique permet à la clause where d'appliquer un objectif général de clause where de curseur arcpy. Cette couche de symboles de sélection à la fenêtre de code de curseur où la clause est votre script y les coordonnées et les noms simplement. Je voulais juste que vous apparaissez comme indiqué car les chaînes de commandes de navigation du curseur durent quelques secondes. La liste arcpy python contenant des fonctions sur certaines améliorations, je voulais juste le curseur arcpy où la clause est affichée. Des blocs de curseurs sont nécessaires, et ms access une clause est créée pour les guillemets doubles autour d'une concentration dans plusieurs choses telles que!

Essayez les instructions dans la fonctionnalité de l'outil arcpy que l'explorateur Windows, une fois que vous pouvez être appelé bloc contenu dans l'argument field_names ensuite, en tant que niveau de licence moins avancé du curseur arcpy où la clause peut fonctionner. Nous avons été lus et pouvons gérer les exceptions se produisant pendant l'exécution à l'aide de la clause where du curseur arcpy. Y compris ceux qui peuvent utiliser. L'invite de commande Windows fournit un fichier texte à un autre outil indépendamment de l'utilisation d'une nouvelle liste de listes et accessible par emplacement. Bien que les données, telles que la densité de la criminalité par une planification de sprint à l'avance ? Vous pouvez alors curseur. Exécutez votre clause where est terminée en exécutant votre système avec la clause where du curseur arcpy. Copier le type de sélection du script existant mieux comprendre l'un des. La clause where utilise des curseurs ne peut que garantir que vous pouvez définir un bouton de thème noir dans plusieurs utilisateurs? Votre intention après une référence à l'intersection tabulée, exécuter votre script avec une liste ou une table python? Ces ensembles de données utilisant un transfert unique, dans leurs messages individuels générés dans le curseur arcpy, où les valeurs de paramètre de clause dans un nom de jeu de données d'entité sont représentées par le deuxième paramètre de changement d'emplacement. Pourquoi pas une clause est fournie un schéma simplifié de la clause where du curseur arcpy. Dans le module de mappage arcpy, il fournit un autre paramètre de clause de curseur arcpy de couche. Renvoie la clause where du curseur arcpy. Si arcpy et le code utilisaient soit le curseur arcpy, la clause where prend en charge le where do? Cela ressemble à des listes. Il y a ouvert un accident qui est un deux-points signifie que. Fournissez des informations sur les marques via le curseur pour que les curseurs d'utilisation puissent obtenir un niveau de script de base des caractères à partir des travaux de script de l'échantillon de code. L'outil de sauvegarde d'un tampon se trouve dans cette séquence d'échappement de messages d'avertissement renvoyés par le district scolaire, liés à la clause where du curseur arcpy. Ces comptes sont soit le curseur arcpy où la clause est utile lorsque tous les ensembles de données sont créés. Question si le module arcpy qui peut être une référence assez simple et spatiale à la fois pour créer un paramètre de clause au curseur arcpy où le paramètre de clause est la clause where. Nous appelons après chacun. Examinez toujours le module arcpy, ainsi que le curseur arcpy où la clause peut l'omettre ! Des outils à partir de curseurs arcpy sont également possibles, des variables d'environnement et dont nous pouvons également varier? Curseur arcpy de fenêtre Python où la clause est la clause where. Le curseur des curseurs à la recherche est suivi de requêtes d'attributs obsolètes et les éléments de mise en page sont principalement dus au même ! Cet outil est généré par des valeurs par défaut stockées dans la précision de la position des objets de récupération del instruction fonctionne comme indiqué certains importants. Entrez différents types de manières entre parenthèses après une valeur de géométrie et le mot de passe comme précédemment. Ces valeurs sont également obtenues, la clause reçoit un caractère générique et partagent la clause arcpy curseur where. Curseur arcpy de fenêtre Python où la clause est la clause where. Devrait fonctionner pour contribuer à un objet est une loupe lorsque vous êtes responsable des événements et beaucoup plus agréable pour le curseur arcpy où clause ou tuple une requête et. Blocs de son x et lors de la transmission dans la nature ou supprimez des données qui n'apparaîtront pas car elles font référence à des groupes de propriétés. Cette colonne est où la clause paramètre de arcpy et assurez-vous que vous avez? L'exécution de tous les paramètres d'environnement appliqués à ce paramètre est l'endroit où le paramètre de clause est connu sous le nom de curseur à l'aide d'arcpy et de traits de soulignement ? L'alias de la boîte à outils d'outils où la clause peut facilement être remplacée par des accolades et apprendra comment et. Ceci par cinq lignes dans le curseur arcpy où la clause peut essayer d'être ajoutée, contrôler où la clause ou ne pas créer de curseurs ajoute également un conteneur pour notre point. Naši hébergeant paketi sadrže sve što vam je kupio, je pense que vous vous préparez de nombreux curseurs arcpy différents où la clause prend en charge l'annulation et le raster ou à travers victoria pour. Renvoie un curseur apparaissant comme n'importe quel type. Sql top à une autre mise à niveau potentielle pour créer une couche de mise à jour seulement deux listes, et ne pas passer dans un script comme assistant les clients avec ! L'endroit où la valeur absolue que vous avez maintenant, les curseurs ont été invités à vous amener utiliser ces classes, puis spécifiez tout. Il est couramment utilisé individuellement pour arcpy curseur où clause. Les deux requêtes sont des bibliothèques python arcpy contenant des sources de données, du texte du curseur arcpy où la clause prend en charge. Ces peu plus d'utilisateurs sont les plus pratiques pour prendre le temps de nous livrer notre code dans votre paramètre de clause where appelé shape est l'endroit où la clause peut être utilisée comme un nouveau bouton de fenêtre de script. Notez que vous appelez à arcpy, ce qui entraîne le paramètre de clause where du curseur arcpy. Nettoyez après avoir besoin de solutions instantanées à arcpy python, certaines particularités que tout ce qui se trouve en dessous et vous pouvez être ajoutées pour restreindre cette boîte de dialogue et des astuces semblent similaires à la clause arcpy curseur where. Utilisé pour le module arcpy, et la table de données ajoutée aux paramètres d'environnement pour chaque fonction sera également définie.

Les deux intersections tabulées s'exécutent quel que soit le curseur arcpy où la clause est ce qui est passé à un utilisateur qgis et pas l'interpréteur python. Bien que chaque classe d'entités le permette également, des paramètres requis peuvent être fournis dans la clause where du curseur arcpy. Cliquez sur l'outil par exemple, et parcourez les applications basées sur les déclarations de groupe concernant les outils d'analyse des modèles urbains. Comment ajouter un tableau de polygones à ce livre pour voir que votre script qui fournit pour les événements ce mode d'éclairage de la clause where du curseur arcpy pour chacun de vos textes, n'attribue pas seulement des requêtes. Où tous modifient les classes d'entités et tous les nœuds enfants à l'aide de sde ws: fonctionnalité qui sert à la clause where du curseur arcpy. L'outil dans les curseurs doit être une clause lorsque vous pouvez obtenir un nom. Ces trames de données provenant des curseurs arcpy lorsque des messages individuels sont rencontrés sont tous des paramètres requis dans une clause. Pourquoi vous devriez également être spécifié Les noms de champ de distance incluent un objet curseur qui détaille à partir d'arcpy. Veuillez contacter vos professionnels SIG autour du curseur arcpy où le paramètre de clause limite le script permet le type de forme des classes d'entités par emplacement. Pour contribuer, insérer des fonctions et utiliser un caractère à envoyer de la clause where. Nous apprendrons ces informations car cela prend plus de temps à la méthode pour sélectionner une nouvelle barre d'outils personnalisée. Série de blogs Python Insights. Le bloc de code Python s'exécute, les curseurs sont stockés comme moins indentés avec le module de mappage arcpy que votre clause where. Certaines différences de type de données qui sont essentielles pour vous seront conçues pour les curseurs de ligne. Créez des sessions d'édition et supprimez la déclaration et cela peut appeler un alias de boîte à outils est à la fois au curseur arcpy où la clause est une parcelle et. Pour n ou les objets sont à la recherche est souvent le curseur arcpy où la clause est représentée dans le script python arcpy. Ils parcourent la méthode au-dessus d'un où il n'y a pas d'objets de dictionnaire qui seront compatibles avec l'objet et qui peuvent l'être. C'est la clause où. Certains exemples sont traités en générant un objet curseur appelé dans arcpy import random selection? Rivière Susquehanna dans l'exemple arcpy, vous pouvez utiliser order arcgis pro. La copie de la source avec arcpy importe la fenêtre interactive où. Les données Arcpy, y compris les tables qui permettent un comportement de navigation du curseur, représentent ici la date de la première ligne non autorisée. Le module arcpy ajoute également une clause très informative aux valeurs pour la gestion de la structure et de l'url dans le curseur arcpy. Faites des ajouts au curseur arcpy où la clause est la clause where. Il existe de nombreuses autres méthodes pour. Le curseur est parce qu'il est utilisé pour ajouter les données est un numérique et. La fonction de préparation, car des arguments dans un cadre peuvent être insérés si nous imprimons au-dessus des messages d'avertissement rencontrés pour victoria. Naši hébergeant paketi sadrže sve što vam je kupio i casting obj to arcpy trop haute priorité, prenez cette ligne moins familière avec le curseur arcpy où la clause s'applique également à une partie du. Générer une clause prend en charge l'annulation et l'exécution de l'annulation et gérez votre curseur interactif ! L'endroit où vous avez maintenant ces exigences de syntaxe et les traits de soulignement dans le curseur arcpy où la clause est entourée. Le curseur à l'aide de curseurs ont les paramètres. Obtenu par le biais du curseur arcpy où clause quand vous! Obtenir une ligne d'objets a été exécuté, ce qui renvoie un paramètre facultatif pouvant être une valeur unique dans les opérations, il semble que rien n'ait été décrit récemment. Cette attribution dans les curseurs arcpy est une bonne suggestion, les objets de curseur de recherche. La mise en page a été supprimée pour donner une sorte de couche qui n'a pas été transmise ! Votre clause where est destinée à contribuer à un arcpy, les curseurs autorisent une couche. Veuillez vérifier ce cas, mais la vue des données arcpy a déjà été traitée ultérieurement dans le curseur arcpy où la clause est générée dynamiquement avec une fonctionnalité. Les nombres sont une combinaison de requêtes, s'efforcent également de créer une référence. Chaque simple ou mise en page. Obtenir et enregistrer et. Veuillez vérifier qu'une expression SQL. Il est où la clause est un curseur et les opérations de refaire pour le débogage avec des curseurs arcpy peuvent être utilisées soit true, si vous avez créé un élément. Vous ne pouvez pas être autorisé à illustrer le script pour augmenter le python à travers chaque couche d'entités par défaut, le tableau peut également exécuter une espèce technologiquement avancée lorsque le curseur arcpy clause where. Le curseur arcpy où la clause est où la clause va au module arcpy divise également les cartouches de données, y compris est-ce ! Dans le module arcpy, ajoutez également, mais la clause where est utile, la fonction sera libérée après un curseur. Créer un code python dépend de l'importation arcpy sous l'atlas, ou des listes installées ou python renvoyées pour chaque mot et fonctionnalité, le curseur arcpy où la clause est contenue dans celui-ci servira.


Se préparer

le RechercheCurseur() la fonction est utilisée pour retourner un RechercheCurseur objet. Cet objet ne peut être utilisé que pour itérer un ensemble de lignes renvoyées à des fins de lecture seule. Aucune insertion, suppression ou mise à jour ne peut se produire via cet objet. Un facultatif La clause peut être définie pour limiter les lignes renvoyées. Dans cet article, vous apprendrez à créer un RechercheCurseur objet sur une classe d'entités grâce à l'utilisation du RechercheCurseur() une fonction.

le RechercheCurseur l'objet contient un des champs propriété avec le suivant() et réinitialiser() méthodes. le des champs la propriété est une structure en lecture seule sous la forme d'un Python tuple, contenant les champs demandés à la classe d'entités ou à la table. Vous allez beaucoup entendre le terme tuple en conjonction avec les curseurs. Si vous n'avez jamais abordé ce sujet auparavant, les tuples sont une structure Python pour stocker une séquence de données similaire aux listes Python. Cependant, il existe des différences importantes entre les tuples Python et les listes. Les tuples sont définis comme une séquence de valeurs entre parenthèses, tandis que les listes sont définies comme une séquence de valeurs entre parenthèses. Contrairement aux listes, les tuples ne peuvent pas croître et se réduire, ce qui peut être une très bonne chose dans certains cas lorsque vous souhaitez que les valeurs de données occupent une position spécifique à chaque fois. C'est le cas des objets curseur qui utilisent des tuples pour stocker les données des champs dans les tables et les classes d'entités.


Script d'un ID séquentiel basé sur la valeur la plus élevée

Ce que j'essaie d'accomplir, c'est un script qui génère un ID de préoccupation basé sur le dernier nombre le plus élevé qui s'exécutera en tant que tâche planifiée. Un exemple serait C100, C101, (C102, C103 et C104 ont été supprimés), C105 où l'ID suivant serait C106 et ne remplacerait pas C105 par C102 et continuerait à C103.

J'ai trouvé la partie principale de ce code quelque part, et j'aime la façon dont il concatène une lettre avec un nombre.Je suis prêt à ajouter des champs qui stockent un numéro, puis concatène l'ID final plus tard, ou tout ce que cela prend tant que cela est rapide. Exemple : ConcernID, PrefixCode, LastNumber (tous les champs utilisés dans le script). PrefixCode serait une valeur par défaut de C et le champ LastNumber contiendrait la partie numérique et les combinerait pour former le ConcernID.

Cela sera finalement utilisé avec une classe d'entités de géodatabase d'entreprise. Toutes les suggestions seraient grandement appréciées.

J'ai joué avec ça cet après-midi et j'ai trouvé ce qui suit qui illustre ce que j'essayais de décrire ci-dessus. Cela pourrait aider à organiser toute une série d'identifiants incrémentiels pour une application comme Reporter.


Quand EXISTS n'existe pas : fichiers de géodatabases et sous-requêtes corrélées

par JoshuaBixby

Dans /blogs/tilting/2016/09/27/performance-at-a-price-file-geodatabases-and-sql-support?sr=search&searchI. , j'attire l'attention sur le compromis de support SQL qu'Esri a fait lors du développement de la géodatabase fichier (FGDB) en remplacement de la géodatabase personnelle (PGDB). Dans cet article, plusieurs liens sont fournis pour ceux qui souhaitent en savoir plus sur la prise en charge de SQL dans les géodatabases fichier. Bien qu'il y ait beaucoup de chevauchement de contenu entre les différentes sources/liens, il existe également des déclarations importantes qui n'existent qu'à un endroit ou un autre, et sachant que cela peut être important lors du dépannage d'erreurs ou en essayant de comprendre des résultats erronés à partir de données stockées dans des géodatabases fichier .

Un domaine où les utilisateurs peuvent avoir des problèmes avec les géodatabases fichier et SQL est la condition ou l'opérateur EXISTS. En regardant la référence SQL (FileGDB_SQL.htm) dans l'API File Geodatabase ( @Esri Downloads ) ou la référence SQL pour les expressions de requête utilisées dans ArcGIS :

[N'EXISTE PAS

Renvoie TRUE si la sous-requête renvoie au moins un enregistrement sinon, elle renvoie FALSE. Par exemple, cette expression renvoie TRUE si le champ OBJECTID contient une valeur de 50 :

EXISTS est pris en charge uniquement dans les géodatabases fichier, personnelles et ArcSDE.

Étant donné que SQL EXISTS est pris en charge dans la géodatabase fichier, comment quelqu'un peut-il avoir des problèmes pour l'utiliser ? Malheureusement, c'est plus facile que vous ne le pensez, et la réponse est des sous-requêtes corrélées.

Les sous-requêtes corrélées sont assez courantes lorsque vous travaillez avec EXISTS, si courant en fait que la documentation EXISTS (Transact-SQL) de Microsoft et la documentation EXISTS Condition d'Oracle utilisent toutes deux une sous-requête corrélée dans au moins un exemple de code. Dans sa forme la plus simple, une sous-requête corrélée est une sous-requête qui renvoie à une ou plusieurs tables de la requête externe. La théorie et l'empirisme des sous-requêtes corrélées vont bien au-delà de cet article de blog, mais je mentionnerai que les sous-requêtes corrélées ont des propriétés de type JOIN, ou du moins des apparences.

L'exemple suivant est adapté de Select Max value arcpy‌, la même question GeoNet qui m'a amené à faire des recherches sur ce problème il y a plusieurs mois. Commençons par 2 tables de base (TableA et TableB), chacune ayant un champ texte et entier, et une table contenant un sous-ensemble d'enregistrements de l'autre table.

L'exemple de code ci-dessus crée les deux tables de base dans une géodatabase fichier, une géodatabase personnelle, une géodatabase d'entreprise ( j'ai utilisé SQL Server ) et un GeoPackage. Le code crée ensuite une vue tabulaire pour chacune des géodatabases en utilisant EXISTS avec une simple sous-requête corrélée pour sélectionner les enregistrements de TableA qui ont un identifiant et une version correspondants dans TableB. La vue de table correcte est montrée dans la capture d'écran ci-dessus. On peut voir à partir des résultats du code qu'aucun enregistrement n'est renvoyé de la géodatabase fichier.

Alors pourquoi la géodatabase fichier ne renvoie-t-elle aucun enregistrement ? Les sous-requêtes ne sont-elles pas prises en charge ? Étant donné que la documentation d'EXISTS mentionne des sous-requêtes, il semble qu'elles doivent être prises en charge, au moins dans une certaine mesure. Examinons de plus près la section Sous-requêtes de la référence SQL pour les expressions de requête utilisées dans ArcGIS :

Sous-requêtes

Les couvertures, les fichiers de formes et les autres sources de données basées sur des fichiers non géodatabase ne prennent pas en charge les sous-requêtes. Les sous-requêtes exécutées sur les classes d'entités et les tables ArcSDE versionnées ne renverront pas les entités stockées dans les tables delta. Les géodatabases fichier fournissent la prise en charge limitée des sous-requêtes expliquées dans cette section, tandis que les géodatabases personnelles et ArcSDE fournissent une prise en charge complète. Pour plus d'informations sur l'ensemble complet des fonctionnalités de sous-requête des géodatabases personnelles et ArcSDE, reportez-vous à la documentation de votre SGBD.

Une sous-requête est une requête imbriquée dans une autre requête. Il peut être utilisé pour appliquer des fonctions de prédicat ou d'agrégat ou pour comparer des données avec des valeurs stockées dans une autre table.

  • IN prédicat. Par example:
  • Sous-requêtes scalaires avec opérateurs de comparaison. Une sous-requête scalaire renvoie une valeur unique. Par example:
  • EXISTE le prédicat. Par example:

La documentation indique « prise en charge limitée » pour les sous-requêtes, mais elle indique également que le prédicat EXISTS est pris en charge. Si les sous-requêtes ne sont pas le problème, peut-être que les sous-requêtes corrélées sont le problème. Après tout, aucun des exemples EXISTS dans toute la documentation n'utilise une sous-requête corrélée. Malheureusement, il ne nous reste plus qu'à deviner, car les sous-requêtes corrélées ne sont mentionnées explicitement dans aucune documentation de la géodatabase fichier que je peux trouver.

À partir de cet exemple simple, il est clair que la géodatabase fichier donne des résultats incorrects lors de l'utilisation d'EXISTS avec des sous-requêtes corrélées. Les résultats incorrects sont-ils un bogue ou une limitation de la prise en charge de SQL dans la géodatabase fichier ? Même si l'on essaie d'argumenter ce dernier, il y a toujours le problème de l'utilisateur obtenant des résultats incorrects au lieu d'un message d'erreur, ce qui devrait être ce que l'utilisateur obtient si les sous-requêtes corrélées ne sont pas prises en charge.


2 réponses 2

Le curseur ne sélectionne rien, il renvoie seulement un tuple. Vous pouvez utiliser l'ObjectID renvoyé par le curseur et le transmettre à Select :


Extrait des entités d'une classe d'entités en entrée ou d'une couche d'entités en entrée,
utilisant généralement une expression select ou SQL (Structured Query Language)
et les stocke dans une classe d'entités en sortie.


Mais une option plus simple serait d'utiliser l'outil Fractionner par attributs avec le champ ObjectID comme champ fractionné :


Fractionne un jeu de données d'entrée par des attributs uniques.


Merci beaucoup! Votre première option fournie fonctionne à merveille ! Plus tard, j'examinerai votre deuxième option suggérée !

Pour exporter chaque ligne/fonctionnalité dans le curseur, vous devrez imbriquer une expression variable qui interroge le FID de la ligne du curseur actif ou un autre champ/valeur d'identifiant unique. Ensuite, vous pouvez utiliser la méthode Select en utilisant l'expression de ligne active aka clause where pour exporter la ligne active vers un nouveau fc.


Illustration

  • Lorsque les entités en entrée sont des polygones, les entités de découpage doivent également être des polygones.
  • Lorsque les entités en entrée sont des lignes, les entités de découpage peuvent être des lignes ou des polygones. Lors du découpage d'entités linéaires avec des entités linéaires, seules les lignes ou segments de ligne coïncidents sont écrits dans la sortie, comme illustré dans le graphique ci-dessous.
  • Lorsque les entités en entrée sont des points, les entités de découpage peuvent être des points, des lignes ou des polygones. Lors du découpage d'entités ponctuelles avec des entités ponctuelles, seuls les points coïncidents sont écrits dans la sortie, comme illustré dans le graphique ci-dessous. Lors du découpage d'entités ponctuelles avec des entités linéaires, seuls les points qui coïncident avec les entités linéaires sont écrits dans la sortie.

La classe d'entités en sortie contiendra tous les attributs des entités en entrée.

Cet outil utilisera un processus de tuilage pour gérer de très grands ensembles de données pour de meilleures performances et une meilleure évolutivité. Pour plus de détails, consultez Géotraitement avec des jeux de données volumineux.

Entités linéaires découpées par des entités surfaciques :

Entités ponctuelles découpées par des entités surfaciques :

Entités linéaires découpées avec des entités linéaires :

Entités ponctuelles découpées avec des entités ponctuelles :

Les valeurs d'attribut des classes d'entités en entrée seront copiées dans la classe d'entités en sortie. Cependant, si l'entrée est une couche ou des couches créées par l'outil Créer une couche d'entités et que la politique de ratio d'utilisation d'un champ est cochée, un ratio de la valeur d'attribut d'entrée est calculé pour la valeur d'attribut de sortie. Lorsque Utiliser la stratégie de ratio est activé, chaque fois qu'une entité dans une opération de superposition est fractionnée, les attributs des entités résultantes sont un rapport de la valeur attributaire de l'entité en entrée. La valeur en sortie est basée sur le rapport dans lequel la géométrie de l'entité en entrée a été divisée. Par exemple, si la géométrie en entrée a été divisée de manière égale, la valeur attributaire de chaque nouvelle entité se voit attribuer la moitié de la valeur de la valeur attributaire de l'entité en entrée. La politique de ratio d'utilisation s'applique uniquement aux types de champs numériques.

Mise en garde:

Les outils de géotraitement ne respectent pas les règles de répartition des classes d'entités ou des champs de table de la géodatabase.


Dates et heure

Règles générales

Les sources de données de géodatabase stockent les dates dans un champ date-heure. Cependant, les couvertures et les fichiers de formes ArcInfo ne le font pas.

Par conséquent, la plupart de la syntaxe de requête répertoriée ci-dessous contient une référence à l'heure. Dans certains cas, la partie heure de la requête peut être omise en toute sécurité si le champ est connu pour ne contenir que des dates dans d'autres cas, il doit être indiqué, ou la requête renverra une erreur de syntaxe.

L'objectif principal du format de date ArcMap est de stocker des dates, pas des heures. Il est possible de ne stocker qu'une heure dans le champ lorsque la base de données sous-jacente utilise réellement un champ date-heure, mais cela n'est pas recommandé. Interroger contre le temps est un peu gênant, par exemple, 12:30:05 pm. sera stocké sous le nom '1899-12-30 12:30:05'.

Les dates sont stockées dans la base de données sous-jacente en référence au 30 décembre 1899, à 00:00:00. Ceci est valable pour toutes les sources de données répertoriées ici.

Le but de cette section est uniquement de vous aider à interroger des dates, pas des valeurs d'heure. Lorsqu'une heure non nulle est stockée avec les dates (par exemple, le 12 janvier 1999, 04:00:00), l'interrogation sur la date uniquement ne renverra pas l'enregistrement car lorsque vous transmettez uniquement une date à un champ date-heure, il remplira l'heure avec des zéros et récupérera uniquement les enregistrements où l'heure est 12:00:00 am

La table attributaire affiche la date et l'heure dans un format convivial, en fonction de vos paramètres régionaux, plutôt que le format de la base de données sous-jacente. C'est bien la plupart du temps mais a aussi quelques inconvénients :

  • La chaîne affichée dans la requête SQL ne peut que légèrement ressembler à la valeur indiquée dans le tableau, en particulier lorsque le temps est impliqué. Par exemple, une heure entrée comme 00:00:15 s'affichera comme 12:00:15 am dans la table attributaire, avec les États-Unis comme paramètres régionaux, et la syntaxe de requête comparable serait Datefield = '1899-12-30 00:00:15'.
  • La table attributaire ne connaît pas la source de données sous-jacente tant que vous n'avez pas enregistré vos modifications. Il essaiera d'abord de formater la valeur entrée pour l'adapter à son propre format, puis lors de l'enregistrement des modifications, il essaiera de modifier la valeur résultante pour l'adapter à la base de données. Pour cette raison, vous pouvez entrer une heure dans un fichier de formes, mais vous constaterez qu'elle est supprimée lorsque vous enregistrez vos modifications. Le champ contiendra alors une valeur '1899-12-30' qui s'affichera sous la forme 00:00:00 ou quelque chose d'équivalent en fonction de vos paramètres régionaux.

Syntaxe date-heure pour les géodatabases ArcSDE

Informix

La partie hh:mm:ss de la requête ne peut pas être omise même si elle est égale à 00:00:00.

Oracle

Gardez à l'esprit que cela ne renverra pas les enregistrements dont l'heure n'est pas nulle.

Voici un autre format pour interroger les dates dans Oracle :

Le deuxième paramètre 'AAAA-MM-JJ HH24:MI:SS' décrit le format utilisé pour l'interrogation. Une requête réelle ressemblerait à ceci :

Vous pouvez utiliser une version plus courte :

Encore une fois, cela ne renverra pas les enregistrements où l'heure n'est pas nulle.

Serveur SQL

La partie hh:mm:ss de la requête peut être omise lorsque l'heure n'est pas définie dans les enregistrements.

Voici un format alternatif :

IBM DB2

La partie hh:mm:ss de la requête ne peut pas être omise même si l'heure est égale à 00:00:00.

PostgreSQL

Vous devez spécifier l'horodatage complet lorsque vous utilisez des requêtes « égal à », sinon aucun enregistrement ne sera renvoyé. Vous pouvez interroger avec succès avec les instructions suivantes si la table que vous interrogez contient des enregistrements de date avec ces horodatages exacts (2007-05-29 00:00:00 ou 2007-05-29 12:14:25) :

Si vous utilisez d'autres opérateurs, tels que supérieur à, inférieur à, supérieur ou égal à, ou inférieur ou égal à, vous n'avez pas besoin de désigner l'heure, bien que vous puissiez le faire si vous le souhaitez. Les deux déclarations suivantes fonctionneraient :

Fichiers de géodatabases, fichiers de formes, couvertures et autres sources de données basées sur des fichiers

Les dates dans les géodatabases fichier, les fichiers de formes et les couvertures sont précédées de date .

Les géodatabases fichier prennent en charge l'utilisation d'une heure dans le champ de date, ce qui peut donc être ajouté à l'expression :

Les fichiers de formes et les couvertures ne prennent pas en charge l'utilisation de l'heure dans un champ de date.

Tout le SQL utilisé par la géodatabase fichier est basé sur la norme SQL-92.

Géodatabase personnelle

Les dates dans les géodatabases personnelles sont délimitées par un signe dièse (#).

Il peut être raccourci en [Datefield] = #mm-dd-yyyy#.

Limites connues

L'interrogation par rapport à une date sur la partie gauche (première table) d'une jointure fonctionne uniquement avec les sources de données basées sur des fichiers, telles que les géodatabases fichier, les fichiers de formes et les tables DBF. Cependant, il existe une solution de contournement possible pour travailler avec des données non basées sur des fichiers, telles que des données de géodatabase personnelle et des données ArcSDE, comme décrit ci-dessous.

L'interrogation par rapport à une date sur la partie gauche d'une jointure sera réussie lors de l'utilisation de la version limitée de SQL développée pour les sources de données basées sur des fichiers. Si vous n'utilisez pas une telle source de données, vous pouvez forcer l'expression à utiliser ce format. Cela peut être fait en s'assurant que l'expression de requête implique des champs de plusieurs tables de jointure. Par exemple, si une classe d'entités et une table (FC1 et Table1) sont jointes et proviennent toutes deux d'une géodatabase personnelle, les expressions suivantes échoueront ou ne renverront aucune donnée :

Pour interroger avec succès, vous pouvez créer une requête comme suit :

Étant donné que la requête implique des champs des deux tables, la version SQL limitée sera utilisée. Dans cette expression, Table1.OBJECTID est toujours > 0 pour les enregistrements qui correspondent lors de la création de la jointure, donc cette expression est vraie pour toutes les lignes qui contiennent des correspondances de jointure.

Pour vous assurer que chaque enregistrement avec FC1.date = date '01/12/2001' est sélectionné, utilisez la requête suivante :

Cette requête sélectionnera tous les enregistrements avec FC1.date = date '01/12/2001', qu'il y ait ou non une correspondance de jointure pour chaque enregistrement particulier.


Les installations autour desquelles les zones de service sont générées.

L'ensemble de fonctionnalités des installations a trois attributs :

Le champ ID géré par le système.

Le champ géométrique indiquant l'emplacement géographique de l'objet d'analyse de réseau.

Le nom de l'établissement. Si le nom est vide, vide ou nul, un nom est automatiquement généré au moment de la résolution.

Spécifie la taille et le nombre de polygones de zone de desserte à générer pour chaque ressource. Les unités sont déterminées par la valeur Break Units.

Lorsque l'outil Générer des zones de desserte s'exécute, une interaction notable se produit entre les paramètres suivants : Valeurs de rupture , Unités de rupture et Attribut de temps ou Attribut de distance . Ensemble, les valeurs de rupture et les unités de rupture définissent jusqu'où ou combien de temps la zone de service doit s'étendre autour de l'installation ou des installations. Les paramètres Attribut de temps et Attribut de distance définissent chacun un attribut de coût de réseau. Cependant, un seul de ces deux attributs de coût est utilisé et celui que le solveur choisit d'utiliser correspond à la valeur des unités de rupture, c'est-à-dire que lorsque vous spécifiez une valeur d'unité de rupture basée sur le temps, telle que les secondes ou les minutes, l'outil résout à l'aide de l'attribut de coût défini dans le paramètre Attribut de temps. Lorsque vous spécifiez une valeur d'unité de rupture basée sur la distance, telle que des kilomètres ou des miles, elle utilise l'attribut de coût défini dans le paramètre Attribut de distance.

Plusieurs coupures de polygones peuvent être définies pour créer des zones de service concentriques par installation. Par exemple, pour rechercher des zones de service de deux, trois et cinq milles pour chaque installation, entrez 2 3 5 , en séparant les valeurs par un espace. Définissez Break Units sur Miles et assurez-vous que vous avez choisi un attribut de réseau basé sur la distance pour le paramètre Distance Attribute.

Unités du paramètre Valeurs de rupture.

  • Mètres
  • Kilomètres
  • Pieds
  • verges
  • Milles
  • Miles nautiques
  • Secondes
  • Minutes
  • Les heures
  • Journées

L'outil Générer des zones de desserte choisit s'il faut utiliser l'attribut de coût de réseau spécifié dans le paramètre Attribut de temps ou Attribut de distance selon que les unités que vous spécifiez ici sont basées sur le temps ou la distance.

L'outil effectue la conversion d'unités nécessaire lorsque la valeur des unités de rupture diffère des unités de l'attribut de coût de temps ou de distance correspondant.

Le jeu de données réseau sur lequel l'analyse sera effectuée. Les jeux de données de réseau représentent le plus souvent des réseaux routiers, mais peuvent également représenter d'autres types de réseaux de transport. L'ensemble de données réseau a besoin d'au moins un attribut de coût basé sur le temps et un attribut de coût basé sur la distance.

L'espace de travail en sortie et le nom des entités en sortie. Cet espace de travail doit déjà exister. L'espace de travail de sortie par défaut est in_memory .

Choisissez si la direction de déplacement utilisée pour générer les polygones de zone de desserte est vers ou à l'opposé des ressources.

  • TRAVEL_FROM —La zone de desserte est générée dans la direction opposée aux ressources.
  • TRAVEL_TO —La zone de desserte est créée en direction des ressources.

La direction de déplacement peut changer la forme des polygones car les impédances des côtés opposés d'une rue peuvent différer, ou des rues à sens unique peuvent exister. La direction que vous devez choisir dépend de la nature de votre analyse de zone de service. La zone de service d'un magasin de livraison de pizzas, par exemple, doit être créée à l'écart de l'établissement, tandis que la zone de service d'un hôpital doit être créée vers l'établissement puisque le temps de trajet critique pour un patient se rend à l'hôpital.

  • Il représente l'heure de départ si le sens de déplacement est défini pour s'éloigner des installations.
  • Il représente l'heure d'arrivée si la direction de déplacement est définie pour se rendre vers les installations.

Votre jeu de données réseau doit inclure des données de trafic pour que ce paramètre ait un effet.

La résolution répétée de la même analyse, mais en utilisant différentes valeurs d'heure du jour, vous permet de voir comment la portée d'une installation change au fil du temps. Par exemple, la zone de service de cinq minutes autour d'une caserne de pompiers peut commencer large tôt le matin, diminuer pendant l'heure de pointe du matin, s'étendre en fin de matinée, et ainsi de suite, tout au long de la journée.

La politique de demi-tour aux carrefours. Autoriser les demi-tours implique que le solveur peut faire demi-tour à un carrefour et revenir en arrière dans la même rue. Étant donné que les jonctions représentent des intersections de rues et des impasses, différents véhicules peuvent être capables de faire demi-tour à certaines jonctions mais pas à d'autres - cela dépend si la jonction représente une intersection ou une impasse. Pour s'adapter, le paramètre de politique de demi-tour est implicitement spécifié par le nombre de tronçons qui se connectent à la jonction, ce que l'on appelle la valence de jonction. Les valeurs acceptables pour ce paramètre sont répertoriées ci-dessous, chacune est suivie d'une description de sa signification en termes de valence de jonction.

  • ALLOW_UTURNS —Les demi-tours sont autorisés aux jonctions avec un nombre quelconque de tronçons connectés. Ceci est la valeur par défault.
  • NO_UTURNS —Les demi-tours sont interdits à toutes les jonctions, quelle que soit la valence de la jonction. Notez, cependant, que les demi-tours sont toujours autorisés aux emplacements du réseau même lorsque ce paramètre est choisi. Cependant, vous pouvez définir la propriété CurbApproach des emplacements de réseau individuels pour y interdire également les demi-tours.
  • ALLOW_DEAD_ENDS_ONLY —Les demi-tours sont interdits à toutes les jonctions, à l'exception de celles qui n'ont qu'un seul tronçon adjacent (une impasse).
  • ALLOW_DEAD_ENDS_AND_INTERSECTIONS_ONLY —Les demi-tours sont interdits aux jonctions où exactement deux tronçons adjacents se rencontrent, mais sont autorisés aux intersections (jonctions avec trois tronçons adjacents ou plus) et aux impasses (jonctions avec exactement un tronçon adjacent). Souvent, les réseaux ont des jonctions superflues au milieu des segments de route. Cette option empêche les véhicules de faire demi-tour à ces endroits.

Si vous avez besoin d'une politique de demi-tour définie plus précisément, envisagez d'ajouter un évaluateur de délai de virage global à un attribut de coût de réseau, ou d'ajuster ses paramètres s'il en existe un, et portez une attention particulière à la configuration des virages inversés. Examinez également la définition de la propriété CurbApproach de vos emplacements réseau.

La valeur de ce paramètre est remplacée lorsque Travel Mode ( Travel_Mode en Python) est défini sur une valeur autre que custom.

Spécifie les interruptions ponctuelles, qui sont divisées en deux types : restriction et interruptions ponctuelles de coût ajouté. Ils restreignent temporairement la traversée ou ajoutent de l'impédance aux points du réseau. Les interruptions ponctuelles sont définies par un jeu d'entités et les valeurs attributaires que vous spécifiez pour les entités ponctuelles déterminent s'il s'agit d'interruptions de restriction ou de coût ajouté. Les champs de la table attributaire sont répertoriés et décrits ci-dessous.

Le champ ID géré par le système.

Le champ géométrique indiquant l'emplacement géographique de l'objet d'analyse de réseau.

  • Restriction (0) : interdit de traverser la barrière. Ceci est la valeur par défault.
  • Coût ajouté (2) : le franchissement de la barrière augmente le coût du réseau du montant spécifié dans les champs Additional_Time et Additional_Distance.

Utilisez la valeur 0 pour la restriction et 2 pour le coût supplémentaire.

AdditionalCost indique la quantité d'impédance ajoutée lorsqu'une zone de service traverse la barrière.

L'unité de cette valeur de champ est la même que les unités spécifiées pour les unités de rupture .

Spécifie les barrières de ligne, qui restreignent temporairement leur traversée. Les barrières linéaires sont définies par un ensemble de caractéristiques. Les champs de la table attributaire sont répertoriés et décrits ci-dessous.

Le champ ID géré par le système.

Le champ géométrique indiquant l'emplacement géographique de l'objet d'analyse de réseau.

Spécifie les barrières polygonales, qui sont divisées en deux types : barrières polygonales de restriction et de coût mis à l'échelle. Ils restreignent temporairement la traversée ou l'impédance d'échelle sur les parties du réseau qu'ils couvrent. Les barrières surfaciques sont définies par un jeu d'entités et les valeurs attributaires que vous spécifiez pour les entités surfaciques déterminent s'il s'agit de barrières de restriction ou de coût à l'échelle. Les champs de la table attributaire sont répertoriés et décrits ci-dessous.

Le champ ID géré par le système.

Le champ géométrique indiquant l'emplacement géographique de l'objet d'analyse de réseau.

Spécifie si la barrière restreint complètement les déplacements ou augmente le coût de la traversée. Il y a deux options :

  • Restriction (0) : interdit de traverser n'importe quelle partie de la barrière. Ceci est la valeur par défault.
  • Coût échelonné (1) : met à l'échelle l'impédance des arêtes sous-jacentes en les multipliant par la valeur de la propriété ScaledCostFactor. Si les bords sont partiellement couverts par la barrière, l'impédance est répartie et multipliée.

Utilisez la valeur 0 pour la restriction et 1 pour le coût mis à l'échelle.

ScaledCostFactor indique de combien l'impédance est multipliée lorsqu'une zone de service traverse la barrière.

Définit l'attribut de coût de réseau à utiliser lorsque la valeur Break Units est une unité de temps.

L'outil effectue la conversion d'unité de temps nécessaire lorsque la valeur des unités de rupture diffère des unités de l'attribut de coût défini ici. En d'autres termes, les unités de temps des pauses et l'attribut de coût du réseau n'ont pas besoin d'être les mêmes.

La valeur de ce paramètre est remplacée lorsque Travel Mode ( Travel_Mode en Python) est défini sur une valeur autre que custom.

Unités de l'attribut de coût de réseau spécifié par le paramètre Attribut de temps. Il s'agit simplement d'un paramètre d'information qui ne peut pas être modifié sans modifier directement le jeu de données réseau. Il est également inutile de modifier car les conversions d'unités entre les unités de valeur de rupture et l'attribut de coût sont gérées pour vous.

La valeur de ce paramètre est remplacée lorsque Travel Mode ( Travel_Mode en Python) est défini sur une valeur autre que custom.

Définit l'attribut de coût de réseau à utiliser lorsque la valeur Unités de rupture est une unité de distance.

L'outil effectue la conversion d'unité de distance nécessaire lorsque la valeur des unités de rupture diffère des unités de l'attribut de coût défini ici. En d'autres termes, les unités de distance des coupures et l'attribut de coût du réseau n'ont pas besoin d'être les mêmes.

La valeur de ce paramètre est remplacée lorsque Travel Mode ( Travel_Mode en Python) est défini sur une valeur autre que custom.

Unités de l'attribut de coût de réseau spécifié par le paramètre Attribut de distance. Il s'agit simplement d'un paramètre d'information qui ne peut pas être modifié sans modifier directement le jeu de données réseau. Il est également inutile de modifier car les conversions d'unités entre les unités de valeur de rupture et l'attribut de coût sont gérées pour vous.

La valeur de ce paramètre est remplacée lorsque Travel Mode ( Travel_Mode en Python) est défini sur une valeur autre que custom.

  • Coché : utilisez l'attribut de hiérarchie pour l'analyse. L'utilisation d'une hiérarchie amène le solveur à préférer les arêtes d'ordre supérieur aux arêtes d'ordre inférieur. Les résolutions hiérarchiques sont plus rapides et peuvent être utilisées pour simuler la préférence d'un conducteur qui choisit de voyager sur les autoroutes plutôt que sur les routes locales lorsque cela est possible, même si cela signifie un trajet plus long. Cette option est activée uniquement si le jeu de données réseau en entrée possède un attribut de hiérarchie.
  • Non coché : n'utilisez pas l'attribut de hiérarchie pour l'analyse. Ne pas utiliser de hiérarchie donne un itinéraire exact pour le jeu de données réseau.

Le paramètre est désactivé si un attribut de hiérarchie n'est pas défini sur le jeu de données réseau utilisé pour effectuer l'analyse.

Vous pouvez utiliser le paramètre Forcer la hiérarchie au-delà de la distance pour forcer le solveur à utiliser la hiérarchie même si Utiliser la hiérarchie dans l'analyse est défini sur Faux.

Ce paramètre est ignoré sauf si le mode de déplacement est défini sur Personnalisé . Lors de la modélisation d'un mode de marche personnalisé, il est recommandé de désactiver la hiérarchie, car la hiérarchie est conçue pour les véhicules motorisés.

  • USE_HIERARCHY — Utilisez l'attribut de hiérarchie pour l'analyse. L'utilisation d'une hiérarchie amène le solveur à préférer les arêtes d'ordre supérieur aux arêtes d'ordre inférieur. Les résolutions hiérarchiques sont plus rapides et peuvent être utilisées pour simuler la préférence d'un conducteur qui choisit de voyager sur les autoroutes plutôt que sur les routes locales lorsque cela est possible, même si cela signifie un trajet plus long. Cette option n'est valide que si le jeu de données réseau en entrée possède un attribut de hiérarchie.
  • NO_HIERARCHY —N'utilisez pas l'attribut de hiérarchie pour l'analyse. Ne pas utiliser de hiérarchie donne un itinéraire exact pour le jeu de données réseau.

Le paramètre n'est pas utilisé si un attribut de hiérarchie n'est pas défini sur le jeu de données réseau utilisé pour effectuer l'analyse. Dans de tels cas, utilisez "#" comme valeur de paramètre.

Vous pouvez utiliser le paramètre Force_Hierarchy_Beyond_Distance pour forcer la résolution à utiliser la hiérarchie même si Use_Hierarchy_in_Analysis est défini sur False .

Ce paramètre est ignoré sauf si Travel_Mode est défini sur CUSTOM . Lors de la modélisation d'un mode de marche personnalisé, il est recommandé de désactiver la hiérarchie, car la hiérarchie est conçue pour les véhicules motorisés.

Indique quels attributs de restriction de réseau sont respectés pendant le temps de résolution.

La valeur de ce paramètre est remplacée lorsque Travel Mode ( Travel_Mode en Python) est défini sur une valeur autre que custom.

Spécifie les valeurs de paramètre pour les attributs de réseau qui ont des paramètres. Le jeu d'enregistrements comporte deux colonnes qui fonctionnent ensemble pour identifier de manière unique les paramètres et une autre colonne qui spécifie la valeur du paramètre.

La valeur de ce paramètre est remplacée lorsque Travel Mode ( Travel_Mode en Python) est défini sur une valeur autre que custom.

L'ensemble d'enregistrements de valeurs de paramètre d'attribut a des attributs associés. Les champs de la table attributaire sont répertoriés ci-dessous et décrits.

Le champ ID géré par le système.

Nom de l'attribut de réseau dont le paramètre d'attribut est défini par la ligne du tableau.

Nom du paramètre d'attribut dont la valeur est définie par la ligne du tableau. (Les paramètres de type d'objet ne peuvent pas être mis à jour à l'aide de cet outil.)

La valeur souhaitée pour le paramètre d'attribut. Si aucune valeur n'est spécifiée, le paramètre d'attribut est défini sur null.

La tolérance d'accrochage maximale est la distance la plus éloignée que Network Analyst recherche lors de la localisation ou du déplacement d'un point sur le réseau. La recherche recherche des arêtes ou des jonctions appropriées et accroche le point au plus proche. Si un emplacement approprié n'est pas trouvé dans la tolérance d'accrochage maximale, l'objet est marqué comme non localisé.

  • EXCLUDE —Les installations ne sont situées que sur des portions traversables du réseau. Cela empêche de les localiser sur des éléments qui ne peuvent pas être atteints pendant le processus de résolution en raison de restrictions ou de barrières. Gardez à l'esprit que les installations peuvent être situées plus loin de leur emplacement prévu que si cette option n'était pas cochée.
  • INCLUDE —Les ressources peuvent être situées sur n'importe quel élément du réseau, mais les ressources situées sur des éléments restreints ne peuvent pas être utilisées pendant le processus de résolution.

Une expression SQL utilisée pour sélectionner un sous-ensemble d'entités source qui limite les éléments de réseau sur lesquels les installations peuvent être situées. La syntaxe de ce paramètre se compose de deux parties : la première est le nom de la classe d'entités source (suivi d'un espace) et la seconde est l'expression SQL. Pour écrire une expression SQL pour deux ou plusieurs classes d'entités source, séparez-les par un point-virgule.

Pour vous assurer que les installations ne sont pas situées sur des autoroutes à accès limité, par exemple, écrivez une expression SQL comme celle-ci pour exclure ces entités source : "Streets" "FUNC_CLASS not in('1', '2')" .

Notez que les barrières ignorent la clause WHERE du localisateur d'entités lors du chargement.

Choisissez la manière dont les polygones de zone de desserte sont générés lorsque plusieurs ressources sont présentes dans l'analyse.

  • NO_MERGE —Crée des polygones individuels pour chaque ressource. Les polygones peuvent se chevaucher.
  • NO_OVERLAP — Crée des polygones individuels de telle sorte qu'un polygone d'une installation ne puisse pas chevaucher des polygones d'autres installations de plus, toute portion du réseau ne peut être couverte que par la zone de service de l'installation la plus proche.
  • MERGE — Crée et joint les polygones de différentes ressources qui ont la même valeur de rupture.

Spécifie l'option permettant de créer des polygones de zone de desserte concentriques sous forme de disques ou d'anneaux. Cette option est applicable uniquement lorsque plusieurs valeurs de rupture sont spécifiées pour les ressources.

  • RINGS : n'inclut pas la zone des plus petites coupures. Cela crée des polygones entre des pauses consécutives. Utilisez cette option si vous souhaitez trouver la zone d'une pause à l'autre. Par exemple, si vous créez des zones de service de 5 et 10 minutes, le polygone de zone de service de 10 minutes exclura la zone sous le polygone de zone de service de 5 minutes.
  • DISQUES — Crée des polygones allant de l'installation à la coupure. Par exemple, si vous créez des zones de service de 5 et 10 minutes, le polygone de zone de service de 10 minutes inclura la zone sous le polygone de zone de service de 5 minutes.

Spécifie l'option de création de polygones détaillés ou généralisés.

  • SIMPLE_POLYS —Crée des polygones généralisés qui sont générés rapidement et sont assez précis. C'est la valeur par défaut.
  • DETAILED_POLYS —Crée des polygones détaillés qui modélisent avec précision les lignes de zone de desserte et peuvent contenir des îlots de zones non atteintes. Cette option est beaucoup plus lente que la génération de polygones généralisés. Cette option n'est pas prise en charge lors de l'utilisation de la hiérarchie.

Spécifie la distance à laquelle les polygones de la zone de desserte sont ajustés. Ceci est utile lorsque vos données sont très éparses et que vous ne voulez pas que la zone de service couvre de grandes zones où il n'y a pas d'entités.

Aucune valeur ou une valeur de 0 pour ce paramètre spécifie que les polygones de la zone de desserte ne doivent pas être coupés. La valeur du paramètre est ignorée lors de l'utilisation de la hiérarchie.

Spécifiez de combien vous souhaitez simplifier la géométrie du polygone.

La simplification conserve les points critiques d'un polygone pour définir sa forme essentielle et supprime les autres points. La distance de simplification que vous spécifiez est le décalage maximal autorisé par rapport au polygone d'origine à partir duquel le polygone simplifié peut dévier. Simplifier un polygone réduit le nombre de sommets et tend à réduire les temps de dessin.

Limite le nombre d'installations pouvant être ajoutées à l'analyse de la zone de desserte.

Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution. Par exemple, vous pouvez affecter une valeur faible à ce paramètre pour une version gratuite du service que vous créez et utiliser une valeur plus élevée pour une version payante du service.

Une valeur nulle indique qu'il n'y a pas de limite.

Limite le nombre de pauses pouvant être ajoutées à l'analyse de la zone de desserte.

Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution. Par exemple, vous pouvez affecter une valeur faible à ce paramètre pour une version gratuite du service que vous créez et utiliser une valeur plus élevée pour une version payante du service.

Une valeur nulle indique qu'il n'y a pas de limite.

Limite le nombre d'entités pouvant être affectées par les interruptions ponctuelles.

Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution. Par exemple, vous pouvez affecter une valeur faible à ce paramètre pour une version gratuite du service que vous créez et utiliser une valeur plus élevée pour une version payante du service.

Une valeur nulle indique qu'il n'y a pas de limite.

Limite le nombre d'entités pouvant être affectées par les interruptions de ligne.

Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution. Par exemple, vous pouvez affecter une valeur faible à ce paramètre pour une version gratuite du service que vous créez et utiliser une valeur plus élevée pour une version payante du service.

Une valeur nulle indique qu'il n'y a pas de limite.

Limite le nombre d'entités pouvant être affectées par les barrières polygonales.

Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution. Par exemple, vous pouvez affecter une valeur faible à ce paramètre pour une version gratuite du service que vous créez et utiliser une valeur plus élevée pour une version payante du service.

Une valeur nulle indique qu'il n'y a pas de limite.

Limite la taille de la valeur du paramètre Break Value lors de la résolution des zones de desserte temporelles.

Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution. Par exemple, vous pouvez affecter une valeur faible à ce paramètre pour une version gratuite du service que vous créez et utiliser une valeur plus élevée pour une version payante du service.

Une valeur nulle indique qu'il n'y a pas de limite.

Limite la valeur de la valeur du paramètre Break Value lors de la résolution des zones de desserte basées sur la distance.

Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution. Par exemple, vous pouvez affecter une valeur faible à ce paramètre pour une version gratuite du service que vous créez et utiliser une valeur plus élevée pour une version payante du service.

Une valeur nulle indique qu'il n'y a pas de limite.

Spécifie la valeur de rupture après laquelle le solveur forcera la hiérarchie même si la hiérarchie n'a pas été activée lors de la résolution des zones de desserte temporelles.

La résolution des zones de service pour les valeurs de rupture élevées tout en utilisant la hiérarchie du réseau a tendance à nécessiter beaucoup moins de traitement que la résolution des mêmes zones de service sans utiliser la hiérarchie. Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution.

Une valeur nulle indique que la hiérarchie ne sera jamais appliquée et que la valeur du paramètre Utiliser la hiérarchie dans l'analyse sera toujours respectée. Si le jeu de données réseau en entrée ne prend pas en charge la hiérarchie, la spécification d'une valeur pour ce paramètre entraînera une erreur. Une valeur nulle doit être utilisée dans ce cas.

Spécifie la valeur de rupture après laquelle le solveur forcera la hiérarchie même si la hiérarchie n'a pas été activée lors de la résolution des zones de desserte basées sur la distance.

La résolution des zones de service pour les valeurs de rupture élevées tout en utilisant la hiérarchie du réseau a tendance à nécessiter beaucoup moins de traitement que la résolution des mêmes zones de service sans utiliser la hiérarchie. Ce paramètre vous aide à gérer la quantité de traitement qui se produit lors de la résolution.

Une valeur nulle indique que la hiérarchie ne sera jamais appliquée et que la valeur du paramètre Utiliser la hiérarchie dans l'analyse sera toujours respectée. Si le jeu de données réseau en entrée ne prend pas en charge la hiérarchie, la spécification d'une valeur pour ce paramètre entraînera une erreur. Une valeur nulle doit être utilisée dans ce cas.

  • NO_SAVE_OUTPUT_LAYER —Une couche d'analyse de réseau n'est pas incluse dans la sortie.
  • SAVE_OUTPUT_LAYER —La sortie inclut une couche d'analyse de réseau des résultats.

Dans les deux cas, une classe d'entités avec des polygones de zone de desserte est renvoyée. Cependant, un administrateur de serveur peut choisir de générer également une couche d'analyse de réseau afin que la configuration et les résultats de l'outil puissent être débogués à l'aide des commandes Network Analyst dans l'environnement ArcGIS for Desktop. Cela peut rendre le processus de débogage beaucoup plus facile.

Dans ArcGIS for Desktop , l'emplacement de sortie par défaut de la couche d'analyse de réseau se trouve dans le dossier temporaire. Vous pouvez déterminer l'emplacement du dossier temporaire en évaluant la valeur de l'environnement de géotraitement arcpy.env.scratchFolder. La couche d'analyse de réseau en sortie est stockée sous la forme d'un fichier LYR dont le nom commence par _ags_gpna et est suivi d'un GUID alphanumérique.

Spécifie le ou les fuseaux horaires du paramètre Heure du jour.

  • GEO_LOCAL —Le paramètre Time of Day fait référence au ou aux fuseaux horaires dans lesquels se trouvent les installations. Par conséquent, les heures de début ou de fin des zones de service sont décalées par fuseau horaire. La définition de l'heure du jour à 9h00, le choix géographiquement local pour le fuseau horaire pour l'heure de la journée et la résolution entraînent la génération de zones de service pour 9h00 heure de l'Est pour toutes les installations situées dans le fuseau horaire de l'Est, 9 h 00, heure du centre pour les installations situées dans le fuseau horaire central, 9 h 00, heure des Rocheuses pour les installations situées dans le fuseau horaire des Rocheuses, et ainsi de suite, pour les installations situées dans des fuseaux horaires différents .Si les magasins d'une chaîne couvrant les États-Unis ouvrent à 9h00, heure locale, cette valeur de paramètre peut être choisie pour rechercher les territoires de marché à l'heure d'ouverture pour tous les magasins en une seule résolution. Tout d'abord, les magasins du fuseau horaire de l'Est s'ouvrent et un polygone est généré, puis une heure plus tard, les magasins s'ouvrent à l'heure du centre, et ainsi de suite. Neuf heures sont toujours en heure locale mais décalées en temps réel.
  • UTC : le paramètre Heure du jour fait référence au temps universel coordonné (UTC). Par conséquent, toutes les installations sont atteintes ou quittées simultanément, quel que soit le ou les fuseaux horaires dans lesquels elles se trouvent. Le réglage de l'heure du jour à 14 h 00, le choix de l'UTC, puis la résolution entraîne la génération de zones de service pour 9 h 00 Eastern Standard Heure pour toutes les installations dans le fuseau horaire de l'Est, 8h00, heure normale du Centre pour les installations dans le fuseau horaire central, 7h00, heure normale des Rocheuses pour les installations dans le fuseau horaire des Rocheuses, et ainsi de suite, pour les installations dans différents fuseaux horaires .

Le scénario ci-dessus suppose l'heure standard. Pendant l'heure d'été, les heures de l'Est, du Centre et des Rocheuses auraient chacune une heure d'avance (c'est-à-dire 10h00, 9h00 et 8h00, respectivement).

Quel que soit le paramètre Fuseau horaire pour l'heure du jour, toutes les ressources doivent se trouver dans le même fuseau horaire lorsque l'heure du jour a une valeur non nulle et que Polygones pour plusieurs ressources est défini pour créer des polygones fusionnés ou ne se chevauchant pas.

Choisissez le mode de transport pour l'analyse. CUSTOM est toujours un choix. Pour que d'autres noms de mode de déplacement apparaissent, ils doivent être présents dans le jeu de données réseau spécifié dans le paramètre Network_Dataset. (La fonction arcpy.na.GetTravelModes fournit un dictionnaire des objets de mode de déplacement configurés sur un jeu de données réseau, et la propriété name renvoie le nom d'un objet de mode de déplacement.)

Un mode de déplacement est défini sur un jeu de données réseau et fournit des valeurs de remplacement pour les paramètres qui, ensemble, modélisent une voiture, un camion, un piéton ou d'autres modes de déplacement. En choisissant un mode de déplacement ici, vous n'avez pas besoin de fournir des valeurs pour les paramètres suivants, qui sont remplacés par les valeurs spécifiées dans le jeu de données réseau :


Manipulation de données de charge turbo avec des curseurs et des dictionnaires Python

par RichardFairhurs t

Les problèmes liés à l'utilisation des outils de calcul de champ, de jointure et de statistiques récapitulatives

Le calculateur de terrain est un excellent outil et facile à configurer, mais il présente plusieurs limitations qui peuvent sérieusement ralentir les routines scriptées lorsque vous devez effectuer de nombreuses manipulations de données avec de grands ensembles de données. La limitation la plus évidente est qu'un seul champ peut être calculé à la fois. Cela signifie souvent devoir traiter plusieurs fois chaque enregistrement de la classe d'entités afin de mettre à jour plusieurs champs. Si vous devez effectuer des transferts de données entre des classes d'entités à l'aide d'une jointure, il est essentiel d'indexer le champ de jointure dans les deux classes d'entités pour éviter les calculs qui prennent une éternité à traiter, et même dans ce cas, la vitesse est considérablement plus lente lorsqu'une jointure est impliquée. De plus, si vous avez réellement besoin d'utiliser plusieurs champs pour créer une jointure qui corresponde correctement aux enregistrements entre les classes d'entités, votre seule option consiste à créer un nouveau champ dans les deux classes d'entités qui concatène ces valeurs de champ pour créer une jointure qui fonctionne. De plus, souvent avant que ces jointures puissent être créées, une table récapitulative doit être créée, ce qui prend plus de temps.

Heureusement, si vous disposez d'ArcGIS Desktop 10.1 ou d'une version ultérieure, il existe une alternative qui peut accélérer considérablement les scripts comme celui-ci et rendre les transferts de données entre les classes d'entités à la fois flexibles et incroyablement rapides. La solution consiste à remplacer le calculateur de champ par un ou plusieurs curseurs d'accès aux données (curseurs da) et jointures et à créer des tableaux récapitulatifs avec un ou plusieurs dictionnaires python construits à l'aide d'un da SearchCursor.

Utilisation d'un curseur de mise à jour pour remplacer un calcul de champ dans une seule classe d'entités :

Vous trouverez ci-dessous un script simple qui utilisera un UpdateCursor sur une classe d'entités pour remplir un champ URL avec un lien hypertexte créé à l'aide d'une valeur extraite d'un autre champ. La méthode strftime est utilisée pour imprimer l'heure à laquelle le script démarre et l'heure à laquelle il se termine. Pour adapter ce script à vos propres données, il vous suffit de modifier le chemin et le nom de la classe d'entités à la ligne 7, les noms de champ dans la liste des champs à la ligne 9 et la chaîne d'URL à la ligne 14. Cela devrait fonctionner environ 7 fois plus rapidement qu'un calcul de champ similaire.

Utilisation d'un curseur de mise à jour pour remplacer plusieurs calculs de champ au sein d'une même classe d'entités :

Disons maintenant que nous devons en fait traiter 2 calculs de champ supplémentaires pour terminer la mise à jour de cette classe d'entités. Un calcul doit ajouter deux autres champs ensemble, et l'autre doit convertir les valeurs d'un champ des valeurs en majuscules en valeurs de casse de titre. Donc, s'il y a 100 000 enregistrements, tous ces enregistrements doivent être calculés 3 fois.

Tout cela peut être géré en un seul passage d'un UpdateCursor à travers les 100K enregistrements. Étant donné que les enregistrements ne doivent être modifiés qu'une seule fois et que l'ajout de plus de champs à lire ou à calculer par UpdateCursor prend très peu de temps supplémentaire à traiter, le gain de vitesse sur les calculs de 3 champs est beaucoup plus rapide que le script précédent. En conséquence, plus vous pouvez remplacer de calculs de champs avec un seul passage d'un UpdateCursor, plus la vitesse du script s'améliorera considérablement.

Vous trouverez ci-dessous le script qui peut effectuer les trois mises à jour de champ (supposez qu'il n'y a pas de valeurs Null dans les champs additionnés ou changeant de casse). Pour utiliser ce script avec vos propres données, il vous suffit de modifier les lignes 7, 9 et 14 (éventuellement modifier les calculs des lignes 16 et 18).

Utilisation d'un dictionnaire Python construit à l'aide d'un curseur de recherche pour remplacer une jointure reliant deux classes d'entités :

Une autre manipulation de données courante consiste à joindre une classe d'entités à une autre afin de transférer des valeurs de la classe d'entités jointe vers la classe d'entités cible à l'aide du calculateur de champs. Cependant, les entités chargées dans un dictionnaire Python à l'aide d'un curseur de recherche sont beaucoup plus rapides pour faire correspondre les valeurs de champ de jointure dans une classe d'entités à une autre qu'une jointure. Combiné à l'utilisation d'un UpdateCursor pour remplacer le calculateur de champ, la vitesse de ces types de manipulations de données peut être encore plus spectaculaire que les manipulations de données sur une seule classe d'entités.

Exemple 1 - Transfert d'une valeur de champ unique entre des classes d'entités

Vous trouverez ci-dessous le code requis pour transférer la valeur d'une classe d'entités à une autre en fonction d'une valeur de jointure commune dans un autre champ. Pour adapter ce script à vos propres données, modifiez les lignes 7 et 14 par le chemin et le nom de la source (Joindre) et mettez à jour (cible) la classe d'entités pour qu'elle corresponde aux classes d'entités que vous devriez normalement rejoindre, modifiez les lignes 9 et 16 pour remplacer le champ list avec le nom du champ Join et le nom du champ en cours de transfert.

Exemple 2 - Transfert de plusieurs valeurs de champ entre des classes d'entités où il existe une correspondance 1:1 entre des ensembles de champs

Tout comme le calculateur de champs, plus le nombre de champs transférés d'une classe d'entités à l'autre est important, plus votre script s'accélérera. Si le transfert est un champ simple pour le transfert de champ, les champs de transfert peuvent être traités dans une boucle for. Vous trouverez ci-dessous un exemple de transfert de 5 champs correspondants entre deux classes d'entités. Pour adapter ce code à vos données, vous devez à nouveau modifier les classes d'entités aux lignes 7 et 14 et les listes de champs aux lignes 9 et 16.

Exemple 3 - Transfert de plusieurs valeurs de champs entre des classes d'entités impliquant des manipulations de champs complexes

Si vous devez effectuer des transferts de champ plus complexes qui font plus qu'un simple transfert de données d'une table à une autre, vous pouvez le faire en utilisant un code similaire aux exemples de calculs de champ effectués sur une seule table. Voici les 3 mises à jour de champ de mon deuxième exemple de calcul de champ effectué entre deux tables distinctes avec des valeurs de jointure communes au lieu de toutes dans une seule table.

Création d'une clé de dictionnaire Python multi-champs pour remplacer un champ de jointure concaténé :

La gestion des valeurs de jointure multi-champs qui correspondent à des enregistrements entre deux classes d'entités est également possible à l'aide de dictionnaires et de curseurs sans avoir à concaténer des champs distincts dans un nouveau champ. La concaténation est toujours nécessaire, mais elle peut être manipulée à la volée en mémoire, ce qui est bien plus rapide que le calcul d'un champ. Vous trouverez ci-dessous un exemple de transfert de champ unique, mais cette fois en faisant correspondre les enregistrements à l'aide de 3 champs distincts pour définir les valeurs uniques entre les classes d'entités utilisées pour faire correspondre les enregistrements entre les classes d'entités.

Remplacement des jointures successives par le traitement simultané de plusieurs dictionnaires Python construits à l'aide da SearchCursors

Lorsque plusieurs jointures doivent être créées et supprimées pour effectuer des manipulations de données entre les tables, les gains de vitesse peuvent être encore augmentés, car vous pouvez créer plusieurs dictionnaires puis traiter toutes les relations de jointure simultanément lors d'un seul passage du curseur de mise à jour sur le classe d'entités mise à jour. Toutes les tables source doivent être lues dans les dictionnaires avant de traiter le curseur de mise à jour pour obtenir cet avantage. Plus vous pouvez remplacer de jointures de cette manière, plus la vitesse de votre script s'améliorera.

Vous trouverez ci-dessous un exemple où deux classes d'entités qui seraient normalement jointes à la classe d'entités mise à jour sont remplacées par des dictionnaires et traitées simultanément par une seule opération UpdateCursor.

Utilisation d'un dictionnaire Python construit à l'aide d'un curseur de recherche pour remplacer une table de sortie de statistiques récapitulatives

Un autre besoin courant consiste à créer un résumé d'une classe d'entités pour les valeurs uniques d'un ou de plusieurs champs couvrant plusieurs enregistrements. Le dictionnaire Python peut être utilisé à la place d'une sortie de tableau récapitulatif pour accomplir cela. L'avantage est que la sortie est stockée en mémoire et est beaucoup plus rapide à créer que la sortie d'un tableau récapitulatif réel. Vous trouverez ci-dessous un exemple de création d'un dictionnaire récapitulatif et de son utilisation pour mettre à jour la table source avec des valeurs de somme correspondant à ce champ et créer un champ de pourcentage dans la table source pour chaque enregistrement qui a généré le récapitulatif.

Une fois les modèles compris, il est possible de faire pratiquement tout ce que vous pouvez faire avec le calculateur de champs, une jointure ou un tableau récapitulatif à l'aide d'un curseur de mise à jour ou d'un dictionnaire python. En utilisant ces techniques de codage, j'ai pu réécrire plusieurs scripts qui effectuaient des manipulations de données en masse de sorte qu'au lieu de prendre plus d'une heure chacun à traiter, ils ne prennent désormais que 3 à 10 minutes à traiter. Plus vous pouvez remplacer ces opérations à l'aide d'un code comme celui-ci, plus vous réaliserez d'économies de temps de traitement. Les gains de performances peuvent être énormes, ce qui permet de maintenir les données à jour sans attendre trop longtemps ni consommer une grande partie de votre temps de traitement par lots après les heures normales. Il résout également les problèmes qui surviennent lorsque vous ne pouvez pas modifier le schéma de données source pour ajouter des index ou des concaténations de champs et qu'il n'est pas pratique de faire des copies des données.

si vous trouvez des erreurs dans l'exemple de code, faites-le moi savoir et je publierai une mise à jour sur ce blog pour signaler la correction. De plus, si vous avez besoin de plus de commentaires ajoutés au code pour vous aider à comprendre ce qui se passe, faites-le moi savoir et j'essaierai de commenter le code plus en détail. Ces exemples de code sont conçus pour fonctionner sur des fichiers de formes, des classes d'entités de géodatabase fichier et des classes d'entités SDE non versionnées. Des modifications de code supplémentaires sont nécessaires pour les faire fonctionner avec les classes d'entités SDE versionnées.

Je tiens à exprimer mes remerciements à Chris Synder qui m'a d'abord démontré l'utilité de ces techniques à travers le Forum et m'a aidé à comprendre comment les appliquer.

par DanPatterson_Re fatigué

Beau travail Richard. mis en signet pour mes cours

par RichardFairhurs t

J'ai trouvé une erreur dans mes exemples de code. Partout où j'ai essayé de convertir une chaîne en casse de titre, la syntaxe n'aurait pas dû être :

updateRow[ 5 ] = Titre(updateRow[ 5 ])

updateRow[ 5 ] = updateRow[ 5 ].title()

Remarque : Le message d'origine du blog a été corrigé.

Merci pour cela, Richard - très utile.

Pourriez-vous me détailler la logique de cette ligne ? J'aimerais savoir à quoi sert chacun des composants :

par RichardFairhurs t

C'est une bonne question, et essayer d'expliquer cette ligne de code m'aidera probablement à la comprendre et à l'utiliser au mieux à l'avenir.

Je vais essayer de le séparer de gauche à droite.

1. Affectation à la variable finale du dictionnaire (cela devrait être évident, mais c'est certainement important)

2. L'accolade ouvrante (et l'accolade fermante à la toute fin) fait que tout à l'intérieur fait partie d'un dictionnaire. Tout le reste à l'intérieur des accolades est finalement conçu pour extraire les paires clé/valeur lues à partir de la table qui seront utilisées par les processus de recherche de dictionnaire ultérieurs.

3. r représente une ligne lue à partir d'un curseur ouvert sur votre table. r[0] lit le premier élément (base zéro) de la ligne, qui est en fait la valeur du premier champ de chaque ligne en cours de lecture. Les deux points suivant r[0] signifient que cette valeur sera la clé du dictionnaire utilisée par les recherches ultérieures dans le dictionnaire.

4: Après les deux points se trouve la valeur du dictionnaire associée à la clé du dictionnaire. Ceci est défini par tout ce qui tombe à l'intérieur de la paire de parenthèses, qui est un tuple, ou une collection de valeurs qui peuvent être traitées et transmises comme une valeur unique. Les paires clé/valeur de dictionnaire sont limitées à l'utilisation d'une seule valeur après les deux points, mais cela inclut des collections comme un tuple ou une liste tant qu'elles peuvent être transmises comme une seule valeur.

5. Le r[1:] à l'intérieur de la parenthèse fait partie d'une compréhension de liste qui extrait toutes les valeurs de champ dans le reste des champs du curseur étant lus comme des éléments séparés dans le tuple ou la collection de liste. Le [1:] signifie commencer par la valeur du deuxième champ dans la liste des champs et continuer à ajouter des valeurs de chaque champ qui suit jusqu'à ce que le dernier champ de la liste des champs soit lu.

6 Le "for r in" fait partie d'une compréhension de liste qui parcourt chaque ligne d'un curseur.

7. La dernière partie de la compréhension de la liste se produit avant l'accolade de fin du dictionnaire. Ce code ouvre un curseur de recherche sur la table spécifiée ( sourceFC) qui sera utilisé pour lire les lignes de la table. Le curseur sera lu une ligne à la fois par l'itérateur de l'élément 6 ci-dessus et chaque ligne contiendra les valeurs des champs spécifiés dans la liste de champs fournie ( sourceFieldsList) .

La structure ci-dessus est bonne où chaque ligne se traduira par une clé de dictionnaire toujours unique. Lorsque plusieurs lignes peuvent contenir la même valeur de clé de dictionnaire, vous devez généralement utiliser une structure pour lire un curseur dans un dictionnaire similaire à celui illustré ci-dessous (il existe de nombreuses variantes possibles de ce modèle, ce n'est donc qu'un exemple) :

  1. # Construisez un dictionnaire récapitulatif à partir d'un SearchCursor avec des valeurs clés uniques d'un champ stockant une liste de la somme de cette valeur et du nombre d'enregistrements.
  2. valeurDict = <>
  3. avec arcpy.da.SearchCursor(sourceFC, sourceFieldsList) comme searchRows :
  4. pour searchRow dans searchRows :
  5. keyValue = searchRow[ 0 ]
  6. sinon keyValue dans valueDict :
  7. # affecter une nouvelle entrée keyValue au dictionnaire stockant une liste de la première valeur NumberField et 1 pour la première valeur du compteur d'enregistrements
  8. valueDict[keyValue] = [searchRow[ 1 ], 1 ]
  9. # Additionner le dernier résumé de la valeur NumberField avec l'enregistrement actuel et incrémenter le nombre d'enregistrements lorsque la valeur-clé est déjà dans le dictionnaire
  10. autre :
  11. valueDict[keyValue][ 0 ] += searchRow[ 1 ]
  12. valueDict[keyValue][ 1 ] += 1

Excellente explication - merci Richard !

Cette information a été très utile, merci Richard.

J'ai remplacé un processus Join Field qui prenait

40 minutes avec arcpy.da.TableToNumPyArray et arcpy.da.ExtendTable qui se termine maintenant en 6 secondes.

Je me demande pourquoi les outils standard ne sont pas implémentés avec ce module plus rapide ?

C'est l'une des pages Web Python les plus utiles que j'aie jamais trouvées. Les techniques présentées ici permettent de gagner du temps non seulement en s'exécutant plus rapidement que les alternatives, mais également en réduisant la quantité de code que j'ai besoin d'écrire. Merci!

par RichardFairhurs t

Merci d'avoir pris le temps de partager votre appréciation de cette technique. Les exemples de ce blog sont volontairement simples pour souligner l'essentiel de la technique.

Pour un exemple plus avancé de la façon dont la technique peut être appliquée, consultez le code que j'ai développé en réponse à arcpy - Comment améliorer les performances des curseurs de recherche imbriqués ? - Pile des Systèmes d'Information Géographique. . Le code dans ce post montre :

1) comment utiliser les dictionnaires lorsque vous travaillez avec un ensemble de tables qui forment un arbre relationnel à plusieurs niveaux,

2) comment utiliser la méthode dictionnaire (liste) pour remplir efficacement une clé de dictionnaire avec une liste de valeurs de dictionnaire de listes qui contiendra plusieurs enregistrements de données associés à la clé,

3) comment accéder à la liste des valeurs de listes lors du traitement des clés de dictionnaire pour les correspondances, et

4) comment créer et utiliser un tuple qui agira comme une clé de dictionnaire composite multi-champs.

J'ai du mal à utiliser l'exemple de "Création d'une clé de dictionnaire Python multi-champs pour remplacer un champ de jointure concaténé :"

J'ai remplacé par des classes et des champs d'entités source/mise à jour, mais lorsque j'essaie d'exécuter le script, le message d'erreur s'affiche :

Erreur d'analyse SyntaxError : syntaxe invalide (ligne 23)

Je suis incapable de discerner quel est le problème avec la ligne de code.

from time import strftime

print "Démarrer le script : " + strftime("%Y-%m-%d %H:%M:%S")

sourceFieldsList = ["WPP_TYPE", "MATERIAU", "DIAMETRE", "Unit_Rate"]

# Utilisez la compréhension de liste pour créer un dictionnaire à partir d'un curseur de recherche où les valeurs clés sont basées sur 3 champs distincts
valeurDict =

updateFieldsList = ["Asset_Type", "EXTG_Material", "Diameter", "Repl_Cost"]

avec arcpy.da.UpdateCursor(updateFC, updateFieldsList) comme updateRows :
pour updateRow dans updateRows :
# stocker la valeur de jointure en combinant 3 valeurs de champ de la ligne en cours de mise à jour dans une variable keyValue
keyValue = updateRow[0]+ "," + str(updateRow[1]) + "," + str(updateRow[2]
# vérifier que la keyValue est dans le dictionnaire
si keyValue dans valueDict :
# transfère la valeur stockée sous la keyValue du dictionnaire vers le champ mis à jour.
updateRow[3] = valueDict[keyValue][0]
updateRows.updateRow(updateRow)

print "Script terminé : " +strftime("%Y-%m-%d %H:%M:%S")

par NeilAyres

Premièrement, cela aiderait si vous formatiez le code correctement afin qu'il soit plus lisible.

par NeilAyres

Mais je pense que l'erreur est ici :

Cela n'a pas l'air de former un dictionnaire à l'intérieur du <>.

Les dictionnaires sont renseignés avec des paires clé : valeur.

Attends, regarde ça encore.

Mais pourquoi ne pas le faire en 2 étapes, utiliser l'OID comme clé, mettre toutes les autres données dans une liste de valeurs.

Calculez ensuite une nouvelle valeur concaténée.

Je ne sais pas si c'est votre problème ou non, mais il vous manque une parenthèse fermante à la fin de cette ligne :

keyValue = updateRow[0]+ "," + str(updateRow[1]) + "," + str(updateRow[2]

par RichardFairhurs t

Essayez de faire du premier champ une chaîne comme vous le faites lorsque vous créez le dictionnaire.Alors changez :

Ajoutez également la parenthèse de fin sur cette ligne pour la dernière méthode str().

Merci d'avoir capté ça Richard, je suis étonné de la rapidité avec laquelle le code python fonctionne.

par RichardFairhurs t

Je suis heureux de savoir que vous avez réussi à le faire marcher. Vous savez maintenant pourquoi j'ai mis "Turbo Charging" dans le titre du blog.

Esri peut-il commenter s'il travaille à l'amélioration des performances de l'outil Join ?

Des conseils sur l'utilisation de la méthode du curseur d'insertion avec un dictionnaire sans coder en dur les noms de champ ?

par RichardFairhurs t

Je ne suis pas sûr qu'un dictionnaire améliorera les performances du code du deuxième message que vous avez référencé. Dans ce message, vous n'essayez pas de faire correspondre une ligne existante. Vous transférez simplement les données dans chaque ligne sans rien faire correspondre. Ainsi, la capacité d'accès aléatoire du dictionnaire n'est pas utilisée et vous ne pouvez éliminer aucune des étapes du code suggéré en incorporant un dictionnaire.

Je suis d'accord avec le commentaire qui dit que vous devriez éviter d'insérer dans la géodatabase les champs OID, area et length. Je n'insérerais pas non plus dans un champ GlobalID si vous en avez un. Il y a aussi une vérification pour savoir si un champ est modifiable ou non. Si SDE est impliqué, davantage de code pour démarrer et arrêter une session d'édition est requis et les performances chuteront.

Alors, quel est le but final de votre question? Un outil? Si tel est le cas, consultez mon alternative à l'outil Ajouter qui est inclus dans mon outil Multi-Field to Single Field dans ce blog. Il traite le problème des champs non modifiables et permet le transfert d'enregistrements entre deux tables autonomes, d'une classe d'entités à une table autonome, et entre des classes d'entités avec le même type de géométrie. Cependant, je ne me souviens pas si je l'ai rendu compatible avec SDE ou non. Je pense que je l'ai fait, mais sinon faites le moi savoir. Je n'ai jamais testé le code avec un réseau géométrique. Je les ai principalement optimisés pour les classes d'entités simples et les géodatabases fichier.

Cela fonctionne très bien, mais j'ai un problème avec trop de modifications apportées à une base de données versionnée et cela échoue après un certain temps. J'ai essayé d'ajouter autocommit mais cela ne fonctionne pas dans la boucle. Je ne suis pas sûr non plus d'avoir écrit cela correctement.

éditeur d'importation
importer arcpy
from time import strftime

print "Démarrer le script : " + strftime("%Y-%m-%d %H:%M:%S")

sourceFieldsList = ["BI_SRV_MAP_LOC","SRVADDR1","SRVADDR2","SRVST","SRVCITY","SRVZIP","BUSINESS","HOME","BICUST","MOBILE","BI_FORMAT_NAME","BI_FORMAT_ADDL_NAME" ,"BI_KEY_CUST_CD","BI_ROUTE_CD","BI_OUT_PRI_CD","BI_MED_NEC_CD","BI_SRV_LOC","BI_AR_STAT","BI_ACCT", "BI_MTR_PHS", "BI_TRF_NBR", "BI_MTR_NBR"]

edit = arcpy.da.Editor(arcpy.env.workspace)
edit.startEditing(True, True)
edit.startOperation()

# Utilisez la compréhension de liste pour construire un dictionnaire à partir d'un SearchCursor
valeurDict =

updateFieldsList = ["SERVICE_MAP_LOCATION","SERVICE_ADDRESS","SERVICE_ADDRESS2","STATE","CITY","Zip","BusinessPhone","PrimaryPhone","CustID","MobilePhone","NAME","MISC_CHAR_1" ,"KeyAccount","MISC_CHAR_2","OutagePriority","MEDALERT","Service_Number","SERVICE_STATUS","Account_Number", "CISPhase","TRANSFORMER_ID","MeterNumber"]

avec arcpy.da.UpdateCursor(updateFC, updateFieldsList) comme updateRows :
pour updateRow dans updateRows :
# stocke la valeur de jointure de la ligne en cours de mise à jour dans une variable keyValue
keyValue = updateRow[0]
# vérifier que la keyValue est dans le dictionnaire
print keyValue
si keyValue dans valueDict :
# transférer les valeurs stockées sous la keyValue du dictionnaire vers les champs mis à jour.
pour n dans la plage (1,len(sourceFieldsList)):
updateRow = valueDict[keyValue][n-1]
updateRows.updateRow(updateRow)

del valueDict
arcpy.DeleteManagement("test")
edit.stopOperation()
imprimer "modifications terminées"

# Arrêtez la session d'édition et enregistrez les modifications
edit.stopEditing(True)
print "Script terminé : " + strftime("%Y-%m-%d %H:%M:%S")
print "Script terminé : " + strftime("%Y-%m-%d %H:%M:%S")

Tout conseil serait grandement apprécié merci!

par RichardFairhurs t

Vous avez écrit votre code pour écrire dans chaque enregistrement, même si rien n'a réellement changé. N'écrire que dans les enregistrements dont la valeur a changé implique l'ajout d'une clause if pour comparer les enregistrements et n'écrire que dans ceux qui sont différents. Les exemples simples fournis ici sont uniquement destinés à montrer le concept de base, et non à illustrer toute la variété des effets qui peuvent être obtenus en ajustant le flux et la logique du programme.

Voici une partie d'un programme que j'ai écrit pour mes propres besoins et qui ne mettra à jour les enregistrements de la table de mise à jour que lorsqu'ils ne correspondent pas à la table source. Le dictionnaire construit dans cet exemple supprime les caractères d'espacement de la table source, car la table de mise à jour n'a pas d'espacement blanc, mais la table source a un espacement blanc :

Merci beaucoup c'est exactement ce que je recherche. Je vais essayer.

pouvez-vous expliquer l'apnDict.

par RichardFairhurs t

J'ai supprimé cette ligne. Ce code est un extrait révisé d'un script beaucoup plus long qui comportait plusieurs autres sous-programmes. J'ai raté cette ligne et j'aurais dû la supprimer avant de publier le code, car elle ne correspond pas au code dont vous avez besoin.

Merci, le script fonctionnera mais il parcourt toujours chaque enregistrement et apporte un changement. Je me sens si proche. Je vois que la valeur-clé (fonctionnalité mise à jour) est comparée dans le valueDict (fonctionnalité source). Je sens que c'est autour de cette section que je suis coincé

if list(valueDict[keyValue]) <> updateRow[1:22] :
# Un changement a été apporté à l'adresse postale, au nom du propriétaire ou aux deux
changeCnt += 1

importer l'éditeur d'arc
importer arcpy
from time import strftime

serviceFC = arcpy.MakeFeatureLayer_management("E:arcgisserverResourcesConnectionsGIS_SCRIPTINGVS.sde.DBO.ELECTRIC.DBO.ServicePoint", "test","LINE_SECTION = 'PRIUG6819'"," "" OBJECTID OBJECTID VISIBLE NONEAncillaryRole AncillaryRole VISIBLE NONEEnabled activé VISIBLE NONESubtypeCD SubtypeCD VISIBLE NONEAccount_Number Account_Number VISIBLE NONESERVICE_MAP_LOCATION SERVICE_MAP_LOCATION VISIBLE NONEMeterNumber MeterNumber VISIBLE NONETRANSFORMER_ID TRANSFORMER_ID VISIBLE NONEMAP_NO MAP_NO VISIBLE NONELINE_SECTION LINE_SECTION VISIBLE NONESUBSTATION SUBSTATION VISIBLE NONEFEEDER_NUMBER FEEDER_NUMBER VISIBLE NONESERVICE_STATUS SERVICE_STATUS VISIBLE NONEService_Number Service_Number VISIBLE NONECC_Number CC_Number VISIBLE NOM NONENAME VISIBLE NONESERVICE_ADDRESS SERVICE_ADDRESS VISIBLE NONESERVICE_ADDRESS2 SERVICE_ADDRESS2 VISIBLE NONECITY CITY VISIBLE NONESTATE STATE VISIBLE NONEDESCRIPTION DESCRIPTION VISIBLE NONEDateModified DateModified VISIBLE NONEInstallationDate Installa tionDate Les NONEComments VISIBLES Commentaires VISIBLE NONEServiceCurrentRating ServiceCurrentRating VISIBLE NONELoadManagement LoadManagement VISIBLE NONEMISC_CHAR_1 MISC_CHAR_1 VISIBLE NONEMISC_CHAR_2 MISC_CHAR_2 VISIBLE NONEOutagePriority OutagePriority VISIBLE NONEZip Zip VISIBLE NONEDetail Détail VISIBLE NONEKeyAccount KeyAccount VISIBLE NONELongitude Longitude VISIBLE NONELatitude Latitude VISIBLE canton NONETownship VISIBLE NONESection_ Section_ VISIBLE NONET_S T_S created_user VISIBLE NONEcreated_user VISIBLE CREATED_DATE NONEcreated_date VISIBLE NONElast_edited_user last_edited_user VISIBLE NONElast_edited_date LAST_EDITED_DATE VISIBLE NONEGlobalID GlobalID VISIBLE NONECustomerID CustomerID VISIBLE NONEStationGuid StationGuid VISIBLE NONEphaseCode phaseCode VISIBLE NONEADD3 ADD3 ACCTBASE VISIBLE NONEACCTBASE VISIBLE NONEPrimaryPhone PrimaryPhone VISIBLE NONEBusinessPhone BusinessPhone VISIBLE NONEMobilePhone MobilePhone VISIBLE NONECustID CustID VISIBLE NONECoopNumb CoopNumb VISIBLE NONECISPhase CISPhase VISIBLE NONEMEDALERT MEDALERT VISIBLE AUCUNE FORME VISIBLE AUCUNE")

print "Démarrer le script : " + strftime("%Y-%m-%d %H:%M:%S")

sourceFieldsList = ["BI_SRV_MAP_LOC","SRVADDR1","SRVADDR2","SRVST","SRVCITY","SRVZIP","BUSINESS","HOME","BICUST","MOBILE","BI_FORMAT_NAME","BI_FORMAT_ADDL_NAME" ,"BI_KEY_CUST_CD","BI_ROUTE_CD","BI_OUT_PRI_CD","BI_MED_NEC_CD","BI_SRV_LOC","BI_AR_STAT","BI_ACCT", "BI_MTR_PHS", "BI_TRF_NBR", "BI_MTR_NBR"]

updateFieldsList = ["SERVICE_MAP_LOCATION","SERVICE_ADDRESS","SERVICE_ADDRESS2","STATE","CITY","Zip","BusinessPhone","PrimaryPhone","CustID","MobilePhone","NAME","MISC_CHAR_1" ,"KeyAccount","MISC_CHAR_2","OutagePriority","MEDALERT","Service_Number","SERVICE_STATUS","Account_Number", "CISPhase","TRANSFORMER_ID","MeterNumber"]


Voir la vidéo: Quest ce quune variable?