shapefile 不重叠补丁
shapefile not overlapping patches
我正在构建一个模型,它要求我将 shapefile 加载到 netlogo。我已经做到了,并且视图上显示的地图与它应该的对应。问题是 shapefile 没有与补丁重叠。我的 shapefile 由 x|y|attribute 组成,文件中有大约 800 000 行。理想的情况是让每一行对应一个补丁,但是当我执行计数补丁时它只有 1089。更糟糕的是,当我请求属性值时每个补丁都检索到 NaN。我将粘贴与此问题相关的部分代码:
globals [ mintempcm-dataset
maxtemphm-dataset
precipitation-dataset
meantemp-dataset
color-list
]
patches-own [
mintempcm
maxtemphm
meantemp
precipitation
]
to setup
ca
gis:load-coordinate-system (word "WGS_84_Geographic.prj")
set maxtemphm-dataset gis:load-dataset "mxtwm.shp"
gis:set-world-envelope (gis:envelope-union-of
(gis:envelope-of maxtemphm-dataset)
)
gis:apply-coverage maxtemphm-dataset "MAXTEMPHM" maxtemphm
ask patches[
set maxtemphm maxtemphm
]
gis:set-drawing-color blue
gis:draw maxtemphm-dataset 1
reset-ticks
end
我是不是遗漏了什么或做错了什么?
澄清一下,我需要让文件的每个坐标对应一个补丁,并将属性传递给补丁。
谢谢。
您可以使用 gis:intersecting
来执行此操作,但对于您想要执行的操作来说效率不高。例如,我从 this site 下载了机场数据集,其中包含一些免费的 gis 数据。机场数据集 (ne_10m_airports.shp) 包含每个机场的点数据和有关每个机场的一些信息。要将一些数据分配给补丁,请参见下文-评论中的一些信息:
extensions [ gis ]
globals [ airports ]
patches-own [ airport-name ]
to setup
ca
resize-world 0 125 0 50
set-patch-size 5
; Load the dataset
set airports gis:load-dataset "ne_10m_airports.shp"
gis:set-world-envelope gis:envelope-of airports
; For each point listed in 'airports', ask any patches
; that are intersecting that point to take the name
; of the airport that intersects them (since these are points,
; intersection in this case means the airport coordinates
; lie within the patch.
foreach gis:feature-list-of airports [
x ->
ask patches gis:intersecting x [
set airport-name gis:property-value x "NAME"
set pcolor red
]
]
reset-ticks
end
您可以使用温度数据集中的 "MAXTEMPHM" 值来执行此操作。但是,您必须考虑您的 NetLogo 世界大小,以确保补丁的数量与您拥有的点数相对应 - gis:set-world-envelope
仅将 gis 数据集与 NetLogo 世界对齐,它不会'影响目前的补丁。如果你有 800000 个温度点要加载,你需要让你的 NetLogo 世界大约有 895 个方块,这是一个相当大的世界。如上所述,加载温度数据需要 while。使用栅格数据集和 gis:apply-raster
.
会使事情变得更简单、更高效(并且明显更快)
我正在构建一个模型,它要求我将 shapefile 加载到 netlogo。我已经做到了,并且视图上显示的地图与它应该的对应。问题是 shapefile 没有与补丁重叠。我的 shapefile 由 x|y|attribute 组成,文件中有大约 800 000 行。理想的情况是让每一行对应一个补丁,但是当我执行计数补丁时它只有 1089。更糟糕的是,当我请求属性值时每个补丁都检索到 NaN。我将粘贴与此问题相关的部分代码:
globals [ mintempcm-dataset
maxtemphm-dataset
precipitation-dataset
meantemp-dataset
color-list
]
patches-own [
mintempcm
maxtemphm
meantemp
precipitation
]
to setup
ca
gis:load-coordinate-system (word "WGS_84_Geographic.prj")
set maxtemphm-dataset gis:load-dataset "mxtwm.shp"
gis:set-world-envelope (gis:envelope-union-of
(gis:envelope-of maxtemphm-dataset)
)
gis:apply-coverage maxtemphm-dataset "MAXTEMPHM" maxtemphm
ask patches[
set maxtemphm maxtemphm
]
gis:set-drawing-color blue
gis:draw maxtemphm-dataset 1
reset-ticks
end
我是不是遗漏了什么或做错了什么? 澄清一下,我需要让文件的每个坐标对应一个补丁,并将属性传递给补丁。
谢谢。
您可以使用 gis:intersecting
来执行此操作,但对于您想要执行的操作来说效率不高。例如,我从 this site 下载了机场数据集,其中包含一些免费的 gis 数据。机场数据集 (ne_10m_airports.shp) 包含每个机场的点数据和有关每个机场的一些信息。要将一些数据分配给补丁,请参见下文-评论中的一些信息:
extensions [ gis ]
globals [ airports ]
patches-own [ airport-name ]
to setup
ca
resize-world 0 125 0 50
set-patch-size 5
; Load the dataset
set airports gis:load-dataset "ne_10m_airports.shp"
gis:set-world-envelope gis:envelope-of airports
; For each point listed in 'airports', ask any patches
; that are intersecting that point to take the name
; of the airport that intersects them (since these are points,
; intersection in this case means the airport coordinates
; lie within the patch.
foreach gis:feature-list-of airports [
x ->
ask patches gis:intersecting x [
set airport-name gis:property-value x "NAME"
set pcolor red
]
]
reset-ticks
end
您可以使用温度数据集中的 "MAXTEMPHM" 值来执行此操作。但是,您必须考虑您的 NetLogo 世界大小,以确保补丁的数量与您拥有的点数相对应 - gis:set-world-envelope
仅将 gis 数据集与 NetLogo 世界对齐,它不会'影响目前的补丁。如果你有 800000 个温度点要加载,你需要让你的 NetLogo 世界大约有 895 个方块,这是一个相当大的世界。如上所述,加载温度数据需要 while。使用栅格数据集和 gis:apply-raster
.