地理编码(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的限制)。