Python利用GDAL模塊實(shí)現(xiàn)讀取柵格數(shù)據(jù)并對(duì)指定數(shù)據(jù)加以篩選掩膜
本文介紹基于Python語(yǔ)言中gdal模塊,對(duì)遙感影像數(shù)據(jù)進(jìn)行柵格讀取與計(jì)算,同時(shí)基于QA波段對(duì)像元加以篩選、掩膜的操作。
本文所要實(shí)現(xiàn)的需求具體為:現(xiàn)有自行計(jì)算的全球葉面積指數(shù)(LAI).tif格式柵格產(chǎn)品(下稱(chēng)“自有產(chǎn)品”),為了驗(yàn)證其精確度,需要與已有學(xué)者提出的成熟產(chǎn)品——GLASS全球LAI.hdf格式柵格產(chǎn)品(下稱(chēng)“GLASS產(chǎn)品”)進(jìn)行做差對(duì)比;其中,自有產(chǎn)品除了LAI波段外,還有一個(gè)質(zhì)量評(píng)估波段(QA),即自有產(chǎn)品在后期使用時(shí),還需結(jié)合QA波段進(jìn)行篩選、掩膜等處理。其中,二者均為基于MODIS hv分幅的產(chǎn)品。
本文分為兩部分,第一部分為代碼的詳細(xì)分段講解,第二部分為完整代碼。
1 代碼分段講解
1.1 模塊與路徑準(zhǔn)備
首先,需要對(duì)用到的模塊與存放柵格圖像的各類(lèi)路徑加以準(zhǔn)備。
import os import copy import numpy as np import pylab as plt from osgeo import gdal # rt_file_path="G:/Postgraduate/LAI_Glass_RTlab/Rc_Lai_A2018161_h12v03.tif" # gl_file_path="G:/Postgraduate/LAI_Glass_RTlab/GLASS01E01.V50.A2018161.h12v03.2020323.hdf" # out_file_path="G:/Postgraduate/LAI_Glass_RTlab/test.tif" rt_file_path="I:/LAI_RTLab/A2018161/" gl_file_path="I:/LAI_Glass/2018161/" out_file_path="I:/LAI_Dif/"
其中,rt_file_path為自有產(chǎn)品的存放路徑,gl_file_path為GLASS產(chǎn)品的存放路徑,out_file_path為最終二者柵格做完差值處理后結(jié)果的存放路徑。
1.2 柵格圖像文件名讀取與配對(duì)
接下來(lái),需要將全部待處理的柵格圖像用os.listdir()進(jìn)行獲取,并用for循環(huán)進(jìn)行循環(huán)批量處理操作的準(zhǔn)備。
rt_file_list=os.listdir(rt_file_path)
for rt_file in rt_file_list:
file_name_split=rt_file.split("_")
rt_hv=file_name_split[3][:-4]
gl_file_list=os.listdir(gl_file_path)
for gl_file in gl_file_list:
if rt_hv in gl_file:
rt_file_tif_path=rt_file_path+rt_file
gl_file_tif_path=gl_file_path+gl_file
其中,由于本文需求是對(duì)兩種產(chǎn)品做差,因此首先需要結(jié)合二者的hv分幅編號(hào),將同一分幅編號(hào)的兩景遙感影像放在一起;因此,依據(jù)自有產(chǎn)品文件名的特征,選擇.split()進(jìn)行字符串分割,并隨后截取獲得遙感影像的hv分幅編號(hào)。
1.3 輸出文件名稱(chēng)準(zhǔn)備
前述1.1部分已經(jīng)配置好了輸出文件存放的路徑,但是還沒(méi)有進(jìn)行輸出文件文件名的配置;因此這里我們需要配置好每一個(gè)做差后的遙感影像的文件存放路徑與名稱(chēng)。其中,我們就直接以遙感影像的hv編號(hào)作為輸出結(jié)果文件名。
DRT_out_file_path=out_file_path+"DRT/"
if not os.path.exists(DRT_out_file_path):
os.makedirs(DRT_out_file_path)
DRT_out_file_tif_path=os.path.join(DRT_out_file_path,rt_hv+".tif")
eco_out_file_path=out_file_path+"eco/"
if not os.path.exists(eco_out_file_path):
os.makedirs(eco_out_file_path)
eco_out_file_tif_path=os.path.join(eco_out_file_path,rt_hv+".tif")
wat_out_file_path=out_file_path+"wat/"
if not os.path.exists(wat_out_file_path):
os.makedirs(wat_out_file_path)
wat_out_file_tif_path=os.path.join(wat_out_file_path,rt_hv+".tif")
tim_out_file_path=out_file_path+"tim/"
if not os.path.exists(tim_out_file_path):
os.makedirs(tim_out_file_path)
tim_out_file_tif_path=os.path.join(tim_out_file_path,rt_hv+".tif")
這一部分代碼分為了四個(gè)部分,是因?yàn)樽杂挟a(chǎn)品的LAI是分別依據(jù)四種算法得到的,在做差時(shí)需要每一種算法分別和GLASS產(chǎn)品進(jìn)行相減,因此配置了四個(gè)輸出路徑文件夾。
1.4 柵格文件數(shù)據(jù)與信息讀取
接下來(lái),利用gdal模塊對(duì).tif與.hdf等兩種柵格圖像加以讀取。
rt_raster=gdal.Open(rt_file_path+rt_file)
rt_band_num=rt_raster.RasterCount
rt_raster_array=rt_raster.ReadAsArray()
rt_lai_array=rt_raster_array[0]
rt_qa_array=rt_raster_array[1]
rt_lai_band=rt_raster.GetRasterBand(1)
# rt_lai_nodata=rt_lai_band.GetNoDataValue()
# rt_lai_nodata=32767
# rt_lai_mask=np.ma.masked_equal(rt_lai_array,rt_lai_nodata)
rt_lai_array_mask=np.where(rt_lai_array>30000,np.nan,rt_lai_array)
rt_lai_array_fin=rt_lai_array_mask*0.001
gl_raster=gdal.Open(gl_file_path+gl_file)
gl_band_num=gl_raster.RasterCount
gl_raster_array=gl_raster.ReadAsArray()
gl_lai_array=gl_raster_array
gl_lai_band=gl_raster.GetRasterBand(1)
gl_lai_array_mask=np.where(gl_lai_array>1000,np.nan,gl_lai_array)
gl_lai_array_fin=gl_lai_array_mask*0.01
row=rt_raster.RasterYSize
col=rt_raster.RasterXSize
geotransform=rt_raster.GetGeoTransform()
projection=rt_raster.GetProjection()
首先,以上述代碼的第一段為例進(jìn)行講解。其中,gdal.Open()讀取柵格圖像;.RasterCount獲取柵格圖像波段數(shù)量;.ReadAsArray()將柵格圖像各波段的信息讀取為Array格式,當(dāng)波段數(shù)量大于1時(shí),其共有三維,第一維為波段的個(gè)數(shù);rt_raster_array[0]表示取Array中的第一個(gè)波段,在本文中也就是自有產(chǎn)品的LAI波段;rt_qa_array=rt_raster_array[1]則表示取出第二個(gè)波段,在本文中也就是自有產(chǎn)品的QA波段;.GetRasterBand(1)表示獲取柵格圖像中的第一個(gè)波段(注意,這里序號(hào)不是從0開(kāi)始而是從1開(kāi)始);np.where(rt_lai_array>30000,np.nan,rt_lai_array)表示利用np.where()函數(shù)對(duì)Array中第一個(gè)波段中像素>30000加以選取,并將其設(shè)置為nan,其他值不變。這一步驟是消除圖像中填充值、Nodata值的方法。最后一句*0.001是將圖層原有的縮放系數(shù)復(fù)原。
其次,上述代碼第三段為獲取柵格行、列數(shù)與投影變換信息。
1.5 差值計(jì)算與QA波段篩選
接下來(lái),首先對(duì)自有產(chǎn)品與GLASS產(chǎn)品加以做差操作,隨后需要對(duì)四種算法分別加以提取。
lai_dif=rt_lai_array_fin-gl_lai_array_fin
lai_dif=lai_dif*1000
rt_qa_array_bin=copy.copy(rt_qa_array)
rt_qa_array_row,rt_qa_array_col=rt_qa_array.shape
for i in range(rt_qa_array_row):
for j in range(rt_qa_array_col):
rt_qa_array_bin[i][j]="{:012b}".format(rt_qa_array_bin[i][j])[-4:]
# DRT_pixel_pos=np.where((rt_qa_array_bin>=100) & (rt_qa_array_bin==11))
# eco_pixel_pos=np.where((rt_qa_array_bin<100) & (rt_qa_array_bin==111))
# wat_pixel_pos=np.where((rt_qa_array_bin<1000) & (rt_qa_array_bin==1011))
# tim_pixel_pos=np.where((rt_qa_array_bin<1100) & (rt_qa_array_bin==1111))
# colormap=plt.cm.Greens
# plt.figure(1)
# # plt.subplot(2,4,1)
# plt.imshow(rt_lai_array_fin,cmap=colormap,interpolation='none')
# plt.title("RT_LAI")
# plt.colorbar()
# plt.figure(2)
# # plt.subplot(2,4,2)
# plt.imshow(gl_lai_array_fin,cmap=colormap,interpolation='none')
# plt.title("GLASS_LAI")
# plt.colorbar()
# plt.figure(3)
# dif_colormap=plt.cm.get_cmap("Spectral")
# plt.imshow(lai_dif,cmap=dif_colormap,interpolation='none')
# plt.title("Difference_LAI (RT-GLASS)")
# plt.colorbar()
DRT_lai_dif_array=np.where((rt_qa_array_bin>=100) | (rt_qa_array_bin==11),
np.nan,lai_dif)
eco_lai_dif_array=np.where((rt_qa_array_bin<100) | (rt_qa_array_bin==111),
np.nan,lai_dif)
wat_lai_dif_array=np.where((rt_qa_array_bin<1000) | (rt_qa_array_bin==1011),
np.nan,lai_dif)
tim_lai_dif_array=np.where((rt_qa_array_bin<1100) | (rt_qa_array_bin==1111),
np.nan,lai_dif)
# plt.figure(4)
# plt.imshow(DRT_lai_dif_array)
# plt.colorbar()
# plt.figure(5)
# plt.imshow(eco_lai_dif_array)
# plt.colorbar()
# plt.figure(6)
# plt.imshow(wat_lai_dif_array)
# plt.colorbar()
# plt.figure(7)
# plt.imshow(tim_lai_dif_array)
# plt.colorbar()
其中,上述代碼前兩句為差值計(jì)算與數(shù)據(jù)化整。將數(shù)據(jù)轉(zhuǎn)換為整數(shù),可以減少結(jié)果數(shù)據(jù)圖層的數(shù)據(jù)量(因?yàn)椴恍枰鎯?chǔ)小數(shù)了)。
隨后,開(kāi)始依據(jù)QA波段進(jìn)行數(shù)據(jù)篩選與掩膜。其實(shí)各類(lèi)遙感影像(例如MODIS、Landsat等)的QA波段都是比較近似的:通過(guò)一串二進(jìn)制碼來(lái)表示遙感影像的質(zhì)量、信息等,其中不同的比特位往往都代表著一種特性。例如下圖所示為Landsat Collection 2 Level-2的QA波段含義。

