谷歌地图地理解析和反解析geocode.geocoder详解

地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程。

地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国贵州省贵阳市南明区翠微巷7号 邮政编码: 550002)的过程。
受当地法律限制及各方面原因,国内很多地图并不包含地理解析和反解析功能(地理解析和反解析功能功能不够强悍),Google永远是最棒的。废话不多说
要使用到Google map 地理解析和反解析功能,我们需要了解google.maps.Geocoder类,谷歌地图给我们提供了强大的api,下面我们来实现
1.初始化地图(最基本的,不解释)

//初始化地图

var map = new google.maps.Map(document.getElementById("map_canvas"),{

center : new google.maps.LatLng(26.57, 106.72),

zoom : 8,

mapTypeId : google.maps.MapTypeId.ROADMAP

});

2.实例化谷歌Geocoder服务

//实例化Geocoder服务

var geocoder = new google.maps.Geocoder();

这样我们就可以进行地理解析和反解析了,使用代码:

geocoder.geocode(request:GeocoderRequest, callback:function(Array.<GeocoderResult>, GeocoderStatus))

i.数据请求:

其中需要进行请求的数据GeocoderRequest可为4种属性:

属性 类型 描述
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >addressde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >stringde> 需要解析的地名. 可选.
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >boundsde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >LatLngBoundsde> 经纬度搜索范围. 可选.(我没有具体试用过)
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >locationde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >LatLng(注意类型)de> 需要解析的经纬度. 可选.
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >regionde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >stringde> 国家代码. 可选.(我没有具体试用过)

对于解析我们使用address,反解析使用location(注意传入的类型),请求的话,至少选择一种。

ii:结果处理:

而对于回掉函数(即解析后返回的处理函数)包含两个内容,GeocoderResult(解析结果,数组类型)和GeocoderStatus(解析状态)
1.解析状态是使用Geocoder()进行解析后返回的状态,包含5种:

ERROR(谷歌地图服务可能出错)
INVALID_REQUEST(GeocoderRequest无效,即输入的请求是错误的,可能是没有选择,或者属性写错)
OK(解析完成,并有相应数据)
OVER_QUERY_LIMIT(响应超时)
REQUEST_DENIED(网页被禁止geocoder解析)
UNKNOWN_ERROR(未知错误)
ZERO_RESULTS(零结果)

我们能用的就是状态为OK的情况
2.解析结果

属性 类型 描述
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >address_componentsde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >Array.<GeocoderAddressComponent>de> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >GeocoderAddressComponentde>s数组
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >formatted_addressde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >stringde> 格式化后的最佳匹配地址(地名可小到街道)
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >geometryde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >GeocoderGeometryde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >GeocoderGeometryde> 对象
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >typesde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >Array.<string>de> 一个表示返回的地理编码元素的类型的字符串数组

其中每一次解析成功后都会有上面的信息,我们最需要的就两样formatted_address和geometry。而address_components是一个地名数组,包含long_name(比如只返回省市名称),short_name和types,可以自己去试一下。

a. 格式化后的地名formatted_address,只需直接调用即可

b.geometry返回一个de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >GeocoderGeometryde> 对象,其中又包含有4个属性

Properties Type Description
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >boundsde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >LatLngBoundsde> 解析出来的精确的界限
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >locationde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >LatLngde> 纬度/经度坐标
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >location_typede> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >GeocoderLocationTypede> 返回的de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >location类型de>
de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >viewportde> de style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; " >LatLngBoundsde> 解析结果的视图范围

至此,所有关于地理解析和反解析就差不多说明完了,具体api参见https://developers.google.com/maps/documentation/javascript/reference#Geocoder

感觉说的好晕!基于此我做了一个关于批量解析和反解析的应用,详见:http://map.yanue.net/geo.htmlhttp://map.yanue.net/toLatLng .使用详解:http://www.yanue.net/archives/207.html ,

下面我们来实例一下

