如果我的shapefile或地理数据库要素类具有要永久重新排序的字段,是否有工具,脚本或实用程序可以帮助我快速完成此任务?
通常,我知道您必须创建一个新字段,然后用旧值填充它,然后删除旧字段。我希望已经有了一些有用的东西。
假设您没有FME或其他ETL工具,下一个最佳建议是什么?
这不是视图级别更改(即,按顺序拖放字段),而是写出到新的shapefile或要素类。

评论

我很难相信,但是我找不到办法。您需要重新排序字段的用例是什么?在ArcMap中图层属性的“字段”选项卡上的字段重新排序不是解决方案吗?

字段的重新排序是因为数据不会在ArcMap中使用,而是使用不太复杂的映射软件,该软件1)使用shapefile,2)不允许在客户端进行重新排序,以及3)客户需要查看关键属性显示在“标识”树的顶部。

刚刚编辑了我之前删除的答案。希望您不害怕命令行;)。

同样的问题吗? gis.stackexchange.com/questions/5839/…

@ SaultDon-这是不一样的问题。您引用了一个要对RECORDS(行)进行排序的问题,但我想对FIELDS(列)进行排序。

#1 楼

我刚刚确认ogr2ogr可以做到这一点。在-select开关上指定字段名称顺序。例如,如果我有一个带有两个字段的shapefile,即“名称”和“ FolderPath”(按该顺序),但是我首先想要一个带有“ FolderPath”的新shapefile,则可以这样做:
C:\Temp>ogr2ogr -f "ESRI Shapefile" re_order_ogr.shp re_order1.shp -select "FolderPath,Name"


评论


尽管它不像我希望的那样对用户友好,但确实可以解决问题。我创建了一个ArcGIS Python脚本来帮助为其建立输入,并且用户只需要包括-select“ field1,field2,etc”选项。您可以从resources.arcgis.com/Resources2010/gallery/file/geoprocessing/…下载它。

– RyanKDalton
2011年2月8日在18:45

我在具有域的SDE上具有要素类。这将保留关联的域吗?

– MjonesGEO
2014年11月5日在16:52

@joebob号AFAIK,ogr不支持来自SDE GDB的数据集,它也不支持域。

–德里克·斯温利(Derek Swingley)
2014年11月5日18:02

谢谢,我只是使用XRay,它可以在SDE中保留其域的同时对字段进行重新排序或替换。

– MjonesGEO
2014年11月5日在18:34

#2 楼

ET GeoWizards工具将执行此操作,并且看起来免费版本将执行此操作,而功能数量不受任何限制。

评论


它可以,但可悲的是不保留别名。

–榴弹炮
16-2-16在12:33

#3 楼

现在,QGIS“表管理器”插件还具有无需命令行即可轻松执行此任务的功能。

#4 楼

在QGIS中,您现在可以使用处理工具箱(Ctl + Alt + T)并转到QGIS地理算法>向量表工具>重构字段。

从那里您将拥有所有用于编辑表结构的工具。



#5 楼

X射线弧图添加了一个工具,可对Geodatabes格式的字段进行重新排序

评论


这很好。如果您要重新订购SDE,它甚至会将您的域保存在字段中。很棒的建议!

– MjonesGEO
2014年11月5日17:59

#6 楼

最好的方法是使用字段映射。多年来,我一直在努力使用ESRI软件的此功能,但最终我对这种解决方案感到满意。基本上,您可以复制要素类,并使用arcpy.FieldMappings对字段进行永久重新排序。所有数据也将保留下来。脚本完成后,只需将旧的要素类重命名为myFeatureClass_old,而将新的要素类重命名为myFeatureClass!这里是脚本,它非常简单: >

#7 楼

要素类到要素类现在可以使用“ GP工具字段映射”部分在10.5中执行此操作。



#8 楼

供参考:MapInfo也可以直接使用。只需打开DBF,然后对字段进行永久重新排序。 http://www.dbf-editor.com也可以这样做(40美元)。其他DBF编辑器也可能会这样做。

评论


在这一行中,只要您愿意忍受.dbf文件格式的限制,infolib可能也应该可以工作(转换为ascii(csv),重新排列以适合,重新转换回info或dbf)。

–马特·威尔基
2011年6月9日在22:11

您是说要忍受CSV格式的限制? DBF是此问题的起点...

– Uffe Kousgaard
2011-6-10 11:39

我的意思是dbf限制,特别考虑到csv对字段名长度或记录值长度没有限制,并且起始点是文件gdb,但是重新阅读标题中提到的Q我看到“ shp”。因此,周围的限制;-)

–马特·威尔基
2011-6-10 18:02

#9 楼

我遇到过类似的问题,如果您已经拥有QGIS,则对数据字段进行永久重新排序的最快方法是使用以前建议的“表管理器”插件。并且用户友好,如下页所述:

http://www.qgistutorials.com/en/docs/using_plugins.html

它允许您按特定顺序移动属性,重命名字段,插入任何新字段并复制它们。它还允许您保存原始文件,或重命名它并以不同于原始文件的方式保存它。问题,强烈建议使用此方法,尤其是对于具有大量与其相关联的属性的文件。

#10 楼

将要素类导出到空的个人地理数据库(最快的拖放操作),在Access中打开.mdb,在“设计视图”中对字段重新排序,保存,然后通过ArcMap / Catalog复制回形状或文件地理数据库。

重命名字段也可以使用相同的方法。 (正如Karey Jack在另一个答案中指出的那样,Esri不鼓励直接访问.mdb)。为了安全起见,请忽略所有以GDB_开头的表以及以_Shape_Index结尾的表。

#11 楼

MakeQueryTable将使您可以定义表或FC(仅限Geodatabase)的字段顺序。您指定字段的顺序是输出的顺序。我发现此工具难以使用。 YMMV

Arctoolbox,数据管理工具,图层和表视图,进行查询表

#12 楼

尝试OGR2OGR。您可以传递SQL查询,并将字段按所需的顺序排列。


ogr2ogr outdataset indataset -sql
“ SELECT src_field1 AS dst_field1,
src_field2 AS dst_field2 FROM
sourcelayer“


只需测试一下,它就可以正常工作!

FYI,安装OGR的最简单方法是通过FWTools。

#13 楼

要对每个要素类和表具有相似字段的GIS字段重新排序,以便将这些字段重新排列在所有其余字段的前面。这适用于完整的数据集。确保字段存在并正确别名。
导入库
import arcpy
import sys

声明工作区
path="D:/temp"
dbname="/gis"
arcpy.env.workspace=path+dbname+'.gdb'
demogis=arcpy.env.workspace
newdb=path+dbname+'_New.gdb'
print(path+dbname+'.gdb')
print(demogis)
print (newdb)

重新排序字段
创建新文件地理数据库和要素数据集
/>
arcpy.management.Delete(path+dbname+'_New'+'.gdb')
arcpy.management.CreateFileGDB(path,dbname + '_New')
try:
    for ds in arcpy.ListDatasets():
        output_dpath = (path+dbname + '_New' + '.gdb')
        arcpy.CreateFeatureDataset_management(output_dpath, ds, ds)
except Exception:
    e = sys.exc_info()[1]
    print(e.args[0], ds)

要素类中的字段映射重新排序
'pfields'列表需要按顺序更新为字段和别名字段名称。这将为要素类中的字段设置顺序。要素类中必须存在字段。
pfields=[('AssetID','Asset Identifier'),('Display','Display Name'),('OpStatus','Operational Status'),('LifeCycleStatus','Lifecycle Status'),('Location','Location Description'),('Address','Address'),('OwnedBy','Owned By'),('MaintBy','Maintained By'),('PrimaryImage','Primary Image'),('CondInspScore','Condition Score'),('CondInspDate','Condition Date'),('WarrantyDate','Warranty Date'),('InstallDate','Install Date'),('InstallCost','Install Cost'),('ExpReplaceDate','Exp Replace Date'),('ExpReplaceCost','Exp Replace Cost'),('Age','Age'),('Criticality','Criticality'),('iPoF','Failure Probability'),('iCoF', 'Failure Consequence'),('iBRE','Business Risk'),('iMSPU','Maint Under Perform'),('iMSPO','Maint Over Perform'),('iMSR','Maint Score'),('iMCFY','Maint Curve Fast Yr'),('iMCSY','Maint Curve Slow Yr'),('iMCAY','Maint Curve Avg Yr'),('iMSName','Maint Strategy Name'),('iCalcDate','OpInsights Calc Date'),('IndFacID','Indoors Facility Identifier'),('IndLevID','Indoors Level Identifier'),('Comments','Comments')]
datasets = arcpy.ListDatasets(feature_type='feature')
datasets = [''] + datasets if datasets is not None else []
for ds in datasets:
    for fc in arcpy.ListFeatureClasses(feature_dataset=ds):
        pfield=[item[0] for item in pfields]
        palias=[item[1] for item in pfields]
        desc = arcpy.Describe(fc)
        output_dpath = (path+dbname + '_New' + '.gdb'+'/'+ds)
        input_fpath = demogis+'/'+ds+'/'+fc
        output_fname = fc
        fms = arcpy.FieldMappings()
        fcall = [(f.name,f.aliasName) for f in arcpy.ListFields(demogis+'/'+ds+'/'+fc) if f.editable]
        ffield = [item[0] for item in fcall]
        falias=[item[1] for item in fcall]
        fields2Add = list(set(fcall) - set(pfields))
        try:    
            for pfield,palias in pfields:
                fm = arcpy.FieldMap()
                fm.addInputField(input_fpath,pfield)
                of = fm.outputField
                of.name = pfield
                of.aliasName = palias
                fm.outputField = of
                fms.addFieldMap(fm)
        except Exception:
            e = sys.exc_info()[1]
            print(e.args[0], fc,pfield)
        try:
            for ffield,falias in fields2Add:
                if ffield != "SHAPE" and ffield != 'Shape':
                    fm = arcpy.FieldMap()
                    fm.addInputField(input_fpath,ffield)
                    of = fm.outputField
                    of.name = ffield
                    of.aliasName = falias
                    fm.outputField = of
                    fms.addFieldMap(fm)
        except Exception:
            e = sys.exc_info()[1]
            print(e.args[0], fc,ffield)
        arcpy.conversion.FeatureClassToFeatureClass(input_fpath,output_dpath,output_fname,"",field_mapping=fms)
    

