Algumas configurações do mapa Baidu ao redor da função de recuperação e pontos de marcador personalizados

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

< usos - permissão android : name = "android.permission.ACCESS_NETWORK_STATE" /> 
< usos - permissão android : name = "android.permission.INTERNET" /> 
< usos - permissão android : name = "com.android.launcher.permission .READ_SETTINGS "  /> 
< usos - permissão android : name = " android.permission.WAKE_LOCK " /> 
< usos - permissão android :nome= "android.permission.CHANGE_WIFI_STATE"  /> 
< usos - permissão android : name = "android.permission.ACCESS_WIFI_STATE"  /> 
< usos - permissão android : name = "android.permission.GET_TASKS"  /> 
< usos - permissão android : name = "android.permission.WRITE_EXTERNAL_STORAGE" /> 
< usos - permissão android : name = "android.permission.WRITE_SETTINGS"  />	

Adicionar chave de desenvolvimento no aplicativo

< aplicativo >   
    < meta - data   
        android : name = "com.baidu.lbsapi.API_KEY"   
        android : value = "chave" 者 "  />   
</ application >

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);

发布了29 篇原创文章 · 获赞 40 · 访问量 3万+

Acho que você gosta

Origin blog.csdn.net/xiyunmengyuan/article/details/75386127
Recomendado
Clasificación