geotrellis使用(十一)实现空间数据库栅格化以及根据属性字段进行赋值
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html
目录
一、前言
前面写了一篇文章(geotrellis使用(八)矢量数据栅格化)讲解了如何使用Geotrellis将Shape文件栅格化,并许下了后续会写一篇文章讲解空间数据库栅格化的诺言,周末虽然不是闲来无事,但是也得抽出时间兑现自己的诺言,就认认真真的折腾了一番,总算完成了,遂记录之。
二、安装空间数据库
目前有许多数据库添加了空间支持,如SQLSERVER、Postgre、Sqlite等,本文选择开源的Postgre,其空间支持名称为PostGis。
网上讲解Postgre安装的文章很多,在这里主要强调两点。
- 在安装完
Postgre之后,要点击Application Stack Builder选择Spatial Extensions安装空间扩展。 - 在创建数据库的时候需要选择空间模板,否则数据库不支持空间操作。
三、空间数据库栅格化
3.1 添加Postgre驱动
由于项目采用sbt框架,所以只需要在build.sbt文件中添加一句libraryDependencies += "org.postgresql" % "postgresql" % "9.4.1208"即可,此处给大家提供一个网站可以查询常用jar包的sbt添加方式,链接为http://search.maven.org。
3.2 连接Postgre
此处只用到最基本的读取数据库,代码如下:
var url = "jdbc:postgresql://localhost:5432/dbName"
var conn: Connection = null
try {
conn = DriverManager.getConnection(url, "user", "pass")
val statemnt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
val rs = statemnt.executeQuery("select * from tablename")
while (rs.next()) {
rs.getString("columnName")
}
}
catch {
case e: Throwable => println(e.getMessage)
}
conn.close
其中
dbName表示空间数据库名称,user表示用户名,pass表示密码,tablename表示表名,columnName表示要取的字段名。
3.3 读取空间数据
此处需要先准备空间数据,具体不在这里赘述,简单的方式可以将shape file直接导入到数据库中。然后查看空间字段名称,一般为geom。
其实读取空间数据与读取普同数据相同,只需要更改一下select语句,给需要读取的空间字段添加一个st_astext函数即可,如select st_astext(geom) as geom from tablename,这样采用rs.getString("geom")读出来的就是一个WKT字符串,后续处理与之前介绍的Shape file栅格化相同。
四、根据属性字段进行赋值
在geotrellis使用(八)矢量数据栅格化一文中介绍的栅格化方式只能给栅格化后的空间对象赋同一个值,无论是Shape file还是空间数据库,有时候往往需要读取另一个属性(字段),并将此属性的值作为空间对象栅格化后的值。其实现方式与之前的方式基本相同,主要存在两点不同:
- 需要多读取一个属性值
- 每个空间属性根据此值赋值
4.1 读取字段值
读取与空间字段相同,需要注意的是要与空间字段的值一一对应,可以采用Map或者自定义类(包含Geometry对象和值对象)的方式进行关联。
4.2 为空间属性赋值
之前介绍的栅格化方式是使用Rasterizer.rasterizeWithValue(features, re, value)直接为所有空间对象赋同一个值value,此处需要为每个对象赋不同的值,可以采用以下方式:
val tile = ByteArrayTile.fill(byteNODATA, re.cols, re.rows)
for (feature <- features) {
Rasterizer.foreachCellByGeometry(feature.geometry, re) { (col, row) => tile.set(col, row, Math.round(feature.value).toInt) }
}
此处的
feature是自己定义的一个类,具体为case class VectorData(geometry: Geometry, value: Double)。
具体实现原理是:先新建一个Tile类型对象,然后循环每个空间对象,调用Rasterizer类中的foreachCellByGeometry方法,其定义如下:def foreachCellByGeometry(geom: Geometry, re: RasterExtent)(f: (Int, Int) => Unit)。这里采用柯里化函数的方式,f表示为空间对象赋值的函数,这里为其赋值为(col, row) => tile.set(col, row, Math.round(feature.value).toInt),即为tile的(col, row)坐标点赋值为对应的属性值。
五、总结
以上就是利用周末时间完成的读取空间数据库栅格化以及为空间对象赋对应的其他字段的值的实现方法,都很基础。但是万丈高楼原地起,只有经过一点点的积累,一点点的努力方能成就你的伟岸高楼。周末愉快!
geotrellis使用(十一)实现空间数据库栅格化以及根据属性字段进行赋值的更多相关文章
- 去除ArcMap连接空间数据库中多余的属性表
这个操作目前可能不具有可行性,但是为了完整性还是在下面讲一下吧.如有兴趣的小伙伴,可以按照下面的操作方式去尝试. 一.需求 去除ArcMap连接空间数据库中多余的属性表. PL/SQL中查询得到的内容 ...
- [小问题笔记(十一)] SQL SERVER 将可空字段改为 NOT NULL不可为空的两个方法
一个字段里面有一些数据是NULL是很讨厌的,写查询麻烦不说,最重要的is null 或者is not null都是不能命中索引的,会导致全表扫描啊. 所以对于一个已经存在NULL的字段,有时间的话最 ...
- 快学Scala 第二十一课 (初始化trait的抽象字段)
初始化trait的抽象字段: trait Logged { println("Logged constructor") def log(msg: String){ println( ...
- 二十一、JavaScript之访问对象属性
一.代码如下 二.执行效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" cont ...
- 第十一篇:vue.js监听属性(大作业进行时)
这个知识点急着用所以就跳过<计算属性>先学了 首先理解一下什么是监听:对事件进行监控,也就是当我进行操作(按了按钮之类的事件)时,会有相应的事情发生 上代码 <div id = &q ...
- Geotrellis系列文章链接
本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...
- geotrellis使用(三十)使用geotrellis读取PostGIS空间数据
前言 最近事情很多,各种你想不到的事情--such as singing and dancing--再加上最近又研究docker上瘾,所以geotrellis看上去似乎没有关注,其实我一直在脑中思考着 ...
- Python GDAL矢量转栅格详解
前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(X,Y)转换到格网坐标(I,J),线栅格化方法主要有DDA算法.Bresenham算法等, ...
- geotrellis使用(八)矢量数据栅格化
目录 前言 栅格化处理 总结 参考链接 一.前言 首先前几天学习了一下Markdown,今天将博客园的编辑器改为Markdown,从编写博客到界面美观明显都清爽多了,也能写出各种样式的东 ...
随机推荐
- Android带边框表格的实现
最近做项目需要用到表格,数据是动态指定的,本来用GridView是很方便的,可是老大不同意用这么重量级的控件,想办法吧. 做表格很容易想到用TableLayout,那就自定义一个来搞. 一.表格最蛋疼 ...
- 关于英语PETS5备考的一些事
首先,自我介绍一下,我叫万世想,目前国内某985高校CS硕士在读,在现代软件工程课上,接触到了博客园,之前是自己在新浪云上用WP简单搭了自己的博客,但是都没有坚持下来.希望自己能够在博客园大家庭中,与 ...
- mailto
什么是mailto链接? mailto链接是一种html链接,能够设置你电脑中邮件的默认发送信息.但是需要你电脑中安装默认的E-mail软件,类似Microsoft Outlook等等.加入您已经安装 ...
- bzoj3380+3381+3382+3383 Usaco2004 Open
四道比较水的题 T1:SPFA+状压 #include<stdio.h> #include<string.h> #include<algorithm> #inclu ...
- Redis 排行榜 相同分数根据时间优先排行
版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 需求 Redis 提供了按分数进行排序的有序集合. 比如在游戏里面,比如战斗力排行,充值排行,用默认的Redis 实现就可以达到需求. ...
- PHP uniqid 高并发生成不重复唯一ID
http://www.51-n.com/t-4264-1-1.html PHP uniqid()函数可用于生成不重复的唯一标识符,该函数基于微秒级当前时间戳.在高并发或者间隔时长极短(如循环代码)的情 ...
- [转]html5表单上传控件Files API
表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:< ...
- SQL Server 求结果
;with cte as ( select CONVERT(DATE, DATEADD(DAY, -9, GETDATE())) as paytime union all select datead ...
- Lua pureMVC
分享一个lua语言版本的pureMVC. 这个是一个根据AS3(ActionScript 3) pureMVC而转换过来的lua pureMVC.所有的接口完全跟AS3版本一致,本来是想用在项目之中的 ...
- AWS 免费套餐
AWS 免费套餐 转载自:https://aws.amazon.com/cn/free/?sc_channel=PS&sc_campaign=acquisition_CN&sc_pub ...