简述
Android Studio开发地图时(用的百度地图),需要根据地址查找地图,但是百度地图API好像没有直接给地址直接跳转到相应地图的简单操作,只给了根据经纬度跳转到相应位置。没细看,不确定。所以在网上查找了一些办法,试了几个,找到了一个好用简单的,下面给出了链接。
根据地址返回经纬度,用到了http连接
- 代码java
package addresstoll_util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
/**
* Created by wanglei on 2017/6/20.
* 根据百度地图API,根据地址得到经纬度
*/
public class AddressToLatitudeLongitude {
private String address = "哈尔滨";//地址
private double Latitude = 45.7732246332393;//纬度
private double Longitude = 126.65771685544611;//经度
public AddressToLatitudeLongitude(String addr_str) {
this.address = addr_str;
}
/*
*根据地址得到地理坐标
*/
public void getLatAndLngByAddress(){
String addr = "";
String lat = "";
String lng = "";
try {
addr = java.net.URLEncoder.encode(address,"UTF-8");//编码
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String url = String.format("http://api.map.baidu.com/geocoder/v2/?"
+"address=%s&ak=4rcKAZKG9OIl0wDkICSLx8BA&output=json",addr);
URL myURL = null;
URLConnection httpsConn = null;
//进行转码
try {
myURL = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
httpsConn = (URLConnection) myURL.openConnection();//建立连接
if (httpsConn != null) {
InputStreamReader insr = new InputStreamReader(//传输数据
httpsConn.getInputStream(), "UTF-8");
BufferedReader br = new BufferedReader(insr);
String data = null;
if ((data = br.readLine()) != null) {
System.out.println(data);
//这里的data为以下的json格式字符串,因为简单,所以就不使用json解析了,直接字符串处理
//{"status":0,"result":{"location":{"lng":118.77807440802562,"lat":32.05723550180587},"precise":0,"confidence":12,"level":"城市"}}
lat = data.substring(data.indexOf("\"lat\":")+("\"lat\":").length(), data.indexOf("},\"precise\""));
lng = data.substring(data.indexOf("\"lng\":")+("\"lng\":").length(), data.indexOf(",\"lat\""));
}
insr.close();
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
this.Latitude = Double.parseDouble(lat);
this.Longitude = Double.parseDouble(lng);
}
public Double getLatitude() {
return this.Latitude;
}
public Double getLongitude() {
return this.Longitude;
}
public static void main(String[] args) {
AddressToLatitudeLongitude at = new AddressToLatitudeLongitude("安徽省亳州市亳州一中");
at.getLatAndLngByAddress();
System.out.println(at.getLatitude() + " " + at.getLongitude());
}
}
- 结果截图
Android Studio应用
- button按钮响应操作部分代码
button_site.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String site_str = myEditText_site.getText().toString();
new Thread(new Runnable() {
@Override
public void run() {
AddressToLatitudeLongitude at = new AddressToLatitudeLongitude(site_str);
getLocationByLL(at.getLatitude(), at.getLongitude());
}
}).start();
//隐藏前面地址输入区域
myLinearLayout2.setVisibility(View.GONE);
//隐藏输入法键盘
InputMethodManager imm = (InputMethodManager) getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
});
- 根据经纬度,地图跳转到相应位置代码
/*
*根据经纬度前往
*/
public void getLocationByLL(double la, double lg)
{
//地理坐标的数据结构
LatLng latLng = new LatLng(la, lg);
//描述地图状态将要发生的变化,通过当前经纬度来使地图显示到该位置
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
myBaiduMap.setMapStatus(msu);
}
- app效果截图
注意
android 主线程不能做http申请,必须在子线程下,切记!!!