如何通过经纬度获取地址信息?

摘要

Google Maps API Web Services,是一个为您的地图应用程序提供地理数据的 Google 服务的 HTTP 接口集合。具体包括:Google Geocoding API、Google Directions API、Google Elevation API、Google Places API。本文将探讨如何通过Google Geocoding API服务来获取地址信息。


 目录

  • 什么是网络服务?
  • 区分地址解析与反地址解析
  • 地址查询(反地址解析)请求
  • 地址查询(反地址解析)响应
  • 处理响应结果

1. 什么是网络服务?

Google Maps API 提供这些网络服务作为从外部服务中请求 Google Maps API 数据以及在您的地图应用程序中使用它们的接口。这些网络服务使用特定网址的 HTTP 请求并将网址参数作为参数提供给服务。一般来讲,这些服务会在 HTTP 请求中以 JSON 或 XML 的形式传回数据,供您的应用程序进行解析和/或处理。

一个典型的网络服务请求通常采用以下形式:

http://maps.google.com/maps/api/service/output?parameters

其中 service 表示所请求的特定服务,output 表示响应格式(通常为 jsonxml)。

2.地址解析与反地址解析

地址解析是将地址(如“1600 Amphitheatre Parkway, Mountain View, CA”)转换为地理坐标(如纬度 37.423021 和经度 -122.083739)的过程,您可以根据转换得到的坐标放置标记或定位地图。Google Geocoding API 可让您通过 HTTP 请求直接访问地址解析器。此外,该服务还可让您执行反向操作(将坐标转换为地址),此过程称为“反向地址解析”(地址查询)

3. 地址查询(反向地址解析)请求

Google Geocoding API 请求必须采用以下形式:

http://maps.google.com/maps/api/geocode/output?parameters

其中,output 可以是以下值之一:

  • json(建议)表示以 JavaScript 对象表示法 (JSON) 的形式输出
  • xml 表示以 XML 的形式输出

有些参数是必需的,有些是可选的。根据网址的标准,所有参数均使用字符 & (&) 分隔。下面枚举了这些参数及其可能的值。

Google Geocoding API 使用以下网址参数定义地址查询请求:

  • latlng(必需)- 您希望获取的、距离最近的、可人工读取地址的纬度/经度文本值。
  • bounds(可选)- 要在其中更显著地偏移地址解析结果的可视区域的边框。
  • region(可选)- 区域代码,指定为 ccTLD(“顶级域”)双字符值。
  • language(可选)- 传回结果时所使用的语言。请注意,我们会经常更新支持的语言,因此该列表可能并不详尽。如果未提供 language,地址解析器将尝试尽可能使用发送请求的区域的本地语言。
  • sensor(必需)- 指示地址解析请求是否来自装有位置传感器的设备。该值必须为 truefalse

注意:boundsregion 参数只会影响地址解析器返回的结果,但不能对其进行完全限制。

实例一:创建查询坐标(39.910093,116.403945)的地址信息的请求,要求以xml格式输出响应,语言为简体中文(zh-CN)。

http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false

注意:经纬度书写的顺序为(纬度,经度)。

实例二:利用C#在客户端程序中创建上述请求。

1 WebClient client = new WebClient();
2 string url = "http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false";
3 client.Encoding = Encoding.UTF8;
4 string responseTest = client.DownloadString(url);

4. 地址查询(反向地址解析)响应

地址解析响应将以网址请求路径中的 output 标记所指示的格式传回。XML 响应包含一个 <GeocodeResponse>和两个顶级元素:

  • <status> 包含请求中状态代码。(非常重要)
  • 零或多个 <result> 元素,每个元素都包含单独的一组地址解析地址信息和几何图形信息。

地址解析响应对象中的 "status" 字段包含请求的状态,并且可能包含调试信息,以帮助您追溯地址解析未正常工作的原因。

"status" 字段可能包含以下值:

  • "OK" 表示未发生错误;地址成功进行了解析并且至少传回了一个地址解析结果。(判断请求是否成功响应)
  • "ZERO_RESULTS" 表示地址解析成功,但未返回结果。如果地址解析过程中传递的偏远位置 addresslatlng 并不存在,则会出现这种情况。
  • "OVER_QUERY_LIMIT" 表示您超出了配额。
  • "REQUEST_DENIED" 表示您的请求被拒绝,通常是由于缺少 sensor 参数。
  • "INVALID_REQUEST" 通常表示缺少查询参数(addresslatlng)。

