我有一个NetLogo模型,其中每只动物占据“领地”,其中属于动物的所有斑块都与动物颜色相同。然后,我使用NetLogo中的R扩展来创建围绕每个区域的最小凸多边形(MCP),并将这些多边形导出为shapefile。然后,我使用GIS扩展将GIS文件导回NetLogo。我的理由与之前发布的这个问题(NetLogo - applying values to patches within polygons)有关。也就是说,我可以使用gis:intersecting
为那些属于GIS导入的多边形的补丁提供变量。创建MCP,导出和导入的过程在每个时间步骤完成,因为区域更新每个滴答。除了导入的shapefile与原始多边形不完全对齐外,一切都很好。附图显示了这一点,其中蓝色轮廓来自导入的shapefile。 。我试过gis:set-world-envelope (list min-pxcor max-pxcor min-pycor max-pycor)
但无济于事。有人知道我做错了什么,或者导出然后导入没有投影的shapefile是错误的吗?这里的任何帮助都会很棒,因为让它们对齐会解决几个问题,包括上一篇文章。整个代码很长,所以我附上了一些最相关的片段。谢谢!
extensions [r gis ]
breed [females female]
globals
[
hr-dataset
]
females-own
[
Name
X
Y
]
patches-own
[
is-hr?
]
to setup
clear-all
r:clear
...
ask n-of 5 patches
[
sprout-females 1
[
...
set X (list pxcor)
set Y (list pycor)
]
]
reset-ticks
end
to go
...
expand
calc-homerange
tick
end
to expand
repeat 10
[
ask females
[
move-to target
set X lput pxcor X
set Y lput pycor Y
]
]
end
to calc-homerange
r:eval "library(adehabitatHR)"
r:eval "library(sp)"
r:eval "library(rgdal)"
; create an empty data.frame"
r:eval "turtles <- data.frame()"
; merge the Name, X- and Y-lists of all females to one big data.frame
ask females
[
(r:putdataframe "turtle" "X" X "Y" Y)
r:eval (word "turtle <- data.frame(turtle, Name = '" Name "')")
r:eval "turtles <- rbind(turtles, turtle)"
]
; create SpatialPointsDataFrame
r:eval "spdf <- SpatialPointsDataFrame(turtles[1:2], turtles[3])"
r:eval "homerange <- mcp(spdf, percent = 100)"
r:eval "writeOGR(homerange, '.', 'homerange-rgdal', overwrite_layer = TRUE, driver = 'ESRI Shapefile')"
mark-homeranges
end
to mark-homeranges
clear-drawing
...
set hr-dataset gis:load-dataset "C:/Program Files (x86)/NetLogo 5.0.4/homerange-rgdal.shp"
gis:set-world-envelope (list min-pxcor max-pxcor min-pycor max-pycor)
gis:set-drawing-color blue
gis:draw hr-dataset 2
ask patches gis:intersecting hr-dataset
[
set is-hr? true
]
end
答案 0 :(得分:2)
我认为Seth是正确的,它是将贴片坐标映射到世界坐标时的一个一个错误。它可能与mentioned here的错误有关。他建议的使用(list min-pxcor - 0.5 max-pxcor + 0.5 min-pycor - 0.5 max-pycor + 0.5)
的解决方案应该有效。如果没有,请把模型寄给我,如果我有时间,我会看看。
答案 1 :(得分:1)
漂亮的屏幕截图,感谢提供,它使问题易于掌握。它看起来离原点越远,差异就越大,就像误差从原点辐射出来一样。
我知道GIS扩展文档建议使用gis:set-world-envelope (list min-pxcor max-pxcor min-pycor max-pycor)
,但我不得不怀疑它是否真的正确。 min/max-pxcor/pycor
是最小和最大补丁坐标,而不是最小和最大乌龟坐标。因此,例如,如果max-pxcor
是10,那么乌龟的x坐标可以高达10.499999 [...],如果min-pxcor
是-10,乌龟的x坐标可以低至-10.5 。因此world-width
是21,而不是20。
也许尝试将其更改为gis:set-world-envelope (list min-pxcor - 0.5 max-pxcor + 0.5 min-pycor - 0.5 max-pycor + 0.5)
,看看是否可以修复它。或者,如果它没有完全修复它,尝试翻转标志或尝试1而不是0.5。它肯定从屏幕截图看起来像问题是一个一个或一个0.5的错误。
答案 2 :(得分:1)
我遇到了同样的问题。我找到了一种更简单的方法来处理两个地图的不对齐情况。
就我而言,一个是栅格地图,另一个是shapefile。他们俩在世界范围内共享。
解决方案是,在导入第一个文件“ A”时,将“ world-envelope”设置为文件“ A”。然后,在导入第二个文件“ B”时,将“ world-envelope”设置为与文件“ A”相同。