【问题标题】:NetLogo - misalignment with imported GIS shapefilesNetLogo - 与导入的 GIS shapefile 不对齐
【发布时间】:2014-04-24 11:40:47
【问题描述】:

我有一个 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 所固有的错误?这里的任何帮助都会很棒,因为让它们对齐可以解决几个问题,包括上一篇文章。整个代码很长,所以我在下面附上了一些最相关的sn-ps。谢谢!

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

【问题讨论】:

    标签: r gis netlogo


    【解决方案1】:

    我认为 Seth 是正确的,在将补丁坐标映射到世界坐标时这是一个错误的错误。它可能与 mentioned here 的错误有关。他提出的使用(list min-pxcor - 0.5 max-pxcor + 0.5 min-pycor - 0.5 max-pycor + 0.5) 的解决方案应该可行。如果没有,把模型发给我,我有时间去看看。

    【讨论】:

      【解决方案2】:

      漂亮的屏幕截图,感谢提供,它使问题易于掌握。看起来离原点越远,差异越严重,就像误差从原点向外辐射一样。

      我知道 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 错误。

      【讨论】:

      • 太棒了!这行得通。谢谢赛斯和埃里克。我最终使用了(list (min-pxcor - 0.5) (max-pxcor + 0.5) (min-pycor - 0.5) (max-pycor + 0.5))
      【解决方案3】:

      我遇到了同样的问题。我找到了一种更简单的方法来处理两张地图的错位。

      在我的例子中,一个是光栅图,另一个是 shapefile。它们都共享相同的世界范围。

      解决方法是,在导入第一个文件“A”时,将“world-envelope”设置为文件“A”。然后,在导入第二个文件“B”时,将“world-envelope”设置为与文件“A”相同。

      【讨论】:

        猜你喜欢
        • 2018-06-03
        • 2020-08-11
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-17
        • 2013-11-14
        • 1970-01-01
        相关资源
        最近更新 更多