地理編碼(Geocoding)指的是將統計資料或是地址信息創建空間座標關係的過程。地址通過地理編碼後,即可在地圖中經過經緯度顯示各地址的位置(正向地理編碼:地址 - 座標)。反之,也能夠經過經緯度解析出對應地址(逆向地理編碼:座標 - 地址)。地理編碼也稱爲地址解析。javascript
當咱們書寫地址是,應該從大到小分級書寫,地址等級可參考以下分級:css
如,黑龍江省哈爾濱市道里區通達街138號。若是城市較大,能夠省略省份。另外,地理編碼通常只解析到門牌號,不必書寫樓層或房間號等細節。html
本文根據百度地圖開發平臺介紹地址和經緯度間的相互轉換。java
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密鑰"> </script> <title>地址解析</title> </head> <body></body> </html>
使用前登錄百度地圖開放平臺開發者註冊頁(http://lbsyun.baidu.com/apiconsole/key),得到本身的密鑰。數據庫
注:在地址欄中輸入國內任何地址,可得到該地址經緯度和墨卡託座標api
代碼樣例
數組
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>地址解析</title> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密鑰"></script> </head> <body> <center>地址 <input id="myAddress" value="北京市海淀區上地10街" style="width:396px;"> <button onclick="setJWD(document.getElementById('myAddress').value)">地址解析</button> <div id="myMap" style="width:500px; height:300px; border:#aaaaaa solid 1px;"></div> 經度 <input id="myJD" style="width:80px;"> 緯度 <input id="myWD" style="width:80px;"> 墨卡託X <input id="myMX" style="width:80px;"> 墨卡託Y <input id="myMY" style="width:80px;"> </center> </body> </html> <script type="text/javascript" charset="UTF-8"> var map = new BMap.Map("myMap"); setJWD(document.getElementById("myAddress").value); function setJWD(addr) { var point = new BMap.Point(116.331398,39.897445); map.centerAndZoom(point,12); var myGeo = new BMap.Geocoder(); // 建立地址解析器實例 var mpObj = new BMap.MercatorProjection(); // 墨卡託座標對象 myGeo.getPoint(addr, function(point){ if (point) { map.centerAndZoom(point, 16); //設置地圖中心點和顯示級別 map.addOverlay(new BMap.Marker(point)); //加載中心點圖層 document.getElementById("myJD").value=point.lng; //得到經度 document.getElementById("myWD").value=point.lat; //得到緯度 var mpoint = mpObj.lngLatToPoint(new BMap.Point(point.lng, point.lat)); //經緯度轉換爲墨卡託座標 document.getElementById("myMX").value=mpoint.x; //得到墨卡託橫座標 document.getElementById("myMY").value=mpoint.y; //得到墨卡託縱座標 }}, ""); } </script>
代碼樣例
函數
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <title>批量地址</title> <style type="text/css"> body, html{width: 100%;height: 100%;margin:0;font-family:"微軟雅黑";} #l-map{height:300px;width:100%;} #r-result{width:100%; font-size:14px;line-height:20px;} </style> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密鑰"></script> </head> <body> <div id="l-map"></div> <div id="r-result"> <input type="button" value="批量地址解析" onclick="bdGEO()" /> <div id="result"></div> </div> </body> </html> <script type="text/javascript"> // 百度地圖API功能 var map = new BMap.Map("l-map"); map.centerAndZoom(new BMap.Point(117.269945,31.86713), 13); map.enableScrollWheelZoom(true); var index = 0; var myGeo = new BMap.Geocoder(); var adds = [ "包河區金寨路1號(金寨路與望江西路交叉口)", "廬陽區鳳台路209號(鳳台路與蒙城北路交叉口)", "蜀山區金寨路217號(近安醫附院公交車站)", "蜀山區梅山路10號(近安徽飯店) ", "蜀山區 長豐南路159號銅鑼灣廣場312室", "合肥市壽春路93號錢櫃星樂町KTV(逍遙津公園對面)", "廬陽區長江中路177號", "新站區勝利路89" ]; function bdGEO(){ var add = adds[index]; geocodeSearch(add); index++; } function geocodeSearch(add){ if(index < adds.length){ setTimeout(window.bdGEO,400); } myGeo.getPoint(add, function(point){ if (point) { document.getElementById("result").innerHTML += index + "、" + add + ":" + point.lng + "," + point.lat + "</br>"; var address = new BMap.Point(point.lng, point.lat); addMarker(address,new BMap.Label(index+":"+add,{offset:new BMap.Size(20,-10)})); } }, "合肥市"); } // 編寫自定義函數,建立標註 function addMarker(point,label){ var marker = new BMap.Marker(point); map.addOverlay(marker); marker.setLabel(label); } </script>
注:代碼摘自百度API示例文檔工具
注:可替換經緯度(如,經度126.61675九、緯度45.74989),點擊「逆地址解析」按鈕得到明碼地址學習
代碼樣例
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <style type="text/css"> body, html{width: 100%;height: 100%;margin:0;font-family:"微軟雅黑";font-size:14px;} #allmap {width:100%;height:500px;} </style> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密鑰"></script> <title>逆地址解析</title> </head> <body> <div id="allmap"></div> <p>點擊地圖展現詳細地址</p> </body> </html> <script type="text/javascript"> // 百度地圖API功能 var map = new BMap.Map("allmap"); var point = new BMap.Point(116.331398,39.897445); map.centerAndZoom(point,12); var geoc = new BMap.Geocoder(); map.addEventListener("click", function(e){ var pt = e.point; geoc.getLocation(pt, function(rs){ var addComp = rs.addressComponents; alert(addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber); }); }); </script>
注:代碼摘自百度API示例文檔
代碼樣例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <title>批量反地址解析+商圈</title> <style type="text/css"> body, html{width: 100%;height: 100%;margin:0;font-family:"微軟雅黑";} #l-map{height:300px;width:100%;} #r-result{width:100%; font-size:14px;line-height:20px;} </style> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密鑰"></script> </head> <body> <div id="l-map"></div> <div id="r-result"> <input type="button" value="批量反地址解析+商圈" onclick="bdGEO(0)" /> <div id="result"></div> </div> </body> </html> <script type="text/javascript"> // 百度地圖API功能 var map = new BMap.Map("l-map"); map.centerAndZoom(new BMap.Point(116.328749,40.026922), 13); map.enableScrollWheelZoom(true); var index = 0; var myGeo = new BMap.Geocoder(); var adds = [ new BMap.Point(116.307852,40.057031), new BMap.Point(116.313082,40.047674), new BMap.Point(116.328749,40.026922), new BMap.Point(116.347571,39.988698), new BMap.Point(116.316163,39.997753), new BMap.Point(116.345867,39.998333), new BMap.Point(116.403472,39.999411), new BMap.Point(116.307901,40.05901) ]; for(var i = 0; i<adds.length; i++){ var marker = new BMap.Marker(adds[i]); map.addOverlay(marker); marker.setLabel(new BMap.Label("我是商圈:"+(i+1),{offset:new BMap.Size(20,-10)})); } function bdGEO(){ var pt = adds[index]; geocodeSearch(pt); index++; } function geocodeSearch(pt){ if(index < adds.length-1){ setTimeout(window.bdGEO,400); } myGeo.getLocation(pt, function(rs){ var addComp = rs.addressComponents; document.getElementById("result").innerHTML += index + ". " +adds[index-1].lng + "," + adds[index-1].lat + ":" + "商圈(" + rs.business + ") 結構化數據(" + addComp.province + ", " + addComp.city + ", " + addComp.district + ", " + addComp.street + ", " + addComp.streetNumber + ")<br/><br/>"; }); } </script>
注:代碼摘自百度API示例文檔
地址正、逆解析精度取決於系統數據庫數據採集密度和更新速度。國內地址服務較好的爲百度和高德地圖。在實踐中,地址解析、特別是大數據批量地址解析較爲經常使用。凡是和位置有關的天然和社會現象,經過地址解析得到數量化指標,從而爲統計量化分析、特別是空間統計分析奠基堅實基礎。
本文提供的各類地址解析工具僅用於我的學習或教學研究用途,不支持大批量商業用途地址解析(因爲百度地圖key的限制)。