การสั่งซื้อฟิลด์ซ้ำอย่างถาวรโดยใช้เครื่องมือ ArcGIS Make Query Table


15

ในฟิลด์คำตอบเพื่อจัดลำดับใหม่(ถาวร) ในฐานข้อมูลไฟล์โดยใช้ ArcGIS Desktop หรือไม่ มีการระบุว่าเครื่องมือสร้างตารางแบบสอบถามสามารถใช้เพื่อจัดลำดับเขตข้อมูลใหม่ในตารางและคลาสคุณลักษณะอย่างถาวร

อย่างไรก็ตามเมื่อฉันเปิดกล่องโต้ตอบสำหรับเครื่องมือนั้นฉันไม่เห็นที่ใดก็ได้ที่เปิดใช้งานการเรียงลำดับฟิลด์ใหม่ ทั้งหมดที่ฉันเห็นคือฟิลด์สามารถดำเนินการผ่านหรือลดลงโดยใช้ช่องทำเครื่องหมาย แต่ในลำดับเดียวกัน

สมมติว่าเป็นไปได้ที่ใครบางคนสามารถอธิบายขั้นตอนโดยละเอียดเพิ่มเติมได้ไหม

สร้างเครื่องมือโต้ตอบ Query Table

คำตอบ:


13

ฉันรู้วิธีการทำสิ่งนี้โดยใช้เครื่องมือสร้างตารางแบบสอบถาม , คัดลอกเป็น Python Snippet , หน้าต่าง Pythonและเครื่องมือCopy Features

หลังจากเรียกใช้เครื่องมือสร้างตารางแบบสอบถามเพื่อดึงข้อมูลในฟิลด์ที่ฉันต้องการให้ปรากฏในผลลัพธ์ฉันสามารถคัดลอกเป็น Python Snippet โค้ดนี้จากการประมวลผลทางภูมิศาสตร์ | หน้าต่างผลลัพธ์ไปยังหน้าต่าง Python ของ ArcMap

arcpy.MakeQueryTable_management("'C:/avhome/data/WAregional/wa regional.mdb/schools'","QueryTable","USE_KEY_FIELDS","#","schools.OBJECTID #;schools.Shape #;schools.CODE #;schools.NAME #;schools.TYPE #;schools.Y11STUDENT #;schools.Y12STUDENT #;schools.COORDGEOCO #;schools.ID #","#")

และแก้ไขเป็น:

arcpy.MakeQueryTable_management("'C:/avhome/data/WAregional/wa regional.mdb/schools'","QueryTable2","USE_KEY_FIELDS","#","schools.OBJECTID #;schools.Shape #;schools.Y12STUDENT #;schools.Y11STUDENT #;schools.NAME #","#")

โปรดทราบว่า QueryTable2 ใหม่จะรักษาฟิลด์รูปร่างไว้ (ดังนั้นฉันจึงสามารถคัดลอกคุณลักษณะได้) และฉันได้เรียงลำดับฟิลด์ NAME อีกครั้ง YR11STUDENT & YR12STUDENT ฉันยังใช้โอกาสนี้เพื่อเลื่อนฟิลด์ออกไปอีกสองสาม

ขั้นตอนสุดท้ายคือการใช้เครื่องมือคัดลอกคุณสมบัติใน QueryTable2 ซึ่งฉันทำผ่านกล่องโต้ตอบเครื่องมือเพื่อสร้างคลาสคุณสมบัติใหม่ที่มีฟิลด์สั่งซื้อใหม่อย่างถาวร


2
หมายเหตุ: คุณยังสามารถใช้ MakeQueryTable เพื่อเปลี่ยนชื่อของฟิลด์ของคุณโดยป้อนรายการของชื่อฟิลด์และชื่อแทน ([[fieldname1, alias1], [fieldname2, alias2] ... ])
ndimhypervol

1
ฟังก์ชั่นเดียวกันนี้จะปรากฏเมื่อคุณเรียกใช้คลาสคุณลักษณะไปยังคลาสคุณลักษณะแล้วคัดลอกเป็น Python
Alex Tereshenkov

