谢谢@jdh你的答案。因为我以前从未使用过Python,所以我必须花一些时间来了解它。
嗨@gio非常感谢你的回答。不幸的是,我无法访问您提供的链接,它出现了一个错误。这个解决方案听起来很有趣,请重新安装!
嗨@Mark2At亚搏在线Safe,非常感谢您为我详细地研究这个问题,非常感谢。你的装箱方法绝对合乎逻辑,我现在用这个术语来描述我的客户的问题是什么!至于方法本身,我以前从未使用过Python,所以我想我必须自学!
所以我想再深入研究一下,发现它可能就是我们所知道的a本包装问题。您想要用特性填充一个箱子,直到它达到一个设置的限制,然后开始打包到一个新的箱子中。
事实证明,这是一个相当大的挑战。基本上,你可以很容易地检查一个解决方案,但是计算那个解决方案需要更多的时间(就像ShortestPathFinder那样),因为它是一个NP问题。
不过,这是可能的,如果你搜索Python的装箱问题,有一些代码。例如这个页面有一段代码,我在FME运行成功(虽然生成随机数而不是使用传入的FME功能)。
另一个搜索是2D Bin Packing,它返回一些Github存储库像这样。这可能有用,也可能没用。这取决于正在打包的形状是否相互接触(在基于空间的设置中,这是您想要的)。
不管怎样,我希望这能有所帮助。我要和我们的开发人员商量一下,看看我们将来是否能生产出什么东西来。这暂时不会有帮助,但这个问题经常出现,我认为我们需要一个解决方案。
这个问题比你想象的更常见,在FME中没有比循环更好的方法了。但是在处理一组特性时,循环是困难的。我发现的一种方法是取两个相邻的特征,如果可以合并它们(它们的总体可以合并),然后将数据写回。然后再次重新运行工作区——一次又一次——直到有一个解决方案(没有更多的多边形可以合并)。
我的另一个想法是来自FME中心的空间分拣转换器。你可以用它来对数据进行空间排序,这样它就很有序了,每个特征都相邻于下一个。这将使上述部分更容易,因为您不必担心特性是否在空间上相邻。您只需要采用前两个特性并假设它们是相互关联的。
因此,一旦数据通过SpatialSorter运行,您就可以使用AttributeManager中的邻近特性属性设置来获得下一个特性的总体,然后决定是否合并它。
如果您不关心这些多边形是否相邻,那么您可以简单地忽略SpatialSorter,只使用相邻的特性属性。
另一种方法是使用聚合器合并所有特性,创建记录列表。然后可以循环遍历列表,提取值并合并它们。这是一种更简单的循环方法,因为您只处理一个特性,而不是一组特性。
我希望这能有所帮助。我知道这不是在FME中最简单的任务,但我认为这是可能的。
你有我们的样本数据集吗?
多边形需要空间关系吗?
但我认为你是在寻找一个子集(解决方案)从子集到幂集。
确实需要迭代(或者如果使用python或tcl,则需要递归)。对于迭代模式,在超集创建期间测试幂集的元素相对容易。对递归版本没有成功。)
可能有也可能没有一个完整的(包括所有的多边形)解决方案。
这是我在经过几个小时的摆弄和阅读之后编写的一个先前的脚本(它是非递归的)。
它在power set构建中查询,只输出满足条件的集合。(不要全部输出…可以是很大的2^n)
你需要身份证和人口号码。将数据转换为列表。
按照指示替换查询。
虽然可以在本机FME中实现,但我可能会使用标准的转换器来生成连接的组件图,然后在pythonCaller中进行迭代,为每个特性分配一个“组ID”,然后根据需要使用Group by来聚合或分解这些特性。