实例代码:(你有必要复制到本地试一下)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="http://maps.google.com/maps/api/js?sensor=false&libraries=places" type="text/javascript"></script>
<title>谷歌地图地理解析和反解析geocode.geocoder详解</title>
<meta name="author" content="yanue" />
<meta name="copyright" content="powered by yanue" />
<link rel="site" href="http://map.yanue.net/" />
<script type="text/javascript">
window.onload = function() {
//初始化地图
var map = new google.maps.Map(document.getElementById("map_canvas"),{
    center : new google.maps.LatLng(26.57, 106.72),
    zoom : 8,
    mapTypeId : google.maps.MapTypeId.ROADMAP
});
//实例化Geocoder服务
var geocoder = new google.maps.Geocoder();

//1.地理解析过程
//请求数据GeocoderRequest为address,值为‘贵阳‘
geocoder.geocode({address:‘贵阳‘},function geoResults(results, status){
  //这里是回掉函数(即结果处理函数)
  //状态为Ok说明有结果
  if (status == google.maps.GeocoderStatus.OK) {
      //一般情况下会有多个结果
      //第一个结果为最佳匹配的结果(匹配地名最全的结果),这里只去第一个,其他的可以根据需要自己循环出来
      //格式化过后的地址
      alert(‘地理解析结果:‘+results[0].formatted_address);
      //geometry是一个包含bounds(界限),location(纬度/经度坐标),location_type和viewport(视图范围)
      //获取解析后的经纬度
        alert(‘地理解析结果:‘+results[0].geometry.location);
  }else{
    alert(":error " + status);
  }
});

//2.地理反解析过程
//请求数据GeocoderRequest为location,值类型为LatLng因此我们要实例化经纬度
geocoder.geocode({location:new google.maps.LatLng(26.57, 106.72)},function geoResults(results, status){
  //这里处理结果和上面一模一样
  if (status == google.maps.GeocoderStatus.OK) {
      alert(‘地理反解析结果:‘+results[0].formatted_address);
        alert(‘地理反解析结果:‘+results[0].geometry.location);
  }else{
    alert(":error " + status);
  }
});
}
</script>
</head>
<body>
    <div id="map_canvas" style=‘width: 300px; height: 200px;‘></div>
</body>
</html>

至此,文章完

http://www.yanue.net/archives/217.html

时间: 2024-08-06 20:00:58

谷歌地图地理解析和反解析geocode.geocoder详解的相关文章

谷歌地图地理解析和反解析geocode.geocoder详解(转)

谷歌地图地理解析和反解析geocode.geocoder详解 谷歌Geocoder服务 实例代码 地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国贵州省贵阳市南明区翠微巷7号 邮政编码: 550002)的过程. 受当地法律限制及各方面原因,国内很多地图并不包含地理解析和反解析功能(地理解析和反解析功能功能不够强悍),Google永远是最棒的. 要

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.

四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的. [优点]      ①允许应用

艺多不压身 -- 四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX: JDOM: DOM4J: 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然

Java解析HTML之HTMLParser使用与详解

HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索.对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用,基本你的各种需求都可以满足.    这里我根据自己这几个月来的经验,写了一点入门的东西,希望能对新学习HTMLParser的朋友们有所帮助.(不过当年高考本人语文只比及格高一分,所以文法方面的问题还希望大家多多担待)        HTMLParser的核心模块是org.htmlparser.Par

解析xml的4种方法详解(转)

http://blog.csdn.net/jzhf2012/article/details/8532873 1. 介绍 1)DOM(JAXP Crimson解析器)         DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的.DOM以及广义的基于树的处理具有几个

iOS 原生地图地理编码与反地理编码

当我们要在App实现功能:输入地名,编码为经纬度,实现导航功能. 那么,我需要用到原生地图中的地理编码功能,而在Core Location中主要包含了定位.地理编码(包括反编码)功能. 在文件中导入 #import <CoreLocation/CoreLocation.h> 地理编码: /** 地理编码 */ - (void)geocoder { CLGeocoder *geocoder=[[CLGeocoder alloc]init]; NSString *addressStr = @&qu

c# xml序列化和反序列化。也就是xml的解析和反解析。

用习惯了newTownSoft.json 的json反序列化.碰到xml是真的不习惯. 每次json反序列化都是直接把json丢到bejson网站生成一个实体类,稍微修改修改一点点变量名.然后直接newTownSoft反序列化,一下就得到一个实体类了.今天调某个接口,碰到xml. 记录如下. xml <response> <functionID>setItemsPics</functionID> <time>2017-09-07 15:51:04</t

jquery源码解析:jQuery工具方法when详解

我们先来看when方法是如何使用的: var cb = $.when();   //when方法也是返回一个延迟对象,源码是return deferred.promise();返回的延迟对象不能修改状态 $.Deferred()也是返回一个延迟对象,那么它们的区别是什么呢?$.Deferred()只能针对一个延迟对象做成功,失败,进行中的操作,而$.when()可以针对多个延迟对象做以上操作.举个例子: function a(){ var cb = $.Deferred(); cb.resolv