2

ด้วยเครื่องมือผสานคุณสามารถจัดลำดับเขตข้อมูลใหม่ได้อย่างง่ายดาย มันทำงานกับตารางและชั้นเรียนคุณสมบัติ การจัดเรียงใหม่สามารถทำได้ผ่านสคริปต์ python และแม้กระทั่งกับกล่องโต้ตอบเครื่องมือ (โดยการลบฟิลด์และเพิ่มใหม่ในกล่องโต้ตอบ) แม้ว่าการสั่งซื้อซ้ำผ่านกล่องโต้ตอบนั้นไม่ใช่วิธีการที่สมบูรณ์แบบ

ขอแนะนำให้ใช้เครื่องมือผสานหนึ่งครั้งจากนั้นใช้คัดลอกเป็น Python Snippetจากนั้นเปลี่ยนคำสั่งเขตข้อมูลด้วยตนเองแล้ววางรหัสหลามในหน้าต่างหลาม

นี่คือสคริปต์หลามที่ใช้เครื่องมือผสานเพื่อจัดลำดับฟิลด์ใหม่ (คัดลอกจากที่นี่ )

import arcpy

def reorder_fields(table, out_table, field_order, add_missing=True):
    """ 
    Reorders fields in input featureclass/table
    :table:         input table (fc, table, layer, etc)
    :out_table:     output table (fc, table, layer, etc)
    :field_order:   order of fields (objectid, shape not necessary)
    :add_missing:   add missing fields to end if True (leave out if False)
    -> path to output table
    """
    existing_fields = arcpy.ListFields(table)
    existing_field_names = [field.name for field in existing_fields]

    existing_mapping = arcpy.FieldMappings()
    existing_mapping.addTable(table)

    new_mapping = arcpy.FieldMappings()

    def add_mapping(field_name):
        mapping_index = existing_mapping.findFieldMapIndex(field_name)

        # required fields (OBJECTID, etc) will not be in existing mappings
        # they are added automatically
        if mapping_index != -1:
            field_map = existing_mapping.fieldMappings[mapping_index]
            new_mapping.addFieldMap(field_map)

    # add user fields from field_order
    for field_name in field_order:
        if field_name not in existing_field_names:
            raise Exception("Field: {0} not in {1}".format(field_name, table))

        add_mapping(field_name)

    # add missing fields at end
    if add_missing:
        missing_fields = [f for f in existing_field_names if f not in field_order]
        for field_name in missing_fields:
            add_mapping(field_name)

    # use merge with single input just to use new field_mappings
    arcpy.Merge_management(table, out_table, new_mapping)
    return out_table

การใช้:

new_field_order = ["field2", "field3", "field1"]
reorder_fields(in_fc, out_fc, new_field_order)

คุณจะสามารถแสดงขั้นตอนที่แน่นอนที่คุณใช้ในการทำสิ่งนี้ผ่านกล่องโต้ตอบเครื่องมือของมันได้ไหม จากการทดสอบ 10.3.1 ของฉันตอนนี้ดูเหมือนว่าแผงการแมปเขตข้อมูลไม่อนุญาตให้สั่งซื้อซ้ำอีกครั้ง นอกจากนี้ฉันคิดว่าคำตอบนี้จะอยู่ในคำถามอื่นที่ดีกว่า ( gis.stackexchange.com/questions/32119/ ...... ) เพราะคำตอบนี้เกี่ยวข้องกับการใช้เครื่องมือสร้างตารางการสืบค้นโดยเฉพาะ
PolyGeo

ใช่ฉันสังเกตเห็นว่าในชื่อคำถามของคุณ แต่โพสต์นี้อาจเป็นประโยชน์แก่ผู้เยี่ยมชมในอนาคตที่จำเป็นต้องเรียงลำดับฟิลด์ใหม่เท่านั้นวิธีที่ง่ายที่สุด
Farid Cheraghi

การจัดเรียงใหม่สามารถทำได้โดยการลบฟิลด์และเพิ่มอีกครั้งในกล่องโต้ตอบ ไม่ใช่วิธีที่สมบูรณ์แบบแม้ว่า
Farid Cheraghi

