Geocoder可以在街道地址和经纬度地图坐标之间进行转换。它提供了对两种地理编码功能的访问:
Forward Geocoding(前向地理编码):查找某个地址的经纬度
Reverse Geocoding(反向地理编码):查找一个给定的经纬度所对应的街道地址。
这两种地理编码函数返回的都是Address对象列表。每一个列表都可以包含多个可能的结果。
每一个Address对象都是使用Geocoder所能够解析的尽可能多的细节来填充的。它可以包含经度、纬度、电话号码以及其他一些地址细节,从国家到街道和门牌号。
提示:
Geocoder查找是同步地进行的,因此,它们将会阻塞调用它们的线程。对于低速的数据连接来说,这可能会导致出现一个应用程序不响应的对话框。在大部分情况下,更好的做法是把这些查找移动到服务或者后台线程中.
反向地理编码
反向地理编码可以返回物理位置的街道地址,其中物理位置由经纬度值对指定。
要执行反向查找,需要向Geocoder的getFromLocation方法传入目标经度和纬度。它会返回一个可能匹配的地址的列表。如果对于指定的坐标,Geocoder不能解析出任何地址,那么它将会返回null。
//取得LocationMananger管理器
LocationManager locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
Location location=locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//获取经纬度的值
double latitude=location.getLatitude();
double longitude=location.getLongitude();
try {
//根据经纬度值获取地址集合
List address=geocoder.getFromLocation(latitude, longitude, 10);
} catch (IOException e) {
e.printStackTrace();
}
}
});
前向地理编码
确定一个给定位置的地图坐标。
提示:
一个有效的位置的组成,会根据搜索的区域(地理区域)的不同而不同。一般来说,它将包括各种正规的、不同粒度的街道地址(从国家到街道名和号码)、邮编、火车站、界标和医院。通常的习惯是,有效的搜索对象与可以输入到Google地图搜索栏中的地址和位置是很相似的。
通过在一个Geocoder实例上调用getFromLocationName,就可以执行前向地理编码查找。在这个过程中需要传递给它想要的坐标的位置以及要返回的结果数量的最大值,如下面的代码所示:
返回的地址列表中可能包含多个可能的匹配。其中每一个地址结果都将包含经度和纬度以及对那些坐标有用的所有额外的信息。这对于保证所解析的地址的正确性是很有用的,而且还能够在查找界标的时候提供地址的细节。
提示:
和反向编码一样,如果没有找到任何匹配的内容,那么它将会返回null。编码结果的可用性、精度和粒度都完全依赖于你正在查找的区域中可用的数据库。
在进行前向查找的过程中,创建Geocoder对象时所指定的区域设置尤其重要。区域设置提供了解释搜索请求的地理上下文,因为多个区域可能会存在相同的位置名称。在可能的地方,应该考虑选择一个地区的区域设置以避免地址名称歧义。
同时,应该使用尽可能多的地址细节。例如,下面的代码段说明了一个对New York街道地址所进行的前向地理编码
Geocoder Geocoder = new Geocoder(this, Locale.US); String streetAddress = "160 Riverside Drive, New York, New York"; List locations = null; try { locations = Geocoder.getFromLocationName(streetAddress, 10); } catch (IOException e) {}
List locations = null;
try {
locations = fwdGeocoder.getFromLocationName(streetAddress, 10,
n, e, s, w);
} catch (IOException e) {}
在与MapView一起使用的时候,这种重载就特别有用,因为它可以把搜索限制在可视的地图范围内。