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,从编写博客到界面美观明显都清爽多了,也能写出各种样式的东 ...
随机推荐
- ViewHolder优化2>:
ViewHoder优化: @Override public View getView(int position, View convertView, ViewGroup par ...
- day 2 Linux基础
6.用户.群组和权限 1) 新建用户natasha,uid为1000,gid为555,备注信息为"master" useradd natasha usermod -u1000 na ...
- git 常用操作命令
A. 新建Git仓库,创建新文件夹git init B. 添加文件到git索引git add <filename> --- 单个文件添加git add * --- 全部文件添加 C. 提 ...
- iOS 从某个页面返回然后刷新当前页面
-------->不说废话 在返回页面实现下面方法: - (void)navigationController:(UINavigationController*)navigationContro ...
- 树莓派pppoe
连接的网络是移动(铁通)的宽带,不同的宽带的dns需要修改. 1.首先安装pppoe包 apt-get install pppoe 2.然后,复制conf文件/etc/ppp/pppoe.conf: ...
- ant的安装及项目的发布
1.安装ant1) 直接解压apache-ant-1.9.7-bin 2) 在环境变量中配置,ant_home的环境变量在 3) 在命令提示符中测试是否安装成功. 2 项目首次打包1) 写好打包的配置 ...
- Ubuntu系统下lnmp环境搭建和Nginx多站点配置
最近需要使用Ubuntu作为服务器搭建Lnmp环境,顺便将操作过程写下来,与大家分享.如有不足之处,欢迎大家提出不同意见.(本文默认读者已经熟悉相关linux命令的使用,比如创建文件和文件夹,编辑文件 ...
- GiuHub 使用
一 Mac 能不能连接安卓手机 1 USB数据线 设置 > 通用 > 开发人员选项 > USB调试 > 选择"相机PTP模式" 连接后,手机中的照片和视 ...
- 游戏编程技巧 - Subclass Sandbox
Subclass Sandbox 使用场景 你正在开发一款类似LOL的游戏,里面有许多英雄角色,你决定把这些英雄类交给小弟们实现.因为在这些英雄中,释放放技能时,有的要使用粒子系统造成炫酷的效果,有的 ...
- OC整理1
关于面向对象 看起来简单,好好体会其实有点深奥,初学的时候更感觉抽象,可能由于开发经验不足的关系吧,很难体会到面向对象的精髓. 放轻松,我们来用最直白得方式来探讨一下面向对象. 首先,编程是为了用计算 ...