span8
span4
在使用文件geodatabase时可能遇到的一种情况是,希望向现有的feature类写入数据,同时修改其模式,而不必删除现有的feature类表。这将允许用户维护其现有功能类的字段名,同时手动或从源数据集添加新字段。虽然我们建议您的ArcGIS客户端处理对现有特性类的任何模式更改,但是下面的示例将展示如何使用FME中的FME和ArcGIS Python模块向现有的地理数据库特性类添加字段。
Python解释器必须是设置为解释器由ArcGIS安装。看到的:没有命名为ArcPy的模块:导入Esri的ArcPy与FME一起使用
ArcGIS与FME安装在同一台机器上
在上面的图像中,我们可以看到源Esri shapefile的可视化,其中包含我们想要添加到现有功能类的新字段“Truck”。
在上面的图像中,我们看到了目标特性类的可视化。可以看到,除了shapefile有一个额外的属性字段外,数据基本上是相同的。
1.读取源数据并公开属性
使用Esri shapefile reader从shapefile源文件中读取垃圾调度几何数据。这个shapefile包含一个属性字段,它不会出现在相应的feature类中,我们将向它写入数据。将shapefile阅读器添加到工作空间后,打开阅读器参数对话框并单击format parameters选项卡。公开下列属性(即复选框):
fme_feature_type
fme_geometry
SHAPE_GEOMETRY
fme_type
*注意:需要公开的属性因数据集和格式的不同而不同。
2.重命名/删除属性
AttributeManager将用于从源shapefile数据集中重命名和删除各种属性。将shapefile阅读器连接到AttributeManager,在AttributeManager属性中,将输出属性“NumAddress”更改为“NumAddress”。此外,更改fme_geometry、fme_type、fme_feature_type和SHAPE_GEOMETRY(即在前一步中暴露的属性)以“删除”。
*注意:公开的格式属性被移除,这样它们就不会通过我们即将发布的Python代码被添加到我们的目标特性类中。
3.向目标特性类添加字段
为了将源shapefile中包含的新字段包含到现有的目标特性类中,必须以编程方式添加它。这将允许进行模式更改,而不必删除现有的特性类表。PythonCaller通过调用FME (fmeobjects)和ArcGIS (arcpy)的功能来进行这些更改。
首先,导入FME和ArcGIS的python模块,然后从相应的FME宏读取目标地理数据库路径。然后,我们将目标特性类的名称硬编码到地理数据库路径。arcpy函数“List Fields”用于获取当前包含在目标特性类中的字段名的单独字符串。然后创建一个空列表变量,并将list字段调用中的字符串追加到空列表。
getallattributenames()函数用于获取源数据集上的字段列表。然后,我们将目标属性列表与源属性中包含的值进行比较,从源属性列表中删除源属性已经存在于目标数据集中的实例。
最后,我们循环遍历源属性列表中的剩余值,并根据相关属性的数据类型向目标特性类添加字段。
下面包含将出现在PythonCaller中的整个代码定义:
fme进口fmeobjects进口进口:arcpy #模板函数接口:#使用这个函数时,确保它的名字是#的值设置为类或函数过程特性的变压器参数def processFeature(特性):#得到目标的位置GDB fme宏的值。Dest_GDB = fme基金。macroValues['DestDataset_GEODATABASE_FILE'] # Call in the Destination feature class from the Destination Geodatabase and # get a list of field names from the destination feature class.dest_featureclass = Dest_GDB + '\\GarbageSchedule' dest_attr = arcpy.ListFields(dest_featureclass)dest_list = [] for a in dest_attr: dest_list.append(a.name) # Get属性名来自源文件。source_attr = feature.getAllAttributeNames() #比较dest_list中的值和source_attr列表中的值,#删除dest_list中val的重复项:(源文件在目标文件中不存在),#使用适当的数据类型添加相应的#字段。用户可以根据数据需要为#数据类型添加更多if语句。对于source_attr中的值:if type(value) == str: arcpy。AddField_management(dest_featureclass, value, "TEXT") if type(value) == int: arcpy.AddField_management(dest_featureclass, value, "LONG")
确保将Process特性的类或函数更改为“processFeature”,以便执行适当的函数。
4.写入数据
将Esri地理数据库(文件Geodb)写入器添加到工作区。对于writer数据集,导航到提供的地理数据库(请参阅下载部分的add_fields.zip)。对于特性类或表定义,选择“从数据集导入”。之所以选择Import from Dataset选项,是因为特性类已经存在于地理数据库中,我们将写入数据并更改其模式。
当提示时,设置格式并选择上文所述的文件geodatabase(它可能—应该—已经由FME设置)。FME现在将扫描地理数据库以确认存在哪些表。当提示一个类列表时,选择GarbageSchedule。
将写入器添加到画布后,双击写入器功能类型以进入功能类型属性对话框。单击Format Parameters选项卡,将Truncate表设置为“Yes”。
保存并运行工作空间并检查来自shapefile的数据,但是现在还添加了“Truck”字段,同时维护来自feature类的原始属性字段名。
数据属性
这里使用的数据来源于由温哥华的城市不列颠哥伦比亚省。它包含在开放政府许可下的信息-温哥华。
©2019安全亚搏在线软件公司法律