Google Earth Engine怎么读?城乡规划GIS数据处理实战(附:GEE入门代码集)

编程与开发
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

Google Earth Engine怎么读?城乡规划GIS数据处理实战(附:GEE入门代码集)这篇文章面向刚接触云端遥感与GIS处理的城乡规划、国土空间规划和GIS学习者:先说清楚 Google Earth Engine 的读法和定位,再用几个能直接复用的 GEE 入门代码,完成行政区影像筛选、NDVI计算、建设用地识别、地表温度提取和结果导出。

Google Earth Engine 通常简称 GEE,英文可读作 “Google Earth Engine”,也常被国内用户直接读作 “G-E-E”。它不是传统桌面GIS软件,而是一个面向全球遥感数据和空间计算的云平台。对城乡规划GIS数据处理来说,GEE最大的价值是:不用先下载几十GB影像,就能在线筛选、计算、制图和导出结果。

Google Earth Engine城乡规划GIS数据处理与GEE入门代码流程图
GEE适合把遥感影像筛选、指数计算、空间统计和结果导出放在同一个云端流程中完成。

引言:Google Earth Engine怎么读,以及它适合解决什么规划问题

很多同学第一次看到 Google Earth Engine,会先问两个问题:Google Earth Engine怎么读?它和 ArcGIS、QGIS 有什么区别?

读法上,完整名称可以按英文读作 “Google Earth Engine”;实际交流中,更多人直接说 “GEE”。如果你在课程、论文汇报或项目沟通中提到它,可以说:“本次遥感数据处理使用 Google Earth Engine,也就是 GEE 平台完成。”

从用途上看,GEE更适合做大范围、多时相、遥感驱动的GIS分析。例如:

  • 快速获取某个城市近10年的Landsat或Sentinel影像。
  • 计算NDVI、NDBI、MNDWI等规划常用遥感指数。
  • 提取城市建设用地扩张趋势。
  • 分析城市热岛、裸地、水体、绿地变化。
  • 把处理结果导出为GeoTIFF,再进入ArcGIS Pro或QGIS制图。

如果你的任务是小范围精细编辑矢量地块,ArcGIS Pro和QGIS更合适;如果你的任务是跨年份、跨区域处理海量遥感影像,Google Earth Engine会更高效。

背景:城乡规划GIS数据处理中为什么会用到GEE

在城乡规划GIS数据处理中,遥感影像常被用来支持现状识别、用地变化监测、生态空间评价和城市热环境分析。传统流程通常是:

  1. 在数据网站检索影像。
  2. 下载原始数据。
  3. 进行辐射校正、大气校正或云掩膜。
  4. 裁剪研究区。
  5. 计算遥感指数。
  6. 分类、统计、制图。

这个流程的问题是:数据下载慢、预处理步骤多、不同年份影像管理复杂,而且初学者很容易在坐标系、波段名称、影像质量筛选上出错。

Google Earth Engine把大量遥感数据集和空间计算能力放在云端。你只需要在浏览器中写JavaScript代码,就可以调用影像集合、筛选时间和区域、计算指数、显示地图,并把结果导出到Google Drive或云资产中。

对规划类GIS应用来说,GEE常见的数据处理场景包括:

  • 城市绿地分析:使用NDVI评估植被覆盖情况。
  • 建设用地识别:使用NDBI、监督分类或机器学习分类识别建成区。
  • 水体提取:使用MNDWI识别河流、湖泊、水库。
  • 热岛分析:使用Landsat热红外波段估算地表温度。
  • 时序变化:比较不同年份的城市扩张、绿地减少或水面变化。

原理:GEE入门要理解的三个核心概念

1. Image:单景影像

Image可以理解为一张栅格影像,例如某一天的Landsat影像、一个DEM高程数据,或者一个已经计算好的NDVI结果。它通常包含多个波段。

var image = ee.Image('USGS/SRTMGL1_003');
Map.addLayer(image, {min: 0, max: 3000}, 'SRTM DEM');

2. ImageCollection:影像集合

ImageCollection是多张影像的集合。例如,Landsat 8在某个城市多年拍摄的所有影像,就是一个影像集合。GEE的强大之处就在于可以对影像集合做筛选、排序、合成和批量计算。

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
  .filterDate('2020-01-01', '2020-12-31')
  .filterBounds(geometry);

