Android 为地址反解析提供了标准的api 方案,但该方案并不是android sdk的一部分。手机用户要想
正常使用该功能,手机上必须安装 google map。但国内没有厂家默认内置google map, 手机用户也不可能
自动安装。反解析的方案国内应该可以通过baidu地图api接口,国外的话,还是的通过google.
主要研究下国外地理信息反解方式
1.获取经纬度provider 方式
gps 方式: LocationManager.GPS_PROVIDER
net 方式: LocationManager.GPS_NET
2种方式优缺点如下:
GPS_PROVIDER 通过卫星与手机定位经纬度,最小精度可以达到10m左右,但能耗比较大,在手机上不利于
长期开启。
GPS_NET 该经纬度误差较大,基本在1公里内(2g,3g),如果使用wi-fi误差会远远超过1公里。原因是该方式获取
的并不是手机本身的地理位置经纬度,而是服务站,或者isp提供商的经纬度信息。如果你用wi-fi方式,并使用国外
代理服务器上网,这个偏差可能跨越半个地球。
2. google 反解的标准方式
引用包名: android.location.Geocoder;
因不是标准api组成,需要通过Geocoder.isPresent先判别能不能使用,然后执行反解析,代码如下:
private void
getAddressFromLocation(double latitude, double longitude)
{
try
{
if (!Geocoder.isPresent())
{ //api level
9
return ;
}
Utils. printLog("GeophyInfoTracker", "getAddressFromLocation");
Geocoder geocoder = new Geocoder(s_CurUIContext ,Locale.ENGLISH);
List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
if (addresses
!= null && addresses.size() > 0) {
Address address = addresses.get(0);
mCountryName =
address.getCountryName();// 国家
mCountryShortName =
address.getCountryCode();
mLocality =
address.getLocality();// 市
mSubLocality =
address.getSubLocality();// 区
}
}
catch (Exception
e) {
Utils. printLog("Geograhy:", "getFromLocation
exception:" + e.toString());}
}
3. google 反解的非api方式
如果Geocoder 组件不可使用,可以把经纬度直接通过网络发送google map http服务器 去获取
反解析信息:
URL form:https://maps.googleapis.com/maps/api/geocode/json?latlng=" +
strLatitude + "," + strLongitude + "&sensor=true_or_false"
把该链接通过 HttpPost 类打开,然后接收数据即可。
Google 支持2种数据返回格式 :json, xml 上面的链接返回json 格式数据。
返回数据样例:
{
"address_components" : [
{
"long_name" : "430223",
"short_name" : "430223",
"types" : [ "postal_code" ]
},
{
"long_name" : "Jiangxia",
"short_name" : "Jiangxia",
"types" : [ "sublocality_level_1", "sublocality", "political" ]
},
{
"long_name" : "Wuhan",
"short_name" : "Wuhan",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Hubei",
"short_name" : "Hubei",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "China",
"short_name" : "CN",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "Jiangxia, Wuhan, Hubei, China, 430223",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 30.4692894,
"lng" : 114.4292148
},
"southwest" : {
"lat" : 30.3985714,
"lng" : 114.3579131
}
}
对于xml格式解析的开源包很多,不再赘述,对应json提供代码如下:
private void getAddressbyGoogleMapWeb()
{
try {
final String
strUrl = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" +
mstrLatitude + "," + mstrLongitude + "&sensor=true_or_false" ;
HttpClient httpClient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(strUrl);
HttpResponse response = httpClient.execute(httppost);
StatusLine status = response.getStatusLine();
if (status.getStatusCode()
!= 200)
{
return ;
}
String strRes = EntityUtils. toString(response.getEntity(), "UTF-8" );
JSONObject jo = new JSONObject(strRes);
if (!jo.has("results" ))
return ;
JSONArray joResult = jo.getJSONArray( "results" );
for (int i
= 0;i < joResult.length();i++)
{
JSONObject ijo = joResult.getJSONObject(i);
if (!ijo.has("types" ))
continue ;
JSONArray ijsaTypes = ijo.getJSONArray( "types" );
String strType = ijsaTypes.getString(0);
if (strType.contains("country" ))
{
if (ijo.has("address_components" ))
{
JSONArray Oaddress = ijo.getJSONArray("address_components" );
for (int j
= 0;j < Oaddress.length();j++)
{
JSONObject item = Oaddress.getJSONObject(j);
if (item.has("long_name" ))
{
Utils. printLog( "Geo",item.getString( "long_name" ));
mCountryName =
item.getString("long_name" );
}
if (item.has("short_name" ))
{
Utils. printLog( "Geo",item.getString( "short_name" ));
mCountryShortName =
item.getString("short_name" );
}
}
}
}
}
} catch (Exception
e)
{
e.printStackTrace();
}
}
google 地图的官方链接地址:https://developers.google.com/maps/documentation/geocoding/