оновіть одну таблицю атрибутів shapefile значеннями з іншої таблиці dbf


10

Я намагаюся пояснити тут, що я намагаюся зробити:

У мене є одна форма файлів і одна незалежна таблиця dbf з тими ж полями. У таблиці dbf усі поля заповнюються, але в таблиці атрибутів shapefile лише одне, іменовано його "OneField". Що я хочу зробити, це перевірити, що значення з "OneField" (Shapefile) збігаються з значеннями в "OneField" (таблиця dbf), і якщо так, заповнити залишки порожніх полів у таблиці атрибутів shapefile таблицями у незалежній таблиці dbf.

На даний момент я намагаюся просто скопіювати значення з незалежної таблиці dbf до таблиці атрибутів shapefile, але я застряг. (Коли я запускаю цей код, я отримую повідомлення про те, що pythonwin перестав працювати і з таблицями нічого не відбувається). Чи можете ви мені подати руку?

Ось код:

import arcpy

table = "link/to/table.dbf"
fc = "link/to/shapefile.shp"

# Create a search cursor

rowsTable = arcpy.SearchCursor(table)

# Create an update cursor

rowsFc = arcpy.UpdateCursor(fc) 

for row in rowsTable:
    row = row.getValue("OneField")
    valueTable = row
    for row in rowsFc:
        row = row.setValue("OneField", valueTable)
        rowsFc.updateRow(row)
        row = rowsFc.next()
    row = rowsTable.next()    

del row, rowsFc, rowsTable

Дуже дякую


1
Ви можете відредагувати своє початкове запитання, виправити або додати інформацію.
Бред Несом

спробуйте приймати всі рядки , які мають .next (), з arcpy рядки є Iterable, за «за» петлі на них, ви не робите .next ()
gotchula

Відповіді:


3

Саме це робить інструмент QGIS ftools "Приєднатись до атрибутів". Він приймає файл форм і dbf файл (або другий файл форми) і приєднується до їх таблиць атрибутів. Інструмент написаний python, тому ви повинні знайти все необхідне тут: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py


3

З точки зору коду, схоже, ви використовуєте "рядок" для купки (~ 4) різних речей, деякі з яких видаються непотрібними. Я не дуже працюю з arcpy, але я думаю, що щось подібне працювало б краще. Якщо це так, ви закінчите весь стовпець OneField у вашому FC, заповнений останнім значенням OneField з вашої таблиці:

for rowT in rowsTable:
    valueTable = rowT.getValue("OneField")
    for rowF in rowsFc:
        rowF.setValue("OneField", valueTable)
        rowsFc.updateRow(rowF)
        rowF = rowsFc.next()
    rowT = rowsTable.next() 

neuhausr, велике спасибі, добре працює, як ти його поставив
Богдан Палад

3

Я витратив багато часу на те, щоб спробувати це, і у мене вийшло щось, що працює. Тут зверніться до мого коду, щоб він працював.

Як оновити клас функції шляхом ітерації через значення з розгалуженням? .

Вам потрібно буде скласти список, який містить усі поля, щоб ви могли повторити їх.


2

Мій метод переміщення даних з dbf у файл форм. Потрібно (звичайно, я вважаю за краще це робити в програмному забезпеченні gui) приєднати dbf до shapefile.

У цей момент я зазвичай вибираю атрибути, які не є нульовими (я роблю це в полі id другої таблиці). Якщо вони не нульові, то вони відповідали.

Після цього ви зможете вибрати значення за допомогою shapefile.onefield <> table.onefield.

Потім запустіть свій розрахунок у файлі форм.


-1

Вибачте за те, що не відповів на ваше запитання, але я б обов'язково це зробив у db-середовищі. Особливо, якщо це багато даних, то, мабуть, це буде набагато швидше.

Якщо ви, наприклад, завантажите shapefile та dbf в db PostGIS, ваш запит може виглядати приблизно так:

CREATE TABLE new_table AS
SELECT a.the_geom, a.populated_field, b.populated_field2, b.populated_field3
FROM shape_table a LEFT JOIN dbf_table b ON a.populated_field=b.populated_field1;

Якщо ви покладете індекс на поля приєднання, це повинно бути дуже швидким. Ви, звичайно, можете оновити shape_table замість цього, але хочете створити нову таблицю замість цього, щоб не зруйнувати вихідні дані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.