在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天的调试、分析、源代码研读终于大致搞明白了其数据调取方式,下面简单介绍。

经过调试发现系统第一次调用数据的过程就是系统启动的时候调用了initCache方法,明显可以看出此方法是进行了数据缓存,那必然牵扯到数据的调取,整个过程清晰明了,只新建了一个RasterSource类,并调用了相关方法。明显数据调取过程应当是使用了RasterSource类,RasterSource是一个object类,新建过程调用了其一个apply方法:

def apply(name: String): RasterSource =
RasterSource(LoadRasterDefinition(LayerId(name)), None)
此方法其实调用了另一个方法
def apply(rasterDef: Op[RasterDefinition], targetExtent: Option[RasterExtent]): RasterSource = {
val (rd, tileOps) =
targetExtent match {
case reOp @ Some(re) =>
( rasterDef.map(_.withRasterExtent(re)),
rasterDef.map { rd =>
Seq(LoadRaster(rd.layerId, reOp))
}
)
case None =>
( rasterDef,
rasterDef.map { rd =>
(for(tileRow <- 0 until rd.tileLayout.layoutRows;
tileCol <- 0 until rd.tileLayout.layoutCols) yield {
LoadTile(rd.layerId, tileCol, tileRow)
})
}
)
} new RasterSource(rd, tileOps)
}
由此可以看出LoadRasterDefinition(LayerId(name))完成的就是获取一个Op[RasterDefinition]对象。
通过此方法经过N步的追踪之后终于在DataSource类中找到了这么一个方法
def getRasterLayer(name:String):Option[RasterLayer] = layers.get(name)
有戏,看方法名字就知道是获得栅格层,那么主要就在layers身上了,layers怎么来的呢,上面有定义
private def initDirectory(d:File) {
val skipDirectories = mutable.Set[String]()
for(f <- d.listFiles
.filter(_.isFile)
.filter(_.getPath.endsWith(".json"))) {
// It's a JSON file
// which may contain layer metadata,
// or we just ignore it.
RasterLayer.fromFile(f) match {
case Success(layer) =>
layers(layer.info.id.name) = layer
// Skip the tile directory if it's a tiled raster.
layer match {
case tl:TileSetRasterLayer =>
skipDirectories.add(new File(tl.tileDirPath).getAbsolutePath)
case _ =>
}
case Failure(e) =>
System.err.println(s"[ERROR] Skipping ${f.getPath}: $e")
}
} // Recurse through subdirectories. If a directory was marked
// as containing a tile set, skip it.
for(subdir <- d.listFiles
.filter(_.isDirectory)
.filter(f => !skipDirectories.contains(f.getAbsolutePath))) {
initDirectory(subdir)
}
}
看到这个是不是就豁然开朗了,原来这里是直接扫描给定的文件夹下的所有json文件,那么这个路径是怎么传进来的呢?找了半天未能找到何时传入了d(即数据路径),不过改变demo中的data文件夹的名字发现报错,并未能成功加载数据,说明是某个地方传入了该文件夹,然后通过查找log发现是GeoTrellis类中报的错,通过分析可以看出其默认获取resource文件夹中的application.conf中的
geotrellis.catalog配置信息,该信息的值为data/catalog.json,此文件具体存在,其中内容如下
{
"catalog": "Catalog of Chattanooga data",
"stores": [
{
"store": "chatta:albers",
"params": {
"type": "fs",
"path": "arg_albers",
"cacheAll": "yes"
}
},
{
"store": "chatta:wm",
"params": {
"type": "fs",
"path": "arg_wm",
"cacheAll": "yes"
}
}
]
}

