斯潘8
斯潘4
我试图模仿FME2015.1中FME 2016中的FeatureWriter,因为升级不是一种选择。我正在使用一个带有FMEFobjects的pythoncaller来尝试这样做。作为基础,我使用示例python脚本比较基准编写器.py安装时附带了FME。
我首先为我的gdb创建一个唯一的文件名,然后我从这个特性中获取模式,在编写器上设置模式并写入gdb。
导入FmeObjects
从fmeobjects导入fmeUniversalWriter
从fmeobjects导入fmeUniversalReader
随机导入
导入操作系统,系统
#获取变量并为temp fgdb创建输出名称
folder=fm_macrovalues['fm_sharedesource_temp']
ext='.gdb'
当前文件=os.listdir(文件夹)
#获取当前fgdb的列表
fgdbs=[]
当前号码=[]
对于当前文件中的curfile:
如果curfile.endswith(ext):
fgdbs.append(curfile)
#从gdb文件名中提取数字
对于fgdbs中的fgdb:
S=int(滤波器(str.isdigit,FGDB)
当前号码。附加
打印“fgdbs列表:”,fgdbs
打印“fgdbs列表:”,当前号码
#fgdb名称的前缀
db='\\转换温度'
#创建一个0-999的列表并删除现有数字
数字=范围(01000)
对于当前数字中的x:
数字。删除(X)
nr=随机选择(数字)
#创建文件名
db=str(文件夹+db+str(nr)+ext)
打印数据库
#创建日志文件对象。
logger=fmeobjects.fmelogfile()。
logger.setFileName(“baselinewriter.log”,假)
#创建作者
objwriter=fmeUniversalWriter('geodatabase_file',db)
objwritter.open(数据库)
def processfeature(功能):
#创建架构功能以描述发送给编写器的功能。
SchemaFeature=功能
ft=feature.getattribute('fme_feature_type')
打印“ft:”,(ft)
schemaFeature.setFeatureType(英尺)
#记录模式功能。
logger.logMessageString(“架构功能:”)
logger.logfeature(SchemaFeature)
#向编写器添加架构功能。
objwriter.addschema(功能)
#记录数据功能。
logger.logfeature(功能)
ObjWriter.write(功能)
objwritter.close()。
feature.setattribute(''loc',db)
我的工作区由一个形状阅读器组成,python调用程序和一个检查器,所以不太可能形成FME。当我运行工作区时,这使我产生了错误:
指定的字段类型为“-999”,这是无效的。有关有效字段类型的信息,请查看geodatabase reader/writer上的文档。
当我看作家的文件时,Tekst“字段类型”不在页面上,所以没什么帮助。我的数据包含值为-999的列,但当我取消选中读卡器上的选项时,它仍然会产生相同的错误。有人有什么想法吗?
我觉得我们接近了,所以已经非常感谢了。然而;通过动态保存,我有以下代码来获取属性及其类型:
收件人=[]
san=feature.getAllattributeNames()。
打印“san:”,san
对于SAN中的A:
at=feature.getattributeType(A)
附件(A)
attrs.append(at)ft=feature.getattribute('fme_feature_type')cs=feature.getcoordsys()ge=feature.getattribute('fme_geometry')
我使用这些设置模式:
#创建架构功能。
架构=fmeobjects.fmefeature())
对于范围(0,Len(收件人)2):
#名称:属性名称,值:数据类型名称
schema.setattribute(属性[i],属性[I+1])
schema.setattribute('fme 0',通用电气公司)
schema.setFeatureType(英尺)
架构.setcoordsys(cs)
这给了我一个所有属性的列表,我循环以获取它们的属性类型。属性类型由数字表示:
收件人:【形状、长度】9,'dtb_id',6,'geodb ou-oid',6,'geodb_类型'
名单比较长,但这是为了给出一个想法。向编写器添加架构时:
#向编写器添加架构功能。
objwriter.addSchema(模式)
这就产生了错误:
在metafile geodatabase_file.fmf中找不到“11”的几何映射条目。
由于数据功能没有可直接用于配置模式的模式信息,基于它们创建模式特性并不容易。
如果要基于数据特性创建模式特性,Schemasetter自定义转换器的实现FME集线器可能会有所帮助。
再次感谢。您提到的文章确实显示了FME使用的数据类型名称。我知道我必须用那些名字。我在文档中找不到的是将数字“翻译”成名字的方法。我想我可以根据我在检查器中看到的内容制作一个映射列表,在这里我看到名称,然后查找这些名称以找到相应的数字。不过,这似乎不是很有效,我有点惊讶,fmeobjects不能做到这一点。或者我不是在找道具?
@高桥谢谢,但是我们有一个工作流,在这个亚搏在线工作流中,用户可以在此编写器之前对模式进行修改。这意味着源数据的模式可能与我们试图写入的模式不同。如果在这个python脚本之前包含一个检查器,数据检查器正在显示具有修改的列和要素类名称的表。因此,我假设可以从特性本身派生模式。
如果所有属性名及其FME通用数据类型(FME_u*),几何类型,特征类型名称已知,您可以创建一个模式特性,然后在Python脚本中将其设置为writer对象。例如
#属性名和FME通用数据类型名对attrs=['attr1','FME_char(20)',“附件2”,“FME日期”,'附件3','fme_int32']创建模式功能。schema=fmeobjects.fmefeature()用于范围(0,Len(收件人)2):名称:属性名称,值:数据类型名称schema.setSequencedAttribute(attrs[i],attrs[i+1])schema.setattribute('fme_0','fme_line')schema.setFeatureType('featureTypeName')schema.setCoordSys('ll84')可选使用'addSchema'方法将'schema'设置为编写器对象。
关于FME通用数据类型,请参阅本文:目标架构是从查找表派生的
谢谢@高桥,我将尝试用python创建列表,尝试一下,因为我不知道会是什么。使用getSequencedAttribute和getFeatureType,我认为可以动态地获取所有内容。
由于您使用的是FME 2015.1,此方法也可能适用于您的工作区:目标架构是从架构功能派生的
本文中描述的方法称为“destination schema is derived from a表“之前。机制本身没有改变。
您好!@BZWEMMER公司,你必须阅读图式源数据集中的功能,并在写入之前将其添加到编写器中数据特征。这是一个最小的例子。
#pythoncaller脚本示例:动态模式[geodatabase_file]writer目标模式是从源esri shapefile数据集派生的。每个模式定义名称都等于读卡器功能类型名称。编写器覆盖现有gdb数据集。除“overwrite_geodb”之外的所有编写器指令和参数都保留为默认值。error handling被省略。导入fmeobjectsClass FeatureProcessor(对象):def u init uuu(self):gdb='c:/fme/tmp/test.gdb'todo:将其更改为实际目标数据集。指令=[]所有默认值。参数=[“覆盖地理数据库”,“是”]除“覆盖地理数据库”外的所有默认值。self.writer=fmeobjects.fmeUniversalWriter('geodatabase_file',指令)self.writer.open(gdb,parameters) source = [] ################################################################ # TODO: Append all source Shapefile paths to the 'source' list.################################################################ for src in source: reader = fmeobjects.FMEUniversalReader('ESRISHAPE',false)reader.open(src)self.writer.addSchema(reader.readSchema())添加架构功能。reader.close()定义输入(self,功能):feature.setFeatureType(feature.getattribute('fme_feature_type'))self.writer.write(feature)写入数据功能。def close(self):self.writer.close()。
?2019安全亚搏在线软件公司|合法的