Suite

Convertir python de arcpy.da.SearchCursor pour fonctionner dans 10.0


J'utilise un code tel que

for row in arcpy.da.SearchCursor(polyFC, ["[email protected]"], spatial_reference=SR): # créer un tampon interne polyBuff = row[0].buffer(buffNum * -1) # créer un rectangle de coque pour établir une zone de rotation d'intérêt coordSplit = row[0].hullRectangle.split(") # collecte les coordonnées des coins coordList = arcpy.Array([arcpy.Point(coordSplit[0],coordSplit[1]),arcpy.Point(coordSplit[2], coordSplit[3]),arcpy.Point(coordSplit[4],coordSplit[5]),arcpy.Point(coordSplit[6],coordSplit[7]),arcpy.Point(coordSplit[0],coordSplit[1]) ]) # créer des lignes à partir du rectangle de coque currentLines = [] pour pointNum in range (0,4) : arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)]) coqueRecLine = arcpy.Polyline( arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)])) currentLines.append(hullRecLine) # comparer la première et la deuxième ligne pour déterminer si la première ligne est courte ou longue firstLong = 0 si currentLines[ 0].length < currentLines[1].length : if shortboolean == 'true' : firstLong = 0 else : firstLon g = 1 if currentLines[0].length > currentLines[1].length: if shortboolean == 'true': firstLong = 1 else: firstLong = 0 # calcule le nombre de points nécessaires le long de l'axe court numPoints = int(math.floor (currentLines[firstLong].length/lineSpaceNum)) # créer et joindre des points pour créer des lignes parallèles pour le point dans la plage (0,numPoints+1): shortPoint1 = currentLines[firstLong].positionAlongLine(lineSpaceNum*point) shortPoint2 = currentLines[firstLong + 2].positionAlongLine(currentLines[firstLong + 2].length - (lineSpaceNum*point)) parallel = arcpy.Polyline(arcpy.Array([shortPoint1.centroid,shortPoint2.centroid]), SR) # coupe des lignes parallèles avec un tampon parallelBuff = parallel.intersect(polyBuff,2) parallels.append(parallelBuff)

mais cela ne fonctionne que dans ArcGIS 10.1 et versions ultérieures. Existe-t-il un moyen de faire la même chose mais de le faire fonctionner dans ArcGIS 10.0 ?


utilisez le curseur équivalent sans .da.

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v00000039000000

ex:

shapefieldname = arcpy.Describe(featureclass).ShapeFieldName sCur = arcpy.SearchCursor(featureclass, {where_clause}, {spatial_reference}, {fields}, {sort_fields}) pour la ligne dans sCur : feature = row.getValue(shapefieldname) (faire des trucs )

Les champs suivants seront ajoutés à la saisie. Si les champs existent déjà, les valeurs des champs sont mises à jour.

L'ID d'objet de l'entité proche la plus proche. Si aucune caractéristique proche n'est trouvée, la valeur sera -1.

La distance entre l'entité d'entrée et l'entité proche. La valeur est dans l'unité linéaire du système de coordonnées des entités en entrée, ou en mètres lorsque le paramètre Méthode est défini sur GEODESIC et que l'entrée est dans un système de coordonnées géographiques. Si aucune caractéristique proche n'est trouvée, la valeur sera -1.

Chemin d'accès du catalogue à la classe d'entités qui contient l'entité proche. Ce champ n'est ajouté à la table de sortie que si plusieurs entités proches sont spécifiées. Si aucune caractéristique proche n'est trouvée, la valeur sera une chaîne vide ou nulle.

Les champs suivants seront ajoutés aux entités en entrée si le paramètre Location est coché (paramètre location défini sur LOCATION en Python). Les valeurs des champs sont mises à jour si les champs existent déjà. L'unité des valeurs des champs dépend de la méthode sélectionnée sur le paramètre Méthode. S'il est défini sur Planaire , la valeur est dans l'unité linéaire du système de coordonnées de l'entité en entrée. S'il est défini sur Géodésique , la valeur se trouve dans le système de coordonnées géographiques associé au système de coordonnées de l'entité en entrée.

Coordonnée X de l'emplacement sur l'entité proche qui est la plus proche de l'entité en entrée. Si aucune caractéristique proche n'est trouvée, la valeur sera -1.

Coordonnée Y de l'emplacement sur l'entité proche qui est la plus proche de l'entité en entrée. Si aucune caractéristique proche n'est trouvée, la valeur sera -1.

