하나의 shapefile 속성 테이블을 다른 dbf 테이블의 값으로 업데이트


10

여기에 내가하려는 일을 설명하려고합니다.

동일한 필드를 가진 하나의 shapefile과 하나의 독립 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
원래 질문을 수정하거나 정보를 수정하거나 추가 할 수 있습니다.
Brad Nesom

그들에 루프 "를"에 대한 행이 반복 가능한입니다 arcpy 당신을 다음 내용을 (이 모든 라인)을 복용하려고하면) (다음 내용하지 않는다
gotchula

답변:



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


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을 대신 업데이트 할 수 있지만 원본 데이터를 삭제하지 않고 새 테이블을 만드는 것을 좋아합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.