zoukankan      html  css  js  c++  java
  • geotrellis使用(十五)使用Bokeh进行栅格数据可视化统计

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html

    目录

    1. 前言
    2. 实现方案
    3. 总结

    一、前言

           之前有篇文章介绍了使用Bokeh-scala进行数据可视化(见http://www.cnblogs.com/shoufengwei/p/5722360.html),其实当时选择Bokeh的部分原因就是Bokeh支持大数据量的可视化,有点“大数据”的意思,总之这刚好能与Geotrellis结合起来进行一些地理信息方面的大数据可视化统计工作。

           比如我们可以实现统计一大块区域内的DEM高程分布情况,将每个高程值出现多少次进行简单的可视化,最终效果如下图所示。下面为大家分析实现方法。

    高程统计可视化效果图

    二、实现方案

           简单来说就是使用Geotrellis读取前端传入的区域内的数据,然后根据高程值进行分类,最后使用Bokeh进行可视化。下面逐一说明。

    1.读取数据

           首先要将数据导入到Accumulo中,layoutScheme选择floating,这一块介绍过多次了,不再赘述。

           从Accumulo中读取数据在上一篇文章中也已经做了介绍,大同小异,在这里要简单一点,实现代码如下:

    val layerId = LayerId(layerName, 0)
    val raster = reader.read[SpatialKey, Tile, TileLayerMetadata[SpatialKey]](layerId)
        
    val polygon = maskz.parseGeoJson[Polygon].reproject(LatLng, raster.metadata.crs)
    
    val masked = raster.mask(polygon)
    val tile = masked.stitch.tile
    

           通过以上语句就能将用户输入区域的数据拼接成一个大瓦片。

    2.根据高程分类

           得到瓦片之后要进行高程分类,首先定义一个可变的map对象,然后从最小值到最大值都映射为0添加到map中,最后循环每一个瓦片值更新map对象,代码如下:

    var map = scala.collection.mutable.Map[Double, Double]()
    val (min, max) = tile.findMinMax
    for (i <- min to max)
      if (!map.contains(i))
        map += i.toDouble -> 0.0
    tile.histogram.foreach { (key, value) => {
        map(key.toDouble) = map(key.toDouble) + value
    }
    }
    

    3.使用bokeh进行可视化

           之后要做的就是根据采样类型、投影方式以及数据类型将上述tile进行转换,代码如下:

    object source extends ColumnDataSource {
        val x = column(map.keys.toIndexedSeq)
        val y = column(map.values.toIndexedSeq)
    }
    
    val xdr = new DataRange1d()
    val ydr = new DataRange1d()
    
    import source._
    
    val plot = BokehHelper.getPlot(xdr, ydr, Pan | WheelZoom | Crosshair)
    BokehHelper.plotBasic(plot)
    BokehHelper.setCircleGlyph(plot, x, y, source)
    plot.title("栅格数据分析")
    BokehHelper.save2Document(plot)
    
    

           其中source类中map就是上述求出的高程值与出现次数对应的映射。BokehHelper类就是在使用Bokeh-scala进行数据可视化一文中我封装的帮助类,具体可以参考该文。这样就完成了对区域内高程进行分类、统计、可视化。

    三、总结

           看似对高程进行统计分析、可视化没有太大的意义,这里介绍的其实只是一种思路、方法,我们可以对任意的栅格数据进行上述操作,如土壤、水域、资源环境等等,所以思想高于一切。

  • 相关阅读:
    POJ NOI0113-05 素数回文数的个数(PKU2928)
    POJ NOI0113-04 垂直直方图(PKU2800)
    POJ NOI0113-03 八进制小数(PKU2765)
    UVALive2245 POJ1131 HDU1376 ZOJ1086 Octal Fractions【进制】
    HDU2708 Vertical Histogram
    POJ2136 Vertical Histogram【打印图案】
    POJ2190 HDU2714 ISBN
    POJ NOI0113-02 不吉利日期(PKU2723)
    POJ NOI0113-01 数制转换(PKU2710)
    POJ NOI MATH-7828 最大公约数与最小公倍数
  • 原文地址:https://www.cnblogs.com/shoufengwei/p/5775417.html
Copyright © 2011-2022 走看看