我正在研究一个使用同一地点的不同地图的模型。我希望海龟具有与它们所在的每个地图的多边形相关的变量。当地图数量减少(2 或 3)时,我已经能够在 NetLogo 之外轻松解决这个问题。
假设我有地图 A 和地图 B,它们都是形状文件。我一直在做的是创建它们的交集,因此我有多个多边形,其中包含地图 A 和 B 中的变量,并使用 NetLogo 模型库中的“GIS 一般示例”模型中的方法在这些交集内创建海龟,以便它们与多边形变量命名相同的变量会自动设置。
to create-citizens-in-countries
foreach gis:feature-list-of countries-dataset [ this-country ->
gis:create-turtles-inside-polygon this-country citizens num-citizens-to-create [
set shape "person"
; since we included cntry_name as a citizens-own variable,
; if we wanted to we could give each citizen a label
; with their corresponding cntry_name like so:
;; set label cntry_name
]
]
end
但是,添加地图 C 并最终添加地图 D 使得这种方法非常不方便,因为交叉点产生的多边形每次都会变小,因此有必要简化它们以避免 NetLogo 充电时出现问题。
然后我认为可能有一种替代方法,但我不确定使用 NetLogo GIS 扩展是否可行。我一直在查看扩展文档,但未能找到解决方案。用自然语言来说,对于地图 C,地图 A 和地图 B 已加载并已用于创建海龟,我想要实现的是:
加载地图 C 并要求每只海龟检查它们放置在地图 C 的哪个多边形中,然后要求它们设置自己的变量
与它们所在的地图 C 中的多边形的turtle-variable-C
变量值相同.map-C-polygon-variable
可以使用 NetLogo GIS 扩展来编程类似的东西吗?如果没有,有人能想象一种替代方法来解决这个问题吗?
我认为你可以使用 gis:contains 来实现你的替代方法?或 gis:包含者?您可以要求每个多边形询问每个海龟该多边形是否包含海龟,如果是,则将海龟的变量设置为多边形的值。每张地图看起来都是这样的:
foreach (gis:feature-list-of polygons-dataset )
[ the-polygon ->
ask turtles with [gis:contains? the-polygon self]
[ set turtle-var (gis:property-value the-polygon poly-variable)]
]
另一个技巧是定义 patch 变量来保存多边形的特征。补丁可以有诸如
map-A-var-1 map-B-var-1
等变量。然后使用 gis:apply-coverage
设置这些变量。海龟会自动使用它们所在补丁的变量。这本质上会将多边形转换为栅格变量,因此您必须使用足够小的面片才能充分表示多边形。