使用ArcGIS Make Query Table工具永久地对字段进行重新排序?


15

回答使用ArcGIS Desktop重新排序字段(永久)在文件地理数据库?据说可以使用“查询表”工具对表和要素类中的字段进行永久性重新排序。

但是,当我打开该工具的对话框时,看不到任何使字段重新排序的地方。我所看到的是,可以使用复选框以相同的顺序来传递或删除字段。

假设有人可以更详细地描述这些步骤,请吗?

创建查询表工具对话框

Answers:


13

我想出了如何使用“查询表”工具,“另存为Python代码段”,“ Python”窗口和“ 复制功能”工具来执行此操作的方法。

运行“生成查询表”工具以仅遍历我想显示在输出中的字段后,我能够将其复制为Python代码段 结果窗口进入ArcMap的Python窗口。

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保留了Shape字段(因此我可以使用CopyFeatures保留它),并且对NAME,YR11STUDENT和YR12STUDENT字段进行了重新排序。我还借此机会放弃了其他几个领域。

最后一步是使用QueryTable2上的“复制要素”工具,该工具是通过其工具对话框完成的,以创建一个新的要素类,其中的字段被永久重新排序。


2
注意:您也可以使用MakeQueryTable通过输入字段名称和别名列表的列表来更改字段名称([[fieldname1,alias1],[fieldname2,alias2] ...]
ndimhypervol,2012年

1
当您将Feature类运行到Feature类,然后复制为Python Snippet时,将显示相同的功能。
Alex Tereshenkov 2014年

2

使用合并工具,您可以轻松地对字段进行永久重新排序。它适用于表和要素类。可以通过python脚本甚至使用“工具”对话框来完成重新排序(通过删除字段并将其重新添加到对话框中)。尽管通过对话框重新排序不是一种完美的方法。

建议一次使用“合并”工具,然后使用“ 复制为Python代码段”,然后手动更改字段顺序,然后将python代码粘贴到python窗口中。

这是一个使用合并工具对字段进行重新排序的python脚本(从此处复制)

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

可以通过删除字段并将其重新添加到对话框中来完成重新排序。虽然不是一个完美的方法。
Farid Cheraghi 2015年

1
我在另一个问题上对此问题投了赞成票,我认为这是最好的答案,但是因为它是“重复的答复”,而不是这里提出的问题的直接答复,所以我认为第二次表决是不合适的。
PolyGeo

@FaridCher,感谢您分享代码。只需在Python中非常快速地对字段进行重新排序,就可以了。太棒了
Alex Tereshenkov

1

阅读了本章“ 更改表中属性的顺序并尝试重新排列字段的顺序”之后,我在ArcMap 10,1中发现了这个简单的解决方案...

  1. 右键单击要在目录中更改的功能
  2. 单击属性
  3. 单击字段选项卡
  4. 点击一个字段
  5. 点击“上移”或“下移”箭头
  6. 申请,确定

在此处输入图片说明


3
很好的尝试。不幸的是,这仅适用于您添加到地图文档中的图层。要素类将仍然具有按定义顺序的字段。从技术上讲,数据库中没有字段的“顺序”,但是作为最终用户,当您将要素类添加到地图文档中并打开属性表时,您可能希望能够看到与您相关的字段。
Alex Tereshenkov 2014年

1

我有一种以相对健壮的方式完全在模型构建器中完成此操作的方法。设置起来有点繁琐,但至少可以将其作为较大的模型构建器分析的一部分插入:

溶解工具-ObjectID作为溶解字段。按所需顺序添加其余(统计)字段,然后从统计类型下拉菜单中选择选项(第一)。在下面的示例中,我将字段SaltMarsh_Pct从字段列表中向上移动到了位置6。

使用重新排序的字段来分解模型

我通常会复制结果,然后重命名每个字段(该副本在功能上是多余的,也可以在此处进行重命名,但这很不稳定)

使用“更改字段”工具重命名每个字段

将字段名称改回原始名称(删除“第一”)

在一个模型中,它们看起来像这样:

要重新排序的示例模型

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.