实例一:在IE浏览中输入上述实例一中的请求,查看响应结果。

浏览器中显示如下信息(该截图只是响应结果的部分信息):

实例二:通过控制台输出上述实例二的响应。

C#代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Net;
 6 
 7 namespace GeoCodeTest
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             WebClient client = new WebClient();
14             string url = "http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false";
15             client.Encoding = Encoding.UTF8;
16             string responseTest = client.DownloadString(url);
17 
18             Console.Write("{0}",responseTest);
19 
20             Console.Read();
21 
22         }
23     }
24 }

输出结果(该截图只是响应结果的部分信息):

5. 处理响应结果

通过上述内容,我们已经能够得到xml响应信息。但是,响应结果包含很多信息,因此我们需要解析出需要的地址信息。具体实现过程为:

第一步:判断status的状态信息。

第二步:获取formatted_address 地址信息。

注意:formatted_address是一个字符串,包含此位置的人类可读地址。通常该地址相当于“邮政地址”,有时会因不同国家/地区而存在差异。

实现代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Net;
 6 using System.Xml;
 7 
 8 namespace GeoCodeTest
 9 {
10     class Program
11     {
12         static void Main(string[] args)
13         {
14             WebClient client = new WebClient();//webclient客户端对象
15             string url = "http://maps.google.com/maps/api/geocode/xml?latlng=39.910093,116.403945&language=zh-CN&sensor=false";//请求地址
16             client.Encoding = Encoding.UTF8;//编码格式
17             string responseTest = client.DownloadString(url);//下载xml响应数据
18 
19             XmlDocument doc = new XmlDocument();//创建XML文档对象
20 
21             if(!string.IsNullOrEmpty(responseTest))
22             {
23               doc.LoadXml(responseTest);//加载xml字符串
24 
25 //获取状态信息
26               string xpath = @"GeocodeResponse/status";
27               XmlNode node = doc.SelectSingleNode(xpath);
28               string status = node.InnerText.ToString();
29               
30               if(status == "OK")
31               {
32                   //获取地址信息
33                   xpath = @"GeocodeResponse/result/formatted_address";
34                   node = doc.SelectSingleNode(xpath);
35                   string address = node.InnerText.ToString();
36 
37                   Console.WriteLine("地址:{0}",address);//输出地址信息
38               }
39               
40             }
41             
42 
43             Console.Read();
44 
45         }
46     }
47 }

输出结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

在C#使用文件监控对象FileSystemWatcher 实现数据同步

       最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容。首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能...

41860
来自专栏weixuqin 的专栏

Django 错误:TypeError at / 'bool' object is not callable

使用 Django自带的 auth 用户验证功能,编写函数,使用 is_authenticated 检查用户是否登录,结果报错:

15330
来自专栏小怪聊职场

安全|API接口安全性设计(防篡改和重复调用)

API接口的安全性主要是为了保证数据不会被篡改和重复调用,实现方案主要围绕Token、时间戳和Sign三个机制展开设计。

1K30
来自专栏跟着阿笨一起玩NET

我的WCF之旅(1):创建一个简单的WCF程序

为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用。本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构。对...

7810
来自专栏我和PYTHON有个约会

Django来敲门~第一部分【9.使用Django内置视图处理对象简化开发】

首先,要说这是Django基础部分的最后一个章节了。后面会详细讲解Django每一部分的使用方式和API了

12230
来自专栏IMWeb前端团队

上手 yeoman generator

最近折腾脚手架相关的一些事情。说到脚手架,不得不谈的就是yeoman了。 是什么 yeoman是一个脚手架生成工具。 yeoman generator则是yeo...

24050
来自专栏瓜大三哥

vim命令总结

23570
来自专栏Python

Django - - - -视图层之视图函数(views)

视图层之视图函数(views) 一个视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。响应可以是一张网页的HTML内容,一...

234100
来自专栏大内老A

ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】

Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成。Server是我们对所有实现了IServer...

37350
来自专栏Java后端技术

Linux的Bash Shell详解

  1.什么是bash           bash是Bourne Again Shell的简称,是从unix系统中的sh发展而来的,是用户和Linux内核交互...

11240

扫码关注云+社区

领取腾讯云代金券