Suite

Exécution d'un script SQL dans la calculatrice de terrain ArcGIS ?

Exécution d'un script SQL dans la calculatrice de terrain ArcGIS ?


J'essaie de transférer des données de ligne d'une table vers des colonnes d'une table de fichier de formes. Il existe une variable "SA" commune entre les deux (c'est-à-dire le numéro de la zone d'étude) mais il existe plus d'un type d'utilisation des terres, c'est pourquoi je dois créer deux nouvelles colonnes pour chaque utilisation des terres, afin de saisir la superficie et la valeur en pourcentage pour chaque type. Une jointure ne fonctionnera pas car elle ne capture que les valeurs d'une utilisation du sol par opposition à toutes, car la première table n'a pas autant d'entrées que la seconde.

La raison pour laquelle je dois migrer les données est que j'essaie de les utiliser dans du texte dynamique sur des pages axées sur les données.

J'ai écrit un script SQL avec l'aide de mon ami mais il ne s'exécutera pas via la calculatrice de champ, donnant l'erreur générique 99999 :

UPDATE SApeelfinal SET LUp1 = (SELECT perc FROM stat_fin WHERE stat_fin.SA = SApeelfinal.FID_text et LANDUSE = 1) WHERE EXIST (SELECT 1 FROM stat_fin WHERE stat_fin.SA = SApeelfinal.FID_text et LANDUSE = 1)

Bien qu'il ait dit que je devais modifier la valeur LANDUSE à chaque fois que j'exécute le script et modifier également SUM_AREA et perc. J'ai essayé de le mettre dans une boîte à outils mais cela ne fonctionnait pas de cette façon non plus. Quelqu'un peut-il m'éclairer sur une meilleure façon de faire cela?

De plus, je me demandais si je devais créer manuellement les nouveaux champs pour que cela fonctionne.

Voici une capture d'écran des deux tableaux :

Vous pouvez également trouver une version plus grande ici : http://i.imgur.com/sx08u.jpg">


Malheureusement, votre problème ne peut pas être facilement résolu par Calculer le champ. Puisque vous essayez d'extraire plusieurs champs d'information d'un autre tableau pour chacune de vos zones d'étude, je devrai recommander les curseurs impensables. Tout d'abord, vous voudrez créer des colonnes pour chacun des attributs souhaités (zone et pourcentage de couverture pour chaque type d'utilisation des terres par zone d'étude). Ensuite, vous voudrez utiliser un curseur de mise à jour pour parcourir chaque ligne, créant ensuite un curseur de recherche pour interroger le tableau des statistiques et récupérer les données que vous recherchez en fonction de votre champ de jointure (ID de la zone d'étude). Voici un exemple de code.

#Créer la variable qui stocke le chemin de la table à mettre à jour dans le fichier = r"path" #Créer la variable qui stocke le chemin de la table de statistiques que nous allons rechercher intable = r"path" # Créer un curseur de mise à jour pour les lignes de la classe d'entités = arcpy.UpdateCursor(infile) print "Mettre à jour le curseur créé" #For Loop parcourt chaque ligne du fichier fourni et fait ce qui est indiqué ci-dessous ! pour la ligne dans les lignes : row.lup0 = 0 row.lua0 = 0 #Si vous voulez des valeurs par défaut, définissez-les ici où = "SATXT = '"+row.FID_Text+"'" #Vous avez besoin de guillemets simples pour un champ de texte. C'est une façon de le faire. rowsearch= arcpy.SearchCursor(intable, where) for x in rowsearch: if x.LANDUSE == 0: row.lup0 = x.perc row.lua0 = x.SUM_AREA #Créer un contrôle pour chaque type d'utilisation des terres afin qu'il récupère les données rows.updateRow(row) #Cela devrait fermer la boucle for afin qu'elle mette à jour la ligne à chaque fois via # Supprimer les objets curseur et ligne pour supprimer les verrous sur les données del row del rows # après cela, le script arrête d'imprimer "C'est terminé ! "

C'est une méthode plutôt brutale pour définir et obtenir des données, mais cela fonctionnera pour un petit ensemble de variables tel que celui que vous avez. Répétez simplement la vérification du numéro d'utilisation des terres pour chacun afin de pouvoir définir les valeurs appropriées. Je pense que vous pourriez probablement utiliser des dictionnaires pour conserver les références aux noms de champs et les parcourir, mais cela devrait le faire pour le moment.


