如何处理大型 GIS shapefile?

问题描述 投票:0回答:2

我正在 netlogo 中构建一个模型,并且有一个非常详细的栖息地地图,其中文件大小为 68mb (67,928 KB) - 我简化了顶点并将文件减少到 47mb (46,958 KB),但是当我尝试导入时,netlogo 仍然崩溃文件。

您会建议什么 - 无论是预处理方法还是 netlogo 方法 - 来提高文件大小或 netlogo 的处理能力?

我加载它的代码是

extensions [gis csv]
globals [world world-shape]
patches-own [habitat]

to set-up
  clear-all
  reset-ticks
  gis:load-coordinate-system "Habitat_map_Pflugmacher_20km_buffer.prj"
      set world gis:load-dataset "Habitat_map_Pflugmacher_20km_buffer.shp"
 ;; load in the circle around the island to create a buffer
  set world-shape gis:load-dataset "Habitat_map_Pflugmacher_20km_buffer.shp"  gis:set-drawing-color white
  gis:set-world-envelope-ds gis:envelope-of world-shape
  gis:apply-coverage world "Gridcode" habitat

        foreach gis:feature-list-of world
  [ ?1 ->
    if gis:property-value ?1 "Gridcode" = 1 [ gis:set-drawing-color 6  gis:fill ?1 2.0] ;; artificial land
    if gis:property-value ?1 "Gridcode" = 2[ gis:set-drawing-color 46  gis:fill ?1 2.0] ;; seasonal crops
    if gis:property-value ?1 "Gridcode" = 3 [ gis:set-drawing-color 43  gis:fill ?1 2.0] ;; perrenial crps
    if gis:property-value ?1 "Gridcode" = 4 [ gis:set-drawing-color 57  gis:fill ?1 2.0] ;; broadlead forest
     if gis:property-value ?1 "Gridcode" = 5 [ gis:set-drawing-color 52  gis:fill ?1 2.0] ;; conifer forest
        if gis:property-value ?1 "Gridcode" = 12  [ gis:set-drawing-color 55  gis:fill ?1 2.0] ;; mixed forest
    if gis:property-value ?1 "Gridcode" = 6 [ gis:set-drawing-color 63 gis:fill ?1 2.0] ;; shrubland
    if gis:property-value ?1 "Gridcode" = 7 [ gis:set-drawing-color 65  gis:fill ?1 2.0] ;; grassland
    if gis:property-value ?1 "Gridcode" = 8 [ gis:set-drawing-color 35  gis:fill ?1 2.0] ;; bareland
    if gis:property-value ?1 "Gridcode" = 9  [ gis:set-drawing-color 95  gis:fill ?1 2.0] ;; water
    if gis:property-value ?1 "Gridcode" = 10 [ gis:set-drawing-color 85  gis:fill ?1 2.0] ;; wetland
     if gis:property-value ?1 "Gridcode" = 11 [ gis:set-drawing-color 68  gis:fill ?1 2.0] ;; wetlands
    if gis:property-value ?1 "Gridcode" = 12  [ gis:set-drawing-color 9.9  gis:fill ?1 2.0] ;; snow    ]
  ]
memory gis netlogo agent-based-modeling
2个回答
1
投票

“NetLogo 崩溃”是什么意思?它是永远不会完成,还是您实际上收到错误消息?如果是的话,那是什么?

确保您了解内存分配问题 - 如果没有,请打开用户手册的常见问题解答部分并查找问题“我的模型可以有多大?”

如果您不确定发生了什么,您可以在 foreach 循环中放置一个“show”语句来告诉您它正在处理哪个功能。

(我从未尝试过导入这么大的形状文件,但理论上它应该可以工作。)


0
投票

我不确定这是否足以实现你想要的,但我建议你尝试一下

to set-up
  clear-all
  reset-ticks
  
  gis:load-coordinate-system "Habitat_map_Pflugmacher_20km_buffer.prj"
  
  set world gis:load-dataset "Habitat_map_Pflugmacher_20km_buffer.shp"
  
  ;; load in the circle around the island to create a buffer
  gis:set-world-envelope-ds gis:envelope-of world
  gis:apply-coverage world "Gridcode" habitat
  
  let girdcodes [1   2   3   4   5   6   7   8   9   10   11   12]
  let colors    [6  46  43  57  52  63  65  35  95   85   68  9.9]
  
  (foreach (gis:feature-list-of world) girdcodes colors [ [?1 gc c] ->
    if gis:property-value ?1 "Gridcode" = gc [gis:set-drawing-color c gis:fill ?1 2.0]
    ]
  )
end

这里最主要的是删除

world-shape
,因为您再次加载正在使用的大型形状文件。我相信仅对
world
全局执行相同的操作应该可行,并且您可以避免 NetLogo 加载两次。还删除了
gis:set-drawing-color white
,因为在设置该颜色后您实际上并没有绘制任何内容。

一个小的改进是使用

foreach
处理多个列表的方法进行着色。我认为这不是解决您的问题的关键,但使您的代码更清晰(我删除了值等于 12 的网格代码,因为它是重复的)。

© www.soinside.com 2019 - 2024. All rights reserved.