首页 文章

如何在Netlogo中从shapefile中创建移动的海龟

提问于
浏览
3

我刚开始使用Netlogo创建基于代理的模型 . 我有两个我想要使用的shapefile:一个城市的网络 Map (line-shapefile)和一个城市滑板车的点状文件 . 我们的想法是让他们在网络shapefile的线路上穿越城市 . 由于我是Netlogo的新手,我只是设法在我的模型中加载这些shapefile . 有人可以通过帮助我从踏板车注册(点)创建海龟并让他们在网络线上移动来给我一个启动 . 到目前为止,我在互联网上找不到任何帮助,它无法通过反复试验 . 到目前为止,我的代码就是这样:

extensions [ gis ]

to load
  ca
  let network gis:load-dataset "Roads_Asmterdam.shp"

  foreach gis:feature-list-of network
  [ gis:set-drawing-color white
    gis:draw ? 0.3

  ]

  let people gis:load-dataset "scooters_Amsterdam.shp"
   foreach gis:feature-list-of people
  [ gis:set-drawing-color blue
    gis:draw people 3

  ]

end

所以,据我所知,我需要一个能够移动海龟的功能 . 我需要一个函数来创建可能的点状文件中的移动海龟,但我还需要让他们知道只使用线而不是整个区域 .

提前谢谢了!

1 回答

  • 2

    加载线形文件后,您需要将它们转换为代理/龟的网络并链接它们 . NetLogo不会为您做到这一点,您需要自己迭代所有功能,线段和坐标 . 然后你需要将滑板车放在线网络的坐标上,然后你可以“要求”他们四处移动 .

    这是我想出的:

    extensions [ gis ]
    globals [ roads-dataset scooter-dataset ]
    breed [ nodes node ]
    breed [ scooters scooter ]
    breed [ walkers walker ]
    walkers-own [ wlocation ]
    scooters-own [slocation]
    
    to setup
      ; reset
      clear-all
      reset-ticks
    
      ; load data set
      gis:load-coordinate-system (word "C:/Program Files/NetLogo 5.3.1/app/models/Code Examples/GIS/data/WGS_84_Geographic.prj")
      set roads-dataset gis:load-dataset "C:/shape/roads.shp"
      set scooter-dataset gis:load-dataset "C:/shape/scooter.shp"
      gis:set-world-envelope (gis:envelope-of roads-dataset)
    
      ; draw data set
      gis:set-drawing-color blue
      gis:draw roads-dataset 1
    
      make-road-network
    end
    
    to make-road-network
      clear-links
      let first-node nobody
      let previous-node nobody
      foreach gis:feature-list-of roads-dataset [ ; each polyline
        foreach gis:vertex-lists-of ? [ ; each polyline segment / coordinate pair
          foreach ? [ ; each coordinate
            let location gis:location-of ?
            if not empty? location [ ; some coordinates are empty []
              create-nodes 1 [
                set color green
                set size 1
                set xcor item 0 location
                set ycor item 1 location
                set hidden? true
                if first-node = nobody [
                  set first-node self
                ]
                if previous-node != nobody [
                  create-link-with previous-node
                ]
                set previous-node self
              ]
            ]
          ]
          set previous-node nobody
        ]
      ]
      ; connect adjacent polylines/roads
      ask nodes [ create-links-with other nodes in-radius 0.001 ]
    end
    
    to add-agents
      create-walkers 5 [
        set color red
        set wlocation one-of nodes
        move-to wlocation
      ]
    end
    
    to add-scooters
      foreach gis:feature-list-of scooter-dataset [ 
        foreach gis:vertex-lists-of ? [
          let location gis:location-of (first ?)
    
          create-scooters 1 [
            set color yellow
            set size 1
            set xcor item 0 location 
            set ycor item 1 location
    
            let nearest-node min-one-of (nodes in-radius 10)[distance myself]
            set slocation nearest-node
            move-to slocation
          ]
        ]
      ]
    end
    
    to go
      ask walkers [
        let new-location one-of [link-neighbors] of wlocation
        move-to new-location
        set wlocation new-location
      ]
      ask scooters [
        let new-location one-of [link-neighbors] of slocation
        move-to new-location
        set slocation new-location
      ]
    end
    

    我发现的一些资源和示例代码特别有用:

相关问题