我正在构建一个模型,要求我将shapefile加载到netlogo。我已经这样做了,视图上显示的地图对应于它应该是什么。问题是shapefile没有与补丁重叠。我的shapefile由x | y |属性组成,我在文件中有80万行。理想的情况是让每一行对应一个补丁但是当我执行计数补丁时它只有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
我错过了什么或做错了什么? 为了澄清,我需要使文件的每个坐标对应一个补丁并将该属性传递给补丁。
感谢。
答案 0 :(得分:1)
您可以使用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个补丁平方,这是一个非常大的世界。如上所述,加载温度数据需要而。使用栅格数据集和gis:apply-raster
可以使事情更简单,更高效(并且速度更快)。