第8页
第4排
这是个很棒的圣诞礼物。非常感谢!
在哪里可以访问API上的文档?
=================FME 2017.0“新增功能”================
[编辑]好。我在fme 2017.0 beta build 17217安装目录中找到了文档:—)
fmeobjects.fmeband/fmebandproperties/fmebandtilepopulator/fmeplate/fmegraster/fmerasterproperties/fmerastertools/fmetile
感谢Takashi为FME 2017.0突出显示了对FME对象python API的新光栅添加。很好的示例应用程序!我只是想让大家知道更新后的2017.0 python api文档,包括新的光栅API,现在可以在线访问https://docs.亚搏在线safe.com/fme/html/fme_objects_python_api/index.html
@高桥,请你是对的。然而,我们的光栅开发团队想澄清一些事情:
CEIL(光栅行数/每块图行数)x CEIL(光栅列数/每块图列数)
您好!@戴维安特亚搏在线,请感谢您对每个图块的行数作出的响应。
好啊。我知道光栅带的数据内容可以由一个或多个图块组成。将数据内容填充到带区时,将多次调用fmeBandTilePopulator.gettile()方法,如果行/列的数目每块瓷砖设置为带区小于行/列的数目光栅的.方法调用的数量等于瓷砖的数量。即
CEIL(光栅行数/每块图行数)x CEIL(光栅列数/每块图列数)
给定数据矩阵中的起始行/列索引和大小将通过参数传递(startrow,开始列,tile)到每个tile创建的gettile()方法。
因此,我练习中的myuint8bandtilepopulator.gettile()方法也可以使用参数这样定义,这个定义允许在每个图块中指定任意数量的行/列作为带区属性。
类myuint8bandtilepopulator(fmeobjects.fmebandtilepopulator):def u init_uuu(self,dataarray):self.dataarray=dataarray def clone(self):返回myuint8bandtilepopulator(self.dataarray)def gettile(self,开始行,开始列,tile):数字行,numcols=tile.getNumRows(),tile.getNumcols()结束行,endcol=开始行+数字行,startcol+numcols data=[self.dataarray[r][startcol:endcol]范围内的r(startrow,endrow)]newtile=fmeobjects.fmeuint8tile(数字行,numcols)newtile.setdata(data)返回newtile
对吗?
计算单元值统计的示例。
[固定时间:2017-03-15]
#pythoncaller脚本示例:光栅单元值的统计计算输入光栅带中单元值(nodata除外)的基本统计。此示例仅支持real64和real32,但如果需要,可以轻松增强。导入fmeobjects,数学类RasterBandStatisticsCalculator(对象):def uu init_uuuu(self):self.keys=[“exploration”,“节点数据”,'计数','总和','最小','最大','范围',“中间”,“平均”,'标准偏差','stdevp',]#返回元组(tile对象,解释名称)。#此方法返回(无,“不支持”)当不支持指定的解释时,def tilean解释(self,解释,数字行,numcols):如果interpretation==fmeobjects.fme_interpretation_real64:return(fmeobjects.fmereal64tile(numrows,数字),'real64')elif interpretation==fmeobjects.fme_interpretation_real32:返回(fmeobjects.fmereal32tile(numrows,数字),'REAL32') ###################################################### # Add other interpretations here if necessary.###################################################### else: return (None,“unsupported”)返回包含指定带区统计信息的字典。定义计算统计(self,乐队,数字行,numcols):获取波段属性。bandproperties=band.getproperties()interpretation=bandproperties.getinterpretation()创建将用于获取带区的单元格值的图块。#解释,行数,列数必须与带区属性一致。瓦片,口译=self.tileandinterpretation(口译,数字行,numcols)stats='解释':解释if tile!=none:获取除nodata以外的所有单元格值作为列表。values=[]nodatavalue=band.getnodatavalue()if nodatavalue==none:对于band.gettile中的数据(0,0,tile).getdata():values+=data,否则:nodata=nodatavalue.getdata()[0][0]用于band.gettile中的数据(0,0,tile).getdata():如果v,则数据中v的值为+=[v!=nodata]stats['nodata']=nodata计算统计信息。values.sort()count=len(values)stats['count']=count if 0<count:total=sum(values)stats['sum']=total stats['min']=values[0]stats['max']=values[-1]stats['range']=(values[-1]-值[0]中位数m=count//2 stats['中位数']=(如果计数为%2==1,则值[m]否则(值[m-1]+值[m])*0.5)平均值(平均值)avrg=float(总计)/计数stats['mean']=avrg standard deviation if 1<count:s=sum([(v-avrg)**2 for v in values])stats['stdev']=math.sqrt(s/(count-1))stats['stdevp']=math.sqrt(s/count)返回统计定义输入(self,功能):光栅=feature.getGeometry()如果是IsInstance(光栅,fmeobjects.fmegraster):rasterproperties=graster.getproperties()numRows=rasterproperties.getNumRows()numCols=rasterproperties.getNumCols()for i in range(graster.getNumBands()):stats=self.calculateStatistics(graster.getBand(i),数字行,numcols)对于self.key s中的键:attr='u band%d%s%(i,key)如果key in stats:feature.setattribute(attr,stats[键])else:feature.setattributeNullWithType(attr,fmeobjects.fme-attr-real64)self.pyoutput(功能)
第二个练习:计算单元值,在带子上附加一个调色板,尝试使用光栅工具。来自生命游戏.
#pythoncaller脚本示例:康威的生活游戏FME 2017.0 RC build 17254,2017-02-28每个输出功能都包含一个表示活/死单元格的光栅。光栅只有一个波段,波段有一个调色板。假设输入功能具有这些属性。1。numGenerations(0<integer):要处理的代数。2。numRows(0<integer):结果光栅中的行数。3。numcols(0<integer):结果光栅中的列数。4。initialRate(0<real<1):第一代中活动单元格的速率。将在输出功能中添加一个名为“生成”(generation)的新属性,该属性存储1个表示生成顺序的序列号。导入fmeobjects,randomclass myuint8和文件填充器(fmeobjects.fmebandtilepopulator):def u init_uuuu(self,dataarray):self.dataarray=dataarray def clone(self):返回myuint8bandtilepopulator(self.dataarray)def gettile(self,开始行,开始列,tile):数字行,numcols=len(self.dataarray)len(self.dataarray[0])newtile=fmeobjects.fmeuint8tile(numrows,numcols)newtile.setdata(self.dataarray)返回newtileClass conwaysgameoflife(object):def u init_uuuu(self):self.rastertools=fmeobjects.fmerastertools()def input(self,功能):从功能属性中获取参数。numGenerations=int(feature.getattribute('numGenerations'))self.numRows=int(feature.getattribute('numRows'))self.numCols=int(feature.getattribute('numCols'))self.initialRate=float(feature.getattribute('initialRate'))if 0<numGenerations\and 0<self.numroods and 0<self.numcols\ and 0.0<=self.initialRate and self.initialRate<=1.0:self.initialize()outnumroods,outNumCols=self.numRows*10,self.numcols*10 graster=none用于范围内的i(numGenerations):graster=self.nextGeneration(graster)feature.setGeometry(self.rastertools.resampleByRowcol(outNumRows,输出数字,fmeobjects.fme_interpolation_nearestneighbor,graster)feature.setattribute(“生成”,i+1)self.pyoutput(feature)else:feature.setattribute(''错误','无效参数')self.pyoutout(feature)def initialize(self):光栅属性xspacing,Y间距=1.0,1.0 XcellOrigin公司,Y细胞原点=0.5,0.5克索里金,约里金=0.0,0.0 x旋转,Y总计=0.0,0.0 self.rasterproperties=fmeobjects.fmerasterproperties(self.numrow,自我麻木,X间距,Y起搏,XcellOrigin公司,Y细胞起源,异丙酚,约里金,X旋转,yrotation)波段属性self.band properties=fmeobjects.fmebandproperties('生命之游戏',fmeobjects.fme_解释_int8,fmeobjects.fme_tile_type_fixed,自我编号,self.numcols)创建一个调色板对象,表示:----------------rgb24 0 220220220 1 128,0,0------------key=fmeobjects.fmeuint8图块(1,2)key.setdata([[0,1])值=fmeobjects.fmergb24文件(1,2)value.setdata([[220220220,128,0,0,]])self.palete=fmeobjects.fmepalete('',键,value)返回代表下一代的光栅,#或者第一代人,如果论点是没有的话。定义下一代(自我,prevgraster):nextdata=[]如果prevgraster==none:num=self.numrows*self.numcols alives=int(num*self.initialirate)seed=[1代表范围内的i(alives)]+[0代表范围内的i(num-alives)]random.shuffle(seed)代表范围内的s(i*self)。范围内i的numcols(self.numrows)]:nextdata.append(seed[s:s+self.numcols])否则:获取上一代的数据数组。tile=fmeobjects.fmeuint8tile(self.numrows,self.numcols)prevdata=prevgraster.getband(0).gettile(0,0,tile).getdata()创建一个临时数据数组,该数组的大小在每个边顶部放大一行/一列,底部,左,上一个光栅的右边,#并将所有附加的外缘单元格设置为0。#此数据数组使计算上一代中每个单元的相邻单元数目变得容易。tmp=[0代表范围内的i(self.numcols+2)]\+[0]+数据+[0代表prevdata中的数据]\+[0代表范围内的i(self.numcols+2)]35;为下一代创建新的数据数组。对于i in range(self.numrows):row=[]对于j in range(self.numcols):计算上一代中活动的邻居单元数,然后根据游戏规则确定下一代手机是否可以存活。n=tmp[i+0][j]+tmp[i+0][j+1]+tmp[i+0][j+2]\+tmp[i+1][j]+tmp[i+1][j+2]\+tmp[i+2][j]+tmp[i+2][j+1]+tmp[i+2][j+2]如果prevdata[i][j]=1:行附加(如果n在[2中,则为1,3]其他0)其他:row.append(如果n==3,则为1)nextdata.append(row)创建并返回包含单个条带的光栅。光栅=fmeobjects.fmegraster(self.rasterproperties)band=fmeobjects.fmeband(myuint8bandtilepopulator(nextdata)),自身属性,self.bandproperties)band.appendPalette(self.palete)将调色板添加到带区。光栅。AppendBand(Band)返回光栅
我将分享我的第一个练习,学习如何使用API创建新的光栅几何图形。
#pythonCreator脚本示例:创建一个包含光栅的功能光栅将有一个带uint8解释。导入fmeobjects定义一个从fmebandtilepopulator类派生的具体类。该类的一个实例将用于创建一个图块并将其填充到一个带。(fmeband实例).class myuint8bandtilepopulator(fmeobjects.fmebandtilepopulator):def u init_uuuu(self,dataarray):self.dataarray=dataarray实现“clone”方法。#它将在创建新波段时被多次调用。def clone(self):返回myuint8bandtilepopulator(self.dataarray)实现“gettile”方法。#您可以在此处创建包含所需内容的新磁贴。#不必使用参数:startrow,开始列,瓦片。定义获取文件(self,开始行,开始列,tile):数字行,numcols=len(self.dataarray)len(self.dataarray[0])newtile=fmeobjects.fmeuint8tile(numrows,numcols)newtile.setdata(self.dataarray)返回newtile创建新带区时将不调用以下两个方法。#在这种情况下,实施这些方法似乎并不重要,#尽管api文档说“这个方法必须在fmebandtilepopulator子类中实现”。def setDeleteSourceOnDestroy(自,deleteflag):传递def setoutputsize(self,排,cols):返回(行,cols)class featurecreator(object):def_uu init_uuuu(self):传递def close(self):要创建的条带的磁贴内容。#行数据列表,每个元素都是列值列表。数据数组=[[0,128个,0,128个,0,128个,0],[128,0,128个,0,128个,0,128],[0,128个,0,128个,0,128个,0],[128,0,128个,0,128个,0,128],[0,128个,0,128个,0,128个,0],]#要创建的光栅的属性。数字行,numcols=len(数据数组),len(dataarray[0])分辨率x空间,Y间距=10.0,10.0地面单元的单元间距xcellorigin,Y细胞原点=0.5,0.5细胞原点坐标xorigin,约里金=0.0,NumRows*Y间距左上角坐标X旋转,Y总计=0.0,0.0°旋转角度创建新光栅。rasterproperties=fmeobjects.fmerasterproperties(numrow,麻木,X间距,Y起搏,XcellOrigin公司,Y细胞起源,异丙酚,约里金,X旋转,yrotation)graster=fmeobjects.fmegraster(rasterproperties)创建一个新条带并将其附加到光栅。#创建波段时指定nodata值是可选的。bandtilePopulator=myuint8bandtilePopulator(dataarray)bandname='my uint8 band'可以设置为空。bandproperties=fmeobjects.fmebandproperties(bandname,fmeobjects.fme_解释_int8,fmeobjects.fme_tile_type_fixed,数字行,numcols)nodatavalue=fmeobjects.fmeuint8tile(1,1)nodatavalue.setdata([[0]])band=fmeobjects.fmebandRasterproperties公司,带特性,nodatavalue)光栅。appendband(band)创建并输出包含上面创建的光栅的功能。feature=fmeobjects.fmefeature()feature.setgeometry(光栅)self.pyoutput(feature)
感谢您在这里共享所有代码,高桥,已经帮了我很多!
我会感谢别人的帮助,因为我在尝试修改代码以将数据写到real64波段时遇到了一个错误。澄清:如果我只是使用原始代码,一切都可以正常工作。
简单的尝试一下,我用real64替换了代码中对uint8的所有引用,将代码放入pythoncreator并添加了一个检查器。
它运行良好,直到调用最后一行(如我在中添加的print语句所示)
#创建并输出包含上面创建的光栅的功能。feature=fmeobjects.fmefeature()feature.setGeometry(光栅)print(“message:all fine until here”)self.pyoutput(feature)
日志显示:
pythoncretor_creator(creationFactory):创建了1个功能消息:在将功能存储到FME功能存储文件'C:\users\bimta\appdata\local\temp\python_to_fme_\inspector.ffs'之前,所有功能都可以存储到FME功能存储文件'C:\users\bimta\appdata\local\temp\python_to_fme_112\inspector.ffs“将空间索引保存到文件”c:\users\bimta\appdata\local\temp\python_to_fme_\inspector.fsi“完成将空间索引保存到文件”c:\users\bimta\appdata\local\temp\python_to_fme_\inspector.fsi“inspector_recorderFactory:未能将功能数据写入`C:\users\bimta\appdata\local\temp\python_to_fme_214112\inspector.ffs'未能将功能数据写入'C:\users\bimta\appdata\local\temp\python_to_fme_214112\inspector.ffs'发生致命错误。检查上面的日志文件以获取详细信息Pythoncreator(Pythonfactory):Pythonfactory未能正确关闭Pythoncreator(Pythonfactory):发生了致命错误。查看上面的日志文件以了解详细信息将空间索引保存到文件“c:\users\bimta\appdata\local\temp\python\u to_fme_\inspector.fsi”已完成将空间索引保存到文件“c:\users\bimta\appdata\local\temp\python\u to_fme_\inspector.fsi”中出现致命错误。检查以上日志文件的详细信息翻译失败,有7个错误和2个警告(0个功能输出)FME会话持续时间:0.5秒。(CPU:0.1s用户,0.2s系统)结束进程ID:21776,峰值进程内存使用率:48144 KB,当前进程内存使用率:发生48144 kba致命错误。检查上面的日志文件以了解详细信息程序终止转换失败。
如果在没有启用检查器和功能兑现的情况下运行,则会出现类似的错误。然后它只指向另一个临时文件夹。
如果这里有人能帮助我理解为什么写不出这个特性,我会非常感激。
您好!@毕姆陶尔,请单元格值应该是浮动当波段解释为real64或real32时键入值。尝试在脚本中的每个常量值中添加一个小数位,这样地。
数据数组=[[0.0,128.0,0.0,128.0,0.0,128.0,0.0],[128.0,0.0,128.0,0.0,128.0,0.0,128.0],[0.0,128.0,0.0,128.0,0.0,128.0,0.0],[128.0,0.0,128.0,0.0,128.0,0.0,128.0],[0.0,128.0,0.0,128.0,0.0,128.0,0.0],]
nodataValue.setData([[0.0]])
所以,我认为官方文件中的相关描述是错误的。据我观察,fmereal32/64tile.getdata和setdata方法描述中的数据类型应为清单[浮动]],请而不是清单[利息]].
希望有人从安全检查以上链接。亚搏在线谁负责?@戴维安特亚搏在线是吗?
?2019安全亚搏在线软件公司|法律