目录

  1. 前言
  2. 栅格化处理
  3. 总结
  4. 参考链接

一、前言

       首先前几天学习了一下Markdown,今天将博客园的编辑器改为Markdown,从编写博客到界面美观明显都清爽多了,也能写出各种样式的东西了,有关Markdown,网上内容很多,暂且不表,开始进入今天的主题。

       前几天碰到一个任务,需要将矢量数据导入到Accumulo中,然后通过geotrellis进行调用。这一下又犯难了,之前处理的全是raster数据,通过ETL类可以直接进行导入生成金字塔等,如何将矢量数据导入平台之前未曾碰到,但是大致分析首先需要进行栅格化,因为栅格化之后就可以直接使用Geotrellis进行处理,矢量数据栅格化之前也未遇到过,解决问题就要一步步来,一步步分析,下面就为大家讲解我本次实现的过程。

二、栅格化处理

       要想栅格化第一步肯定需要读取矢量数据。

读取矢量数据

本文中主要讲解shapefile,数据库部分后面讲解。

       首先浏览Geotrellis的源代码,发现一个ShapeFileReader类,貌似直接能解决问题啊,赶紧写代码如下:

  1. geotrellis.shapefile.ShapeFileReader.readSimpleFeatures(path)

       满心欢喜的以为一句话就解决问题了,谁知道一直报如下错误:

  1. The following locker still has a lock: read on file:..shp by org.geotools.data.shapefile.shp.ShapefileReader
  2. The following locker still has a lock: read on file:..shx by org.geotools.data.shapefile.shp.IndexFile
  3. The following locker still has a lock: read on file:...dbf by org.geotools.data.shapefile.dbf.DbaseFileReader
  4. Exception in thread "main" java.lang.IllegalArgumentException: Expected requestor org.geotools.data.shapefile.dbf.DbaseFileReader@4ea5b703 to have locked the url but it does not hold the lock for the URL

       实验了各种方法无果,那么看一下他的源代码,然后直接拿过来用,发现可以,代码如下:

  1. /**
  2. * get the features from shape file by the attrName,default "the_geom"
  3. * @param path
  4. * @return mutable.ListBuffer[Geometry]
  5. */
  6. def getFeatures(path: String, attrName: String = "the_geom", charset: String = "UTF-8"): mutable.ListBuffer[Geometry] ={
  7. val features = mutable.ListBuffer[Geometry]()
  8. var polygon: Option[MultiPolygon] = null
  9. val shpDataStore = new ShapefileDataStore(new File(path).toURI().toURL())
  10. shpDataStore.setCharset(Charset.forName(charset))
  11. val typeName = shpDataStore.getTypeNames()(0)
  12. val featureSource = shpDataStore.getFeatureSource(typeName)
  13. val result = featureSource.getFeatures()
  14. val itertor = result.features()
  15. while (itertor.hasNext()) {
  16. val feature = itertor.next()
  17. val p = feature.getProperties()
  18. val it = p.iterator()
  19. while (it.hasNext()) {
  20. val pro = it.next()
  21. if (pro.getName.getLocalPart.equals(attrName)) {
  22. features += WKT.read(pro.getValue.toString) //get all geom from shp
  23. }
  24. }
  25. }
  26. itertor.close()
  27. shpDataStore.dispose()
  28. features
  29. }

       实验中的shape文件包含一个字段the_geom,里面存储了空间信息的WKT语句,所以程序中读出该属性的值然后使用WKT.read(pro.getValue.toString)将其转换成Geometry对象。

注意最后需要添加shpDataStore.dispose()否则会同样报上述文件锁定的错误,所以我猜测此处应该是Geotrellis的一个bug。

通过上述可以得出其实通过数据库读取矢量数据也只是个驱动的问题,只要将需要的记录逐行读出然后转化为Geometry对象即可,后面会通过一篇博客详细说明。

       读出了矢量数据后,紧接着就是将数据映射到栅格图像上。

将Geometry数组对象进行栅格化

