GEE C25 高级矢量运算

主要内容

介绍GEE中可视化和处理矢量的高级技巧。

 1、可视化要素集;

一、可视化要素集

1.可使用的函数

Map.addLayer:

draw:

paint:

style:

2.创建等值线图Choropleth Map

复制代码
var blocks = ee.FeatureCollection('TIGER/2010/Blocks'); 
var roads = ee.FeatureCollection('TIGER/2016/Roads'); 
var sfNeighborhoods = ee.FeatureCollection( 
    'projects/gee-book/assets/F5-0/SFneighborhoods'); 
var geometry = sfNeighborhoods.geometry(); 
Map.centerObject(geometry); 
// Filter blocks to the San Francisco boundary. 
var sfBlocks = blocks.filter(ee.Filter.bounds(geometry)); 

// Visualize with a single color. 
Map.addLayer(sfBlocks, { 
    color: '#de2d26' 
}, 'Census Blocks (single color)'); 

//人口普查块表有一个名为“pop10”的属性,其中包含2010年人口普查的人口总数。
//我们可以用它来创建一个显示人口密度的等值线图。
// Add a pop_density column. 
var sfBlocks = sfBlocks.map(function(f) { 
    // Get the polygon area in square miles. 
    var area_sqmi = f.area().divide(2.59e6); 
    var population = f.get('pop10'); 
    // Calculate population density. 
    var density = ee.Number(population).divide(area_sqmi); 
    return f.set({ 
        'area_sqmi': area_sqmi, 
        'pop_density': density 
    }); 
}); 


// Calculate the statistics of the newly computed column. 
var stats = sfBlocks.aggregate_stats('pop_density'); 
print(stats);

// Create an empty image into which to paint the features. 
// Cast to 32-bit integer which supports storing values 
// up to 2,147,483,647. 
var empty = ee.Image().int32(); 

var sfBlocksPaint = empty.paint({ 
    featureCollection: sfBlocks, 
    color: 'pop_density', 
});

var palette = ['fee5d9', 'fcae91', 'fb6a4a', 'de2d26', 'a50f15']; 
var visParams = { 
    min: 0, 
    max: 50000, 
    palette: palette 
}; 
Map.addLayer(sfBlocksPaint.clip(geometry), visParams, 'Population Density');
复制代码

代码解释:

  1. 导入数据集:

    • 导入了2010年的街区数据集(Census Blocks),2016年的道路数据集,以及一个名为“SFneighborhoods”的旧金山邻居区数据集。
  2. 定位和筛选地理数据:

    • 通过sfNeighborhoods.geometry()获取旧金山邻居区的地理范围,并以此为中心设置地图视图。
    • 使用这个范围来筛选街区数据,只保留旧金山边界内的街区数据。
  3. 显示旧金山的街区数据:

    • 在地图上以单一颜色(红色)显示这些筛选后的街区数据。
  4. 计算人口密度:

    • 在处理街区数据集时,为每个街区添加了两个新字段:area_sqmi(面积,单位为平方英里)和pop_density(人口密度)。
    • 计算每个街区的面积,并从属性pop10获取2010年的人口总数,以此计算人口密度。
  5. 统计和可视化人口密度:

    • 计算了人口密度的统计数据并打印出来。
    • 使用empty.paint()方法将人口密度数据“绘制”到一个空白图像上,以便于在地图上显示。
    • 定义了一个颜色渐变的调色板,用不同的颜色代表不同的人口密度区间,以视觉方式展示人口密度的地理分布。
  6. 最终展示:

    • 将人口密度图层添加到地图上,使用事先定义的视觉参数(颜色、最小和最大值等)来控制展示效果。

 

3.创建分类图 categorical map(draw  style)

复制代码
var blocks = ee.FeatureCollection('TIGER/2010/Blocks'); 
var roads = ee.FeatureCollection('TIGER/2016/Roads'); 
var sfNeighborhoods = ee.FeatureCollection( 
    'projects/gee-book/assets/F5-0/SFneighborhoods'); 
var geometry = sfNeighborhoods.geometry(); 

