`
切切歆语
  • 浏览: 31278 次
  • 性别: Icon_minigender_1
  • 来自: 泸州市
社区版块
存档分类
最新评论

Android Studio之高德地图实现定位和3D地图显示

 
阅读更多

在应用开发中,地图开发是经常需要使用的“组件”,国内比较出名的是就是百度地图和高德地图。

此博客讲的是高德地图实现定位和3D地图显示,并标注相应位置,话不多说,先看看效果,在上代码。

效果如图:

首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息,如下图:

途中包含了发布版的SHA1安全码和测试版SHA1安全码,两者的值可以看 博客 : Android Studio apk打包,keystore.jks文件生成,根据keystore密钥获取SHA1安全码

讲的很详细,照做就一定会成功获取的。

首先导入高德的jar包

选中jar包右键点击 Add As Library, 在build.fradle中看到如下代码 表示导包成功

    compile files('libs/AMap_Location_V3.0.0_20160922.jar')
    compile files('libs/AMap_Search_V3.5.0_20160927.jar')
    compile files('libs/AMap_3DMap_V4.1.1_20161019.jar')

代码:(注:项目代码目录中要添加一个接口文件 JniLibs 的os文件 才能绘制地图,具体下载源码查看,就不详细描述了)

/****
 * 讲诉了高德地图定位和3D地图显示
 *
 * 打包和未打包的情况是不一样的,高德配置是可以配置调试版和发布版
 *
 */
public class MainActivity extends AppCompatActivity implements AMapLocationListener,GeocodeSearch.OnGeocodeSearchListener {

    private AMapLocationClient locationClient = null;
    private AMapLocationClientOption locationOption = null;
    private TextView textView;
    private String[] strMsg;
    private com.amap.api.maps.AMap aMap;
    private MapView mapView;
    private GeocodeSearch geocoderSearch;
    private Marker geoMarker;
    private static LatLonPoint latLonPoint;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text_map);
        mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);// 此方法必须重写
        Location();
    }



    private void initMap(){

        if (aMap == null) {
            aMap = mapView.getMap();

             //用高德默认图标
             //geoMarker= aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
            //自定义图标
            geoMarker = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)
                   .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.punch_dw))));
        }
        geocoderSearch = new GeocodeSearch(this);
        geocoderSearch.setOnGeocodeSearchListener(this);
        getAddress(latLonPoint);
    }


    @Override
    public void onLocationChanged(AMapLocation loc) {
        if (null != loc) {
            Message msg = mHandler.obtainMessage();
            msg.obj = loc;
            msg.what = Utils.MSG_LOCATION_FINISH;
            mHandler.sendMessage(msg);
        }

    }

    Handler mHandler = new Handler() {
        public void dispatchMessage(android.os.Message msg) {
            switch (msg.what) {
                //定位完成
                case Utils.MSG_LOCATION_FINISH:
                    String result = "";
                    try {
                        AMapLocation loc = (AMapLocation) msg.obj;
                        result = Utils.getLocationStr(loc, 1);
                        strMsg = result.split(",");
                        Toast.makeText(MainActivity.this, "定位成功", Toast.LENGTH_LONG).show();
                        textView.setText("地址:" + strMsg[0] + "\n" + "经    度:" + strMsg[1] + "\n" + "纬    度:" + strMsg[2]);
                        latLonPoint= new LatLonPoint(Double.valueOf(strMsg[2]), Double.valueOf(strMsg[1]));
                        initMap();
                    } catch (Exception e) {
                        Toast.makeText(MainActivity.this, "定位失败", Toast.LENGTH_LONG).show();
                    }
                    break;
                default:
                    break;
            }
        };

    };

    public void Location() {
        // TODO Auto-generated method stub
        try {
            locationClient = new AMapLocationClient(this);
            locationOption = new AMapLocationClientOption();
            // 设置定位模式为低功耗模式
            locationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
            // 设置定位监听
            locationClient.setLocationListener(this);
            locationOption.setOnceLocation(true);//设置为单次定位
            locationClient.setLocationOption(locationOption);// 设置定位参数
            // 启动定位
            locationClient.startLocation();
            mHandler.sendEmptyMessage(Utils.MSG_LOCATION_START);
        } catch (Exception e) {
            Toast.makeText(MainActivity.this, "定位失败", Toast.LENGTH_LONG).show();
        }
    }


    /**
     * 响应逆地理编码
     */
    public void getAddress(final LatLonPoint latLonPoint) {
        RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200,
                GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
        geocoderSearch.getFromLocationAsyn(query);// 设置同步逆地理编码请求
    }

    /**
     * 地理编码查询回调
     */
    @Override
    public void onGeocodeSearched(GeocodeResult result, int rCode) {

    }

    /**
     * 逆地理编码回调
     */
    @Override
    public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
        if (rCode == 1000) {
            if (result != null && result.getRegeocodeAddress() != null
                    && result.getRegeocodeAddress().getFormatAddress() != null) {

                Toast.makeText(MainActivity.this,result.getRegeocodeAddress().getFormatAddress()
                        + "附近",Toast.LENGTH_LONG).show();
                aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
                        AMapUtil.convertToLatLng(latLonPoint), 15));
                geoMarker.setPosition(AMapUtil.convertToLatLng(latLonPoint));
            } else {

            }
        } else {
        }
    }

    /**
     * 方法必须重写
     */
    @Override
    public void onResume() {
        super.onResume();
        mapView.onResume();
    }

    /**
     * 方法必须重写
     */
    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    /**
     * 方法必须重写
     */
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }
}


AndroidManifest.xml中加入权限

 <!--允许程序打开网络套接字-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 定位 -->
    <!-- 用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <!--允许程序设置内置sd卡的写权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--允许程序获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--允许程序访问WiFi网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--允许程序读写手机状态和身份-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

如果只实现高德定位可查看: Android Studio 中实现高德定位并获取相应信息

讲的很详细;有疑问的请留言。

源码点击下载



分享到:
评论

相关推荐

    unity 接入高德地图 包括源码和生成好的APK和Eclipse源码

    在Unity中接入高德地图,可以为游戏或应用增加地理定位、地图展示、路径规划等功能,尤其适用于地理位置相关的游戏和应用。 "Unity"是一款强大的跨平台游戏开发引擎,支持2D和3D图形,广泛应用于游戏开发、虚拟现实...

    高德SDK的包

    - **地图组件(AMap3DMap)**:提供2D和3D地图展示,支持自定义地图样式、缩放、平移、旋转等操作。 - **导航组件(AMapNavi)**:实现路线规划、语音导航、实时交通等功能,适用于出行应用。 2. **版本信息**:...

    Android代码-android-path-smooth

    本工程为基于高德地图Android SDK进行封装,实现了定位轨迹的平滑优化处理。 前述 高德官网申请Key. 阅读参考手册. 工程基于Android 3D地图SDK实现 功能描述 基于3D地图SDK,对真实轨迹进行处理,实现去噪、平滑和...

    Unity与原生交互,Arr包 拨号 高德导航 等

    4. 配置AndroidManifest.xml:在Android Studio的`AndroidManifest.xml`中,添加权限以允许拨打电话和使用高德地图服务。确保包含以下权限: ```xml &lt;uses-permission android:name="android.permission.CALL_...

    Android ,Java,KML文件详细解析,并显示出来 本文将详细解析KML文件,获取里面的数据并显示出来

    用于描述2D和3D地理空间数据,广泛应用于Google Earth、Google Maps以及高德地图等平台

    DragonBoard 410c开发套件开发教程、案例

    - **技术要点**:利用DragonBoard 410c强大的处理器能力和集成的GPS模块,结合高德地图API,实现精准导航功能。 - **案例二**:基于激光成像的伪3D建模仪 - **应用场景**:工业设计、智能家居 - **技术要点**:...

Global site tag (gtag.js) - Google Analytics