四维地球

四维地球是华为和中国四维发布的遥感应用在线服务平台,部署于华为云上,可以动态持续的更新高分辨率遥感影像,包括日新图,镶嵌图,底图以及目标检测,分割,变化监测等增值服务,打造了遥感云服务生态圈。

县域边界经纬度坐标获取

四维地球查询日新图的api调用采用坐标形式,当利用行政区进行数据检索时,手动获取行政区边界经纬度坐标再相当的费劲,因此我们利用高德地图api获取县域的边界坐标,然后作为参数传入到四维地球api接口中。

四维地球开发者文档链接:

python能显示三维地图 python 三维地球_Data


四维地球日新图查询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)