NetLogo中Distance原语结合GIS栅格使用报NOBODY错误
报错根因
你触发DISTANCE expected input to be an agent but got NOBODY instead错误的核心原因有两个,优先级从高到低:
- 主流程漏调用栅格加载逻辑:你的
setup初始化过程中,没有调用setup-map过程,直接执行了set-houses。这意味着draw-lake从未运行,所有斑块的tota变量都没有被赋值为1,patches with [tota = 1]是一个空的斑块集合,对空集合执行min-one-of会直接返回nobody,传给distance就会触发你看到的报错。 - 代码本身存在多处语法、变量定义、逻辑错误,就算补上
setup-map调用也会触发其他报错,具体问题点列在下面。
代码现存问题清单
- 语法错误:
draw-tota过程中gis:raster-sample worldself漏写空格,正确写法是gis:raster-sample world self,否则会直接触发语法错误。 - 变量定义缺失:
patches-own块中没有声明代码里用到的elevation、dano_suelo、distance-lake三个斑块变量,运行时会报变量未定义错误。 - 变量作用域错误:你把
water定义成了全局变量,但draw-lake中是逐斑块给water赋值,全局变量只能存单个值,无法存储每个斑块的采样结果,应该把water挪到patches-own中。 - 变量初始化缺失:非湖体斑块的
tota没有设置默认值0,仅给湖体斑块设置了tota=1,未赋值的变量在筛选时会出现不可预期的结果。 - 冗余逻辑:
draw-tota中if (elevation <= 0) or (elevation >= 0)是恒真判断,所有高程值都会满足这个条件,这段判断没有实际作用。
修复方案
- 补全所有缺失的斑块变量声明,调整
water的作用域到斑块自有变量 - 初始化所有斑块的
tota默认值为0,湖体斑块再覆盖为1 - 修复
gis:raster-sample的空格语法错误 - 删除恒真的冗余判断
- 在
setup流程中,执行set-houses之前调用setup-map,保证栅格采样、湖体标识赋值完成后再计算距离 - 距离计算逻辑增加空判断,避免栅格加载失败时重复触发nobody错误
修复后完整代码
extensions [ gis ] globals [ world lake show-lake ] patches-own[ elevation distance-water distance-lake dano_suelo tota water ] to draw-tota let min-elevation gis:minimum-of world let max-elevation gis:maximum-of world ask patches [ set elevation gis:raster-sample world self set pcolor scale-color green elevation 2900 max-elevation ] end to draw-lake ask patches [ set tota 0 ; 先给所有斑块设置湖体标识默认值 set water gis:raster-sample lake self if (water >= 0) [ set pcolor blue set tota 1 ] ] end to setup-map set world gis:load-dataset "D:/Geografico/DEM_Lago_Tota.asc" gis:set-transformation [-72.994844704 -72.835891153 5.418413284 5.648012857666661] [0 1000 0 1000] set lake gis:load-dataset "D:/Geografico/Lago_Tota_Raster.asc" draw-tota draw-lake end to set-houses ask patches [ set dano_suelo (1 + random 5) let nearest-lake min-one-of patches with [tota = 1] [distance myself] if is-a-patch? nearest-lake [ ; 增加空判断避免报错 set distance-lake distance nearest-lake ] ] set-default-shape turtles "person" create-turtles 100 end to setup ca resize-world 0 1000 0 1000 setup-map ; 补上之前漏的栅格加载调用 set-houses reset-ticks end
内容的提问来源于stack exchange,提问作者bksnlow
相关产品推荐
相关产品推荐

