SPAN8.
SPAN4.
在使用文件地理数据库时可能遇到的场景是一个希望将数据写入现有要素类,同时更改其模式而无需删除现有的要素类表。这将允许用户在手动添加新字段或从源数据集中添加新字段时维护其现有特征类的字段名称。虽然我们建议您的ArcGIS客户端处理的任何模式更改都是由ArcGIS客户端处理的,但以下示例将显示如何在FME中使用FME和ArcGIS Python模块将字段添加到现有地理数据库功能类中。
Python解释器必须是设置给口译员由ArcGIS安装。看:没有名为Arcpy的模块:导入ESRI的ArcPy以与FME一起使用
ArcGIS安装在同一台机器上的FME
在上面的图像中,我们看到包含包含新字段“卡车”的源ESRI Shapefile的可视化,其中我们要添加到现有的要素类。
在上面的图像中,我们看到了目标要素类的可视化。可以看出,除了Shapefile具有额外的属性字段之外,数据基本上是相同的。
1.读取源数据和公开属性
使用ESRI Shapefile Reader从Shapefile源文件读取垃圾计划几何。此Shapefile包含一个属性字段,该属性字段不会出现在我们将写入数据的相应功能类上。Shapefile Reader已添加到Workspace后,打开“读取器参数”对话框,然后单击“格式参数”选项卡。公开以下属性(即选中框):
fme_feature_type.
fme_geometry.
shape_geometry.
fme_type.
*注意 - 要公开所需的属性将从DataSet到数据集,格式格式化。
2.重命名/删除属性
attributemanager将用于从源shapefile数据集重命名和删除各种属性。将shapefeile读取器连接到attributemanager并在attributemanager属性中,将输出属性“numaddress”更改为“numaddresses”。此外,更改FME_GEOMETRY,FME_TYPE,FME_FEATURE_TYPE和SHAZE_GEOMERY的操作(即前一步中暴露的属性)到“删除”。
*注意 - 正在删除公开的格式属性,以便它们不会通过我们即将到来的Python代码将其附加到我们的目标功能类。
3.将字段添加到目标要素类
为了使源Shapefile上包含的新字段要包含在我们现有的目标特征类上,必须以编程方式添加。这将允许架构更改,而无需删除现有的要素类表。PythonCaller用于通过调用FME(FMEOBJECTS)和ArcGIS(Arcpy)的功能来进行这些改变。
首先,导入FME和ArcGIS的Python模块,其中从相应的FME宏读取目标地理数据库路径。然后,我们将我们的目标要素类的名称硬编码到地理数据库路径。然后,ArcPy函数“列表字段”将用于获取当前包含在目标要素类中的字段名称的单个字符串。然后创建一个空列表变量,并从我们的列表字段调用中的字符串附加到空列表。
其次,FMEObjects Feature.getAllattributenames()函数用于获取源数据集上的字段列表。然后,我们将Destination属性列表与源属性中包含的值进行比较,从源属性列表中删除源属性已存在的源属性列表中的值。
最后,我们通过源属性列表中的剩余值循环,并根据有问题的属性的数据类型向目标要素类添加字段。
以下内容包含将出现在PythonCaller中的整个代码定义:
导入fme导入fmeobjects导入arcpy#模板函数界面:#使用此功能时,请确保将其名称设置为#“类”或“流程”变换器参数DEF ProcessFeature(功能)的“函数”的值(功能):#获取位置来自FME宏值的目的地GDB。dest_gdb = fme.macraverues ['destdataset_geodatabase_file']#从目标地理数据库和#从目标要素类获取字段名称列表。dest_featureclass = dest_gdb +'\\ garbageschedule'dest_attr = arcpy.listfields(dest_featureclass)#从目标要素类中创建空列表和附加字段名称。dest_list = []在dest_attr:dest_list.append(a.name)#从源文件中获取属性名称。source_attr = feature.getAllAttributeNames() # Compare the values in dest_list to the values in the source_attr list and # remove duplicates for val in dest_list: if val in source_attr: source_attr.remove(val) # For the remaining attributes (i.e. source does not exist in destination), # add the corresponding # field with the proper data type. The user can add more if statements for # data types as their data requires. for value in source_attr: if type(value) == str: arcpy.AddField_management(dest_featureclass, value, "TEXT") if type(value) == int: arcpy.AddField_management(dest_featureclass, value, "LONG")
请务必将类或函数更改为“ProcessFeature”处理功能,以便执行合适的功能。
4.写数据
将ESRI地理数据库(文件GeoDB)编写器添加到工作区。对于Writer DataSet,导航到所提供的地理数据库(请参阅下载部分中的add_fields.zip)。对于要素类或表定义,请选择“从数据集导入”。选择“从数据集”选项中的导入,因为该功能类已存在于地理数据库中,我们将写入数据并改变其模式。
在提示时,设置格式并选择上面段落中所指出的文件地理数据库(它可能 - 应该由FME设置)。FME现在将扫描地理数据库以确认存在的表。提示使用类列表时,选择arbageschedule。
一旦编写程序添加到画布,请双击Writer Featory类型以进入“要素类型属性”对话框。单击“格式参数”选项卡并将TRUNCATE表设置为“是”。
保存并运行工作区并从shapefile中检查数据,但现在也添加了“卡车”字段,同时从要素类中维护原始属性字段名称。
数据归因
这里使用的数据源自可提供的开放数据温哥华市, 不列颠哥伦比亚省。它包含根据开放政府许可证的信息 - 温哥华。
©2019 S亚搏在线afe Software Inc |合法的