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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何通过经纬度获取地址信息相关的知识,希望对你有一定的参考价值。

1. 什么是网络服务?

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

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

htt p:/ /maps.g oogl e.co m/maps/api/service/output?parameters

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

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

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

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

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

htt p:/ /maps.g oogl e.c om/maps/api/geocode/output?parameters

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

json(建议)表示以 javascript 对象表示法 (JSON) 的形式输出

xml 表示以 XML 的形式输出

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

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

latlng(必需)- 您希望获取的、距离最近的、可人工读取地址的纬度/经度文本值。

bounds(可选)- 要在其中更显著地偏移地址解析结果的可视区域的边框。

region(可选)- 区域代码,指定为 ccTLD(“顶级域”)双字符值。

language(可选)- 传回结果时所使用的语言。请注意,我们会经常更新支持的语言,因此该列表可能并不详尽。如果未提供 language,地址解析器将尝试尽可能使用发送请求的区域的本地语言。

sensor(必需)- 指示地址解析请求是否来自装有位置传感器的设备。该值必须为 true 或 false。

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

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

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

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

1 WebClient client = new WebClient();

2 string url = "htt p:/ /m aps.g oogl e.co m/maps/api/geocode/xm l?latln g=39.910  093,116.403945&language=zh-CN&sensor=false";

3 client.Encoding = Encoding.UTF8;

4 string responseTest = client.DownloadString(url);

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

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

<status> 包含请求中状态代码。(非常重要)

零或多个 <result> 元素,每个元素都包含单独的一组地址解析地址信息和几何图形信息。

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


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


"OK" 表示未发生错误;地址成功进行了解析并且至少传回了一个地址解析结果。(判断请求是否成功响应)

"ZERO_RESULTS" 表示地址解析成功,但未返回结果。如果地址解析过程中传递的偏远位置 address 或 latlng 并不存在,则会出现这种情况。

"OVER_QUERY_LIMIT" 表示您超出了配额。

"REQUEST_DENIED" 表示您的请求被拒绝,通常是由于缺少 sensor 参数。

"INVALID_REQUEST" 通常表示缺少查询参数(address 或 latlng)。

实例一:在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 = "ht tp:/ /maps.go ogle.c om/maps/a pi/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是一个字符串,包含此位置的人类可读地址。通常该地址相当于“邮政地址”,有时会因不同国家/地区而存在差异。


实现代码如下:


View Code

参考技术A 下载gps工具箱,非常好用

如何通过经纬度坐标获取附近的地址信息?

经纬度是确定每个地点位置的精确坐标,使用坐标描述一个位置,非常准确但是并不直观,面向用户表达并不友好。HMS Core定位服务提供了逆地理编码功能,可以通过纬度获取附近地点的详细地址,将坐标转化为地理描述。例如,在电商App的地图里标定一个点,就可以显示具体位置;打车、外卖App里拖动地图或者点击地图上的某一点,定位标能够选择附近合适的上车地址或者外卖地址;在物流配送App中,需要很精确直观的描述物流车辆所在的线路以及物流配送点,使用逆地理编码功能通过回传的经纬度坐标,来确认车辆位置。

HMS Core定位服务逆地理编码功能拥有强大的地址理解能力,使用更加本地化位置的表达方式,准确率高达90%,支持79种语言,低至200ms的时延。

Demo演示

开发步骤

集成准备

注册成为开发者

在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法请参见帐号注册认证。

创建应用

参见创建项目创建应用完成应用的创建。

生成并配置签名证书指纹

签名证书指纹用于校验应用的真实性,您需要根据签名证书在本地生成签名证书指纹,并在应用上架前将签名证书指纹配置到AppGallery Connect。

具体操作步骤见官网

集成SDK

针对Android Studio开发环境,华为提供了Maven仓集成方式的SDK包。在开始开发前,您需要将SDK集成到您的Android Studio开发环境中。

具体操作步骤见官网

开发步骤

1. 创建地理编码服务客户端

在您的项目中使用到地理编码服务的GeocoderActivity中的onClick()方法中创建一个GeocoderService实例,通过该实例调用地理编码相关接口。

Locale locale = new Locale("zh", "CN");
GeocoderService geocoderService = LocationServices.getGeocoderService(GeocoderActivity.this, locale);

2. 获取逆地理编码信息

如果您希望应用获取逆地理编码信息,可以使用定位服务中的GeocoderService对象提供的getFromLocation()接口。该接口会根据您设置的GetFromLocationRequest请求信息返回一个包含位置信息的List<HWLocation>对象。

2.1. 设置逆地理编码请求参数。

// 参数一:纬度
// 参数二:经度
// 参数三:返回结果最大数量 
// 请传入合理的地区经纬度,否则没有相关地理信息返回。如果是非中国地区,请传入非中国地区的经纬度,且确保经纬度是准确的。
GetFromLocationRequest getFromLocationRequest = new GetFromLocationRequest(39.985071, 116.501717, 5);

2.2. 调用getFromLocation()接口,获取逆地理编码信息。

private void getReverseGeocoding() 
    //初始化GeocoderService对象
    if (geocoderService == null) 
        geocoderService = new GeocoderService(this, new Locale("zh", "CN"));
    
    geocoderService.getFromLocation(getFromLocationRequest)
            .addOnSuccessListener(new OnSuccessListener<List<HWLocation>>() 
                @Override
                public void onSuccess(List<HWLocation> hwLocation) 
                    // TODO:接口调用成功的处理
                    if (null != hwLocation && hwLocation.size() > 0) 
                        Log.d(TAG, "hwLocation数据集数量: " + hwLocation.size());
                        Log.d(TAG, "CountryName: " + hwLocation.get(0).getCountryName());
                        Log.d(TAG, "City: " + hwLocation.get(0).getCity());
                        Log.d(TAG, "Street: " + hwLocation.get(0).getStreet());
                    
                
            )
            .addOnFailureListener(new OnFailureListener() 
                @Override
                public void onFailure(Exception e) 
                    // TODO:接口调用失败的处理
                
            );

2.3. Log日志为:

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

以上是关于如何通过经纬度获取地址信息的主要内容,如果未能解决你的问题,请参考以下文章

如何通过IP地址或精确定位获取用户的经纬度

jQuery通过地址获取经纬度demo

如何根据经纬度来获取城市名

JS爬取高德地图地址信息(周边设施经纬度)

怎么用程序通过百度地图API批量获取具体地址的经纬度

怎么用程序通过百度地图API批量获取具体地址的经纬度