【问题标题】:shapefile not overlapping patchesshapefile 不重叠补丁
【发布时间】:2018-04-19 16:52:34
【问题描述】:

我正在构建一个模型,它要求我将 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

我是否遗漏了什么或做错了什么? 澄清一下,我需要让文件的每个坐标对应一个patch,并将属性传递给patch。

谢谢。

【问题讨论】:

  • 你的 shapefile 是什么数据类型?如果它只是一个点 x y 值或线,gis:apply-coverage 将不起作用,只有多边形数据将 (see definition)。你可能想要gis:intersecting
  • 是的,它是 x|y|值。我认为应用覆盖会起作用。我会尝试 gis:intersecting。谢谢
  • 据我所知,相交会返回与其他东西相交的东西。我正在尝试将 shapefile 的每个点分配给一个补丁,即我的文件中有坐标 x 坐标 y 和属性。我想在文件的每一行和一个补丁之间建立一个对应关系。

标签: gis netlogo shapefile


【解决方案1】:

您可以使用gis:intersecting 来执行此操作,但是对于您想要执行的操作来说效率不是很高。例如,我从this site 下载了机场数据集,其中包含一些免费的 gis 数据。机场数据集 (ne_10m_airports.shp) 包含每个机场的点数据和有关每个机场的一些信息。要将一些数据分配给补丁,请参阅下面的 cmets 中的一些信息:

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 会使事情变得更容易。我的原始数据是 xyz 格式,这是(我认为)ascii 网格文件。我是否必须将文件的扩展名更改为 .asc 才能将其用作栅格数据集,还是必须使用 QGIS 等软件?另外,有没有办法在文件中的行数和补丁数之间建立对应关系,或者我将不得不手动设置我的世界大小(即设置世界的 max/min-px/ycor),以便补丁数等于点数?
  • @PauloSergio - 如果我要引入栅格数据,我个人几乎总是保持这种格式。当您说xyz格式时,您是指x列,y列,值列吗?如果是这样,不,您不能只更改文件扩展名 - ASC 文件的格式类似于矩阵(example)。要进入 ASC,您需要软件(或者,从技术上讲,需要编码知识)。您可以根据行数以编程方式设置您的世界大小(参见上面的resize-world),但这值得提出不同的问题,并且可能不会完全按照您希望的方式运行。
  • 是的。我有 x y 值。我将尝试将其转换为 asc,然后将数据加载为栅格数据集。感谢您的帮助,如果您对这项工作有任何其他建议,请随时给我发消息或发表评论
猜你喜欢
  • 1970-01-01
  • 2015-05-21
  • 2022-10-17
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多