谷歌地图地理解析

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

大家好,又见面了,我是你们的朋友全栈君。

微信搜索:“二十同学” 公众号,欢迎关注一条不一样的成长之路

地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度: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., GeocoderStatus))

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

属性 类型 描述
address string 需要解析的地名. 可选.
bounds LatLngBounds 经纬度搜索范围. 可选.(我没有具体试用过)
location LatLng(注意类型) 需要解析的经纬度. 可选.
region string 国家代码. 可选.(我没有具体试用过)

对于解析我们使用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.解析结果

属性 类型 描述
address_components Array.<GeocoderAddressComponent> GeocoderAddressComponents数组
formatted_address string 格式化后的最佳匹配地址(地名可小到街道)
geometry GeocoderGeometry GeocoderGeometry 对象
types Array. 一个表示返回的地理编码元素的类型的字符串数组

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

a. 格式化后的地名formatted_address,只需直接调用即可b.geometry返回一个GeocoderGeometry 对象,其中又包含有4个属性

Properties Type Description
bounds LatLngBounds 解析出来的精确的界限
location LatLng 纬度/经度坐标
location_type GeocoderLocationType 返回的location类型
viewport LatLngBounds 解析结果的视图范围

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

下面我们来实例一下实例代码:

<!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>

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/147791.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用docker部署jar包_docker run 参数

    用docker部署jar包_docker run 参数小小总结一、思路1、将docker容器中的指定文件夹挂载到宿主机上,更新jar包只需上传到宿主机指定路径,方便更新2、利用bash文件运行jar包,并构建该bash的镜像,代替构建直接运行jar包的镜像,利于镜像与jar包解耦。例如,app-1.0.0.jar升级到app-2.0.0.jar,只须更改bash文件的内容,而无须构建新的镜像。二、准备工作1、创建存放docker配置文件、jar包的文件夹在宿主机上,创建文件夹:/home/admin/app,用于存放bash文件和jar包。然

    2022年9月27日
    2
  • k8s的apiserver_k8s源码分析

    k8s的apiserver_k8s源码分析APIserverfunc main() { … #核心 command := app.NewAPIServerCommand() #日志 logs.InitLogs() defer logs.FlushLogs() …}#NewAPIServerCommand#核心是调用run函数 运行AIPserver 永远不会退出return Run(completedOptions, genericapiserver.SetupSignalHandler())#Run#创建

    2022年8月11日
    4
  • JAVA常用框架及漏洞[通俗易懂]

    JAVA常用框架及漏洞[通俗易懂]三大语言常用框架及漏洞Java框架1.MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情:封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换MyBatis的主要设计目的就是让我们对执行SQL语句时对输入输出的数据管理更加方便,所以方便地写出SQL和方便地获取SQL的执行结果才是MyBatis的核心竞争力。…

    2022年7月7日
    42
  • 【crossbeam系列】3 crossbeam-deque:work-stealing算法

    【crossbeam系列】3 crossbeam-deque:work-stealing算法work-stealing算法简介crossbeam-deque包提供了一个无锁的双向队列(deque)。那么这个双向队列在并发中又起到了什么重要的作用呢?这就涉及到了在多任务环境下的一…

    2022年9月14日
    2
  • 3.20 DAY3[通俗易懂]

    3.20 DAY3[通俗易懂]1.msg=’我叫%s,我看着像%r’%(‘太白’,’郭德纲’)print(msg)我叫太白,我看着像’郭德纲’句中出现引号,把%s替换成%r,可以打印出原来样式2.ASCII8位字节英文字母,数字,特殊字符unicode:万国码  python2:unicode默认是2个字节表示一个字符  python3:unicode统一是4个字节表示一个字符    创建初期16位字…

    2022年9月25日
    2
  • 图像的卷积操作

    图像的卷积操作原理:给定一个奇数尺寸大小的卷积核,对图像进行卷积操作。因为使用奇数尺寸大小的卷积核,其锚点正好在卷积核正中央的位置。如下图中间画了一个锚的就是锚点使锚点覆盖在待计算像素上面,然后计算像素值与被覆盖的卷积核中的值的乘积和。将这个和赋值给当前像素,这就是卷积的过程。公式如下所示此处会有一个问题,如果锚点落在第一个像素点(1,1)上,卷积核当中锚点左侧和上方的卷积值超出了图像的边界外…

    2022年5月27日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号