地理编码 - 地理信息系统(2)

2023-10-28 11:10

本文主要是介绍地理编码 - 地理信息系统(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

copyright.gif(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="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>

3、百度批量地址解析

批量地址格式文本(地址加引号并用逗号分隔)
"合肥市包河区金寨路1号(金寨路与望江西路交叉口)","合肥市庐阳区凤台路209号(凤台路与蒙城北路交叉口)","合肥市蜀山区金寨路217号(近安医附院公交车站)","合肥市蜀山区梅山路10号(近安徽饭店) ","合肥市蜀山区 长丰南路159号铜锣湾广场312室","合肥市寿春路93号钱柜星乐町KTV(逍遥津公园对面)","合肥市庐阳区长江中路177号","合肥市新站区胜利路89"
注:按格式批量添加地址,然后运行“批量地址解析”按钮

批量地址解析

批量地址经纬度坐标

代码样例

<!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示例文档

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{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示例文档

5、百度批量逆地址解析

[[116.307852,40.057031],[116.313082,40.047674],[116.328749,40.026922],[116.347571,39.988698],[116.316163,39.997753],[116.345867,39.998333],[116.403472,39.999411],[116.307901,40.05901]]
注:数组按格式批量添加经纬度,然后运行“批量反地址解析”按钮

代码样例

<!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的限制)。

转载于:https://www.cnblogs.com/cloudtj/p/7105000.html

这篇关于地理编码 - 地理信息系统(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292805

相关文章

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte

Redis地理数据类型GEO

通常要计算两个地理位置的距离不是很方便,这里可以直接通过Redis提供的GEO操作来完成地理位置相关的计算 1)添加地理位置 语法:geoadd key longitude latitude member [longitude latitude member] ...字段说明:key:存放地理位置的集合名称longitude:地理坐标的经度latitude:地理坐标的纬度member:表示这

4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)

一、Camera 简化思路 在 Camera 的开发中,其实我们通常只关注打开相机、图像预览和关闭相机,其他的步骤我们不应该花费太多的精力 为此,应该提供一个工具类,它有处理相机的一些基本工具方法,包括获取摄像头 ID、选择最优预览尺寸以及打印相机参数信息 二、Camera 工具类 CameraIdResult.java public class CameraIdResult {

Python字符编码及应用

字符集概念 字符集就是一套文字符号及其编码的描述。从第一个计算机字符集ASCII开始,为了处理不同的文字,发明过几百种字符集,例如ASCII、USC、GBK、BIG5等,这些不同的字符集从收录到编码都各不相同。在编程中出现比较严重的问题是字符乱码。 几个概念 位:计算机的最小单位二进制中的一位,用二进制的0,1表示。 字节:八位组成一个字节。(位与字节有对应关系) 字符:我们肉眼可见的文字与符号。

在Eclipse环境下修改Tomcat编码的问题

问题: 由于BMS需要设置UTF-8编码,要不就会出现中文乱码问题; 一、项目保持UTF-8格式; 二、由于可能会多次移除项目、加载项目,不想每次都要修改tmp0\conf 原因: 如果在eclipse中配置了tomcat后,其实,tomcat所用的所有tomcat配置文件,都不是catalina_home/config下面的xml文件,而是在eclipse所创建的Serve

在Unity环境中使用UTF-8编码

为什么要讨论这个问题         为了避免乱码和更好的跨平台         我刚开始开发时是使用VS开发,Unity自身默认使用UTF-8 without BOM格式,但是在Unity中创建一个脚本,使用VS打开,VS自身默认使用GB2312(它应该是对应了你电脑的window版本默认选取了国标编码,或者是因为一些其他的原因)读取脚本,默认是看不到在VS中的编码格式,下面我介绍一种简单快

霍夫曼编码/译码器

赫夫曼树的应用 1、哈夫曼编码   在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,1}。现要求为这些字母设计编码。要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制,可分别用