Le champ suivant sera ajouté aux entités en entrée si le paramètre Angle est coché (paramètre d'angle défini sur ANGLE en Python). Les valeurs des champs sont mises à jour si les champs existent déjà.

Angle de la ligne aux emplacements FROM_X et FROM_Y qui relie les entités en entrée à l'entité proche. Si aucune entité proche n'est trouvée ou si l'entité proche croise l'entité en entrée, la valeur sera 0.

Les valeurs pour NEAR_FID et NEAR_DIST seront -1 si aucune entité n'est trouvée dans le rayon de recherche.

Les entités en entrée et les entités proches peuvent être ponctuelles, multipoints, linéaires ou polygonales.

Les entités proches peuvent inclure une ou plusieurs classes d'entités de différents types de forme (point, multipoint, ligne ou polygone).

La même classe d'entités ou couche peut être utilisée à la fois comme entités en entrée et à proximité. Dans cette situation, l'entité en entrée évaluée est exclue des caractéristiques proches candidates pour éviter que toutes les caractéristiques soient les plus proches d'elles-mêmes.

Les entités en entrée peuvent être une couche sur laquelle vous avez effectué une sélection. Les fonctionnalités sélectionnées seront utilisées et mises à jour lors de l'exécution de l'outil. Les autres entités auront les valeurs des champs nouvellement créés (tels que NEAR_FID et NEAR_DIST ) définis sur -1.

Lorsque plusieurs entités proches ont la même distance la plus courte d'une entité en entrée, l'une d'entre elles est choisie au hasard comme l'entité la plus proche.

Lorsque vous utilisez l'option Planaire pour le paramètre Méthode, les entités en entrée doivent être dans une projection appropriée pour la mesure de distance, telle qu'une projection équidistante.

Pour visualiser les emplacements FROM_X , FROM_Y , NEAR_X et NEAR_Y , la table de sortie peut être utilisée comme entrée pour les outils Créer une couche d'événements XY ou XY en ligne.


Exemple d'application

Il n'existe aucun moyen intégré de travailler avec HTML dans ArcGIS. Cependant, les scripts Python donnent accès à des méthodes et des fonctions qui peuvent être utilisées pour créer et modifier des documents HTML. Pour intégrer cette fonctionnalité HTML à ArcGIS, intégrez un outil de script Python dans un modèle.

L'exemple suivant effectue des requêtes spatiales et attributaires sur une couche de parcelles et génère un rapport HTML détaillant les attributs d'une parcelle spécifiée par l'utilisateur et des parcelles voisines. La génération HTML est effectuée dans un script Python exécuté à partir du modèle.


Automatisation des pages de séries de cartes dans ArcGIS Pro avec Python

Je me demandais si quelqu'un avait trouvé de la documentation pour accéder aux pages de la série de cartes dans ArcGIS Pro via ArcPy. Je pensais que cela aurait fait partie du module de cartographie. Cela peut-il être fait, ou est-ce quelque chose à venir dans les prochaines versions.?

par RebeccaStrauch_ _GISP

edit : ajout de ressources et de discussions supplémentaires

Merci Rebecca, cependant ces liens ne semblent pas couvrir ce que je recherche. Je me demande comment accéder et exporter les pages d'une série de cartes. quelque chose de similaire à la fonctionnalité de la classe arcpy.mapping.datadrivenPages.

par RebeccaStrauch_ _GISP

Hmm. donc je suppose que cela résume pour l'instant alors.

Pas vraiment utile sur une ligne de temps ou s'ils seront pris en charge. mais on dirait que vous savez que vous n'avez pas de chance.

par DanPatterson_Re fatigué

Oui. il a été promis pour les versions PRO 1.2 (certaines solutions de contournement sont données)

mais maintenant appelée série de cartes (mais je ne trouve toujours pas de série définitive. oui. ddp est maintenant une série de cartes. quote0

Je soupçonne que le document pdf et les documents associés sont ce que vous recherchez

Je cherche un moyen d'automatiser l'exportation de chaque page d'une série de cartes au format png ou jpeg. Ceci est possible avec les pages pilotées par les données dans ArcMap - mais ne semble pas être possible dans Pro (1.4). A partir de la doc :

" Si vous avez activé une série de cartes et que vous l'exportez dans un format autre que PDF (par exemple, JPG), vous ne générerez qu'un fichier de sortie d'une seule page. Si vous voulez un fichier JPG pour chaque page de la série de cartes, vous Vous aurez besoin d'afficher et d'exporter manuellement chaque page. "

**Insérez les plaintes et les reproches ici**

Moi aussi, je cherche à automatiser les exportations jpg à partir d'une série de cartes et jusqu'à présent, je n'ai rien (il est vrai que j'ai perdu mon temps là-dessus depuis un certain temps). La seule solution de contournement à laquelle je peux penser est :

1) au lieu d'utiliser des séries de cartes, créez les étendues de vos cartes manuellement et ajoutez-les à vos favoris