Votre besoin de convertir votre SQL en VBA ou Python pour le calculateur de champ dans ArcMap

http://webhelp.esri.com/arcgiSDEsktop/9.3/index.cfm?TopicName=Making_field_calculations

Les utilisateurs d'ArcGIS 10 peuvent également utiliser des scripts Python dans ArcGIS Field Calculator

C'est une option moins chère que l'achat d'ArcSDE et d'une base de données prenant en charge SQL.


Connaissez-vous R ? (Je recommande d'utiliser R-Studio car je pense qu'il est plus intuitif que l'interface par défaut). Il est possible de lire le.dbffichier d'un shapefile dansRen utilisant leétrangerpaquet. Vous pouvez ensuite effectuer les opérations que vous souhaitez et écrire un dbf avec les données dont vous avez besoin et le joindre au fichier de formes. Voici un exemple de ce qui peut être fait :

# installer un package pour lire les fichiers dbf (ne doit être fait qu'une seule fois) install.packages('foreign') # importer la bibliothèque de packages (foreign) # lire dans le dbf associé aux limites du fichier de formes <- read.dbf('G: /US_data/Census2000.dbf', as.is = TRUE) # les limites sont maintenant un résumé d'objet de trame de données (limites) # faites quelque chose pour le fichier et créez un nouveau dbf appelé 'new_boundaries' # écrivez ces données dans le fichier dbf write.dbf (new_boundaries , 'G:/example.dbf', factor2char = TRUE, max_nchar = 254)

Ma solution à ce problème a été de diviser ma table en tables simples.

En d'autres termes, prenez le premier enregistrement de chaque correspondance et créez une table appelée correspondance 1 (par exemple uniquement).

Faites ensuite la même chose avec chaque deuxième correspondance, encore et encore jusqu'à ce que tous les enregistrements de la table soient dans une table numérotée.

Ensuite, en les joignant consécutivement et en calculant en un lu1p, lu2p… vous obtenez toutes les données fusionnées sur une seule ligne.
Ensuite, vous pouvez calculer tous les agrégats que vous devez compléter.

Pas la méthode des programmeurs mais mon meilleur hack.


Si vous avez accès à MS Access, pourquoi ne pas les charger dans une géodatabase, l'ouvrir dans Access et y exécuter votre SQL ?

J'ai récemment fait le contraire - en passant des colonnes aux lignes - sur un ensemble de données Excel dans Access (bien que j'ai utilisé VBA pour le faire fonctionner).


Que faites-vous pour passer le temps lorsque vous exécutez un énorme script ?

Calculer actuellement une liste de contours et des chemins à moindre coût pour toutes les zones de patrimoine naturel de la région du Triangle en Caroline du Nord, et l'outil que j'utilise prend une MERDE de temps sans la puissance d'un superordinateur.

Que faites-vous tous pour passer le temps dans les limbes de l'Arc ? Parce que Dieu nous en préserve, nous travaillons réellement.

Je commence un autre travail. Ensuite, pendant que cela fonctionne, je commence un autre travail. Puis ils finissent tous pendant que je lis Reddit et j'oublie ce que je faisais.

Pas vraiment. Si c'est vraiment long, alors je fais un autre travail et j'y reviens. S'il s'agit de minutes, je lis quelque chose en ligne. Slashdot/Slashgeo/gis.stackexchange quoi que ce soit (aussi reddit!).

Je pratique ma programmation Python. Une bonne façon de commencer est d'examiner le code Python du ou des outils que vous exécutez. Ensuite, j'essaierai de combiner plusieurs scripts de géotraitement dans un fichier .py afin de savoir à l'avenir quelles étapes j'ai suivies pour faire quelque chose.

Si j'ai un indice qu'un script va prendre beaucoup de temps, je détourne l'un des ordinateurs inutilisés du bureau et l'utilise pour cela.

Et sinon, j'ai rarement une seule chose à faire et j'aime donc avoir les mains libres pour d'autres choses.

Vous pouvez parcourir r/gis et r/askgis en attendant la fin de votre script, vous pouvez toujours dire à votre supérieur qu'il s'agit de forums SIG et que vous apprenez d'eux et aidez les gens.


Voir la vidéo: Whats new in ArcGIS Pro