span8
span4
喜FME用户,
如何检查线,面带Pythoncaller变压器之间的空间关系?
我计算多边形的功能,有一定的方向内尽可能长的线,并与多边形本身的几何形状不相交。首先,我计算了所有可能的线路,它们的距离和方位面要素的所有顶点之间。接下来,我想检索完全位于多边形内最长行具有一定orientation.Therefore我需要检查的空间关系,即不与多边形线相交?
我想蟒(PythonCaller)内,而无需使用外部库完全执行此计算。
提前致谢,
德赖斯Verdoodt
你好德赖斯,
首先,你可以在这里访问FME工厂文档:http://docs.亚搏在线safe.com/fme/html/FME_FactFunc/index.h..。
这里是我如何使用工厂与蟒蛇。
如果我有这样的变压器在FME工作台:
我可以剪切和粘贴在文本编辑器,看看工厂代码:
DEFAULT_MACRO WB_CURRENT_CONTEXT#------------------------------------------------------------------------- FACTORY_DEF * SpatialRelationshipFactory \ FACTORY_NAME SpatialRelator \ INPUT BASE FEATURE_TYPE AttributeCreator_OUTPUT_0_olPiq+C1D00= \ INPUT CANDIDATE FEATURE_TYPE AttributeCreator_2_OUTPUT_1_KpUyI6tMDVI= \ PREDICATE "INTERSECTS" \ LIST_NAME "_relationships" \ SUCCESS_ATTR "_related_candidates" \ REJECT_INVALID_GEOM Yes \ CURVE_BOUNDARY_RULE ENDPOINTS_MOD2 \ CALCULATE_CARDINALITY No \ OUTPUT TAGGED FEATURE_TYPE SpatialRelator_Output \ OUTPUT REJECTED FEATURE_TYPE SpatialRelator_
然后我就可以使用该工厂代码在Python呼叫者这种方式(请注意,我改名一些参数,并清理了一些引号(“)):
进口FME进口fmeobjects#模板类接口:类FeatureProcessor(对象)的:def __init __(个体):#Initialize管道strFactory = “”“FACTORY_DEF * SpatialRelationshipFactory \ FACTORY_NAME SpatialRelator \ INPUT BASE FEATURE_TYPE RequestorPort \输入候选FEATURE_TYPE SupplierPort \ PREDICATE相交\ LIST_NAME _relationships \ SUCCESS_ATTR _related_candidates \ REJECT_INVALID_GEOM Yes \ CURVE_BOUNDARY_RULE ENDPOINTS_MOD2 \ CALCULATE_CARDINALITY No \ OUTPUT TAGGED FEATURE_TYPE SpatialRelator_Output \ OUTPUT REJECTED FEATURE_TYPE SpatialRelator_”““自我。pipeline = fmeobjects.FMEFactoryPipeline("MyFactory") self.pipeline.addFactory(strFactory) def input(self,feature): #Push features in the pipeline type = feature.getAttribute("_type") if type == "LINE": print "Adding a line" feature.setFeatureType("RequestorPort") self.pipeline.processFeature(feature) elif type == "AREA": print "Adding an area" feature.setFeatureType("SupplierPort") self.pipeline.processFeature(feature) else: raise Exception("Unexpected feature!") def close(self): #Adding one more line myFeature = fmeobjects.FMEFeature() myFeature.addCoordinates([(10,30),(100,30)]) myFeature.setFeatureType("RequestorPort") self.pipeline.processFeature(myFeature) #Execute the factory code self.pipeline.allDone() tmpFeature = self.pipeline.getOutputFeature() while tmpFeature != None: #We skip the rejected features if tmpFeature.getFeatureType() == "SpatialRelator_Output": self.pyoutput(tmpFeature) tmpFeature = self.pipeline.getOutputFeature()
示例工作区连接(FME 2015)。
问候,
拉里
你好皮埃尔,
非常感谢您的回答。这工作得很好,但我需要做一些更具体。
该PythonCaller我使用只接受几何要素。该生产线特征将PythonCaller内创建。接下来这条线应该与进入变压器多边形的几何形状进行比较。
例如。线39之后创建PythonCaller内的线对象:
#创建线要素我的功能= fmeobjects.FMEFeature()myFeature.addCoordinates([(10,30),(100,30)])myFeature.setFeatureType( “RequestorPort”)#self.pipeline.processFeature(我的功能)
但是,如果我创建PythonCaller内新线特征,PythonCaller不再正常运行。
是否有可能使用fmeobjects.FMEFactoryPipeline与两个对象进入PythonCaller并在PythonCaller本身对象创建的?
因为我不知道发生了什么事时,PythonCaller停止正常运行,有可能存在两个问题:
否则,告诉我该错误信息是什么,附上你有工作区的新版本。
嗨拉里,
压痕确实是不正确的。虽然它似乎压痕是一见钟情正确的,我使用空格作为分隔符,而你正在使用的标签添加一些代码。
非常感谢你的回应,解决这一问题的支持。
嗨,
首先,你应该剪切和粘贴之前,连接你的输入和输出变压器端口。如果将它们连接起来,你就会有一个更好的工厂。
您还可以在工厂文档,以获取有关TeeFactory一些线索。
在下面的图像中,我将一个创建者连接到输入端口,并将一个检查器连接到输出端口。
现在您在TeeFactory上有了输入,在ChoppingFactory上有了输出(1和2)。
还要注意,TeeFactory(3)的输出连接到ChopperFactory(4)的输入。
我的理解是,TeeFactory创建了一个_残余属性,默认值是“no”,如果需要,ChoppingFactory会将其设置为“yes”。
现在有三个选项可以在PythonCaller中集成这段代码。
这段python代码演示了选项3。注意,由于ChopperFactory不是阻塞的,我可以在推动一个进行处理后立即读取切碎的特性,而不必在SpatialRelator这样的阻塞工厂的情况下在close方法中等待。
导入fme导入fmeobjects模板类接口:类功能处理器(对象):def _init__(self):#Initialize the pipeline strFactory1 = """FACTORY_DEF * TeeFactory \ FACTORY_NAME Chopper_catcher \ INPUT FEATURE_TYPE Creator_2_CREATED \ OUTPUT FEATURE_TYPE __chopper_input__ \ _remnant no""" strFactory2 = """FACTORY_DEF * ChoppingFactory \ FACTORY_NAME Chopper \ INPUT FEATURE_TYPE __chopper_input__ \ MODE VERTEX \ MAX_VERTICES 2 \ REMNANT_ATTRIBUTE _remnant \ CHOP_POLYGONS \ OUTPUT CHOPPED FEATURE_TYPE Chopper_OUTPUT \ _chopped yes \ OUTPUT UNTOUCHED FEATURE_TYPE Chopper_OUTPUT \ _chopped no""" self.pipeline = fmeobjects.FMEFactoryPipeline("MyFactory") self.pipeline.addFactory(strFactory1) self.pipeline.addFactory(strFactory2) def input(self,feature): #Push features in the pipeline feature.setFeatureType("Creator_2_CREATED") self.pipeline.processFeature(feature) tmpFeature = self.pipeline.getOutputFeature() while tmpFeature != None: self.pyoutput(tmpFeature) tmpFeature = self.pipeline.getOutputFeature() def close(self): pass
问候,
拉里
哇,真有趣!
我只是试着自己实现,但是用了直升机。然而,我注意到在斩波变压器中调用了两个工厂。
DEFAULT_MACRO WB_CURRENT_CONTEXT # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - FACTORY_DEF * TeeFactory \ FACTORY_NAME Chopper_catcher \输出FEATURE_TYPE __chopper_input__ \”_remnant“没有FACTORY_DEF * ChoppingFactory \ FACTORY_NAME直升机\输入FEATURE_TYPE __chopper_input__ \模式顶点\ REMNANT_ATTRIBUTE \ CHOP_POLYGONS \ GRID_POLYGONS“_remnant”
拉里,你能详细说明一下我如何用Python实现它吗?
我正在与TeeFactory斗争,因为它似乎没有输入。我应该把这个工厂添加到管道中吗?这是怎么做到的呢?
谢谢你的回答!
©2019安全亚搏在线软件公司|法律