2) en python, parcourez vos signets (définir l'étendue de vos cartes) puis exportez chacun au format jpeg

Ce n'est qu'une idée, et je n'ai pas testé/enquêté sur sa faisabilité. Si vous l'essayez, faites-moi savoir comment cela se passe pour vous.

J'espère qu'ils viennent de mettre à jour le module Arcpy pour gérer cela correctement dans la version d'automne d'ArcGIS Pro (1.5)


La référence ArcGIS Pro Python est organisée en sections Prise en main, Géotraitement et Python , Fonctions et classes ArcPy et Modules ArcPy. Ces sections sont à la fois consultables et consultables.

Commencer

Python est un langage de programmation open source gratuit et multiplateforme. Il est largement utilisé et pris en charge et fait partie intégrante d'ArcGIS.

Cette section couvre plusieurs sujets importants pour démarrer avec Python dans ArcGIS Pro , notamment la migration Python pour ArcGIS Pro , Python dans ArcGIS Pro , Qu'est-ce qu'ArcPy ?, ArcGIS API pour Python , Python Package Manager et Notebooks dans ArcGIS Pro .

ArcPy et l'API ArcGIS pour Python sont des bibliothèques complémentaires ArcPy vous permet d'utiliser, d'automatiser et d'étendre le SIG de bureau, et l'API ArcGIS pour Python prend en charge la même chose pour le SIG Web.

Un exemple serait d'utiliser ArcPy pour gérer des données locales, de les ajouter en tant que couches à une carte et d'utiliser des outils de géotraitement pour créer des sorties et des fichiers de définition de service. L'API ArcGIS pour Python peut ensuite être utilisée pour publier les fichiers de définition sur le SIG Web, composer une carte Web ou partager ces couches avec d'autres.

Géotraitement et Python

Python peut être utilisé pour automatiser l'exécution des outils de géotraitement et offrir la possibilité de créer vos propres outils de géotraitement, en tant qu'outil de script ou outil de boîte à outils Python. Cliquez pour développer le nœud Accès aux outils de géotraitement et trouver des rubriques d'introduction pour l'utilisation et la compréhension des outils de géotraitement tels que Utilisation des outils en Python. Cliquez sur le nœud Création d'outils de géotraitement pour rechercher des rubriques sur la création de vos propres outils, comme Qu'est-ce qu'un outil de script ? et Qu'est-ce qu'une boîte à outils Python ?

Fonctions et classes ArcPy

Les sections Fonctions ArcPy et Classes ArcPy fournissent des rubriques d'aide pour les fonctions et les classes. Les fonctions et les classes fournissent des fonctionnalités supplémentaires pour prendre en charge les workflows basés sur Python. Pour obtenir une liste des fonctionnalités, consultez Vue d'ensemble des fonctions ArcPy et Vue d'ensemble des classes ArcPy. Des fonctions et classes supplémentaires se trouvent dans plusieurs modules ArcPy.


Boîte à outils Python pour les données OpenStreetMap

Mon projet est une boîte à outils Python. C'est mon premier grand projet de codage et il m'a fallu un certain temps pour coder cette boîte à outils. J'ai beaucoup appris depuis le début jusqu'à ce jour. J'ai changé ce code des centaines de fois, chaque fois que j'ai appris une nouvelle astuce ou une nouvelle méthode. Ce code fonctionne. Je l'ai testé avec divers ensembles de données, des bugs corrigés ou des erreurs de syntaxe.

  • Le code a des noms polonais pour : variable, fonctions, etc.
  • L'interface graphique est entièrement polonaise
  • J'ai commencé à utiliser Python il y a environ 3 mois

Ce que fait mon code :

L'objectif principal de cette boîte à outils était d'automatiser la transformation des données OpenStreetMap (OSM) des fichiers de formes de la voïvodie en un fichier à la taille d'un pays, à partir duquel les valeurs étaient sélectionnées par leurs attributs pour visualiser les caractéristiques (par exemple, les routes étaient sélectionnées et symbolisées).

Le code se compose de trois classes qui sont trois scripts à l'intérieur de ma boîte à outils.

Il est utilisé dans ArcGIS Pro pour aider les utilisateurs non-programmeurs à reproduire mon travail.

Quelqu'un de plus expérimenté que moi en Python peut-il me donner des conseils utiles ?


Remplir champ par champ d'une table liée en python

J'essaie de comprendre cela, mais j'ai du mal à comprendre ce que je dois fondamentalement faire.

J'ai une classe de relation un-à-plusieurs. L'un est la bouche d'incendie. la plupart sont des inspections de bouches d'incendie.

Ils sont liés par un FacilityID unique.

Les deux tables ont une colonne appelée "CurrentPosition", et ces deux colonnes ont le même domaine.

J'essaie de comprendre comment exécuter un script python qui analysera la table des inspections, trouvera l'inspection la plus récente (par le champ InspectionDate), prendra la valeur trouvée dans cet enregistrement pour CurrentPosition et l'écrira dans le champ CurrentPosition du Table des bornes d'incendie.

Je prévois de finaliser cela et de le faire exécuter comme une tâche nocturne afin que toutes les inspections effectuées, la position actuelle soit mise à jour sur la table de la borne-fontaine cette nuit-là.

Quelqu'un a-t-il des suggestions ou de la documentation que je peux consulter? Quelqu'un fait quelque chose de similaire ?


1 réponse 1

Je n'ai aucune expérience avec arcpy, donc peut-être que certains de ces éléments peuvent être invalides.

La plupart du temps, le code est très bon : il est concis, il est assez clair ce qu'il fait sans beaucoup de documentation, et il a la documentation dont il a besoin.

Ce qui rend le code « bon » exactement dépend de la façon dont il va être utilisé. Cela ressemble à un utilitaire autonome que vous utilisez dans votre travail, donc le garder bref et facile à entretenir vaut probablement plus que de tout documenter en profondeur et d'appliquer des contraintes de type. Tout ce qui suit ne s'appliquera pas à vous.


1 réponse 1

La division modulaire est un concept bien connu de presque tous ceux qui ont fait de la programmation. À mon avis, la déléguer à une fonction is_divisible_by n'est pas nécessaire et ne fait qu'introduire une surcharge inutile en générant un appel de fonction supplémentaire. Ce n'est pas comme si vous alliez jamais utiliser une autre implémentation que la division modulaire. Au lieu de cela, je l'intégrerais simplement.

Bien que je sois un fan des noms de variables clairs et que PEP8 déconseille les variables à une seule lettre, l'utilisation de n pour un nombre générique (et i pour un nombre entier générique) est acceptable par l'OMI et aide à garder les lignes courtes.

Votre variable FACTORS n'est nécessaire que pour la commande, puisqu'il ne s'agit que des clés du dictionnaire. Depuis Python 3.7, l'ordre des dictionnaires est garanti être l'ordre d'insertion (implémenté depuis CPython 3.6), vous n'en avez donc pas besoin non plus pour la commande si vous utilisez une version moderne de Python.

Vous avez une faute d'orthographe dans les gouttes de pluie (mais au moins elle est également présente lors de l'appel).

