根据向量中的实际种群创建海龟

时间:2018-07-12 12:52:48

标签: vector netlogo patch population

我想在NetLogo中创建一个填充。因此,我想根据地区人口来创建海龟。但是,我不确定如何做到这一点。

我将区域内的人口作为一个补丁值:

gis:apply-coverage lor-dataset "GESBEV" population

但是当我以此来创建人口时,我得到的是每个区域中某个区域内的人数,而不是每个区域内的人数。

每个地区是否只能获得一次人口价值?对于任何可以进一步阅读的资料,我也将不胜感激。我还没有自己找到任何东西。

1 个答案:

答案 0 :(得分:3)

可能有很多方法可以解决这个问题,但是这里有两个选择。首先,我在Esri Open数据中找到了一些示例数据2015 population data for Haiti。我将shapefile和相关文件提取到名为“ gis”的文件夹中。我们将使用在“ gis:属性名称”:“人口”中找到的人口值。使用此设置:

extensions [ gis ]

globals [
  state-layer 
]

to setup
  ca
  resize-world 0 110 0 80
  set-patch-size 6.5
  set state-layer gis:load-dataset "gis/Population_2015.shp"
  gis:set-world-envelope gis:envelope-of state-layer
  gis:set-drawing-color white
  gis:draw state-layer 1
  reset-ticks
end

第一种选择是在每个要素的质心处仅萌芽整个种群(在这种情况下,将其除以1000以免产生太多的海龟)。

to sprout-at-centroid
  foreach gis:feature-list-of state-layer [
    state ->

    ; Get the population for this state, divided by 1000
    ; to get a reasonable number
    let pop ( gis:property-value state "POPULATION" ) / 1000

    ; get the 'gis:location-of', an x-y list, for the 
    ; centroid of the current state / district
    let center gis:location-of gis:centroid-of state

    ; get the patch with the center xy values to sprout pop
    ask patch first center last center [
      sprout pop
    ]    
  ] 
end

输出看起来像这样: enter image description here

看起来不错!所有海龟都发芽在每个要素的地理中心。但是,根据您的数据集,您可能会遇到问题。请注意,位于中心的岛实际上是多部分要素的一部分,因此该多部分要素的填充物已在边界之外产生。根据您所在地区的形状,这可能对您没有问题。

选项2有点复杂,您可能会引入一些舍入错误。它也要慢很多,并且取决于您的世界的大小和人口可能会花费很长时间/您可能会耗尽内存。首先,获取您的人口数量和您所在地区内包含的补丁数量。然后,将人口除以该区域中的斑块,以获得每个斑块的平均人口。然后,让每个包含补丁的补丁发芽那么多的海龟:

to apply-evenly
  foreach gis:feature-list-of state-layer [
    state ->

    ; Get the population for this state, divided by 10000
    ; to get a reasonable number
    let pop ( gis:property-value state "POPULATION" ) / 1000

    ; Get the patches contained by the state. This is slow!
    ; Using 'gis:intersecting' alone is much faster, but results
    ; in overlaps as geographic boundaries don't align with  patch boundaries
    let target-patches ( patches gis:intersecting state ) with [ gis:contained-by? self state ] 

    if any? target-patches [

      ; Get the number of turtles that should be in each target-patch:
      let avg-turtles round ( pop / count target-patches )

      ; Get the contained patches to sprout the appropriate number of turtles
      ask target-patches [
        sprout avg-turtles
      ]    
    ]
  ] 
end

此输出结果如下:

enter image description here

但是请注意,人口大的确比我在此处使用的示例花费的时间长得多,尤其是因为我除以1000的情况。还要注意,如果补丁太大而无法包含在某个区域内,您将不会在该区域内产卵任何海龟(例如,南海岸外的较小岛屿)。

希望这能使您指向正确的方向!