如何创建地理空间/时间数据的动画

Posted

技术标签:

【中文标题】如何创建地理空间/时间数据的动画【英文标题】:How to create an animation of geospatial / temporal data 【发布时间】:2013-06-15 14:13:28 【问题描述】:

我有一组数据,其中包含对 800 名受试者的大约 150,000 次观察。每个观测值都有:对象 ID、纬度、经度以及对象在这些坐标处的时间。数据涵盖 24 小时周期。

如果我一次绘制所有数据,我只会得到一个 blob。有没有人能给我一些提示,告诉我如何为这些数据设置动画,以便我可以观察对象的路径作为时间的函数?

我已经阅读了时空小插曲,但我不完全确定它会如我所愿。在这一点上,我花了很多时间在谷歌上搜索,但并没有真正想出任何满足我需求的东西。

非常感谢任何提示和指示!

【问题讨论】:

动画包看过了吗? 【参考方案1】:

你的问题有点含糊,但我会分享我过去是如何制作这种动画的。

    创建一个函数,绘制一个时间片的所有主题位置:

    plot_time = function(dataset, time_id) 
        # make a plot with your favorite plotting package (e.g. `ggplot2`)
        # Save it as a file on disk (e.g. using `ggsave`), under a regular name, 
        # frame001.png, frame002.png, see sprintf('frame%03d', time_index)
    
    

    在您的每个时间片上调用此函数,例如使用lapply:

    lapply(start_time_id:stop_time_id, plot_time)
    

    导致硬盘上的一组图形文件称为frame001framexxx

    使用工具将这些帧渲染成电影,例如使用ffmpeg,见for example。

这是一个通用的工作流程,已经在animation 包中实现(感谢@mdsummer 提醒我)。您可能可以利用该软件包来获取动画。

【讨论】:

绝对使用动画包而不是你的代码来生成帧:)【参考方案2】:

这是我第一次使用animation 包。这比我预期的要容易,尤其是savehtml 真的很棒。这是我的场景(即使我认为我的 R 代码会更清晰:)

    我生成了一些数据 我为所有人绘制了一个基本图作为背景图。 我重塑数据以获取更宽的格式,我可以在每个人的当前位置和下一个位置之间绘制一个箭头。 我循环了几个小时,以生成许多图。我将 llop 放入强大的 saveHTML 函数中。 您会得到一个带有漂亮动画的 html 文件。我在这里展示了一个中间图。

这是我的代码:

library(animation)
library(ggplot2)      
library(grid)
## creating some data of hours 
N.hour <- 24
dat <- data.frame(person=rep(paste0('p',1:3),N.hour),
                  lat=sample(1:10,3*N.hour,rep=TRUE),
                  long=sample(1:10,3*N.hour,rep=TRUE),
                  time=rep(1:N.hour,each=3))


# the base plot with
base <- ggplot() + 
  geom_point(data=dat,aes(x=lat, y=long,colour = person),
             size=5)+ theme(legend.position = "none") 


## reshape data to lat and long formats

library(plyr)
dat.segs <- ddply(dat,.(person),function(x)
  dd <- do.call(rbind,
           lapply(seq(N.hour-1),
              function(y)c(y,x[x$time %in% c(y,y+1),]$lat,
                   x[x$time %in% c(y,y+1),]$long)))
  dd

)
colnames(dat.segs) <- c('person','path','x1','x2','y1','y2')

# a function to create the animation
oopt <- ani.options(interval = 0.5)
saveHTML(
  print(base)
  interval = ani.options("interval")
  for(hour in  seq(N.hour-1))
    # a segment for each time
    tn <- geom_segment(aes(x= x1, y= y1, xend = x2,
                        yend = y2,colour = person), 
                       arrow = arrow(), inherit.aes = FALSE,
                       data =subset(dat.segs,path==hour))

    print(base <- base + tn)
    ani.pause()
  
, img.name = "plots", imgdir = "plots_dir", 
   htmlfile = "random.html", autobrowse = FALSE, 
    title = "Demo of animated lat/long for different persons",
    outdir=getwd())

【讨论】:

以上是关于如何创建地理空间/时间数据的动画的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Go 驱动程序或 mgo/qmgo 在 MongoDB 中存储地理空间数据?

如何创建平衡的 k-means 地理空间集群?

如何使用 C++ 在 MongoDB 中创建地理空间索引

如何使用空间数据库检查 AIS 信号是不是从地理围栏发出?

多索引数据的mongodb地理空间查询

如何使用具有球形几何形状的 MySQL 地理空间扩展