使用Excel VBA编程将网点的百度坐标转换后标注到高德地图上

公司网点表存储的坐标是百度坐标,现需要将网点位置标注到高德地图上,研究了一下高德地图的云图数据模版 http://lbs.amap.com/yuntu/reference/cloudstorage和坐标转换服务http://lbsbbs.amap.com/forum.php?mod=viewthread&tid=724,云数据管理平台http://yuntu.amap.com/datamanager/   ,实现了excel文件的导入,现将实现步骤及使用的一些技巧总结一下:

本地数据导出为高德云图导出模版需要的excel文件

因为需要转为高德地图对应的坐标,高德提供了坐标转换的接口服务(http://lbsbbs.amap.com/forum.php?mod=viewthread&tid=724),我想直接使用excel里的vba编程实现坐标的转换。

上面的文件导出后生成excel文件,红色的是模版必填的内容,蓝色的是选填的,为了后面其它应用的需要,我将对应的code和Id也存入到模版中

Excel VBA编程实现坐标转换

高德提供的坐标转换服务接口:http://restapi.amap.com/v3/assistant/coordinate/convert?locations=116.481499,39.990475&coordsys=baidu&output=Json&key=dd21bdd2263294d9e11b4a9f9d5d6c71

只要传入对应的坐标即可返回高德坐标(coordsys可选值:gps;mapbar;baidu),通过浏览器访问将返回如下格式数据,其中locations值就是对应的高德坐标。

根据这个接口,我使用Excel的VBA编程来实现接口请求和坐标转换,具体实现参考下面的截图

需要引用的对象如上图。

Function BytesToBstr(body, code)
    Dim objstream
    Set objstream = CreateObject("adodb.stream")
    objstream.Type = 1
    objstream.Mode = 3
    objstream.Open
On Error Resume Next
    objstream.Write body
On Error GoTo 0
    objstream.Position = 0
    objstream.Type = 2
    objstream.Charset = code
    BytesToBstr = objstream.ReadText
    objstream.Close
    Set objstream = Nothing
End Function

Function GetGaoDeLocations(XmlStr As String) As String
Dim objHTTP, xmlDOC

Set objHTTP = CreateObject("MSXML2.XMLHTTP")
Set xmlDOC = CreateObject("MSXML.DOMDocument")
strWebserviceURL = "http://restapi.amap.com/v3/assistant/coordinate/convert?coordsys=baidu&output=json&key=dd21bdd2263294d9e11b4a9f9d5d6c71&locations=" & XmlStr
objHTTP.Open "GET", strWebserviceURL, False '默认是POST方式
objHTTP.setRequestHeader "Content-Type", "application/json"
objHTTP.send ("")
'objHTTP.send ("{locations:'" & XmlStr & "'}") 'XmlInput是Ws的参数
GetGaoDeLocations = CStr(BytesToBstr((objHTTP.responseBody), "utf-8"))

Dim objSC, strJSON, objJS
strJOSN = GetGaoDeLocations
 '调用ScriptControl对象
Set objSC = CreateObject("MSScriptControl.ScriptControl")
strJSON = "var o=" & strJOSN & ";"
objSC.Language = "javascript"
objSC.AddCode (strJSON)
Set objJS = objSC.CodeObject.o
GetGaoDeLocations = objJS.locations

End Function


 

VBA里的代码如上,实现接口请求及返回值的处理。

 

通过拖动实现文本框内容的自动填充,拖动过程中,就自动去调用接口返回对应的高德坐标。

经过一番坐标转换后,需要再将返回值分割成经度和纬度分别填充到X,Y列。关于字符串分割,参考下面的方法:取左侧经度=LEFT(C2,FIND(",",C2)-1),取右侧纬度的=RIGHT(C2,LEN(C2)-LEN(D2)-1)

怎么样可以从一串字符中的某个指定位置的前或后截取指定个数的字符.

如:12345.6789,我要截取小数点前(或后)的3个字符.怎么样操作,

另外,怎么样从右边截取字符,就是和left()函数相反的那个功能.

=find(".",a2)
返回在数字中字符(小数点)的位置。

具体公式如下:
字符(小数点)前三位
=MID(A2,FIND(".",A2)-3,3)

字符(小数点)后三个
=MID(A2,FIND(".",A2)+1,3)

字符(小数点)前面的所有数字

=LEFT(A2,FIND(".",A2)-1)

字符(小数点)后面的所有数字

=RIGHT(A2,FIND(".",A2)-2)

以上均为不包括“字符”的情况。其它情况只需改变一下红色数字大小。

Excel文件上传到高德云图

 
 
全部上传后,通过http://yuntu.amap.com/share/2YJvMz可以看到效果

 

posted @ 2016-03-22 16:56  三人成虎  阅读(1186)  评论(0编辑  收藏  举报