高德地图开发(二)地图上显示指定位置

我们在用地图软件搜索的时候,搜索结果会在地图上以红点显示,现在我们来实现一个在地图上显示指定位置的程序,先看效果图。高德地图开发(二)地图上显示指定位置_第1张图片


要实现这么个功能,首先要能将地图视图中心移动到以指定位置;还有在指定位置绘制一个点(图标),上图一个是系统自带图标,一个是自定义图标;因为这里的位置是经纬度坐标,如果是根据坐标来显示倒是可以直接显示,如果是根据地址来显示,就得从地址获取坐标了。我的代码只写了从坐标获取地址,至于从地址获取坐标,也就改两行代码就行了,如不了解参考官方API:http://lbs.amap.com/api/android-sdk/guide/map-data/geo

下面是代码以及解析,有一点需要注意,在解析坐标地址的时候,查询结果的监听一定写在异步请求的前面,不然可能获取不到地址解析数据。切记!

package com.example.gdmap;

import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdate;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.geocoder.GeocodeResult;
import com.amap.api.services.geocoder.GeocodeSearch;
import com.amap.api.services.geocoder.RegeocodeQuery;
import com.amap.api.services.geocoder.RegeocodeResult;

public class MainActivity extends AppCompatActivity{

    MapView mapView=null;//地图视图
    AMap aMap;//地图对象
    CameraUpdate cameraUpdate;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapView= (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);//创建地图
        aMap=mapView.getMap();//获取地图对象

        getadress();
    }

    //根据地址绘制需要显示的点
    public void makepoint(String s){
        Log.e("Shunxu","开始绘图");
        //北纬39.22,东经116.39,为负则表示相反方向
        LatLng latLng=new LatLng(39.22,116.39);
        Log.e("地址",s);

        //使用默认点标记
        Marker maker=aMap.addMarker(new MarkerOptions().position(latLng).title("地点:").snippet(s));


        //自定义点标记
        MarkerOptions markerOptions=new MarkerOptions();
        markerOptions.position(new LatLng(34,115)).title("标题").snippet("内容");
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
        .decodeResource(getResources(),R.mipmap.ic_launcher)));//设置图标
        aMap.addMarker(markerOptions);

        //改变可视区域为指定位置
        //CameraPosition4个参数分别为位置,缩放级别,目标可视区域倾斜度,可视区域指向方向(正北逆时针算起,0-360)
        cameraUpdate= CameraUpdateFactory.newCameraPosition(new CameraPosition(latLng,8,0,30));
        aMap.moveCamera(cameraUpdate);//地图移向指定区域

        //位置坐标的点击事件
        aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {
                //Toast.makeText(MainActivity.this,"点击指定位置",Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        //位置上面信息窗口的点击事件
        aMap.setOnInfoWindowClickListener(new AMap.OnInfoWindowClickListener() {
            @Override
            public void onInfoWindowClick(Marker marker) {
                Toast.makeText(MainActivity.this,"点击了我的地点",Toast.LENGTH_SHORT).show();
            }
        });
    }

    //解析指定坐标的地址
    public void getadress(){
        Log.e("Shunxu","调用getadress");
        GeocodeSearch geocodeSearch=new GeocodeSearch(this);//地址查询器

        //设置查询参数,
        //三个参数依次为坐标,范围多少米,坐标系
        RegeocodeQuery regeocodeQuery=new RegeocodeQuery(new LatLonPoint(39.22,116.39),200,GeocodeSearch.AMAP);

        //设置查询结果监听
        geocodeSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
            //根据坐标获取地址信息调用
            @Override
            public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
              String s =regeocodeResult.getRegeocodeAddress().getFormatAddress();
                Log.e("Shunxu","获得请求结果");
                makepoint(s);
            }
            //根据地址获取坐标信息是调用
            @Override
            public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
            }
        });

        geocodeSearch.getFromLocationAsyn(regeocodeQuery);//发起异步查询请求
    }

    //将地图生命周期跟活动绑定,减少某些不必要的bug
    @Override
    protected void onPostResume() {
        super.onPostResume();
        mapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        mapView.onPause();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }
}

你可能感兴趣的:(Android)