获取Geometry数组对象的空间范围RasterExtent

       栅格化后的数据仍然包含了投影、空间范围等空间信息以及分辨率、图像尺寸等栅格信息,所以我们要先根据Geometry数组求出这些信息。

  • 获取经纬度范围

       一个简单的循环遍历所有要素比较最大最小值的方法,代码如下:

  1. var minX = features(0).jtsGeom.getEnvelopeInternal.getMinX
  2. var minY = features(0).jtsGeom.getEnvelopeInternal.getMinY
  3. var maxX = features(0).jtsGeom.getEnvelopeInternal.getMaxX
  4. var maxY = features(0).jtsGeom.getEnvelopeInternal.getMaxY
  5. for (feature <- features) {
  6. if (feature.jtsGeom.getEnvelopeInternal.getMaxX > maxX)
  7. maxX = feature.jtsGeom.getEnvelopeInternal.getMaxX
  8. if (feature.jtsGeom.getEnvelopeInternal.getMaxY > maxY)
  9. maxY = feature.jtsGeom.getEnvelopeInternal.getMaxY
  10. if (feature.jtsGeom.getEnvelopeInternal.getMinX < minX)
  11. minX = feature.jtsGeom.getEnvelopeInternal.getMinX
  12. if (feature.jtsGeom.getEnvelopeInternal.getMinY < minY)
  13. minY = feature.jtsGeom.getEnvelopeInternal.getMinY
  14. }
  • 计算栅格化后的图像尺寸

       栅格图像包含分辨率、像素大小、cols、row等要素,在这里我简单的理解为可以根据矢量数据的经纬度范围差除以分辨率来得到cols、rows,通过查阅资料可以发现当zoom(表示瓦片的层级)为22时,分辨率为0.037323,所以这里可以简单的算出其他层级的分辨率如下:

  1. val resolution = 0.037323 * Math.pow(2, 22 - zoom)

       得到了分辨率后即可用范围差除以分辨率得到图像尺寸。

此处需要注意图像的空间参考,若参考不同时需要进行投影转换:val res1 = Reproject((minX, minY), LatLng, WebMercator)

  • 得到RasterExtent
  1. RasterExtent(new Extent(minX, minY, maxX, maxY), cols, rows)

栅格化

       经过查阅Geotrellis的源代码以及咨询官方大牛,大概明白了可以使用Rasterizer类进行栅格化操作,其实也很简单,只需要一句代码如下:

  1. Rasterizer.rasterizeWithValue(features, re, 100)

       其中features即从shp文件中读出的Geometry数组,re为上文中得到的RasterExtent,100表示将这些对象在栅格中赋予的像素值。

       栅格化效果如下:

       矢量数据

       栅格化数据

三、总结

       通过以上代码便完成了栅格化操作,看似没几行代码,确确实实也折腾了很久,主要是对Geotrellis的源代码还不够熟悉,对一些基础的地理空间信息知识掌握还不够到位。

四、参考链接

一、geotrellis使用初探

二、geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

三、geotrellis使用(三)geotrellis数据处理过程分析

四、geotrellis使用(四)geotrellis数据处理部分细节

五、geotrellis使用(五)使用scala操作Accumulo

六、geotrellis使用(六)Scala并发(并行)编程

七、geotrellis使用(七)记录一次惨痛的bug调试经历以及求DEM坡度实践

八、geotrellis使用(八)矢量数据栅格化

