如果我的shapefile或地理数据库要素类具有要永久重新排序的字段,是否有工具,脚本或实用程序可以帮助我快速完成此任务?
通常,我知道您必须创建一个新字段,然后用旧值填充它,然后删除旧字段。我希望已经有了一些有用的东西。
假设您没有FME或其他ETL工具,下一个最佳建议是什么?
这不是视图级别更改(即,按顺序拖放字段),而是写出到新的shapefile或要素类。
#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)的字段顺序。您指定字段的顺序是输出的顺序。我发现此工具难以使用。 YMMVArctoolbox,数据管理工具,图层和表视图,进行查询表
#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
评论
我很难相信,但是我找不到办法。您需要重新排序字段的用例是什么?在ArcMap中图层属性的“字段”选项卡上的字段重新排序不是解决方案吗?字段的重新排序是因为数据不会在ArcMap中使用,而是使用不太复杂的映射软件,该软件1)使用shapefile,2)不允许在客户端进行重新排序,以及3)客户需要查看关键属性显示在“标识”树的顶部。
刚刚编辑了我之前删除的答案。希望您不害怕命令行;)。
同样的问题吗? gis.stackexchange.com/questions/5839/…
@ SaultDon-这是不一样的问题。您引用了一个要对RECORDS(行)进行排序的问题,但我想对FIELDS(列)进行排序。