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');
代码解释:
-
导入数据集:
- 导入了2010年的街区数据集(Census Blocks),2016年的道路数据集,以及一个名为“SFneighborhoods”的旧金山邻居区数据集。
-
定位和筛选地理数据:
- 通过
sfNeighborhoods.geometry()
获取旧金山邻居区的地理范围,并以此为中心设置地图视图。 - 使用这个范围来筛选街区数据,只保留旧金山边界内的街区数据。
- 通过
-
显示旧金山的街区数据:
- 在地图上以单一颜色(红色)显示这些筛选后的街区数据。
-
计算人口密度:
- 在处理街区数据集时,为每个街区添加了两个新字段:
area_sqmi
(面积,单位为平方英里)和pop_density
(人口密度)。 - 计算每个街区的面积,并从属性
pop10
获取2010年的人口总数,以此计算人口密度。
- 在处理街区数据集时,为每个街区添加了两个新字段:
-
统计和可视化人口密度:
- 计算了人口密度的统计数据并打印出来。
- 使用
empty.paint()
方法将人口密度数据“绘制”到一个空白图像上,以便于在地图上显示。 - 定义了一个颜色渐变的调色板,用不同的颜色代表不同的人口密度区间,以视觉方式展示人口密度的地理分布。
-
最终展示:
- 将人口密度图层添加到地图上,使用事先定义的视觉参数(颜色、最小和最大值等)来控制展示效果。
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());
分类:
2-GEE
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了