2016-05-19 8 views
0

У меня есть таблица, в которую я хотел бы присоединиться к шейп-файлу ArcGIS. Моя проблема заключается в том, что таблица имеет два поля Identity (например, «Номер плана» и «Номер контракта»), а шейп-файл имеет одно поле «Идентификация» (т. Е. «Имя»). Я хочу присоединиться к «Имя» в шейп-файле либо «Номер плана», либо «Номер контракта».Присоединение одного из двух полей в таблице dbf к одному файлу формы ArcGIS - Python

В качестве фона шейп-файл создается путем рисования вручную полигонов в ArcGIS. Эти многоугольники представляют собой различные проекты. Идентификатор «Имя» может быть либо начальным номером планирования проекта, либо номером контракта, который существует после того, как проект будет заложен в бюджет. Номер планирования существует, когда нет бюджета, а номер контракта - позже. Создаются полигоны, и поле «Имя» заполняется любым этапом идентификации (номер планирования или номер контракта), который был достигнут в проекте. Таким образом, поле shapefile «Name» содержит либо номера планирования, либо номера контрактов.

Одновременно с этим, мы имеем сложную базу данных всех проектов с двумя полями, представляющих как номер планирования и номер контракта:

PLN ------------ Договор ----- Фаза ------------ Длина ----- NTP --------- SC ------------- Примечания

1415-003 ----- WD-2506 ---- Pre-Planning ---- 45 ---- ---------- 1/1/1900 1/20/1900 ----- тест

Для создания моего кода я создал простую таблицу xml, которая ссылается на базу данных. В этой таблице xml есть поле PLN (номер плана) и поле Contract (Contract Number). В моем коде я преобразовал этот xml в dbf. Теперь я пытаюсь найти способ присоединиться к Shapefile «Name» к «PLN» или «Контракт».

Пожалуйста, смотрите код ниже:

#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] 

Я не уверен, что ввести в joinField и если есть любой другой код, который я должен включать.

ПЕРЕСМОТР 1: Я использовал код Итана, но получил сообщение об ошибке по адресу:

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

Ошибка гласит:

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' 

ПЕРЕСМОТР 2: Я начальный уровень, так может быть, я что-то довольно простое. Когда я пытаюсь импортировать DBF, я получаю ошибку после того, как мой код:

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 

Я скачал модуль DBF, но при запуске установки, я получаю эту ошибку:

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

Я m не уверен, что я делаю неправильно, чтобы установить dbf.

REVISION 3: Я установил модуль dbf и успешно импортирован в дугу.Тем не менее, я все еще получаю то же сообщение об ошибке:

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' 

Мой код:

#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) 

Я использую модуль DBF здесь: https://pypi.python.org/pypi/dbf

Спасибо.

+0

Параметр 'AttributeError' ссылается на' «Результат» object' - там нет таких вещей в моем 'dbf' пакете - есть другие' dbf', который используется вместо шахты ? –

+0

Вы правы. Однако у меня возникают проблемы с командой «import dbf». См. Пересмотренный вопрос. –

+0

@Ethan После импорта dbf, я все еще получаю тот же атрибут AttributeError, который ссылается на объект Result. Я импортирую xlrd для преобразования моего листа excel в таблицу dbf ... может ли xlrd быть в конфликте с модулем dbf? –

ответ

0

Я не работал с дуговой (и я не совсем уверен, что понимаю, что вы пытаетесь сделать), но используя my dbf module, это то, что вы делаете для обновления/добавления из главной таблицы в dbf таблицы формы файл:

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

Спасибо Ethan. См. Пересмотренный вопрос с сообщением об ошибке. –

 Смежные вопросы

  • Нет связанных вопросов^_^