爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4565|回复: 0

[混合编程] IDL之GPS坐标转高德地图坐标

[复制链接]

新浪微博达人勋

发表于 2020-7-4 10:27:22 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
一、需求缘起


气象上制图,经常是大开大合,地图上有个省市轮廓就行了,分辨率比较粗糙;
但是大气环境监测中,很多项目只在一个城市、一个区县中开展,坐标分辨率大约得精确到10m,
这种对地图的高要求,得使用国内的商用地图,其中据说高德最好。


二、代码与要点


;GPS转高德,可批量,lon经度,lat纬度,可以是向量。(现在经度我已经改用lng)
function GPS_amap,lon,lat


key='XXXXXXXXXXXXXXXXXXX';高德地图web开发k码,可免费申请

;坐标转换的url:
url='https://restapi.amap.com/v3/assistant/'+$
  'coordinate/convert?locations='
for i=0,n_elements(lon)-1 do begin
  url=url+strtrim(string(lon),2)+','+strtrim(string(lat),2)+';'
endfor
  url=url+'&coordsys=gps&output=json&key='+key


;将网页数据按json格式下载到本地
  netObject = IDLnetURL()
  jsonfile='.\geocode.json'
  !null = netObject.Get(URL=url,FILENAME=jsonfile)
  netObject = 0


;按字符串读取该json文件
  openr,lun,jsonfile,/get_lun
  xx=''
  readf,lun,xx
  free_lun,lun


;json解析,字符串转结构体(/TOSTRUCT表示转为结构体)
  json=JSON_PARSE(xx,/TOSTRUCT)
  cut=strsplit(json.locations,';',/extract)
  if n_elements(cut) ne n_elements(lon) then begin
    print,'AMAP坐标数量与GPS不一致!'
    stop
  endif
  
;不转为双精度浮点,则后面追加元素时,小数点位数不足,即精度不够
;如果只是float,则有效数字6位,经纬度精度不够,例如120.115,35.2462
  amaplon=double(1)
  amaplat=double(1)


  for i=0,n_elements(lon)-1 do begin
    cut2=strsplit(cut,',',/extract)
    amaplon=[amaplon,double(cut2[0])]
    amaplat=[amaplat,double(cut2[1])]
  endfor


  amaplon=amaplon[1:-1];高德经度
  amaplat=amaplat[1:-1];高德纬度
  
  re={amaplon:amaplon,amaplat:amaplat}
  return,re


end


调用示例:
IDL> lon=116.481499+dindgen(3)/1000
IDL> lat=39.990475+dindgen(3)/1000
IDL> re=GPS_amap(lon,lat)
IDL> re
{
    "AMAPLON": [116.48758626302100,
116.48858289930600, 116.48957926432300],
    "AMAPLAT": [39.991754014756999,
39.992751193577000, 39.993748101129000]
}

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表