更快的将栅格GIS数据应用于NetLogo补丁的方法

3
有没有办法在导入栅格数据到补丁时提高计算时间?
这是我的代码,通常需要约20分钟才能完成。我的世界是500x500。我发现,如果只考虑真或假,使用gis:intersect?要比gis:apply-coverage快得多。祝好运。
 to setup-gis
  set city gis:load-dataset "GSR_GIS.shp"
  set LGA_nodes gis:load-dataset "LGA_nodes.shp"
  set builtuparea gis:load-dataset "GSR_builtuparea.shp"
  set recreationalarea gis:load-dataset "GSR_recreationalareas.shp"
  set natural gis:load-dataset "GSR_natural.shp"
  set reserves gis:load-dataset "GSR_reserves.shp"
  set rail_network gis:load-dataset "Greater_Sydney_rail_networkt.shp"
  set roads gis:load-dataset "GSR_road_network.shp"

  gis:set-world-envelope gis:envelope-of city 
  gis:set-drawing-color white 
  gis:draw city 1 
  gis:apply-coverage city "LGA" zone 

  set patchesinlga (patch-set patches with [ zone > 0 ])

      ask patchesinlga [
    ifelse gis:intersects? builtuparea self [set builtuparea? true][set builtuparea? false]
    ifelse gis:intersects? recreationalarea self [set recreationalarea? true][set recreationalarea? false]
    ifelse gis:intersects? natural self [set natural? true][set natural? false]
    ifelse gis:intersects? reserves self [set reserves? true][set reserves? false]
    ifelse gis:intersects? roads self [set roads? true][set roads? false]
    ifelse gis:intersects? rail_network self [set rail? true][set rail? false]
    if gis:intersects? LGA_nodes self [sprout-LGAs 1 [set color red set shape "flag" set size 2 set LGAid [zone] of patch-here]]
    ]

    ask patches with [zone > 0 and (round([zone] of self) / [zone] of self) != 1][set zone 0] ;; fixed the zone floating point issue
end  

*我的编辑说明:我找到了一种方法,可以通过只询问感兴趣的补丁来加快速度。在我的情况下,它们是具有LGA(LGA是区域标识符)的补丁,因此将排除地理信息系统地图之外的补丁以运行ifelse循环,在底部。

但是有没有办法改进这个?

一些运行时间结果

  • 50*50花费23秒
  • 100*100花费79.5秒
  • 400*400花费30分钟

你可以尝试另一种方法,即确定每次运行都将相同的部分,并将它们与世界的任意生成部分分开。以其慢速形式运行GIS代码,然后“导出世界”。然后,您可以将“导入世界”作为启动过程的开始(这可能比GIS工具更快)。但是,如果您这样做,请记住,所有内容都包括在内,例如随机状态、所有代理等,因此您需要重置随机数生成器并在导入后创建所有代理。 - JenB
1个回答

1
我有同样的问题:我的代码需要30多分钟才能完成,而我的世界只有500x700个补丁。延迟不在于加载数据,而是在于显示数据。从你上面的代码来看,我认为你正在经历类似的现象。
在你的askpatchesinlga[]过程中,你要求每个补丁检查是否与数据相交。我认为这就是执行所需时间如此之长的原因。2500个代理器每秒钟只需一秒钟就已经是大约45分钟的处理时间。为了加快速度,预先创建栅格,并将它们加载到netlogo中。这将把2500个命令变成7个(左右),并应相应地减少处理时间。
总之:如果你正在加载数据,请不要要求每个补丁都做些什么。先进行处理,然后加载完成的数据集 - 在你的情况下,是建立区域栅格、修复区域栅格、自然区域栅格等。任何地理处理工具箱都应该能够为你制作这些。

谢谢@Chris的回答。我知道这已经晚了两年才来感谢你。但是我确实在当时的工作中使用了你的建议。非常感激。 :) - z5182
@z5182 非常乐意帮忙! - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接