обновить одну таблицу атрибутов шейп-файла значениями из другой таблицы 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 строки итерируемы, вы для циклов "for" на них, вы не делаете .next ()
gotchula

Ответы:


3

Это именно то, что делает инструмент QGIS ftools "Join by Attribute". Он принимает шейп-файл и файл 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 к шейп-файлу.

В этот момент я обычно выбираю атрибуты, которые не равны нулю (я делаю это в поле id второй таблицы). Если они не равны нулю, значит, они совпадают.

Как только это будет сделано, вы можете выбрать значения с помощью shapefile.onefield <> table.onefield.

Затем запустите расчет в шейп-файле.


-1

Извините, что не ответил на ваш вопрос, но я бы определенно сделал это в db-environment. Особенно, если данных много, тогда это, вероятно, будет намного быстрее.

Например, если вы загружаете шейп-файл и базу данных в базу данных 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.