由此可以看出该文件完成了Catalog类和DataSource类定义的实例,而上文中讲到框架正是通过此类来加载数据。
这应当就是GeoTrellis框架读取数据的方式,即在application.conf配置一个catalog.json文件的地址,然后在catalog.json文件记录具体的DataSource信息,通过此信息来获取数据。
通过分析使用GeoTrellis框架下的多个demo可以发现均有catalog的踪迹,这应当是GeoTrellis读取数据的机制,catlog具体的工作模式还需后续继续研读源代码。
本文讲的比较乱,只是读demo的一点心得,后续如果有更好的想法也会随时进行修改完善。
下一步准备在此demo的基础上实现实时切割dem数据进行显示,后续心得会在总结之后继续发布到博客中。 相关链接:
一、geotrellis使用初探
二、geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探的更多相关文章

  1. ENVI二次开发模式下的Landsat数据读取

    从usgs网站或者马里兰大学下载TM或Landsat原始数据,数据可能包括9个tif数据,两个txt文件和一个gtf文件.示例结构如下: ENVI下可以直接打开*_MTL.txt文件打开,打开后波段列 ...

  2. geotrellis使用(二十五)将Geotrellis移植到spark2.0

    目录 前言 升级spark到2.0 将geotrellis最新版部署到spark2.0(CDH) 总结 一.前言        事情总是变化这么快,前面刚写了一篇博客介绍如何将geotrellis移植 ...

  3. geotrellis使用(二十三)动态加载时间序列数据

    目录 前言 实现方法 总结 一.前言        今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...

  4. geotrellis使用(三十八)COG 写入和读取

    前言 上一篇中简单介绍了 COG 的概念和 Geotrellis 中引入 COG 的原因及简单的原理,本文为大家介绍如何在 Geotrellis 中使用 COG 来写入和读取 GeoTIFF数据. 一 ...

  5. ThinkPHP框架整合phpqrcode生成二维码DEMO

    ThinkPHP框架发展到今天功能已经变得是非常强大了,但是ThinkPHP框架中没有二维码相关的库,因此我们可以通过整合phpqrcode来完成生成二维码的功能.想使用phpqrcode首先就要把p ...

  6. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  7. Java学习-028-JSON 之二 -- 数据读取

    JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...

  8. 第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据

    第一百二十七节,JavaScript,JSON数据类型转换,数据转换成字符串,字符串转换成数据 学习要点: 1.JSON语法 2.解析和序列化 前两章我们探讨了XML的结构化数据,但开发人员还是觉得这 ...

  9. PHP 二维数组根据某个字段按指定排序方式排序

    /** * 二维数组根据某个字段按指定排序方式排序 * @param $arr array 二维数组 * @param $field string 指定字段 * @param int $sort_or ...

随机推荐

  1. js判断undefined类型

    js判断undefined类型 if (reValue== undefined){    alert("undefined");    }  发现判断不出来,最后查了下资料要用ty ...

  2. Java的四种引用方式

    一.引用基本概念 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用.虚引用. 1.强引用(StrongRef ...

  3. Putty部署tomcat

    webserver下是tomcatprojects放置项目源代码webapp下放置项目 1. 输入地址栏 登入进去32 192.168.1.32 端口号22 2.进入projects文件夹 cd pr ...

  4. [ios]利用alertView 插入数据都数据库。笔记

    利用alertView 插入数据都数据库 -(void)addItemToList { UIAlertView *alter=[[UIAlertViewalloc]initWithTitle:@&qu ...

  5. Usaco*Brownie Slicing

    Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C <= 500)个小的巧克力蛋糕组成的. 第i行,第j列的蛋糕有N_ij(1 <= N_ ...

  6. 猥琐的wordpress后门分享

    https://www.t00ls.net/thread-37312-1-1.html 一个可以自动调用管理员帐号登录wordpress后台的方法. <?php require('../../. ...

  7. FIR on Hadoop using hadoop-streaming

    1.Prepare Hadoop Streaming Hadoop streaming allows you to create and run Map/Reduce jobs with any ex ...

  8. Oracle EBS - PO Approval

    PO Approval Except Standard Flow: 1. Personal setting

  9. Eclipse上安装GIT插件EGit及使用

    一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2-win32.zip(在Eclipse3.3版本找不到对应的 EGit插件,无法安装) E ...

  10. Linq 那些事儿

    今天突然好奇当linq进行循环遍历的时候,如果满足条件的时候还会不会继续循环剩余的数据,做了个小实验. 首先看看上代码 这个是测试的类 public class TestLinq { int _Num ...