您的位置:首页 > 移动开发 > Android开发

android 根据地址获取经纬度

2016-11-10 14:59 513 查看
项目上又有个功能上传地址,然后根据上传的地址显示在地图上,但是后来发现提供的存在本地地址文件只有地名而没有经纬度,所有还要自己在讲地址转换成经纬度。


Android.location.Geocoder类提供了此功能。实际上,Geocoder既提供了前向转换,也提供了后向转换——它可以获取地址并返回经纬度,也可以将经纬度对转换为一组地址。可以通过各种方式来描述位置。例如,getFromLocationName() 方法可以获得地方的名称、物理地址和机场编号,或者该位置的流行名称。这些方法提供了一个地址列表(List<Address>),而不是一个地址。因为这些方法返回多个结果,官方建议最好提供1~5的maxResults
值来限制结果集,

<span style="font-size:14px;">/**
* 根据地址获取经纬度
*
* @param adressStr
*/
private void getLocation(final String adressStr, final String addressMix) {
showLoading("...");
putAsyncTask(new Listenner() {

@Override
public Serializable doInBackground(String str) {
AddressEntity addressEntity = new AddressEntity();
List<Address> addressList = null;
try {
addressList = geocoder.getFromLocationName(adressStr, 5);
if (addressList != null && addressList.size() > 0) {
addressEntity.setAddresses(addressList);
}
} catch (IOException e) {
e.printStackTrace();
}
return addressEntity;
}

@Override
public void onPostExecute(Serializable result, String str) {
AddressEntity addressEntity = (AddressEntity) result;
if (addressEntity.getAddresses() != null && addressEntity.getAddresses().size() > 0) {
Address address = addressEntity.getAddresses().get(0);
// setResult(addressMix, address.getLongitude(), address.getLatitude());
}
cancelLoading();
}
});</span>
}

ok 转换成功,然后调用address.getLongitude();address.getLatitude.获取到经纬度,,这样看起来好像是没什么问题,但是你会发现,有时候对输入的地址无法获取但经纬度,处理时间长,效率比较低。所以放弃了getFromLocationName方法,
用的是The
Google Geocoding API

这个API整合可以代替先前的方法,输入地名返回JSON或者XML格式的文件,包含一对地址信息。

XML为http://maps.googleapis.com/maps/api/geocode/xml?address=
吉林省长春市&sensor=false吉林省长春市

JSON为http://maps.googleapis.com/maps/api/geocode/json?address=吉林省长春市&sensor=false

现在需要自己写一个静态方法去解析XML或者JSON,以JSON为例:

/**
* 将获取到的地址转换成经纬度
* Created by zhang on 2016/11/10.
*/
public class MapUtils {

/**
* @param addr 查询的地址
* @return
* @throws IOException
*/
public Object[] getCoordinate(String addr) throws IOException {
String lng = null;//经度
String lat = null;//纬度
String address = "";
try {
address = java.net.URLEncoder.encode(addr, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
String key = "iQWBRMOXBiUa1WWmGONiGaOZ";
String url = String.format("http://api.map.baidu.com/geocoder?address=%s&output=json&key=%s", address, key);
URL myURL = null;
URLConnection httpsConn = null;
try {
myURL = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
InputStreamReader insr = null;
BufferedReader br = null;
try {
httpsConn = (URLConnection) myURL.openConnection();// 不使用代理
if (httpsConn != null) {
insr = new InputStreamReader(httpsConn.getInputStream(), "UTF-8");
br = new BufferedReader(insr);
String data = null;
int count = 1;
while ((data = br.readLine()) != null) {
if (count == 5) {
lng = (String) data.subSequence(data.indexOf(":") + 1, data.indexOf(","));//经度
count++;
} else if (count == 6) {
lat = data.substring(data.indexOf(":") + 1);//纬度
count++;
} else {
count++;
}
}
}

} catch (IOException e) {
e.printStackTrace();
} finally {
if (insr != null) {
insr.close();
}
if (br != null) {
br.close();
}
}
Logger.e(this, "精度===" + lng + "=纬度===" + lat);
return new Object[]{lng, lat};
}
}

然后调用;注意,这里调用一定要在子线程中进行,因为网络请求时耗时操作,而主线程中是禁止执行耗时操作的。

new Thread() {
@Override
public void run() {
try {
Object[] obj = new MapUtils().getCoordinate(province + city + area);
if (obj != null) {
setResult(location, (String) obj[0], (String) obj[1]);
}else{
ToastUtil.show("换个地址试试!!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
private void setResult(String strLocation, String locationX, String locationY) {
if (TextUtils.isEmpty(strLocation)) {
return;
}

Intent intent = new Intent();
intent.putExtra("strLocation", strLocation);
intent.putExtra("locationX", Double.valueOf(locationX).doubleValue());
intent.putExtra("locationY", Double.valueOf(locationY).doubleValue());
Logger.e(this, "locationX=" + locationX + "==locationY=" + locationY);
this.setResult(TypeCodeing.TYPE_RESULTCODE_SELECT_LOCATION, intent);
finish();
}
ok  这样就成功的降低至转换成经纬度了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息