อัพเดตตาราง attributefile หนึ่งตารางด้วยค่าจากตาราง 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

ลองดึงทุกบรรทัดที่มี. next (), โดยให้ arcpy เป็นแถวคุณสามารถใช้คำสั่ง "for" บนลูปคุณไม่ต้องทำ.
next

คำตอบ:


3

นั่นคือสิ่งที่เครื่องมือ QGIS ftools "เข้าร่วมโดยแอตทริบิวต์" กำลังทำอยู่ มันใช้รูปร่างและไฟล์ dbf (หรือรูปร่างที่สอง) และเข้าร่วมตารางคุณลักษณะของพวกเขา เครื่องมือเขียนด้วยไพ ธ อนดังนั้นคุณควรพบทุกสิ่งที่คุณต้องการที่นี่: 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 ขอบคุณมากมันทำงานได้ดีวิธีที่คุณใส่มัน
Bogdan Palade

3

ฉันใช้เวลาพอสมควรในการพยายามทำสิ่งนี้ด้วยตัวเองและฉันก็มีสิ่งที่ใช้ได้ผล อ้างอิงรหัสของฉันที่นี่เพื่อให้มันทำงาน

จะอัปเดตคลาสคุณลักษณะโดยวนซ้ำผ่านค่าที่มีการแยกย่อยได้อย่างไร .

คุณจะต้องสร้างรายการที่มีฟิลด์ทั้งหมดเพื่อให้คุณสามารถวนซ้ำได้


2

วิธีการของฉันสำหรับการย้ายข้อมูลจาก dbf ไปยัง shapefile คือ (แน่นอนว่าฉันต้องการทำสิ่งนี้ภายในซอฟต์แวร์ gui) เข้าร่วม dbf กับ shapefile

ณ จุดนั้นฉันมักจะเลือกคุณสมบัติที่ไม่เป็นโมฆะ (ฉันทำสิ่งนี้ในช่อง id ของตารางที่สอง) หากพวกเขาไม่ใช่โมฆะพวกเขาก็จับคู่กัน

เมื่อดำเนินการเสร็จแล้วคุณสามารถเลือกค่าได้โดย shapefile.onefield <> table.onefield

จากนั้นรันการคำนวณของคุณใน shapefile


-1

ขออภัยที่ไม่ตอบคำถามของคุณ แต่ฉันจะทำสิ่งนี้ใน db-environment แทน โดยเฉพาะอย่างยิ่งถ้ามันเป็นข้อมูลจำนวนมากนั่นอาจจะเร็วขึ้นมาก

หากคุณเช่นโหลดรูปร่างไฟล์และ 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.