目录
栅格转矢量
想把影像转成矢量,会用到这个函数,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系列,关注不走丢!