NetLogo - 导入的GIS shapefile未对齐

时间:2014-03-18 16:27:44

标签: r gis netlogo

我有一个NetLogo模型,其中每只动物占据“领地”,其中属于动物的所有斑块都与动物颜色相同。然后,我使用NetLogo中的R扩展来创建围绕每个区域的最小凸多边形(MCP),并将这些多边形导出为shapefile。然后,我使用GIS扩展将GIS文件导回NetLogo。我的理由与之前发布的这个问题(NetLogo - applying values to patches within polygons)有关。也就是说,我可以使用gis:intersecting为那些属于GIS导入的多边形的补丁提供变量。创建MCP,导出和导入的过程在每个时间步骤完成,因为区域更新每个滴答。除了导入的shapefile与原始多边形不完全对齐外,一切都很好。附图显示了这一点,其中蓝色轮廓来自导入的shapefile。 enter image description here。我试过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

3 个答案:

答案 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”相同。