3. FeatureCollection:矢量要素集合

FeatureCollection类似GIS中的矢量图层,可以是行政区、规划范围、街道边界、样本点或地块。城乡规划GIS数据处理中,常用它来限定研究区、做分区统计或训练分类样本。

var region = ee.FeatureCollection('FAO/GAUL/2015/level2')
  .filter(ee.Filter.eq('ADM2_NAME', 'Beijing'));

初学GEE时要特别注意:GEE采用的是延迟计算。代码定义了处理流程,不代表本地立即算完。只有在地图显示、导出、打印统计结果时,平台才会真正执行计算。

步骤:城乡规划GIS数据处理实战代码

步骤1:定义研究区并加载底图

在GEE代码编辑器中,可以直接用左侧绘图工具画一个研究区,也可以加载行政区矢量数据。下面示例假设你已经在地图上画了一个名为 geometry 的研究区。

Map.centerObject(geometry, 10);
Map.addLayer(geometry, {color: 'red'}, '研究区');

如果你需要导入自己的规划范围,可以先把Shapefile压缩为ZIP,再上传到GEE Assets。上传后用类似下面的方式加载:

var region = ee.FeatureCollection('users/your_name/planning_boundary');
Map.centerObject(region, 10);
Map.addLayer(region, {color: 'yellow'}, '规划范围');

步骤2:筛选Sentinel-2影像并做云量过滤

Sentinel-2适合做城市绿地、水体和建设用地分析,空间分辨率较高,常用10米和20米波段。下面代码筛选2023年夏季低云量影像,并合成为中值影像。

var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
  .filterBounds(geometry)
  .filterDate('2023-06-01', '2023-09-30')
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20));

var s2Median = s2.median().clip(geometry);

Map.addLayer(
  s2Median,
  {bands: ['B4', 'B3', 'B2'], min: 0, max: 3000},
  'Sentinel-2真彩色'
);

这里使用 median() 是为了降低单景影像中云、阴影和异常值的影响。它适合做一般规划识别,但如果研究区云量很高,还需要更严格的云掩膜。

步骤3:计算NDVI用于城市绿地分析

NDVI是归一化植被指数,常用于识别植被覆盖。公式为:

NDVI = (NIR – Red) / (NIR + Red)

在Sentinel-2中,近红外波段是B8,红光波段是B4。

var ndvi = s2Median.normalizedDifference(['B8', 'B4']).rename('NDVI');

Map.addLayer(
  ndvi,
  {min: -0.2, max: 0.8, palette: ['brown', 'yellow', 'green']},
  'NDVI植被指数'
);

在城乡规划GIS数据处理中,可以把NDVI作为绿地现状识别、生态空间评价或城市开发强度分析的辅助指标。一般来说,NDVI越高,植被覆盖越好;但农田、草地、林地、公园绿地都可能表现为高NDVI,不能仅凭NDVI判断规划用地性质。

步骤4:计算NDBI用于建设用地识别

NDBI是归一化建筑指数,常用于辅助识别建成区。公式为:

NDBI = (SWIR – NIR) / (SWIR + NIR)

在Sentinel-2中,短波红外可使用B11,近红外使用B8。

var ndbi = s2Median.normalizedDifference(['B11', 'B8']).rename('NDBI');

Map.addLayer(
  ndbi,
  {min: -0.5, max: 0.5, palette: ['blue', 'white', 'red']},
  'NDBI建设用地指数'
);

NDBI高值区域通常与建筑、裸地、硬化地表有关。但需要注意,裸土、采矿区、施工区也可能出现较高NDBI。因此在规划分析中,建议把NDBI与NDVI、MNDWI、道路数据、现状用地数据结合使用。

步骤5:提取水体并排除与建设用地混淆的区域

MNDWI是改进归一化水体指数,常用于城市水体提取。Sentinel-2中可以使用绿光B3和短波红外B11。

var mndwi = s2Median.normalizedDifference(['B3', 'B11']).rename('MNDWI');

Map.addLayer(
  mndwi,
  {min: -0.5, max: 0.8, palette: ['white', 'blue']},
  'MNDWI水体指数'
);