// Filter roads to San Francisco boundary. 
var sfRoads = roads.filter(ee.Filter.bounds(geometry)); 
Map.addLayer(sfRoads, { 
    color: 'blue' 
}, 'Roads (default)');

// Visualize with draw(). 
var sfRoadsDraw = sfRoads.draw({ 
color: 'blue', 
strokeWidth: 1 
}); 
Map.addLayer(sfRoadsDraw, {}, 'Roads (Draw)');

var styles = ee.Dictionary({ 
    'S1100': { 
        'color': 'blue', 
        'width': 3 
    }, 
    'S1200': { 
        'color': 'green', 
        'width': 2 
    }, 
   'S1400': { 
        'color': 'orange', 
        'width': 1 
    } 
}); 

var defaultStyle = { 
    color: 'gray', 
    'width': 1 
}; 

var sfRoads = sfRoads.map(function(f) { 
    var classcode = f.get('mtfcc'); 
    var style = styles.get(classcode, defaultStyle); 
    return f.set('style', style); 
});

var sfRoadsStyle = sfRoads.style({
    styleProperty: 'style'
});
Map.addLayer(sfRoadsStyle.clip(geometry), {}, 'Roads (Style)');

 
复制代码

 

 

二、Joins with Feature Collections

地球引擎被设计成一个处理栅格数据的平台,这就是它的亮点所在。多年来,它已经获得了高级的矢量数据处理能力。连接是较难掌握的技能之一,但这样做将帮助您在Earth Engine中执行许多复杂的分析任务。

  • ee.Filters
    • ee.Filter.equals
    • ee.Filter.withinDistance
  • Join type
    • simple join
    • inner join
    • save-all join

2.1  通过位置选择

复制代码
//选择旧金山州际公路1公里范围内的所有街区。
var blocks = ee.FeatureCollection('TIGER/2010/Blocks'); 
var roads = ee.FeatureCollection('TIGER/2016/Roads'); 
var sfNeighborhoods = ee.FeatureCollection( 
    'projects/gee-book/assets/F5-0/SFneighborhoods'); 
var geometry = sfNeighborhoods.geometry(); 
Map.centerObject(geometry); 
// Filter blocks and roads to San Francisco boundary. 
var sfBlocks = blocks.filter(ee.Filter.bounds(geometry)); 
var sfRoads = roads.filter(ee.Filter.bounds(geometry));

var interstateRoads = sfRoads.filter(ee.Filter.eq('rttyp', 'I')); 

var sfBlocksDrawn = sfBlocks.draw({ 
    color: 'gray', 
    strokeWidth: 1 
    }).clip(geometry); 
Map.addLayer(sfBlocksDrawn, {}, 'All Blocks'); 

var interstateRoadsDrawn = interstateRoads.draw({ 
    color: 'blue', 
    strokeWidth: 3 
    }).clip(geometry); 
Map.addLayer(interstateRoadsDrawn, {}, 'Interstate Roads');

var joinFilter = ee.Filter.withinDistance({ 
    distance: 1000, 
    leftField: '.geo', 
    rightField: '.geo', 
    maxError: 10 
}); 

var closeBlocks = ee.Join.simple().apply({ 
    primary: sfBlocks, 
    secondary: interstateRoads, 
    condition: joinFilter 
});

var closeBlocksDrawn = closeBlocks.draw({ 
    color: 'orange', 
    strokeWidth: 1 
    }).clip(geometry); 
Map.addLayer(closeBlocksDrawn, {}, 'Blocks within 1km');
复制代码

 

2.2 空间连接(Spatial Joins)

 根据空间关系,查询两个矢量集合。举个例子:统计包含在多边形里面点的数量。

语法:

复制代码
var intersectFilter = ee.Filter.intersects({ 
    leftField: '.geo', 
    rightField: '.geo', 
    maxError: 10 
}); 


  var saveAllJoin = ee.Join.saveAll({
      matchesKey: 'trees',
  });

 

  var joined = saveAllJoin
    .apply(sfNeighborhoods, sfTrees, intersectFilter);
  print(joined.first());

 
复制代码

 

 

 

 

posted @   百里屠苏top  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示