地理編碼 - 地理信息系統(2)

(2017-07-02 銀河統計)

地理編碼(Geocoding)指的是將統計資料或是地址信息創建空間座標關係的過程。地址通過地理編碼後,即可在地圖中經過經緯度顯示各地址的位置(正向地理編碼:地址 - 座標)。反之,也能夠經過經緯度解析出對應地址(逆向地理編碼:座標 - 地址)。地理編碼也稱爲地址解析。javascript

1、標準地址規範

當咱們書寫地址是,應該從大到小分級書寫,地址等級可參考以下分級:css

  • 第一級省
  • 第二級市
  • 第三級區、縣
  • 第四級鎮、鄉、街道
  • 第五級路、巷、行政村
  • 第六級小區、天然村
  • 第七級門牌、村組
  • 第八級樓號、辦公樓房(單位)
  • 第九級單元號、房號

如,黑龍江省哈爾濱市道里區通達街138號。若是城市較大,能夠省略省份。另外,地理編碼通常只解析到門牌號,不必書寫樓層或房間號等細節。html

2、地址解析

本文根據百度地圖開發平臺介紹地址和經緯度間的相互轉換。java

一、在網頁中引用百度地圖API

<!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),得到本身的密鑰。數據庫

二、百度地址解析

地址   
經度   緯度   墨卡託X   墨卡託Y 

注:在地址欄中輸入國內任何地址,可得到該地址經緯度和墨卡託座標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>地址&nbsp;<input id="myAddress" value="北京市海淀區上地10街" style="width:396px;">&nbsp;
<button onclick="setJWD(document.getElementById('myAddress').value)">地址解析</button>
<div id="myMap" style="width:500px; height:300px; border:#aaaaaa solid 1px;"></div>
經度&nbsp;<input id="myJD" style="width:80px;">&nbsp;緯度&nbsp;<input id="myWD" style="width:80px;">&nbsp;
墨卡託X&nbsp;<input id="myMX" style="width:80px;">&nbsp;墨卡託Y&nbsp;<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的限制)。

相關文章
相關標籤/搜索