1
ฉันโหวตให้กับคำตอบนี้ในคำถามอื่นที่ฉันคิดว่ามันเป็นคำตอบที่ดีที่สุด แต่เป็น "คำตอบซ้ำ" และไม่ใช่คำตอบที่ตรงกับคำถามที่ถามที่นี่ฉันไม่คิดว่าการลงคะแนนเสียงครั้งที่สองจะเหมาะสม
PolyGeo

@FaridCher ขอบคุณสำหรับการแบ่งปันรหัส เพียงแค่ต้องการสั่งซื้อฟิลด์ซ้ำอย่างรวดเร็วใน Python และใช้งานได้ดี น่ากลัว
Alex Tereshenkov

1

เมื่ออ่านสิ่งนี้แล้วการเปลี่ยนลำดับของแอตทริบิวต์ในตารางและพยายามที่จะจัดเรียงลำดับของฟิลด์ใหม่ฉันพบวิธีแก้ปัญหาง่ายๆใน ArcMap 10,1 ...

  1. คลิกขวาที่คุณสมบัติที่คุณต้องการแก้ไขในสารบัญ
  2. คลิกคุณสมบัติ
  3. คลิกที่แท็บฟิลด์
  4. คลิกที่ฟิลด์
  5. คลิกลูกศร "เลื่อนขึ้น" หรือ "เลื่อนลง"
  6. ใช้ตกลง

ป้อนคำอธิบายรูปภาพที่นี่


3
ดีลอง แต่น่าเสียดายที่สิ่งนี้ใช้ได้กับเลเยอร์ที่คุณเพิ่มเข้าไปในเอกสารแผนที่เท่านั้น คลาสคุณลักษณะจะยังคงมีฟิลด์ตามลำดับที่กำหนดไว้ ในทางเทคนิคการพูดไม่มีคำสั่ง "ของฟิลด์" ในฐานข้อมูล แต่ในฐานะผู้ใช้ปลายทางคุณอาจต้องการเมื่อเพิ่มคลาสฟีเจอร์ลงในเอกสารแผนที่และเปิดตารางแอททริบิวเพื่อดูฟิลด์ที่เกี่ยวข้องกับการสั่งซื้อของคุณ
Alex Tereshenkov

1

ฉันมีวิธีการทำอย่างสมบูรณ์ภายในตัวสร้างแบบจำลองในลักษณะที่ค่อนข้างแข็งแกร่ง เป็นเรื่องน่าเบื่อเล็กน้อยที่จะตั้งค่า แต่อย่างน้อยก็สามารถแทรกเป็นส่วนหนึ่งของการวิเคราะห์ตัวสร้างแบบจำลองที่มีขนาดใหญ่กว่า:

เครื่องมือละลาย - ObjectIDเป็นเขตข้อมูลละลาย เพิ่มฟิลด์ (สถิติ) ที่เหลือตามลำดับที่ต้องการและเลือกตัวเลือก (ขั้นแรก) จากประเภทแบบหล่นลงของ Statstic ในตัวอย่างด้านล่างฉันได้ย้ายสนามSaltMarsh_Pctขึ้นแบบฟอร์มลงในรายการของเขตข้อมูลไปยังตำแหน่งที่ 6

ยุบโมเดลด้วยฟิลด์ที่เรียงลำดับใหม่

ฉันมักจะคัดลอกผลลัพธ์จากนั้นเปลี่ยนชื่อแต่ละฟิลด์ (การคัดลอกซ้ำซ้อนตามหน้าที่และการเปลี่ยนชื่อสามารถทำได้ที่นั่นเช่นกัน แต่มันไม่สม่ำเสมอ)

ใช้เครื่องมือ Alter Field เพื่อเปลี่ยนชื่อแต่ละฟิลด์

เปลี่ยนชื่อฟิลด์กลับเป็นต้นฉบับ (ลบ FIRST)

ทั้งหมดเข้าด้วยกันในแบบจำลองดูเหมือนว่า:

ตัวอย่างแบบจำลองเพื่อจัดเรียงใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.