百度地图地址解析(百度Geocoding API)

孤街醉人 提交于 2020-08-06 09:00:54
1.什么是Geocoding?

Geocoding API 是一类简单的HTTP接口,用于提供从地址到经纬度坐标或者从经纬度坐标到地址的转换服务,用户可以使用C# 、C++、Java等开发语言发送HTTP请求且接收JSON、XML的返回数据。

2.功能介绍

Geocoding API包括地址解析和逆地址解析功能。

  • 地理编码:即地址解析,由详细到街道的结构化地址得到百度经纬度信息,且支持名胜古迹、标志性建筑名称直接解析返回百度经纬度。例如:“北京市海淀区中关村南大街27号”地址解析的结果是“lng:116.31985,lat:39.959836”,“百度大厦”地址解析的结果是“lng:116.30815,lat:40.056885”
  • 逆地理编码,即逆地址解析,由百度经纬度信息得到结构化地址信息。例如:“lat:31.325152,lng:120.558957”逆地址解析的结果是“江苏省苏州市虎丘区塔园路318号”。

 

3.如何使用

百度地图Geocoding API是一套免费对外开放的API,无使用次数限制。使用方法:

第一步:申请ak(即获取密钥),若无百度账号则首先需要注册百度账号

第二步,拼写发送http请求的url,注意需使用第一步申请的ak。

第三步,接收http请求返回的数据(支持json和xml格式)。

以下是一个关于地理编码的简单示例。发送一个地址是“百度大厦”的请求,返回该地址对应的地理坐标。发送请求的url如下:

http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=E4805d16520de693a3fe707cdc962045&callback=showLocation 
4.java调用测试
  View Code

运行结果:

5.简单应用

期望实现功能:

input.txt存放中文地址
从input.txt中读取中文地址,获得经纬度
将中文地址以及经纬度输出到output.txt中
  View Code

运行测试结果:

 

6.改进

上面的解决方案使用单线程,数据量小的情况下还可以勉强使用。但是当数据量巨大时,耗时就非常的长(测试使用15000条地址数据差不多用了1小时)。考虑到耗费的时间主要花费在获取经纬度时服务器的响应上,因此考虑使用多线程。

从input.txt读入,然后将地址信息切分为多个数组,为每一个数组开一个线程,转换后统一输出到output.txt

实现代码:

  View Code
  View Code
7.不足

1,网速不好的情况下,开100个线程会出现 java.net.SocketTimeoutException: connect timed out错误。

虽然使用了uc.setConnectTimeout(10000);   uc.setReadTimeout(10000); 但是没有起到效果。(求改进)

2,所有的数据都会放在内存上,当数据量到达千万级别时候,会内存不足。(求改进)

8.引用

http://developer.baidu.com/map/webservice-geocoding.htm  

http://www.cnblogs.com/gzggyy/archive/2013/06/21/3148610.html

http://lavasoft.blog.51cto.com/62575/99150

http://www.360doc.com/content/13/0422/09/3776353_280044198.shtml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!