使用来自另一个dbf表的值更新一个shapefile属性表


10

我试图在这里解释我要做什么:

我有一个shapefile和一个具有相同字段的独立dbf表。在dbf表中填充了所有字段,但在shapefile属性表中仅填充了一个字段,将其命名为“ OneField”。我想做的是检查“ OneField”(Shapefile)中的值是否与“ OneField”(dbf表)中的值相同,如果是,则用这些填充在shapefile属性表中的其余空字段在独立的dbf表中。

目前,我只想将独立dbf表中的值复制到shapefile属性表中,但是我被卡住了。你能帮我一下吗?

这是代码:

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 2010年

Answers:



3

从代码的角度来看,似乎您正在使用“行”处理一堆(约4种)不同的事物,其中有些似乎不必要。我对arcpy所做的工作不多,但是我想像这样的方法会更好。如果这样做的话,最终将在FC中填充整个OneField列,并在其中填充表中的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,非常感谢,您的放置效果很好
Bogdan Palade 2010年


2

我的将数据从dbf移动到shapefile的方法。要(当然,我更喜欢在gui软件中执行此操作)将dbf连接到shapefile。

那时,我通常选择不为null的属性(我在第二个表的id字段上执行此操作)。如果它们不为null,则匹配。

完成此操作后,您可以通过shapefile.onefield <> table.onefield选择值。

然后在shapefile中运行您的计算。


-1

抱歉,没有回答您的问题,但是我绝对会在db-environment中这样做。尤其是如果有大量数据,那可能会快很多。

例如,如果将shapefile和dbf加载到PostGIS db中,则查询可能如下所示:

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,但是喜欢创建一个新表而不破坏原始数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.