Google Earth Engine(GEE):栅格数据集转矢量数据集(reduceToVectors),并对矢量数据集新增字段并标号

目录

栅格转矢量

给转好的矢量数据集编号


栅格转矢量

        想把影像转成矢量,会用到这个函数,reduceToVectors。如果是相对一个ImageCollection都转成矢量,那么要使用map(function())。这里假设大家都懂map(function())的使用了,代码如下:

var fun = function(img){
  var geo = img.reduceToVectors({
        reducer: ee.Reducer.countEvery(), 
        geometry: yuegangao.geometry(), 
        scale: 1000,
        maxPixels: 1e8}) //FeatureCollection (11 elements, 3 columns)
        
  var addArea = geo.map(function(f0) {
    var areakm = f0.area(1000).divide(1000 * 1000);
    var count_temp = f0.get('count')
    return f0.set({area:areakm,index:count_temp});
    }); // add the properties:area, to eliminate the small polygon
    
  var final = addArea.sort("area",false).first();//select the largest
  return final 
}  
var citys_geo=citys.map(fun); //FeatureCollection (3 elements)

        代码里面的最后两句是调用上面那个超级长的函数,citys是imagecollection类型的数据,运行的结果就是得到了featurecollection,运行的结果如下图的左边那个图所示。

        现在来讲这个function里面的细节!

        (1)一定要调reduceToVectors的scale!尤其是如果出现了什么请设置最大容差或者超出算力这种报错,基本上来说就是你没有设置scale或者设置得太小了!这时候就要把scale调大一点。因为这里用的是MODIS数据,所以我就设置成了1000m,对应一下分辨率。geometry这个参数也一定要设置,不然也会报错!

        (2)我这里额外算了一下面积,这个非常关键!因为一般来说,用reduceToVectors转出来的矢量是很多块的!把image的边界分成了好多块(如果你的image的范围不是规则的)!但是,通过我的仔细观察发现,它转出来的这些碎片,其中只有一个非常的大,其他的都是很小的,基本只有一两个pixel,基本不影响结果。所以你就添加一个面积字段,计算面积,倒序sort一下,选出面积最大的保留就好。

给转好的矢量数据集编号

        这里用了一个很笨的方法,需要一点人工,但代码量很少也很直观,如果大家有更好的方法可以评论或者私信dd我~因为我转了一圈CSDN都没有找到结果,就自己来填这个坑了。

        在上面的代码的函数返回的时候,有一个:return f0.set({area:areakm,index:count_temp})的操作,这里之所以把像元数量赋给我们之后用到的index属性,是因为对于每一个矢量来说,基本上count(像元数量)是不重复的(如果重复的话那么这个方法不适用)。所以这里之前先print一下,看一下转出来的结果中,每一个矢量的count是不是都是不一样的,且分别是多少。之后我们将用到remap函数,给矢量数据集的每一个矢量的index字段重新赋值。这个函数的用法自己可以去搜一下,一句话解释就是:用一个列表,重新给指定的字段赋值。

         代码如下:

var old_label1 = ee.List([7535,7974,8297]);
var new_label1 = ee.List([2005,2015,2022]);

var city_remap = citys_geo.remap(old_label1,new_label1,'index');

        上面代码里面的old_label1是print里面的count数量。而new_label1是我自己加的一个index,就可以把编号写进去,大家可以改成1,2,3......。运行的结果就是上面那个图的右边的图!可以看到右边的index字段的值变成自己定义的了!

        如果想让代码变得更智能的话,可以写一个for循环,然后用迭代器来标上1,2,3......但我还是很不推荐GEE的for循环,所以就用了人工的方式。

        好啦!这期就到这里了!俺将持续更新GEE系列,关注不走丢!

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值