La fonction de conversion peut être un peu simplifiée en utilisant ou .

Vous pouvez également vous débarrasser complètement du dictionnaire et utiliser simplement une liste de tuples :

Au lieu d'avoir beaucoup de cas de test, ce qui nécessite beaucoup de saisie manuelle à configurer, regroupez les cas de test similaires et utilisez unittest.TestCase.subTest :

Pour les cas de test réussis, cela est signalé comme un cas de test, mais s'il échoue, les informations supplémentaires transmises en tant qu'arguments de mot-clé sont affichées (ici volontairement interrompues en fournissant la mauvaise sortie attendue) :


Je recommande l'imbrication des dictionnaires pour vos conversions. Habituellement, si vous avez une longue chaîne de comparaisons elif avec une chaîne ou un nombre, vous devez utiliser un dictionnaire.

Vous pouvez stocker la première unité en tant que clé primaire, puis la deuxième valeur est la clé de la deuxième unité. Les valeurs doivent alors toutes être un nombre par lequel vous pouvez multiplier afin d'effectuer la conversion. Donc, pour diviser par 1000, à la place, la valeur à multiplier est 1/1000 . Vous pouvez techniquement stocker des fonctions à appeler afin d'évaluer les conversions, mais les chiffres sont plus simples.

Cela permet de voir plus facilement si tous sont implémentés, ils sont conservés dans des rangées ordonnées afin que vous puissiez vous assurer qu'aucun des calculs ne semble faux. Un autre avantage est que vous pouvez générer automatiquement une liste de valeurs à signaler à l'utilisateur.

De plus, vous pouvez maintenant vous assurer que l'utilisateur saisit une clé valide de cette façon.

conversions[unit1][unit2] est juste appelé afin de tester si la clé existe et générera une erreur si ce n'est pas le cas afin que l'utilisateur soit invité à saisir de nouvelles clés. J'ai également ajouté .lower() afin que si l'utilisateur saisit CM , Cm ou même cM, ils seront tous convertis en cm pour correspondre à la clé.

Je recommande d'envelopper la saisie numérique de la même manière, car cela évite les erreurs ultérieures.

Maintenant, en ce qui concerne la logique réelle, c'est vraiment assez simple puisque les deux valeurs sont déjà préparées :