NetLogo导入GIS Shapefile:解决多边形质心Patch重叠问题
问题解决方案
一、自动切换到最近的空Patch
你可以通过min-one-of命令筛选出目标Patch周围最近的未被占用(ID-parcel=0)的Patch,替换原有的直接定位逻辑。修正后的代码如下:
gis:set-world-envelope (gis:envelope-of shpefile) ask patches [set pcolor white] gis:set-drawing-color black gis:draw shapefile 0.5 let n 1 foreach gis:feature-list-of BE_WAL_Parcels_2015 [ polygone -> let center-point gis:location-of gis:centroid-of polygone let target-patch patch (item 0 center-point) (item 1 center-point) ;; 找到最近的空Patch,目标Patch为空则直接使用 let selected-patch min-one-of (patches with [ID-parcel = 0]) [distance target-patch] ask selected-patch [ set ID-temp n set ID-parcel gis:property-value polygone "ID_PRCL" set ID-farm gis:property-value polygone "ID_FARM" ;; 标记已占用的Patch set pcolor red ] set n n + 1 ]
代码说明:
- 先获取质心对应的
target-patch,再通过min-one-of从所有空Patch中筛选出距离目标点最近的那个 - 直接对选中的空Patch赋值属性,彻底避免重叠问题
- 修正了原代码中
ifelse的语法嵌套错误
二、不缩小多边形前提下增加单个多边形内的Patch数量
NetLogo的gis:set-world-envelope会自动将Shapefile的地理范围适配到当前世界的Patch网格中,要缩小Patch尺寸(让单个多边形覆盖更多Patch),只需先扩大世界的Patch总数,再设置地理范围:
- 打开NetLogo的「Settings」面板,在「World Size」选项中调大
max-pxcor和max-pycor的值(比如从默认31改为127,世界总Patch数从64×64变为256×256) - 保持Shapefile地理范围不变,重新运行
gis:set-world-envelope (gis:envelope-of shpefile)
操作后,每个Patch对应的实际地理面积会变小,多边形的实际大小不会改变,但会覆盖更多Patch,从根源上降低质心重叠的概率。
内容的提问来源于stack exchange,提问作者Sarahdata
相关产品推荐
相关产品推荐