var water = mndwi.gt(0.2).selfMask();

Map.addLayer(
  water,
  {palette: ['0000ff']},
  '水体提取结果'
);

阈值 0.2 不是固定标准。不同城市、季节、传感器和水体浑浊度都会影响结果。实际项目中应通过目视解译、样本点或已有水系数据验证阈值是否合理。

步骤6:简单构建建设用地候选区

下面用一个简化规则构建建设用地候选区:NDBI较高、NDVI较低,同时排除明显水体。

var builtCandidate = ndbi.gt(0.05)
  .and(ndvi.lt(0.3))
  .and(mndwi.lt(0.1))
  .selfMask();

Map.addLayer(
  builtCandidate,
  {palette: ['ff0000']},
  '建设用地候选区'
);

这段代码适合用于GEE入门和规划初筛,不建议直接作为正式用地调查成果。正式成果应结合监督分类、样本验证、混淆矩阵、现状调查数据和规划底图。

步骤7:统计研究区内绿地、水体和建设用地面积

面积统计是城乡规划GIS数据处理中的常见需求。GEE中可以使用 ee.Image.pixelArea() 计算像元面积,再按掩膜区域求和。

var pixelArea = ee.Image.pixelArea();

var builtAreaImage = pixelArea.updateMask(builtCandidate);
var builtArea = builtAreaImage.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: geometry,
  scale: 10,
  maxPixels: 1e13
});

print('建设用地候选区面积平方米', builtArea);

如果要换算成平方公里,可以进一步除以1,000,000:

var builtAreaKm2 = ee.Number(builtArea.get('area')).divide(1000000);
print('建设用地候选区面积平方公里', builtAreaKm2);

有时输出字段名不是 area,而是影像波段名。遇到这种情况,可以先 print(builtArea) 查看返回字典的键名,再修改 get() 中的字段。

步骤8:导出GeoTIFF到Google Drive

当你需要在ArcGIS Pro、QGIS或制图软件中继续处理结果时,可以把GEE结果导出为GeoTIFF。

Export.image.toDrive({
  image: builtCandidate,
  description: 'built_candidate_2023',
  folder: 'GEE_Export',
  fileNamePrefix: 'built_candidate_2023',
  region: geometry,
  scale: 10,
  crs: 'EPSG:4326',
  maxPixels: 1e13
});

点击运行后,需要到右侧 Tasks 面板手动启动导出任务。导出完成后,可以在Google Drive中下载GeoTIFF,再导入QGIS或ArcGIS Pro进行符号化、矢量化、叠加分析和制图。

常见坑:GEE入门代码为什么跑不出结果

1. 忘记定义geometry

很多GEE入门代码默认存在 geometry,但你复制后直接运行会报错。解决方法是:用地图左上方绘图工具画一个多边形,或把变量名改为你自己的研究区变量。

2. 影像集合筛选后为空

如果时间范围太短、云量限制太严格、研究区太小,可能筛选不到影像。可以先打印影像数量:

print('影像数量', s2.size());

如果结果为0,可以放宽时间范围或把云量阈值从20调整到40。

3. 波段名称用错

不同数据集的波段名称不同。Sentinel-2常用B2、B3、B4、B8、B11;Landsat Collection 2 Level 2常用SR_B2、SR_B3、SR_B4、SR_B5、SR_B6等。复制代码前一定要确认数据集和波段名匹配。

4. 比例尺scale设置不合理

Sentinel-2常用10米或20米,Landsat常用30米。面积统计和导出时,如果 scale 设置过小,会导致计算量过大;如果设置过大,又会损失空间细节。

5. 把指数结果当成最终规划结论

NDVI、NDBI、MNDWI是遥感指数,不等于法定用地分类。它们适合辅助识别和快速分析,但正式规划成果仍需结合用地调查、地形图、地籍数据、规划审批数据和外业核查。

方法比较:GEE、QGIS、ArcGIS Pro在规划GIS中的分工

