四维地球
四维地球是华为和中国四维发布的遥感应用在线服务平台,部署于华为云上,可以动态持续的更新高分辨率遥感影像,包括日新图,镶嵌图,底图以及目标检测,分割,变化监测等增值服务,打造了遥感云服务生态圈。
县域边界经纬度坐标获取
四维地球查询日新图的api调用采用坐标形式,当利用行政区进行数据检索时,手动获取行政区边界经纬度坐标再相当的费劲,因此我们利用高德地图api获取县域的边界坐标,然后作为参数传入到四维地球api接口中。
四维地球开发者文档链接:
四维地球日新图查询api传入的json中为边界点的坐标,也可以传入多个多边形,但是行政区一般情况下为不规则多边形,其边界点多达几百个,利用高德api获取相对简单,代码如下:
import urllib.request
from urllib.parse import quote
import numpy as np
import json
import pandas as pd
from pandas import Series, DataFrame
#TODO
#高德上申请的key
key = 'xxxxxxxxxxxxxxxxx'
#搜素的城市名(全名)
addr_name = 'xx市'
def getlnglat(url,address):
uri = url + 'keywords=' + quote(address) + '&key=' + key + '&subdistrict=1' + '&extensions=all'
# 访问链接后,api会回传给一个json格式的数据
temp = urllib.request.urlopen(uri)
temp = json.loads(temp.read())
# polyline是坐标,name是区域的名字
#print(temp)
if len(temp['districts'])>0:
Data = temp["districts"][0]['polyline']
name = temp["districts"][0]['name']
# polyline数据是一整个纯文本数据,不同的地理块按照|分,块里面的地理信息按照;分,横纵坐标按照,分,因此要对文本进行三次处理
Data_Div1 = Data.split('|') # 对结果进行第一次切割,按照|符号
len_Div1 = len(Data_Div1) # 求得第一次切割长度
num = 0
len_Div2 = 0 # 求得第二次切割长度,也即整个数据的总长度
while num < len_Div1:
len_Div2 += len(Data_Div1[num].split(';'))
num += 1
num = 0
output = np.zeros((len_Div2, 3)).astype(np.float) # 循环2次,分割;与,
polygon_list = []
while num < len_Div1:
temp = Data_Div1[num].split(';')
len_temp = len(temp)
num_temp = 0
while num_temp < len_temp:
lon_pos=temp[num_temp].split(',')[0]
lat_pos=temp[num_temp].split(',')[1]
# print('经度坐标: ',lon_pos)
# print('纬度坐标: ', lat_pos)
#将经纬度组成一个dict
pos_dict={"x":lon_pos,"y":lat_pos}
polygon_list.append(pos_dict)
#output[num_temp + num_base, 1:3] = np.array(temp[num_temp].split(',')) # 得到横纵坐标
# output[num_temp + num_base, 2] = num_temp + 1 # 得到横纵坐标的连接顺序
# output[num_temp + num_base, 3] = num + 1 # 得到块的序号
num_temp += 1
num += 1
# output = DataFrame(output, columns=[ '名称','经度', '纬度'])
# output['名称'] = name
***#按照四维地球api的格式,每一个坐标点组成一个字典,最终形成一个列表传入到四维地球api的json中***
return polygon_list
else:
return ''
> 上述代码返回的坐标点格式如下所示:
> [{'x': '122.69752', 'y': '30.832721'}, {'x': '122.697317', 'y': '30.832904'}, {'x': '122.697172', 'y': '30.832891'}, {'x': '122.696988', 'y': '30.832752'}]
四维地球api查询日新图
利用高德api获取的区域边界坐标点,传入到post请求的json文件中。
#四维地球的key和链接
DEFAULT_URL ="https://api.siweiearth.com/seis/v3/api/image_query?"
token = "xxxxxxxxxxxxxxx885a55685"
token_type = 0 #access_token/client_token
op = "polygon_select" #操作指令:1)polygon_select:单面检索;2)geojson_select:多面检索
#高德api
gd_url = 'http://restapi.amap.com/v3/config/district?'
addr_name_list=['xx县']
print('县域名称: ',addr_name_list)
addr_img_id_list=[]
for addr_name in addr_name_list:
#获取xx县的地理坐标点
polygon_pos=getlnglat(gd_url,addr_name)
#请求的body
body = {
"image_filter": {
"image_type": 101,#日新图影像
"start_time": "2020-04-01 14:12:32",
"end_time": "2020-11-30 14:12:32",
#"CloudPercent":15,
#"sat_ids": [1001,1002,1003,1005,1006,1007,1008]
"sat_ids": [1002]#1002代表GF2卫星
},
"query": {
"projection": "EPSG:4326",
"polygon": []
},
"start": 0
}
body['query']['polygon']=polygon_pos
print('body: ',body)
#将传入参数转化为json
j_data=json.dumps(body)
#print(DEFAULT_URL+'access_token='+token+'&op='+op)
#提出post请求
response=requests.post(url=DEFAULT_URL+'access_token='+token+'&op='+op, data=j_data.encode("utf8"))
# 返回结果json
return_json = response.json()
print('return: ', return_json)
if return_json['status']=='$SUCCESS':
print('return: ',return_json)
RS_img_num=len(return_json['result']['item_list'])
print('获取影像数量: ',RS_img_num)
item_list=return_json['result']['item_list']
# print(item_list[0])
# print(item_list[1])
product_id_list=[]
for i in range(RS_img_num):
#在返回的json中是个固定格式 产品号位于这个固定字符串的-26:-16的位置。
product_id_list.append(item_list[i]['image_url'][-26:-16])
print(addr_name+'产品列表id: ',product_id_list)
addr_dict={'名称':addr_name,'影像产品号':product_id_list}
addr_img_id_list.append(addr_dict)
else:
product_id_list = []
addr_dict = {'名称': addr_name, '影像产品号': product_id_list}
addr_img_id_list.append(addr_dict)
#获取到的四维地球日新图的产品号
print('产品号: ',addr_img_id_list)
# csv_name='result.csv'
# header=['名称','影像产品号']
# write_to_csv(csv_name,header,addr_img_id_list)