根据向量中的真实种群创建海龟
Create turtles according to real population within vectors
我想在 NetLogo 中创建人口。因此,我想在依赖该地区人口的地区内创建海龟。但是,我不太确定该怎么做。
我得到了该地区的人口作为一个像这样的补丁值:
gis:apply-coverage lor-dataset "GESBEV" population
但是当我用这个创建人口时,我得到的是每个补丁中一个地区的人口数量,而不是每个地区的人口数量。
有没有可能每个区只能得到一次人口值?我也将感谢任何我可以做进一步阅读的资源。我自己还没有找到任何东西。
可能有很多方法可以解决这个问题,但这里有两个选项。首先,我在 Esri Open 数据中找到了一些示例数据 - 2015 population data for Haiti。我将 shapefile 和相关文件提取到名为 'gis' 的文件夹中。我们将使用在“gis:属性-name”中找到的人口值:"POPULATION"。使用此设置:
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
输出如下所示:
看起来不错!所有海龟都在每个要素的地理中心萌芽。但是,根据您的数据集,您可能 运行 遇到问题。请注意,中心的岛屿实际上是多部分要素的一部分,因此该多部分要素的种群已在边界之外生成。这对您来说可能不是问题,具体取决于您所在地区的形状。
选项 2 有点复杂,您可能会引入一些舍入误差。它也慢很多,并且根据你的世界和人口的大小可能需要很长时间/你可能 运行 内存不足。首先,获取您所在地区的人口数量和斑块数量。然后,将人口除以该地区的斑块以获得每个斑块的平均人口。然后,让每个 contained-patch 发芽那么多的海龟:
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
这一个的输出如下:
但请注意,与我在此处用作示例的人口相比,它确实需要 多 更长的时间,特别是因为我除以 1000。另请注意,如果您的补丁是太大而无法被某个区域包含,您将不会在您的区域内生成任何海龟(例如,南海岸外的小岛)。
希望这能让您指明正确的方向!
我想在 NetLogo 中创建人口。因此,我想在依赖该地区人口的地区内创建海龟。但是,我不太确定该怎么做。
我得到了该地区的人口作为一个像这样的补丁值:
gis:apply-coverage lor-dataset "GESBEV" population
但是当我用这个创建人口时,我得到的是每个补丁中一个地区的人口数量,而不是每个地区的人口数量。
有没有可能每个区只能得到一次人口值?我也将感谢任何我可以做进一步阅读的资源。我自己还没有找到任何东西。
可能有很多方法可以解决这个问题,但这里有两个选项。首先,我在 Esri Open 数据中找到了一些示例数据 - 2015 population data for Haiti。我将 shapefile 和相关文件提取到名为 'gis' 的文件夹中。我们将使用在“gis:属性-name”中找到的人口值:"POPULATION"。使用此设置:
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
输出如下所示:
看起来不错!所有海龟都在每个要素的地理中心萌芽。但是,根据您的数据集,您可能 运行 遇到问题。请注意,中心的岛屿实际上是多部分要素的一部分,因此该多部分要素的种群已在边界之外生成。这对您来说可能不是问题,具体取决于您所在地区的形状。
选项 2 有点复杂,您可能会引入一些舍入误差。它也慢很多,并且根据你的世界和人口的大小可能需要很长时间/你可能 运行 内存不足。首先,获取您所在地区的人口数量和斑块数量。然后,将人口除以该地区的斑块以获得每个斑块的平均人口。然后,让每个 contained-patch 发芽那么多的海龟:
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
这一个的输出如下:
但请注意,与我在此处用作示例的人口相比,它确实需要 多 更长的时间,特别是因为我除以 1000。另请注意,如果您的补丁是太大而无法被某个区域包含,您将不会在您的区域内生成任何海龟(例如,南海岸外的小岛)。
希望这能让您指明正确的方向!