• 地理编码


    (2017-07-02 银河统计)

    地理编码(Geocoding)指的是将统计资料或是地址信息建立空间坐标关系的过程。地址经过地理编码后,便可在地图中通过经纬度显示各地址的位置(正向地理编码:地址 - 坐标)。反之,也可以通过经纬度解析出对应地址(逆向地理编码:坐标 - 地址)。地理编码也称为地址解析。

    一、标准地址规范

    当我们书写地址是,应该从大到小分级书写,地址等级可参考如下分级:

    • 第一级省
    • 第二级市
    • 第三级区、县
    • 第四级镇、乡、街道
    • 第五级路、巷、行政村
    • 第六级小区、自然村
    • 第七级门牌、村组
    • 第八级楼号、办公楼房(单位)
    • 第九级单元号、房号

    如,黑龙江省哈尔滨市道里区通达街138号。如果城市较大,可以省略省份。另外,地理编码一般只解析到门牌号,没必要书写楼层或房间号等细节。

    二、地址解析

    本文根据百度地图开发平台介绍地址和经纬度间的相互转换。

    1、在网页中引用百度地图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),获得自己的密钥。

    2、百度地址解析

    地址  
    经度  纬度  墨卡托X  墨卡托Y 
    注:在地址栏中输入国内任何地址,可获得该地址经纬度和墨卡托坐标

    代码样例

    <!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="396px;">&nbsp;
    <button onclick="setJWD(document.getElementById('myAddress').value)">地址解析</button>
    <div id="myMap" style="500px; height:300px; border:#aaaaaa solid 1px;"></div>
    经度&nbsp;<input id="myJD" style="80px;">&nbsp;纬度&nbsp;<input id="myWD" style="80px;">&nbsp;
    墨卡托X&nbsp;<input id="myMX" style="80px;">&nbsp;墨卡托Y&nbsp;<input id="myMY" style="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>
    

    3、百度批量地址解析

    批量地址格式文本(地址加引号并用逗号分隔)

    注:按格式批量添加地址,然后运行“批量地址解析”按钮


    批量地址经纬度坐标

    代码样例

    <!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{ 100%;height: 100%;margin:0;font-family:"微软雅黑";}
    	#l-map{height:300px;100%;}
    	#r-result{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示例文档

    4、百度逆地址解析

    经度  纬度  
    省份  城市  区镇  街道  牌号 
    地址 
    注:可替换经纬度(如,经度126.616759、纬度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{ 100%;height: 100%;margin:0;font-family:"微软雅黑";font-size:14px;}
    	#allmap {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示例文档

    5、百度批量逆地址解析


    注:数组按格式批量添加经纬度,然后运行“批量反地址解析”按钮

    代码样例

    <!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{ 100%;height: 100%;margin:0;font-family:"微软雅黑";}
    	#l-map{height:300px;100%;}
    	#r-result{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的限制)。

  • 相关阅读:
    2018-2019-1 20165229 20165306 实验五 通讯协议设计
    2018-2019-1 20165306 《信息安全系统设计基础》第十一周学习总结
    2018-2019-1 20165229 20165306 实验四 外设驱动程序设计
    2018-2019-1 20165229 20165306 实验三 实时系统
    2018-2019-1 20165306 《信息安全系统设计基础》第七周学习总结
    2018-2019-1 20165229 20165306 实验二 固件程序设计
    2018-2019-1 20165306 《信息安全系统设计基础》第六周学习总结
    2018-2019-1 20165306 《信息安全系统设计基础》第五周学习总结
    2018-2019-1 20165306 《信息安全系统设计基础》第四周学习总结
    2018-2019-1 20165229 20165306 实验一 开发环境的熟悉
  • 原文地址:https://www.cnblogs.com/cloudtj/p/7105000.html
Copyright © 2020-2023  润新知