De acordo com as necessidades do projeto, dois tipos de pontos de coordenadas devem ser marcados no mapa.De acordo com esse requisito, as coordenadas de diferentes fontes precisam ser classificadas e exibidas. A imagem a seguir é a renderização:
Estou usando a versão mais recente 4.3.1 do Baidu SDK. Primeiro, preciso acessar a plataforma de desenvolvimento de APIs de mapas do Baidu para me registrar e efetuar login. Para usar o Baidu map, preciso solicitar uma chave:
1. Configuração do ambiente de desenvolvimento:
Basta testar o pacote so file e jar correspondente na pasta sdk libs baixada em seu próprio projeto e adicionar a dependência de cada pacote jar;
2. Adicione algumas permissões e configurações de chave no arquivo AndroidManifest.xml:
Adicionar permissões necessárias
Adicionar chave de desenvolvimento no aplicativo
3. Correspondendo aos jars dos quais o projeto de construção depende no build.gradle, e as seguintes configurações precisam ser adicionadas, caso contrário, um erro será relatado
sourceSets { main { jniLibs. srcDirs = [ 'libs' ] } }
Até o momento, a configuração básica do Baidu SDK foi concluída.O seguinte descreve como usá-lo:
Primeiro, você precisa inicializar o SDK após a atividade correspondente ou o método Application onCreate, também pode definir o tipo esquerdo retornado
. SDKInitializer o initialize (getApplicationContext ()) ; . SDKInitializer setCoordType (Iniciado coordtype. GCJ02 ) ; // default para coordenar BD09LL
Adicione um controle de mapa no arquivo xml de layout;
<com.baidu.mapapi.map.MapView android : id = "@ + id / baidumaps" android : layout_width = "match_parent" android : layout_height = "0dp" android : layout_weight = "1" android : clickable = "true" / >
Inicializar na atividade
private MapView mapView; private BaiduMap baiduMap; PoiSearch mPoiSearch;
mapView = (MapView) findViewById(R.id.baidumaps);
// O BaiduMap gerencia um MapView específico: rotação, movimento, dimensionamento, eventos. . . baiduMap = o mapView .getMap () ; // definir o nível de zoom, o nível padrão de 12 é MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory. ZoomTo ( 19. ) ; baiduMap .setMapStatus (mapstatusUpdate) ; mPoiSearch . = PoiSearch o newInstance () ; mPoiSearch .setOnGetPoiSearchResultListener ( poiListener ) ;
nearbySearch ( 1 ) ;Pode ser chamado após definir parâmetros básicos
/** * 附近检索 */ private void nearbySearch(int page) { PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); //120.220854,30.259387 nearbySearchOption.location(new LatLng(latitude,longitude)); nearbySearchOption.keyword("超市");//小吃快餐 nearbySearchOption.radius(10000);// 检索半径,单位是米 nearbySearchOption.pageNum(page); nearbySearchOption.pageCapacity(500); mPoiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求 }
还要对mPoiSearch设置监听方法:
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){ public void onGetPoiResult(PoiResult result){ if (result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(ShopMapActivity.this, "没有搜索到结果...", Toast.LENGTH_LONG).show(); } else { baiduMap.clear(); // 得到具体地址的坐标 // 此处是设置蓝色标记的方法 for(int i=0;i<result.getAllPoi().size();i++) { PoiInfo pos = result.getAllPoi().get(i); LatLng lat = pos.location; // 得到一个标记的控制器 MarkerOptions mMarkerOptions = new MarkerOptions(); // 我们设置标记的时候需要传入的参数 BitmapDescriptor mbitmapDescriptor = BitmapDescriptorFactory .fromResource(R.mipmap.location_blue); // 设置标记的图标 mMarkerOptions.icon(mbitmapDescriptor); // 设置标记的坐标 mMarkerOptions.position(lat); mMarkerOptions.title(pos.name); // 添加标记 baiduMap.addOverlay(mMarkerOptions); // 设置地图跳转的参数 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory .newLatLngZoom(lat, 15); // 设置进行地图跳转 baiduMap.setMapStatus(mMapStatusUpdate); }
红色标记点的设置 这里的list是一些模拟数据
for(int i=0;i<list.size();i++) { PoiInfo pos = result.getAllPoi().get(i); LatLng lat = list.get(i); // 得到一个标记的控制器 MarkerOptions mMarkerOptions = new MarkerOptions(); // 我们设置标记的时候需要传入的参数 BitmapDescriptor mbitmapDescriptor = BitmapDescriptorFactory .fromResource(R.mipmap.location_red); // 设置标记的图标 mMarkerOptions.icon(mbitmapDescriptor); // 设置标记的坐标 mMarkerOptions.position(lat); mMarkerOptions.title(pos.name); // 添加标记 baiduMap.addOverlay(mMarkerOptions); // 设置地图跳转的参数 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory .newLatLngZoom(lat, 15); // 设置进行地图跳转 baiduMap.setMapStatus(mMapStatusUpdate); }
baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { baiduMap.hideInfoWindow(); } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } }); baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { showLocation(marker);//点击marker显示详细信息 // return true; } }); } progressDialog.dismiss(); } public void onGetPoiDetailResult(PoiDetailResult result){ //获取Place详情页检索结果 progressDialog.dismiss(); } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { progressDialog.dismiss(); } };
private void showLocation(final Marker marker) { //显示气泡 // 创建InfoWindow展示的view LatLng pt = null; double latitude, longitude; latitude = marker.getPosition().latitude; longitude = marker.getPosition().longitude; InfoWindow infoWindow; TextView tv = new TextView(ShopMapActivity.this); tv.setBackgroundResource(R.drawable.change_btn_bg_gray); tv.setPadding(30, 20, 30, 20);// 大小 tv.setText( marker.getTitle()); tv.setTextColor(Color.parseColor("#000000")); final LatLng latLng = marker.getPosition(); Point p = baiduMap.getProjection().toScreenLocation(latLng); p.y -= 47; LatLng ll = baiduMap.getProjection().fromScreenLocation(p); mInfoWindow = new InfoWindow(tv, ll, 1); baiduMap.showInfoWindow(mInfoWindow); //显示气泡 }
protected void initData(Bundle savedInstanceState) { list.add(new LatLng(31.172713399983827,121.48811344710886)); list.add(new LatLng(31.179060850684824,121.50363668006136)); list.add(new LatLng(31.17131410477326,121.49315948551842)); list.add(new LatLng(31.176633393276752,121.48780798968677)); list.add(new LatLng(31.178353120267477,121.47352839282098)); }
最终实现的效果:
如果有ui刷新的操作 对空件的requestFocus请求将会失效 需要做个延迟操作
goodsSearch.postDelayed(new Runnable() {
public void run() {
etAddGoods.requestFocus();
}
},500);