重新排序表中的字段映射
“ pfields”列表需要按顺序更新为字段和别名字段名称。这将设置表中字段的顺序。表中必须存在字段。
pfields=[('AssetID','Asset Identifier'),('Display','Display Name'),('OpStatus','Operational Status'),('LifeCycleStatus','Lifecycle Status'),('Location','Location Description'),('Address','Address'),('OwnedBy','Owned By'),('MaintBy','Maintained By'),('PrimaryImage','Primary Image'),('CondInspScore','Condition Score'),('CondInspDate','Condition Date'),('WarrantyDate','Warranty Date'),('InstallDate','Install Date'),('InstallCost','Install Cost'),('ExpReplaceDate','Exp Replace Date'),('ExpReplaceCost','Exp Replace Cost'),('Age','Age'),('Criticality','Criticality'),('iPoF','Failure Probability'),('iCoF','Failure Consequence'),('iBRE','Business Risk'),('iMSPU','Maint Under Perform'),('iMSPO','Maint Over Perform'),('iMSR','Maint Score'),('iMCFY','Maint Curve Fast Yr'),('iMCSY','Maint Curve Slow Yr'),('iMCAY','Maint Curve Avg Yr'),('iMSName','Maint Strategy Name'),('iCalcDate','OpInsights Calc Date'),('IndFacID','Indoors Facility Identifier'),('IndLevID','Indoors Level Identifier'),('Comments','Comments')]
tables = arcpy.ListTables()
for tb in tables:
    output_dpath = (path+dbname + '_New' + '.gdb')
    input_fpath = demogis+'/'+tb
    pfield=[item[0] for item in pfields]
    palias=[item[1] for item in pfields]
    output_fname = tb
    fms = arcpy.FieldMappings()
    fcall = [(f.name,f.aliasName) for f in arcpy.ListFields(demogis+'/'+tb) if f.editable]
    ffield = [item[0] for item in fcall]
    falias=[item[1] for item in fcall]
    fields2Add = list(set(fcall) - set(pfields))
    try:    
        for pfield,palias in pfields:
            fm = arcpy.FieldMap()
            fm.addInputField(input_fpath,pfield)
            of = fm.outputField
            of.name = pfield
            of.aliasName = palias
            fm.outputField = of
            fms.addFieldMap(fm)
    except Exception:
        e = sys.exc_info()[1]
        print(e.args[0], tb,pfield)
    try:
        for ffield,falias in fields2Add:
            if ffield != "SHAPE" and ffield != 'Shape':
                fm = arcpy.FieldMap()
                fm.addInputField(input_fpath,ffield)
                of = fm.outputField
                of.name = ffield
                of.aliasName = falias
                fm.outputField = of
                fms.addFieldMap(fm)
    except Exception:
        e = sys.exc_info()[1]
        print(e.args[0], tb,ffield)
    arcpy.conversion.TableToTable(input_fpath,output_dpath,output_fname,"",field_mapping=fms)


#14 楼

在MS Access中打开.mdb文件,然后使用“设计视图”中的拖放功能对字段重新排序。

尽管ESRI不鼓励在Access中编辑数据库

评论


欢迎来到我们的网站,Karey!这不是18个月前Matt Wilkie在此主题中给出的答案吗(gis.stackexchange.com/a/5879)?

– hu
2012年7月30日在13:28

#15 楼

没有人提到ESRI地理数据库图表绘制器。
ESRI提供的一种资源,用于编辑地理数据库和文件的XML结构。就我而言,如果您正在从事任何必须完美设计的工作(长期项目),那么这是至关重要的。犯了一个简单的错误后,它使您不必连续重新创建文件。

评论


您是否看到(针对问题本身的)评论指出这不是数据库重组,而是需要导出数据?

– hu
2012年7月30日13:29