工具 适合任务 优势 限制
Google Earth Engine 多时相遥感、指数计算、云端批量处理、区域统计 不用大量下载原始影像,适合大范围快速分析 需要写代码,细节制图和人工编辑能力较弱
QGIS 结果检查、矢量叠加、符号化制图、插件分析 免费开源,适合教学和日常GIS处理 处理超大遥感影像时依赖本机性能
ArcGIS Pro 专业制图、空间分析、规划成果整合、地理数据库管理 制图和数据管理能力强,适合项目成果生产 软件授权成本较高,遥感批处理仍需合理组织流程
Python GIS 自动化处理、批量统计、模型复现、数据清洗 适合构建可重复分析流程 环境配置和库版本管理对初学者有门槛

比较实用的工作流是:在Google Earth Engine中完成遥感影像筛选、指数计算和初步分类;导出GeoTIFF后,在QGIS或ArcGIS Pro中完成叠加分析、成果制图和版面表达。

检查清单:发布规划分析结果前要核对什么

  • 研究区是否正确:边界是否为最新行政区或项目范围,是否存在偏移。
  • 影像时间是否合理:是否与规划现状年份、季节或调查时间匹配。
  • 云量是否可接受:是否存在云、云影、雾霾影响识别结果。
  • 波段是否匹配:Sentinel-2、Landsat不同数据集的波段名不能混用。
  • 阈值是否验证:NDVI、NDBI、MNDWI阈值应通过样本或目视检查校准。
  • 坐标系是否满足后续软件需求:导出结果进入QGIS或ArcGIS Pro后,要检查投影和单位。
  • 面积统计单位是否明确:平方米、公顷、平方公里不要混用。
  • 成果用途是否说明:遥感指数分析结果适合辅助判断,不应直接替代法定用地数据。

FAQ:Google Earth Engine城乡规划GIS数据处理常见问题

Q1:Google Earth Engine怎么读才比较自然?

完整读法是 “Google Earth Engine”,实际交流中常简称 “GEE”,可以直接读作 “G-E-E”。在中文课堂或项目沟通中,说“用GEE处理遥感影像”通常都能被理解。

Q2:GEE适合零基础GIS学生学习吗?

适合,但建议先掌握基本GIS概念,例如栅格、矢量、坐标系、波段、像元、投影和空间分辨率。GEE代码主要使用JavaScript语法,入门难度低于完整的软件开发,但需要理解遥感数据处理逻辑。

Q3:城乡规划中能不能只用GEE识别建设用地?

不建议只依赖GEE指数阈值识别建设用地。GEE可以快速生成建设用地候选区,但正式规划成果应结合现状用地数据、道路建筑数据、地籍资料、人工判读和外业核查。

Q4:为什么我导出的GeoTIFF在QGIS里看起来很模糊?

常见原因是导出 scale 设置过大,或者使用了分辨率较低的数据源。Sentinel-2常用10米,Landsat常用30米。如果你把Sentinel-2结果按100米导出,细节会明显减少。

Q5:GEE能不能直接导出Shapefile?

可以导出矢量 FeatureCollection,但栅格分类结果通常需要先矢量化,再导出为SHP或GeoJSON。对于大面积分类结果,不建议盲目矢量化,否则文件会很大、边界很碎,后续处理效率也会下降。

Q6:GEE代码中的maxPixels是什么意思?

maxPixels 是允许处理的最大像元数量。大范围、高分辨率导出时,如果像元数量超过默认限制,就可能报错。可以适当增大 maxPixels,但更重要的是合理设置研究区、分辨率和导出范围。

结论:GEE是规划GIS遥感分析的高效入口

Google Earth Engine的正确理解方式,不只是知道它怎么读,而是知道它适合放在城乡规划GIS数据处理流程的哪个位置。它特别适合做多时相遥感影像筛选、NDVI和NDBI等指数计算、城市建设用地初筛、水体识别、热岛分析和区域统计。

对初学者来说,建议从三个动作开始:先定义研究区,再筛选影像,最后计算一个指数并导出结果。等你熟悉GEE入门代码后,再逐步加入云掩膜、分类样本、精度验证和批量年份循环。

记住一个原则:GEE负责快速获取和计算遥感信息,QGIS或ArcGIS Pro负责检查、叠加、制图和成果组织。把两类工具结合起来,才是城乡规划GIS数据处理更稳妥的实践路径。