geotrellis使用(八)矢量数据栅格化的更多相关文章

  1. geotrellis使用(十)缓冲区分析以及多种类型要素栅格化

    目录 前言 缓冲区分析 多种类型要素栅格化 总结 参考链接 一.前言        上两篇文章介绍了如何使用Geotrellis进行矢量数据栅格化以及栅格渲染,本文主要介绍栅格化过程中常用到的缓冲区分 ...

  2. geotrellis使用(十一)实现空间数据库栅格化以及根据属性字段进行赋值

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 安装空间数据库 空间数据库栅格化 根据属性字段进行赋 ...

  3. Geotrellis系列文章链接

    本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...

  4. geotrellis使用(九)使用geotrellis进行栅格渲染

    目录 前言 图像渲染 总结 参考链接 一.前言        前面几篇文章讲解了如何使用Geotrellis进行数据处理.瓦片生成等,今天主要表一下如何使用Geotrellis进行栅格渲染.     ...

  5. geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言     ...

  6. geotrellis使用(三十四)矢量瓦片技术研究——矢栅一体化

    前言 本文所涉及技术与Geotrellis并无太大关系,仅是矢量瓦片前端渲染和加载技术,但是其实我这是在为Geotrellis的矢量瓦片做铺垫.很多人可能会说,Geotrellis为什么要搞矢量瓦片, ...

  7. Python GDAL矢量转栅格详解

    前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(X,Y)转换到格网坐标(I,J),线栅格化方法主要有DDA算法.Bresenham算法等, ...

  8. 部分GDAL工具功能简介

    主要转自http://blog.csdn.net/liminlu0314?viewmode=contents 部分GDAL工具功能简介 gdalinfo.exe 显示GDAL支持的各种栅格文件的信息. ...

  9. geotrellis使用(二十八)栅格数据色彩渲染(多波段真彩色)

    目录 前言 实现过程 总结 一.前言        上一篇文章介绍了如何使用Geotrellis渲染单波段的栅格数据,已然很是头疼,这几天不懈努力之后工作又进了一步,整清楚了如何使用Geotrelli ...

随机推荐

  1. eclipse导入项目出现叹号处理方法:

    1.选中该项目名称,单击右键 2.点击Properties 3.选中Java Build Path 4. 5. 6. 7.出现红叉的解决办法 8. 9. 10. 11. 12. 按照以上步骤操作就可以 ...

  2. Python之路Day16--JavaScript(二)

    本节内容: 1.上节内容回顾 2.JavaScript补充 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 一.上节内容回顾 1.作业问题: a.页面布局不好 ...

  3. git 常用操作命令

    A. 新建Git仓库,创建新文件夹git init B. 添加文件到git索引git add <filename>  --- 单个文件添加git add * --- 全部文件添加 C. 提 ...

  4. 10分钟学会前端调试利器——FireBug

    概述 FireBug是一个用于网站前端开发的工具,它是FireFox浏览器的一个扩展插件.它可以用于调试JavaScript.查看DOM.分析CSS.监控网络流量以及进行Ajax交互等.它提供了几乎前 ...

  5. php函数类型

    静态变量: <?php function calcute(){ static $num =10; $num = $num+2; echo $num."<br>"; ...

  6. bzoj 2739 最远点

    Description 给你一个N个点的凸多边形,求离每一个点最远的点. Input 本题有多组数据,第一行一个数T,表示数据组数. 每组数据第一行一个数N,表示凸多边形点的个数,接下来N对数,依次表 ...

  7. Expert 诊断优化系列------------------语句调优三板斧

    前面三篇通过CPU.内存.磁盘三巨头,讲述了如何透过现在看本质,怎样定位服务器三巨头反映出的问题.为了方便阅读给出链接: SQL SERVER全面优化-------Expert for SQL Ser ...

  8. 日志系统实战(三)-分布式跟踪的Net实现

    介绍 在大型系统开发调试中,跨系统之间联调开始变得不好使了.莫名其妙一个错误爆出来了,日志虽然有记录,但到底是哪里出问题了呢? 是Ios端参数传的不对?还是A系统或B系统提供的接口导致?相信有不少人遇 ...

  9. 《CLR.via.C#第三版》第二部分第10,11章节读书笔记(五)

    第10章是对 属性 做阐述 属性本质上是方法 匿名类型的使用: }; Console.WriteLine("Name={0},Year={1}",o1.Name,o1.Year); ...

  10. 关于大型网站技术演进的思考(十九)--网站静态化处理—web前端优化—上(11)

    网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是应该归属于web服务端的技术范畴还是应该归属 ...