北京城市建设用地情况分析
# 北京城市建设用地情况分析
PIE-Engine Studio遥感计算云服务平台选取了来自清华大学地球系统科学系宫鹏教授研究组完成的全球30m分辨率的地表覆盖数据,1985~2017年覆盖北京地区的影像产品,通过PIE-Engine Studio加载该数据,编程实现了建筑用地分布情况的动态可视化,同时将每年的用地情况进行统计并以图表的形式进行展示。
# 1) 数据源分析
该影像数据分辨率为30米,包含1个波段,无效值为0,波段中不同的像素值代表着不同的年份,波段值与年份的对应关系如下表所示。
年份 | 像素值 |
---|---|
1978 | 34 |
1985 | 33 |
…… | …… |
2016 | 2 |
2017 | 1 |
# 2) 核心代码示例
# 循环将每一年的城镇化数据提取出来,同时计算对应的城镇化面积
image = pie.Image('user/101/public/Raster/UrbanFreq_1978_2017_Beijing').select("B1")
geometry = roi.getAt(0).geometry()
areaInfo = {}
layerNames = []
for i in range(33, 0, -1):
year = 2018 - i
layerNames.append(str(year))
Map.addLayer(image.updateMask(image.gte(i)), {'palette': "ff0000"}, str(year))
areaImage = image.pixelArea().multiply(image.gte(i))
data = areaImage.reduceRegion(pie.Reducer.sum(), geometry, 1000)
area = data.getInfo().get("constant")/1000000
areaInfo[str(year)] = area
# 绘制结果图表
xAxis = []
series = []
for year in range(1985, 2017, 1):
xAxis.append(year)
series.append(areaInfo[str(year)])
line_options = {
'title': '北京市1985年-2017年城镇化进度',
'legend': ['建筑用地'],
'xAxis': xAxis,
'xAxisName': "年",
'yAxisName': "平方公里",
'series': [
series
],
'chartType': "line"
}
# 调用绘制折线图的方法
PIEChart.ChartArray(**line_options)
# 显示在地图上,取消下一行的注释
# Map复制错误复制成功
计算流程如下:
a) 加载用地数据;
b) 遍历多年数据求得面积数据;
c) 定义图表属性;
d) 显示图表或者地图。
# 3) 案例中主要涉及到的算子
• pixelArea():计算像素的面积;
• reduceRegion():统计分析指定区域的信息结果;
• ChartArray():绘制图表。
# 4) 结果分析展示
调用PIE-Engine遥感计算云平台在jupyter notebook中的实现效果如下图所示:
通过折线图可以看出自2001年北京申奥成功后,建筑用地范围开始明显增加,而2008年奥运会举办之后增长更为迅速。
# 5) 完整代码
注意: 需要将代码中用户名和密码替换为用户在平台上注册时的用户名/密码
"""
Program infomation:Python3.7
"""
# 北京城镇建设用地分析
import pie
from pie import *
from pie.chart import PIEChart
# 使用用户在平台上注册时的用户名/密码
pie.initialize()
# 调用地图
Map = pie.Map()
# 加载北京区域矢量
roi = pie.FeatureCollection('user/101/public/shape/beijing')
Map.addLayer(roi, {'color':"red", 'fillColor':"00000000"}, "roi")
Map.setCenter(116.385,39.917,7)
# 加载DEM
dem = pie.Image('user/101/public/Raster/beijing_dem').select("B1")
demVis = {
'min':0,
'max':1200,
'palette': "0F2F78,29998F,22D926,FFFD38,EBA02C,C05340"
}
Map.addLayer(dem, demVis, "dem")
# 循环将每一年的城镇化数据提取出来,同时计算对应的城镇化面积
image = pie.Image('user/101/public/Raster/UrbanFreq_1978_2017_Beijing').select("B1")
geometry = roi.getAt(0).geometry()
areaInfo = {}
layerNames = []
for i in range(33, 0, -1):
year = 2018 - i
layerNames.append(str(year))
Map.addLayer(image.updateMask(image.gte(i)), {'palette': "ff0000"}, str(year))
areaImage = image.pixelArea().multiply(image.gte(i))
data = areaImage.reduceRegion(pie.Reducer.sum(), geometry, 1000)
area = data.getInfo().get("constant")/1000000
areaInfo[str(year)] = area
# 绘制结果图表
xAxis = []
series = []
for year in range(1985, 2017, 1):
xAxis.append(year)
series.append(areaInfo[str(year)])
line_options = {
'title': '北京市1985年-2017年城镇化进度',
'legend': ['建筑用地'],
'xAxis': xAxis,
'xAxisName': "年",
'yAxisName': "平方公里",
'series': [
series
],
'chartType': "line"
}
# 调用绘制折线图的方法,取消下一行的注释
# PIEChart.ChartArray(**line_options)
# 显示在地图上
Map
有问题,我来改改 (opens new window)
上次更新: 2022/05/25, 09:15:11