首页 > 编程知识 正文

缓冲区分为哪几种,定义缓冲区有几种方式

时间:2023-05-04 10:06:17 阅读:120210 作者:157

一、前言

在前两篇文章中,我们介绍了如何使用Geotrellis栅格化和栅格化矢量数据。 本文介绍光栅化过程中常用的缓冲区分析,以及光栅化同一范围内的多种类型的元素。

本文主要记录了当今过程中遇到的两个问题,第一个问题是线状要素在进行光栅化时只有单个像素,没有效果; 第二个问题是,同一地区的数据既包含面状要素,也包含线状要素,通常的方式只能光栅化为两组数据。 下面是解决这两个问题的方法。 当然,如果有更好的方法,欢迎交流。

二.缓冲区分析

百度百科中缓冲区分析的定义:

缓冲区分析是根据点、线和面的实体,自动创建其周围一定宽度范围内的缓冲区多边形图层,创建该图层与目标图层的重叠,进行分析,得到所需的结果。 是解决邻近性问题的空间分析工具之一。 接近度表示地理空间中两个图形的距离接近多少。

当然,它并没有教我们如何解决邻近性问题,只是简单说明了在光栅化过程中如何可以额外扩展一些像素。

自己实现扩展像素

因为我不是地理信息专家,(也不是电脑专家,没办法,只好投身代码农业,推销青春! ),所以遇到问题时,不知道缓冲区分析的高措辞。 首先想到的是在矢量化过程中可以向外扩展一些像素。 这样不就能起到强调的效果吗? 但是,有问题。 要知道线段的方向,我先来。 将线段点的上下左右像素全部设置为与修改点相同的值。 那样的话,就不用想方向了,应该会收到效果。

说干就干,再一次认真研究了Geotrellis的Reasterizer.scala的源代码,沉思了一会儿,想出了方法。 主要重写赋值的方法。 实现代码如下。

defrasterize(geom:geometry,rasterExtent: RasterExtent, value: Int () val cols=raster extent.cols valarray=array.of dim [ int ] ) raster extent.cols * raster extent.rows valaray row:int((array(row*colscol )=valueif ) col0) array (row * cols col-1 )=value if (col cols-1 ) array ) row=if(row0) array () row-1 ) colscol ) ) valueif ) rowrasterextent.rows-1 ) array ) row1) * cols col )=value rasteriritery rasterExtent ) Array tile (array ) array,rasterExtent.cols,rasterExtent.rows ) }简单来说,在以往的f函数中,array(row*colscol

得到的结果看起来有点丑,但总算解决了这个问题,然后把结果给上司看了。 上司什么都没说,默默地给我发了一个https://gitter.im/geo trellis/geo trellis/archives/2016/02/22的网站。 那么,老板果然是老板。 这里也介绍https://gitter.im/geo trellis/geo trellis /。 这是Github中的GeoTrellis项目交流群。 qkdxg咨询问题有时由懂的人和作者解答,对英语的基础有一点考验。

使用buffer函数

那个页面上面有这样的代码:

val points=seq (point (re.gridtomap (100,100 ) ).buffer (30 ),point (re.gridtomap ) 200,200 ) ).buffer ) point ) re.gridtomap ) 500,500 ) ).buffer ) 30 ) )基于这个代码,我们把它带来了一个特别仓促的实验,这是buffer名称,但其中有几个需要注意的问题

缓冲距离

这里的缓冲距离实际测试结果表明与当前数据的坐标系一致。 也就是说,如果是WGS84地理坐标系,这里的缓冲距离是纬度和经度单位,在测地系统中这里是米单位。

缓冲型

通常,您只需要将缓冲区用于点和线要素

可,这里就可以使用模式匹配,如下:

val geom = WKT.read(pro.getValue.toString) match { case geom: Point => geom.buffer(bufferDistance) case geom: Line => geom.buffer(bufferDistance) case geom: MultiLine => geom.buffer(bufferDistance).toGeometry().get case geom => geom }

这里就仅为Point、Line以及MultiLine类型进行了缓冲区设置,其他需要转换的可以用同样的方式进行匹配,展示一下最终的效果。

缓冲区分析

其实查看buffer函数的定义,不难发现该函数实现的就是将要点线要素转换成了面要素。

以上就实现了缓冲区分析,下面进行下一个主题多种类型要素栅格化。

三、多种类型要素栅格化
同一个区域数据即包含面状要素又包含线状要素,显然在shape文件中以及数据库中我们都没有办法将其进行合并,而如果我们又不想得到两套栅格化的数据该如何是好呢?

其实方法也很简单,只需要将要素拼接到同一个GeometryCollection中然后统一获取其RasterExtent即可,实现代码如下:

val features = mutable.ListBuffer[Geometry]() for (path <- paths) { val file = new File(path) if(file.exists()) { val shpDataStore = new ShapefileDataStore(new File(path).toURI().toURL()) shpDataStore.setCharset(Charset.forName(charset)) val featureSource = shpDataStore.getFeatureSource() val itertor = featureSource.getFeatures().features() while (itertor.hasNext()) { val feature = itertor.next() <span class="hljs-keyword">val</span> p = feature.getProperties() <span class="hljs-keyword">val</span> it = p.iterator() <span class="hljs-keyword">while</span> (it.hasNext()) { <span class="hljs-keyword">val</span> pro = it.next() <span class="hljs-keyword">if</span> (pro.getName.getLocalPart.equals(<span class="hljs-string">"the_geom"</span>)) {<span class="hljs-comment">//get all geom from shp</span> <span class="hljs-keyword">val</span> geom = <span class="hljs-type">WKT</span>.read(pro.getValue.toString) <span class="hljs-keyword">match</span> { <span class="hljs-keyword">case</span> geom: <span class="hljs-type">Point</span> =&gt; geom.buffer(resolution * bufferDistance) <span class="hljs-keyword">case</span> geom: <span class="hljs-type">Line</span> =&gt; geom.buffer(resolution * bufferDistance) <span class="hljs-keyword">case</span> geom: <span class="hljs-type">MultiLine</span> =&gt; geom.buffer(resolution * bufferDistance).toGeometry().get <span class="hljs-comment">//0.0054932 * 7</span> <span class="hljs-keyword">case</span> geom =&gt; geom } features += geom } } } itertor.close() shpDataStore.dispose() } <span class="hljs-keyword">else</span> println(<span class="hljs-string">s"the file <span class="hljs-subst">${path}</span> isn't exist"</span>)}

以上代码实现的是逐个循环需要栅格化的文件,然后将每个geometry对象添加到features中,剩下的在前面的文章中已经介绍过,不再赘述。

四、总结
以上讲述了如何进行缓冲区分析以及多种类型要素栅格化。虽然实现方法比较较难,但是在刚碰到这些问题的时候确实会让人摸不着头脑,本文简单记录之,仅为整理思路以及方便以后使用,如果能够帮助到一些苦苦探索的人当然是更好的。最后感谢在工作过程中给予了重大帮助和指导的等待的菠萝!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。