Я пытаюсь объяснить здесь, что я пытаюсь сделать:
У меня есть один шейп-файл и одна независимая таблица 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
большое спасибо
Ответы:
Это именно то, что делает инструмент QGIS ftools "Join by Attribute". Он принимает шейп-файл и файл DBF (или второй шейп-файл) и объединяет их таблицы атрибутов. Инструмент написан на python, поэтому вы должны найти все, что вам нужно здесь: http://trac.osgeo.org/qgis/browser/trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
источник
С точки зрения кода, похоже, что вы используете «строку» для множества (~ 4) разных вещей, некоторые из которых кажутся ненужными. Я не особо разбираюсь в arcpy, но я бы подумал, что что-то подобное будет работать лучше. Если это произойдет, вы получите весь столбец OneField в вашем FC, заполненный последним значением OneField из вашей таблицы:
источник
Я потратил много времени, пытаясь сделать это сам, и у меня есть кое-что, что работает. Обратитесь к моему коду здесь, чтобы заставить его работать.
Как обновить класс объектов путем перебора значений с разветвлением? ,
Вам нужно будет составить список, содержащий все поля, чтобы вы могли перебирать их.
источник
Мой метод для перемещения данных из базы данных в шейп-файл. Это (конечно, я предпочитаю делать это внутри программного обеспечения графического интерфейса) присоединить dbf к шейп-файлу.
В этот момент я обычно выбираю атрибуты, которые не равны нулю (я делаю это в поле id второй таблицы). Если они не равны нулю, значит, они совпадают.
Как только это будет сделано, вы можете выбрать значения с помощью shapefile.onefield <> table.onefield.
Затем запустите расчет в шейп-файле.
источник
Извините, что не ответил на ваш вопрос, но я бы определенно сделал это в db-environment. Особенно, если данных много, тогда это, вероятно, будет намного быстрее.
Например, если вы загружаете шейп-файл и базу данных в базу данных PostGIS, ваш запрос может выглядеть примерно так:
Если вы добавите индекс в поля объединения, это должно быть очень быстро. Вместо этого вы можете обновить shape_table, но вместо этого создать новую таблицу, чтобы не уничтожать исходные данные.
источник