在這里,QA波段原本為十進(jìn)制(一般遙感影像為了節(jié)省空間,QA波段都是寫(xiě)成十進(jìn)制的形式),因此需要將其轉(zhuǎn)換為二進(jìn)制;隨后通過(guò)獲取指定需要的二進(jìn)制數(shù)據(jù)位數(shù)(在本文中也就是能確定自有產(chǎn)品中這一像素來(lái)自于哪一種算法的二進(jìn)制位數(shù)),從而判斷這一像素所得LAI是通過(guò)哪一種算法得到的,從而將每種算法對(duì)應(yīng)的像素分別放在一起處理。DRT_lai_dif_array等四個(gè)變量分別表示四種算法中,除了自己這一種算法得到的像素之外的其他所有像素;之所以選擇這種方式,是因?yàn)楹笃谖覀兛梢詫⑵渲苯友谀さ?,那么剩下的就是這種算法自身的像素了。
其中,上述代碼注釋掉的plt相關(guān)內(nèi)容可以實(shí)現(xiàn)繪制空間分布圖,大家感興趣可以嘗試使用。
1.6 結(jié)果柵格文件寫(xiě)入與保存
接下來(lái),將我們完成上述差值計(jì)算與依據(jù)算法進(jìn)行篩選后的圖像保存。
driver=gdal.GetDriverByName("Gtiff")
out_DRT_lai=driver.Create(DRT_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_DRT_lai.SetGeoTransform(geotransform)
out_DRT_lai.SetProjection(projection)
out_DRT_lai.GetRasterBand(1).WriteArray(DRT_lai_dif_array)
out_DRT_lai=None
driver=gdal.GetDriverByName("Gtiff")
out_eco_lai=driver.Create(eco_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_eco_lai.SetGeoTransform(geotransform)
out_eco_lai.SetProjection(projection)
out_eco_lai.GetRasterBand(1).WriteArray(eco_lai_dif_array)
out_eco_lai=None
driver=gdal.GetDriverByName("Gtiff")
out_wat_lai=driver.Create(wat_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_wat_lai.SetGeoTransform(geotransform)
out_wat_lai.SetProjection(projection)
out_wat_lai.GetRasterBand(1).WriteArray(wat_lai_dif_array)
out_wat_lai=None
driver=gdal.GetDriverByName("Gtiff")
out_tim_lai=driver.Create(tim_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_tim_lai.SetGeoTransform(geotransform)
out_tim_lai.SetProjection(projection)
out_tim_lai.GetRasterBand(1).WriteArray(tim_lai_dif_array)
out_tim_lai=None
print(rt_hv)
其中,.GetDriverByName("Gtiff")表示保存為.tif格式的GeoTIFF文件;driver.Create(DRT_out_file_tif_path,row,col,1,gdal.GDT_Float32)表示按照路徑、行列數(shù)、波段數(shù)與數(shù)據(jù)格式等建立一個(gè)新的柵格圖層,作為輸出圖層的框架;其后表示分別將地理投影轉(zhuǎn)換信息與像素具體數(shù)值分別賦予這一新建的柵格圖層;最后=None表示將其從內(nèi)存空間中釋放,完成寫(xiě)入與保存工作。
2 完整代碼
本文所需完整代碼如下:
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 15 19:36:15 2021
@author: fkxxgis
"""
import os
import copy
import numpy as np
import pylab as plt
from osgeo import gdal
# rt_file_path="G:/Postgraduate/LAI_Glass_RTlab/Rc_Lai_A2018161_h12v03.tif"
# gl_file_path="G:/Postgraduate/LAI_Glass_RTlab/GLASS01E01.V50.A2018161.h12v03.2020323.hdf"
# out_file_path="G:/Postgraduate/LAI_Glass_RTlab/test.tif"
rt_file_path="I:/LAI_RTLab/A2018161/"
gl_file_path="I:/LAI_Glass/2018161/"
out_file_path="I:/LAI_Dif/"
rt_file_list=os.listdir(rt_file_path)
for rt_file in rt_file_list:
file_name_split=rt_file.split("_")
rt_hv=file_name_split[3][:-4]
gl_file_list=os.listdir(gl_file_path)
for gl_file in gl_file_list:
if rt_hv in gl_file:
rt_file_tif_path=rt_file_path+rt_file
gl_file_tif_path=gl_file_path+gl_file
DRT_out_file_path=out_file_path+"DRT/"
if not os.path.exists(DRT_out_file_path):
os.makedirs(DRT_out_file_path)
DRT_out_file_tif_path=os.path.join(DRT_out_file_path,rt_hv+".tif")
eco_out_file_path=out_file_path+"eco/"
if not os.path.exists(eco_out_file_path):
os.makedirs(eco_out_file_path)
eco_out_file_tif_path=os.path.join(eco_out_file_path,rt_hv+".tif")
wat_out_file_path=out_file_path+"wat/"
if not os.path.exists(wat_out_file_path):
os.makedirs(wat_out_file_path)
wat_out_file_tif_path=os.path.join(wat_out_file_path,rt_hv+".tif")
tim_out_file_path=out_file_path+"tim/"
if not os.path.exists(tim_out_file_path):
os.makedirs(tim_out_file_path)
tim_out_file_tif_path=os.path.join(tim_out_file_path,rt_hv+".tif")
rt_raster=gdal.Open(rt_file_path+rt_file)
rt_band_num=rt_raster.RasterCount
rt_raster_array=rt_raster.ReadAsArray()
rt_lai_array=rt_raster_array[0]
rt_qa_array=rt_raster_array[1]
rt_lai_band=rt_raster.GetRasterBand(1)
# rt_lai_nodata=rt_lai_band.GetNoDataValue()
# rt_lai_nodata=32767
# rt_lai_mask=np.ma.masked_equal(rt_lai_array,rt_lai_nodata)
rt_lai_array_mask=np.where(rt_lai_array>30000,np.nan,rt_lai_array)
rt_lai_array_fin=rt_lai_array_mask*0.001
gl_raster=gdal.Open(gl_file_path+gl_file)
gl_band_num=gl_raster.RasterCount
gl_raster_array=gl_raster.ReadAsArray()
gl_lai_array=gl_raster_array
gl_lai_band=gl_raster.GetRasterBand(1)
gl_lai_array_mask=np.where(gl_lai_array>1000,np.nan,gl_lai_array)
gl_lai_array_fin=gl_lai_array_mask*0.01
row=rt_raster.RasterYSize
col=rt_raster.RasterXSize
geotransform=rt_raster.GetGeoTransform()
projection=rt_raster.GetProjection()
lai_dif=rt_lai_array_fin-gl_lai_array_fin
lai_dif=lai_dif*1000
rt_qa_array_bin=copy.copy(rt_qa_array)
rt_qa_array_row,rt_qa_array_col=rt_qa_array.shape
for i in range(rt_qa_array_row):
for j in range(rt_qa_array_col):
rt_qa_array_bin[i][j]="{:012b}".format(rt_qa_array_bin[i][j])[-4:]
# DRT_pixel_pos=np.where((rt_qa_array_bin>=100) & (rt_qa_array_bin==11))
# eco_pixel_pos=np.where((rt_qa_array_bin<100) & (rt_qa_array_bin==111))
# wat_pixel_pos=np.where((rt_qa_array_bin<1000) & (rt_qa_array_bin==1011))
# tim_pixel_pos=np.where((rt_qa_array_bin<1100) & (rt_qa_array_bin==1111))
# colormap=plt.cm.Greens
# plt.figure(1)
# # plt.subplot(2,4,1)
# plt.imshow(rt_lai_array_fin,cmap=colormap,interpolation='none')
# plt.title("RT_LAI")
# plt.colorbar()
# plt.figure(2)
# # plt.subplot(2,4,2)
# plt.imshow(gl_lai_array_fin,cmap=colormap,interpolation='none')
# plt.title("GLASS_LAI")
# plt.colorbar()
# plt.figure(3)
# dif_colormap=plt.cm.get_cmap("Spectral")
# plt.imshow(lai_dif,cmap=dif_colormap,interpolation='none')
# plt.title("Difference_LAI (RT-GLASS)")
# plt.colorbar()
DRT_lai_dif_array=np.where((rt_qa_array_bin>=100) | (rt_qa_array_bin==11),
np.nan,lai_dif)
eco_lai_dif_array=np.where((rt_qa_array_bin<100) | (rt_qa_array_bin==111),
np.nan,lai_dif)
wat_lai_dif_array=np.where((rt_qa_array_bin<1000) | (rt_qa_array_bin==1011),
np.nan,lai_dif)
tim_lai_dif_array=np.where((rt_qa_array_bin<1100) | (rt_qa_array_bin==1111),
np.nan,lai_dif)
# plt.figure(4)
# plt.imshow(DRT_lai_dif_array)
# plt.colorbar()
# plt.figure(5)
# plt.imshow(eco_lai_dif_array)
# plt.colorbar()
# plt.figure(6)
# plt.imshow(wat_lai_dif_array)
# plt.colorbar()
# plt.figure(7)
# plt.imshow(tim_lai_dif_array)
# plt.colorbar()
driver=gdal.GetDriverByName("Gtiff")
out_DRT_lai=driver.Create(DRT_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_DRT_lai.SetGeoTransform(geotransform)
out_DRT_lai.SetProjection(projection)
out_DRT_lai.GetRasterBand(1).WriteArray(DRT_lai_dif_array)
out_DRT_lai=None
driver=gdal.GetDriverByName("Gtiff")
out_eco_lai=driver.Create(eco_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_eco_lai.SetGeoTransform(geotransform)
out_eco_lai.SetProjection(projection)
out_eco_lai.GetRasterBand(1).WriteArray(eco_lai_dif_array)
out_eco_lai=None
driver=gdal.GetDriverByName("Gtiff")
out_wat_lai=driver.Create(wat_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_wat_lai.SetGeoTransform(geotransform)
out_wat_lai.SetProjection(projection)
out_wat_lai.GetRasterBand(1).WriteArray(wat_lai_dif_array)
out_wat_lai=None
driver=gdal.GetDriverByName("Gtiff")
out_tim_lai=driver.Create(tim_out_file_tif_path,row,col,1,gdal.GDT_Float32)
out_tim_lai.SetGeoTransform(geotransform)
out_tim_lai.SetProjection(projection)
out_tim_lai.GetRasterBand(1).WriteArray(tim_lai_dif_array)
out_tim_lai=None
print(rt_hv)到此這篇關(guān)于Python利用GDAL模塊實(shí)現(xiàn)讀取柵格數(shù)據(jù)并對(duì)指定數(shù)據(jù)加以篩選掩膜的文章就介紹到這了,更多相關(guān)Python GDAL讀取柵格數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python獲取時(shí)間及時(shí)間格式轉(zhuǎn)換問(wèn)題實(shí)例代碼詳解
這篇文章主要介紹了python獲取時(shí)間及時(shí)間格式轉(zhuǎn)換,需要的朋友可以參考下2018-12-12
win7 下搭建sublime的python開(kāi)發(fā)環(huán)境的配置方法
Sublime Text具有漂亮的用戶(hù)界面和強(qiáng)大的功能,例如代碼縮略圖,Python的插件,代碼段等。還可自定義鍵綁定,菜單和工具欄。Sublime Text的主要功能包括:拼寫(xiě)檢查,書(shū)簽,完整的 Python API,Goto功能,即時(shí)項(xiàng)目切換,多選擇,多窗口等等。2014-06-06
Python?Pipeline處理數(shù)據(jù)工作原理探究
如果你是一個(gè)Python開(kāi)發(fā)者,你可能聽(tīng)過(guò)"pipeline"這個(gè)術(shù)語(yǔ),但?pipeline?到底是什么,它又有什么用呢?在這篇文章中,我們將探討?Python?中的?pipeline?概念,它們是如何工作的,以及它們?nèi)绾螏椭憔帉?xiě)更清晰、更高效的代碼2024-01-01
解決Tensorboard可視化錯(cuò)誤:不顯示數(shù)據(jù) No scalar data was found
今天小編就為大家分享一篇解決Tensorboard可視化錯(cuò)誤:不顯示數(shù)據(jù) No scalar data was found,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python3 使用OpenCV計(jì)算滑塊拼圖驗(yàn)證碼缺口位置(場(chǎng)景示例)
這篇文章主要介紹了python3 使用OpenCV計(jì)算滑塊拼圖驗(yàn)證碼缺口位置,本文通過(guò)場(chǎng)景示例給大家詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
python利用logging模塊實(shí)現(xiàn)根據(jù)日志級(jí)別打印不同顏色日志的代碼案例
這篇文章主要介紹了python利用logging模塊實(shí)現(xiàn)根據(jù)日志級(jí)別打印不同顏色日志,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12

