2016-05-19 1 views
0

J'ai une table que j'aimerais joindre à un fichier de formes ArcGIS. Mon problème est que la table a deux champs d'identité (c'est-à-dire "numéro de plan" et "numéro de contrat") et le fichier de forme a un champ d'identité (c'est-à-dire "nom"). Je veux joindre le "Nom" du fichier de formes au "Numéro de Plan" OU au "Numéro de Contrat". En tant qu'arrière-plan, le fichier de formes est créé en dessinant manuellement des polygones dans ArcGIS. Ces polygones représentent différents projets. L'identifiant "Nom" peut être soit le numéro de planification initial d'un projet, soit le numéro de contrat existant après la budgétisation du projet. Le numéro de planification existe lorsqu'il n'y a pas de budget, et le numéro de contrat vient plus tard. Les polygones sont créés et le champ "Nom" est rempli avec l'étape d'identification (soit le numéro de planification ou le numéro de contrat) atteinte par le projet. Ainsi, le champ "Nom" du fichier de formes contient des numéros de planification ou des numéros de contrat.Joindre l'un des deux champs d'une table dbf à un seul champ de fichier de formes ArcGIS - Python

En même temps, nous avons une base de données complexe de tous les projets avec deux champs représentant à la fois le numéro de la planification et le numéro de contrat:

PLN ------------ ----- Phase contrat ------------ Longueur ----- NTP --------- SC ------------- Notes

1415-003 ----- WD-2506 ---- Pré-planification ---- 45 ---------- 1/1/1900 ---- 1/20/1900 ----- test Pour créer mon code, j'ai créé une table xml simple qui lie à la base de données. Cette table xml comporte un champ PLN (numéro de plan) et un champ Contrat (numéro de contrat). Dans mon code, j'ai converti ce fichier XML en dbf. J'essaye maintenant de trouver un moyen de joindre un "nom" Shapefile à SOIT le "PLN" ou le "contrat".

S'il vous plaît voir le code ci-dessous:

#Convert xlsx to table: 
import xlrd 

in_excel= r'W:\\Engineering\\ENGINEER\\LAMP (062012)\\Database\\VisualDatabase\\Planning_Out\\JoinTest.xlsx' 
out_table= r'W:\\Engineering\\ENGINEER\\LAMP (062012)\\Database\\VisualDatabase\\Planning_Out\\JoinTest.gdb' 


# Perform the conversion 
join_table= arcpy.ExcelToTable_conversion(in_excel, out_table) 

print join_table 

