【爬虫】根据水文资料(水位/流量)爬取地理空间数据云遥感影像信息

当我们利用遥感影像提取河流的水体时,往往需要以该河流上某一水文站的水文资料来确定一个水位/流量范围,根据水文资料中符合要求的日期序列去下载遥感影像资料,这样才能使得不同年份提取出来的水体具有可比性,以便进一步分析

如题,基于python的selenuim库,在地理空间数据云上爬取遥感影像(Landsat)的日期信息;并利用水文站的水位/流量序列筛选符合水位/流量要求的日期序列;最后从提取遥感影像日期序列中符合水位/流量要求的数据条目,以.xls的形式输出。

代码运行需要下载一个浏览器驱动,将驱动放在对应浏览器的安装目录下

所需输入的东西如下:

  1. 水位/流量序列的excel表格
    这里用的是监利站水位:
    注意要有表头和年、月、日、水位顺序
  2. 云量,条带号和行编号
  3. 需要的年份序列
  4. 所需的卫星列表
    这里用到的卫星是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')

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值