Android之百度地图的更加深入学习
之前的文章我是主要先介绍获取用户的准确经纬度。现在我讲讲述学习百度地图更加深入学习-----根据自己想查找的地点来确定位置。
首先基本工作我们要完成,需要百度SDK(在这里我就不在介绍了,我之前的文章有介绍如何申请)
首先需要配置成这样我们才能使as与百度地图才能连接(这里它们相当于是as与百度地图之间的桥梁)
首先需要创建一个安卓项目,(我相信大家都会创建,在这里我就不在说废话了)
在安卓项目中的xml中编写如下代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<EditText
android:id="@+id/address"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="浙江工业大学" />
<Button
android:id="@+id/btn_search"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="查询" />
</LinearLayout>
<LinearLayout
android:id="@+id/map_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
这个布局主要是分为两个部分,上面的布局是有一个编辑框和按钮,实现输入你所想看的地点,点击按钮,下面会显示你所表达的地点。主要是实现这种效果的。而实现这种效果主要是把你所输入的地区运用地理编码来把具体的地址转变为经纬度来实现具体的定位。
好了接下来是在项目中的java中编写如下代码:
public class MainActivity extends AppCompatActivity {
Button select;
EditText editText;
// 声明一个标记
MapView mapView;
BaiduMap baiduMap; // 声明一个BaiduMap用来控制地图
GeoCodeOption geoCodeOption;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());//初始化地图SDK
setContentView(R.layout.activity_main);
select=(Button)findViewById(R.id.btn_search);
editText=(EditText)findViewById(R.id.address);
// 得到视图的容器
LinearLayout map_container = (LinearLayout) findViewById(R.id.map_container);
// 得到MapView
MapView mapView = new MapView(this);
// 将地图添加的视图容器
map_container.addView(mapView);
// mapView=new MapView(this);
baiduMap=mapView.getMap();// 通过MapView来获得BaiduMap
select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 通过GeoCoder的实例方法得到GerCoder对象
GeoCoder geoCoder=GeoCoder.newInstance();//根据某个key寻找地理位置的坐标,这个key可以是地址还可以是ip地址
// 得到GenCodeOption对象
GeoCodeOption geoCodeOption=new GeoCodeOption();//地理编码请求参数
EditText editText=(EditText)findViewById(R.id.address);
String address=editText.getText().toString();
Log.i("成功",address);
geoCodeOption.address(address);
geoCodeOption.city(address); // 这里必须设置城市,否则会报错
geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
//将具体的地址转化为坐标
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult==null||geoCodeResult.error!=SearchResult.ERRORNO.NO_ERROR){
Toast.makeText(MainActivity.this,"检索错误",Toast.LENGTH_SHORT).show();
}else {
// 得到具体地址的坐标
//LatLng是存储经纬度坐标值的类,单位角度。
LatLng latLng=geoCodeResult.getLocation();//使用传入的经纬度构造LatLng 对象,一对经纬度值代表地球上一个地点。
Log.i("经度", String.valueOf(latLng));
// 得到一个标记的控制器
//MarkerOptions设置 Marker 覆盖物的图标,相同图案的 icon 的 marker 最好使用同一个 BitmapDescriptor 对象以节省内存空间。
MarkerOptions markerOptions = new MarkerOptions();
BitmapDescriptor mbitmapDescriptor = BitmapDescriptorFactory //BitmapDescriptor用户自定义图标
.fromResource(R.drawable.two);
// 设置标记的图标
markerOptions.icon(mbitmapDescriptor);
// 设置标记的坐标
markerOptions.position(latLng);
// 添加标记
baiduMap.addOverlay(markerOptions);//意思是添加覆盖物
// 设置地图跳转的参数
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
.newLatLngZoom(latLng, 15);
// 设置进行地图跳转
baiduMap.setMapStatus(mMapStatusUpdate);
}
}
// 这个方法是将坐标转化为具体地址
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
}
});
// 这句话必须写,否则监听事件里面的都不会执行
geoCoder.geocode(geoCodeOption);
}
});
}
}
重点(我自认为)
百度LBS SDK的API中提供了一个BaiduMap类,它是地图的总控制器,调用MapView的getMap()方法就能获取到BaiduMap的实例,如下所示:
BaiduMap baiduMap=MapView.getMap();
有了BaiduMap后,我们就能对地图进行各种各样的操作了,比如设置地图的缩放级别以及将地图移动到某一个经纬度上。
百度地图将缩放级别的取值范围定在3至19之间,其中小数点的值也是可以取的,值越大,地图显示的信息就越精细。比如我们想要将缩放级别设置成12.5,就可以如下所示:
类 MapStatusUpdate: 描述地图状态将要发生的变化
类 MapStatusUpdateFactory: 生成地图状态将要发生的变化点击查看
类BaiduMap点击查看
最后别忘在Manifest.xml要设置权限和百度地图的密钥。
如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.lbstest5">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_LOGS"
tools:ignore="ProtectedPermissions" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.baidu.lbsapi.API_KEY"
android:value="ADuRoL0gilmwrS6MnskQyWGSaaQxhwaH"/>
<service android:name="com.baidu.location.f" android:enabled="true"
android:process=":remote"
/>
</application>
</manifest>
好了快运行实现吧。
具体的效果图如下所示:
星光不问赶路人,时光不负有心人,你若“有心”定不会辜负你。