摘要:不管是百度LBS開放平臺,仍是高德LBS開放平臺,其調用量最高的接口,必然是定位,其次就是地址解析了,又稱爲地理編碼。地址解析,就是將地址轉換爲經緯度。而逆地址解析,就是將經緯度轉換爲地址。經緯度通常是由專業測繪機構用GPS採集,而後使用國測局接口加密,最後呈如今互聯網地圖上的。而地址,這裏說的是結構化的帶街道門牌號的地址,好比「北京市朝陽區阜通東大街6號」,這個地址是由公安局頒發的。而將地址和經緯度一一對應起來,這個就是高德地圖作的事情了,也就是地址解析接口的功能了。地址解析功能,實用性強,調用頻次高,谷歌API的地址解析接口甚至是收費的!因此,如今有現成免費的接口,你們應該很開心呀。javascript
---------------------------------------------------------------------------css
使用高德提供的AMap.Geocoder插件便可實現地址解析,和逆地址解析。html
地理編碼類是指將地址信息和地理座標點信息進行相互轉化,包括將地址信息轉換爲地理座標點的編碼和將地理座標點轉換爲地址信息的逆地理編碼。java
一、地理編碼web
地理編碼是將地址信息轉換爲地理座標點信息,你能夠使用此項功能在指定位置添加一個點或是定位地圖上的某個位置。接口爲:windows
geocoder.getLocation("北京市海淀區蘇州街");
代碼:api
var geocoder; //加載地理編碼插件 mapObj.plugin(["AMap.Geocoder"],function(){ geocoder=new AMap.Geocoder({ radius:1000, //以已知座標爲中心點,radius爲半徑,返回範圍內興趣點和道路信息 city:"010"//城市,默認:"全國" }); //返回地理編碼結果 AMap . event . addListener(geocoder, "complete",geocoder_callBack); geocoder.getLocation("北京市海淀區蘇州街"); });
效果圖:數組
二、逆地理編碼函數
逆地理編碼又稱位置描述或地址解析,即從已知的經緯度座標到對應的地址描述(如省市、街區、樓層、房間等)的轉換。接口爲:ui
geocoder.getAddress(lnglatXY);
代碼:
var geocoder; var lnglatXY=new AMap.LngLat(116.396574,39.992706); //加載地理編碼插件 mapObj.plugin(["AMap.Geocoder"],function(){ geocoder=new AMap.Geocoder({ radius:1000, //以已知座標爲中心點,radius爲半徑,返回範圍內興趣點和道路信息 extensions: "all"//返回地址描述以及附近興趣點和道路信息,默認"base" }); //返回地理編碼結果 AMap . event . addListener(geocoder, "complete",geocoder_callBack); //逆地理編碼 geocoder.getAddress(lnglatXY); });
效果圖:
三、所有源代碼
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>地址解析</title> <link rel="stylesheet" type="text/css" href="zero.css" /> <script language="javascript" src="http://webapi.amap.com/maps?v=1.3&key=【您的key】"></script> </head> <body onLoad="mapInit()"> <div id="iCenter"></div> <div id="iControlbox"> <ul> <li> <input type="text" id="key_11" value="116.51413" /> <input type="text" id="key_12" value="39.912896" /> <button onclick="javascript:geocoder2();">逆地址解析</button> </li> <li> <input type="text" id="key_2" value="北京市朝陽區大屯路304號" /> <button onclick="javascript:geocoder();">地址解析</button> </li> </ul> </div> <div id="result"></div> </body> <script language="javascript"> var mapObj; var result; var marker = []; var windowsArr = []; function mapInit () { mapObj = new AMap.Map('iCenter'); //默認定位:初始化加載地圖時,center及level屬性缺省,地圖默認顯示用戶所在城市範圍 }; var MGeocoder; var key_11; var key_12; var key_2; function geocoder2() { //POI搜索,關鍵字查詢 key_11 = document.getElementById("key_11").value; key_12 = document.getElementById("key_12").value; var lnglatXY = new AMap.LngLat(key_11,key_12); //document.getElementById('result').innerHTML = "您輸入的是:" + key_1; //加載地理編碼插件 mapObj.plugin(["AMap.Geocoder"], function() { MGeocoder = new AMap.Geocoder({ radius: 1000, extensions: "all" }); //返回地理編碼結果 AMap.event.addListener(MGeocoder, "complete", geocoder_CallBack2); //逆地理編碼 MGeocoder.getAddress(lnglatXY); }); //加點 var marker = new AMap.Marker({ map:mapObj, icon: new AMap.Icon({ image: "http://api.amap.com/Public/images/js/mark.png", size:new AMap.Size(58,30), imageOffset: new AMap.Pixel(-32, -0) }), position: lnglatXY, offset: new AMap.Pixel(-5,-30) }); mapObj.setFitView(); } //鼠標劃過顯示相應點 var marker2; function onMouseOver (e) { var coor = e.split(','), lnglat = new AMap.LngLat(coor[0], coor[1]); if (!marker2) { marker2 = new AMap.Marker({ map:mapObj, icon: "http://webapi.amap.com/images/0.png", position: lnglat, offset: new AMap.Pixel(-10, -34) }); } else { marker2.setPosition(lnglat); } mapObj.setFitView(); } function geocoder_CallBack2(data) { //回調函數 var resultStr = ""; var roadinfo =""; var poiinfo=""; var address; //返回地址描述 address = data.regeocode.formattedAddress; //返回周邊道路信息 roadinfo +="<table style='width:600px'>"; for(var i=0;i<data.regeocode.roads.length;i++){ var color = (i % 2 === 0 ? '#fff' : '#eee'); roadinfo += "<tr style='background-color:" + color + "; margin:0; padding:0;'><td>道路:" + data.regeocode.roads[i].name + "</td><td>方向:" + data.regeocode.roads[i].direction + "</td><td>距離:" + data.regeocode.roads[i].distance + "米</td></tr>"; } roadinfo +="</table>" //返回周邊興趣點信息 poiinfo += "<table style='width:600px;cursor:pointer;'>"; for(var j=0;j<data.regeocode.pois.length;j++){ var color = j % 2 === 0 ? '#fff' : '#eee'; poiinfo += "<tr onmouseover='onMouseOver(\"" + data.regeocode.pois[j].location.toString() + "\")' style='background-color:" + color + "; margin:0; padding:0;'><td>興趣點:" + data.regeocode.pois[j].name + "</td><td>類型:" + data.regeocode.pois[j].type + "</td><td>距離:" + data.regeocode.pois[j].distance + "米</td></tr>"; } poiinfo += "</table>"; //返回結果拼接輸出 resultStr = "<div style=\"font-size: 12px;padding:0px 0 4px 2px; border-bottom:1px solid #C1FFC1;\">"+"<b>地址</b>:"+ address + "<hr/><b>周邊道路信息</b>:<br/>" + roadinfo + "<hr/><b>周邊興趣點信息</b>:<br/>" + poiinfo +"</div>"; document.getElementById("result").innerHTML = resultStr; } function geocoder() { //地理編碼返回結果展現 key_2 = document.getElementById("key_2").value; mapObj.plugin(["AMap.Geocoder"], function() { //加載地理編碼插件 MGeocoder = new AMap.Geocoder(); //返回地理編碼結果 AMap.event.addListener(MGeocoder, "complete", geocoder_CallBack); MGeocoder.getLocation(key_2); //地理編碼 }); } //地理編碼返回結果展現 function geocoder_CallBack(data){ var resultStr=""; //地理編碼結果數組 var geocode = new Array(); geocode = data.geocodes; for (var i = 0; i < geocode.length; i++) { //拼接輸出html resultStr += "<span style=\"font-size: 12px;padding:0px 0 4px 2px; border-bottom:1px solid #C1FFC1;\">"+"<b>地址</b>:"+geocode[i].formattedAddress+""+ "<b> 座標</b>:" + geocode[i].location.getLng() +", "+ geocode[i].location.getLat() +""+ "<b> 匹配級別</b>:" + geocode[i].level +"</span>"; addmarker(i, geocode[i]); } mapObj.setFitView(); document.getElementById("result").innerHTML = resultStr; } function addmarker(i, d) { var lngX = d.location.getLng(); var latY = d.location.getLat(); var markerOption = { map:mapObj, icon:"http://webapi.amap.com/images/"+(i+1)+".png", position:new AMap.LngLat(lngX, latY) }; var mar = new AMap.Marker(markerOption); marker.push(new AMap.LngLat(lngX, latY)); var infoWindow = new AMap.InfoWindow({ content:d.formattedAddress, autoMove:true, size:new AMap.Size(150,0), offset:{x:0,y:-30} }); windowsArr.push(infoWindow); var aa = function(e){infoWindow.open(mapObj,mar.getPosition());}; AMap.event.addListener(mar,"click",aa); } </script> </html>