# Join 
# Set the local parameters 
inFeatures = r'W:\\Engineering\\ENGINEER\\LAMP (062012)\\Database\\VisualDatabase\\Planning_Out\\CDDprojects.shp' 
joinField = 
joinTable = join_table 
fieldList = ["PLN", "Contract", "Phase", "Length", "NTP", "SC", "Notes] 

Je ne suis pas sûr que d'entrer dans joinField et s'il y a un autre code que je dois inclure.

Révision 1: J'utilise le code d'Ethan, mais a reçu un message d'erreur à:

with master_table.open(): 
    with minimal_table.open(): 
     minimal_index = dbf.create_index(minimal_table, lambda record: record.name) 

L'erreur se lit comme suit:

Traceback (most recent call last): 
    File "W:\Engineering\ENGINEER\LAMP (062012)\Database\VisualDatabase\LAMP.py", line 53, in <module> 
    with master_table.open(): 
AttributeError: 'Result' object has no attribute 'open' 

Révision 2: Je suis un niveau débutant alors peut-être que je suis Il manque quelque chose d'assez simple. Lorsque je tente d'importer DBF, je reçois le une erreur après mon code:

Traceback (most recent call last): 
    File "W:\Engineering\ENGINEER\LAMP (062012)\Database\VisualDatabase\LAMP.py", line 50, in <module> 
    import dbf 
ImportError: No module named dbf 

J'ai téléchargé le module FFC, mais lors de l'exécution du programme d'installation, je reçois cette erreur:

Warning (from warnings module): 
    File "C:\Python27\ArcGIS10.3\lib\distutils\dist.py", line 267 
    warnings.warn(msg) 
UserWarning: Unknown distribution option: 'install_requires' 

Je Je ne sais pas ce que je fais mal pour installer le dbf.

RÉVISION 3: J'ai installé le module dbf et il est importé avec succès dans arcpy.Cependant, je reçois toujours le même message d'erreur:

Traceback (most recent call last): 
    File "W:\Engineering\ENGINEER\LAMP (062012)\Database\VisualDatabase\LAMP.py", line 56, in <module> 
    with master_table.open(): 
AttributeError: 'Result' object has no attribute 'open' 

Mon code est:

#Convert xlsx to table: 
import xlrd 

in_excel= r'W:\\Engineering\\ENGINEER\\LAMP (062012)\\Database\\VisualDatabase\\Planning_Out\\JoinTest.xlsx' 
out_table= r'W:\\Engineering\\ENGINEER\\LAMP (062012)\\Database\\VisualDatabase\\Planning_Out\\JoinTest.gdb' 

# Perform the conversion 
join_table= arcpy.ExcelToTable_conversion(in_excel, out_table) 

import enum 
import dbf 

# table with all projects at all stages 
master_table = join_table 
# table with single project and most up-to-date stage 
minimal_table = r'W:\\Engineering\\ENGINEER\\LAMP (062012)\\Database\\VisualDatabase\\Planning_Out\\CDDprojects.dbf' 

with master_table.open(): (LINE 56 which the AttributeError calls) 
    with minimal_table.open(): 
     minimal_index = dbf.create_index(minimal_table, lambda record: record.name) 

# cycle through master, updating minimal if necessary 
     for master in master_table: 
# look for PLN # first 
      found = minimal_index.search(master.PLN) 
      if not found: 
       # if record doesn't exist with PLN #, try CONTRACT # 
       found = minimal_index.search(master.Contract) 

J'utilise le module DBF ici: https://pypi.python.org/pypi/dbf

Merci.

+0

Le 'AttributeError' fait référence à un' « Résultat » object' - Il n'y a pas de telles choses dans mon paquet 'dbf' - est-il une autre' dbf' qui est utilisé à la place de mes ? –

+0

Vous avez raison. Cependant, j'ai des problèmes avec la commande "import dbf". S'il vous plaît voir la question révisée. –

+0

@Ethan Après l'importation de dbf, je reçois toujours la même AttributeError qui fait référence à un objet 'Result'. J'importe xlrd pour convertir ma feuille excel en une table de dbf ... pourrait xlrd être en conflit avec le module de dbf? –

Répondre

0

Je n'ai pas travaillé avec arcpy (et je ne suis pas entièrement certain que je comprends ce que vous essayez de faire), mais en utilisant my dbf module c'est ce que vous faites pour mettre à jour/ajouter de la table principale au dbf fichier:

import dbf 

# table with all projects at all stages 
master_table = dbf.Table(complex_table) 
# table with single project and most up-to-date stage 
minimal_table = dbf.Table(single_project_table) 

with master_table.open(): 
    with minimal_table.open(): 
     minimal_index = dbf.create_index(minimal_table, lambda record: record.name) 

     # cycle through master, updating minimal if necessary 
     for master in master_table: 
      # look for PLN # first 
      found = minimal_index.search(master.pln) 
      if not found: 
       # if record doesn't exist with PLN #, try CONTRACT # 
       found = minimal_index.search(master.contract) 
       if not found: 
        # not there at all, add it 
        minimal_table.append(master.contract or master.pln, master.phase, master.length, ...) 
        break 

      # have a match, update it 
      found.name = master.contract or master.pln 
      # plus any other updates you need 
      # ... 
      # and then write the record 
      dbf.write(found) 
+0

Merci Ethan. S'il vous plaît voir la question révisée avec un message d'erreur. –