当我们利用遥感影像提取河流的水体时,往往需要以该河流上某一水文站的水文资料来确定一个水位/流量范围,根据水文资料中符合要求的日期序列去下载遥感影像资料,这样才能使得不同年份提取出来的水体具有可比性,以便进一步分析
如题,基于python的selenuim库,在地理空间数据云上爬取遥感影像(Landsat)的日期信息;并利用水文站的水位/流量序列筛选符合水位/流量要求的日期序列;最后从提取遥感影像日期序列中符合水位/流量要求的数据条目,以.xls的形式输出。
代码运行需要下载一个浏览器驱动,将驱动放在对应浏览器的安装目录下
所需输入的东西如下:
- 水位/流量序列的excel表格
这里用的是监利站水位:
- 云量,条带号和行编号
- 需要的年份序列
- 所需的卫星列表
这里用到的卫星是Landsat4,5,7,8,你也可以自行添加其它卫星
输出结果
这里计算的条件是从LT5,LE7,LC8中筛选满足监利站水位85高程水位在29-31m的数据条目,时间跨度为2001-2017年。
有了这些条目信息,我们可以人为的根据云量多少、水位是否最靠近30 m,来进一步筛选需要下载的数据。
下一步,我们可以再写一个爬虫:利用筛选过的信息去USGS或者地理空间数据云上下载数据(从gscloud批量下载遥感影像信息)。
代码如下:
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
def extract_water(excel):
#从excel中提取水位/流量的序列及对应的日期(以年-月-日的格式)
#gscloud的日期是-连接的2012-05-06
#return water_list=[[date],[water_level]]
import xlrd
workbook=xlrd.open_workbook(excel)
sheet1=workbook.sheet_by_name("Sheet1")
water_list=[[],[]]
for i in range(1,sheet1.nrows):
year=str(int(sheet1.cell(i,0).value))
month=str(int(sheet1.cell(i,1).value))
day=str(int(sheet1.cell(i,2).value))
if len(month)==1:
month='0'+month
if len(day)==1:
day='0'+day
date=year+'-'+month+'-'+day
water_level=sheet1.cell(i,3).value
water_list[0].append(date)
water_list[1].append(water_level)
return water_list
def water_filter(water_list):
#筛选满足水位要求的日期序列
#water_list是[[日期序列],[水位/流量序列]]
#return filted_water_list=[[date],[water_level]]
filted_water_list=[[],[]]
for i in range(len(water_list[1])):
if water_list[1][i]>29 and water_list[1][i]<31:
filted_water_list[0].append(water_list[0][i])
filted_water_list[1].append(water_list[1][i])
return filted_water_list
def out_excel(in_list,out_workspace,filename):
#输出符合条件的遥感影像条目
import os
result_path=os.path.join(out_workspace,filename)
result=open(result_path,'w')
for m in range(len(in_list)):
for n in range(len(in_list[m])):
result.write(str(in_list[m][n]))
result.write('\t')
result.write('\n')
result.close()
def extract_data(satellite,num,cloud,year,filted_water_list):
#num是条带号和行编号,比如num=[123,40]
[x_num,y_num]=num
year=[str(i) for i in year]
#各个卫星及其对应的表单网址,如有需要可以自行添加新卫星的名称和对应网站
dict1={}
dict1['LT4_5']='http://www.gscloud.cn/sources/accessdata/243?pid=1'#TM传感器
dict1['LC8']='http://www.gscloud.cn/sources/accessdata/411?pid=263'#OLI传感器
dict1['LE7_off']='http://www.gscloud.cn/sources/accessdata/241?pid=263'#ETM传感器
dict1['LE7_on']='http://www.gscloud.cn/sources/accessdata/242?pid=1'#ETM传感器
#
driver.get(dict1[satellite])
time.sleep(3)
B=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[1]/td[3]/div/input')
B.send_keys(str(x_num))
C=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[1]/td[4]/div/input')
C.send_keys(str(y_num))
E=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[1]/td[6]/div/input')
E.send_keys(str(cloud))
r=[]
for j in range(len(year)):
D=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[1]/td[5]/div/input')
D.clear()
D.send_keys(year[j])
D.send_keys(Keys.ENTER)
time.sleep(3)
#跳过空条目的年份
q=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[3]/td').text
if str(q)=="没有记录!":continue
while True:
#把同一页每一行数据的信息存入list1中;list1=[[数据标识],[日期],[云量],[数据有无]]
list1=[[],[],[],[],[]]
x=driver.find_elements_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr')
for i in range(3,len(x)+1):
date=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[{}]/td[5]'.format(i))
if str(date.text) in filted_water_list[0]:
biaoshi=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[{}]/td[2]'.format(i))
cloud=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[{}]/td[6]'.format(i))
youwu=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div[1]/table/tr[{}]/td[9]'.format(i))
list1[0].append(biaoshi.text)
list1[1].append(date.text)
list1[2].append(cloud.text)
list1[3].append(youwu.text)
index=filted_water_list[0].index(str(date.text))
list1[4].append(filted_water_list[1][index])
print(list1)
for k in range(len(list1[0])):
n=[]
[n.append(i[k]) for i in list1]
r.append(n)
#判断是否可以往下翻页,可以的话就翻页
i=driver.find_element_by_xpath('/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[2]/div[2]/div[3]/div[2]/table/tr/td[10]/a')
if i.get_attribute("class")=="l-btn l-btn-plain":
i.click()
time.sleep(4)
else:
break
return r
satellite_list=['LT4_5','LE7_on','LE7_off','LC8']#这里添加你想要搜索的卫星
water_list=extract_water(r'C:\Users\23932\Desktop\毕设\监利水位.xlsx')#这里添加水位/流量序列的路径文件,表格应该是第一行表头,每一行是年、月、日、水位/流量
filted_water_list=water_filter(water_list)#在函数内部改水位筛选条件
year=[str(i) for i in range(2001,2018)]#这里添上需要的年份
driver=webdriver.Chrome(executable_path=r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
out_datalist=[]
for satellite in satellite_list:
r=extract_data(satellite,[124,39],100,year,filted_water_list)
out_datalist+=r
out_excel(out_datalist,r'C:\Users\23932\Desktop\毕设','29_31.xls')