使用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文件上传到高德云图