Java是目前最流行的开发语言,java的应用领域比较广泛,利用java我们可以开发很多应用出来,还可以实现地图定位,那java地图定位如何实现?下面来我们就来给大家讲解一下。
实现如下功能:点击findme按钮,进入新的activity,即在地图上显示我的位置。
首先是完成androidManifest.xml的相关设置
package = "com.example.TraceMe" > android: name = "com.example.TraceMe.TraceMe" android: icon = "@drawable/icon" android: label = "@string/app_name" > android: name = "com.example.TraceMe.Activity_Main" android: configChanges = "orientation" android: label = "TraceMe" android: screenOrientation = "sensor" > android: name = "com.baidu.location.f" android: enabled = "true" android: process = ":remote" > android: anyDensity = "true" android: largeScreens = "true" android: normalScreens = "false" android: resizeable = "true" android: smallScreens = "true" / > 然后在layout目录下完成相关activtiy的设计 其中百度地图的控件声明如下: android: layout_width = "fill_parent" android: layout_height = "fill_parent" android: clickable = "true" android: layout_weight = "1" 然后在Activity_showMyLocation中完成定位操作并显示在地图上 package com.example.TraceMe; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.Log; import android.widget.Button; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.map.*; import com.baidu.platform.comapi.basestruct.GeoPoint; /** * Created with IntelliJ IDEA. * User: mac * Date: 12/1/13 * Time: 5:12 下午 * To change this template use File | Settings | File Templates. */ public class Activity_showMyLocation extends Activity { private MapView mMapView = null; //MapView 是地图主控件 private MapController mMapController = null; //用MapController完成地图控制 MKMapViewListener mMapListener = null; //MKMapViewListener 用于处理地图事件回调 //定位相关 LocationClient mLocClient; LocationData locData = null; public MyLocationListenner myListener = new MyLocationListenner(); //定位图层 locationOverlay myLocationOverlay = null; // Button map_FindMe = null; boolean isRequest = false; //是否手动触发请求定位 boolean isFirstLoc = true; //是否首次定位 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); /** * 使用地图sdk前需先初始化BMapManager. * BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建, * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁 */ TraceMe app = (TraceMe) this.getApplication(); if (app.mBMapManager == null) { app.mBMapManager = new BMapManager(this); app.mBMapManager.init(TraceMe.strKey, new TraceMe.MyGeneralListener()); } mMapView = (MapView) findViewById(R.id.bmapView); /** * 获取地图控制器 */ mMapController = mMapView.getController(); /** * 设置地图是否响应点击事件 . */ mMapController.enableClick(true); /** * 设置地图缩放级别 */ mMapController.setZoom(18); /** * MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause() */ mMapListener = new MKMapViewListener() { @Override public void onMapMoveFinish() { /** * 在此处理地图移动完成回调 * 缩放,平移等操作完成后,此回调被触发 */ } @Override public void onClickMapPoi(MapPoi mapPoiInfo) { /** * 在此处理底图poi点击事件 * 显示底图poi名称并移动至该点 * 设置过: mMapController.enableClick(true); 时,此回调才能被触发 * */ String title = ""; if (mapPoiInfo != null) { title = mapPoiInfo.strText; Toast.makeText(Activity_showMyLocation.this, title, Toast.LENGTH_SHORT) .show(); mMapController.animateTo(mapPoiInfo.geoPt); } } @Override public void onGetCurrentMap(Bitmap b) { /** * 当调用过 mMapView.getCurrentMap()后,此回调会被触发 * 可在此保存截图至存储设备 */ } @Override public void onMapAnimationFinish() { /** * 地图完成带动画的操作(如: animationTo())后,此回调被触发 */ } /** * 在此处理地图载完成事件 */ @Override public void onMapLoadFinish() { Toast.makeText(Activity_showMyLocation.this , "地图加载完成" , Toast.LENGTH_SHORT) .show(); } }; mMapView.regMapViewListener(TraceMe.getInstance() .mBMapManager, mMapListener); mLocClient = new LocationClient(this); locData = new LocationData(); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); //打开gps option.setCoorType("bd09ll"); //设置坐标类型 option.setScanSpan(5000); mLocClient.setLocOption(option); mLocClient.start(); //定位图层初始化 myLocationOverlay = new locationOverlay(mMapView); //设置定位数据 myLocationOverlay.setData(locData); //添加定位图层 mMapView.getOverlays() .add(myLocationOverlay); myLocationOverlay.enableCompass(); //修改定位数据后刷新图层生效 mMapView.refresh(); } // /** // * 修改位置图标 // * @param marker // */ // public void modifyLocationOverlayIcon(Drawable marker){ // //当传入marker为null时,使用默认图标绘制 // myLocationOverlay.setMarker(marker); // //修改图层,需要刷新MapView生效 // mMapView.refresh(); // } @Override protected void onPause() { /** * MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause() */ mMapView.onPause(); super.onPause(); } @Override protected void onResume() { /** * MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume() */ mMapView.onResume(); super.onResume(); } @Override protected void onDestroy() { /** * MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy() */ mMapView.destroy(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mMapView.onRestoreInstanceState(savedInstanceState); } public class locationOverlay extends MyLocationOverlay { public locationOverlay(MapView mapView) { super(mapView); // TODO Auto-generated constructor stub } } public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null) return; locData.latitude = location.getLatitude(); locData.longitude = location.getLongitude(); //如果不显示定位精度圈,将accuracy赋值为0即可 locData.accuracy = location.getRadius(); // 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。 locData.direction = location.getDerect(); //更新定位数据 myLocationOverlay.setData(locData); //更新图层数据执行刷新后生效 mMapView.refresh(); //是手动触发请求或首次定位时,移动到定位点 if (isRequest || isFirstLoc) { //移动地图到定位点 // Log.d("LocationOverlay", "receive location, animate to it"); mMapController.animateTo(new GeoPoint((int)(locData.latitude * 1e6), (int)(locData.longitude * 1e6))); isRequest = false; } //首次定位完成 isFirstLoc = false; } public void onReceivePoi(BDLocation poiLocation) { if (poiLocation == null) { return; } } } }
java怎么做定位打卡功能?
说明:用于打卡签到功能;
用户到达某一地点后,根据用户所在位置经纬度位置和目的地所在位置经纬度进行计算对比,对比值大于设置距离差,不能打卡,小于设置距离差,可以打开。
1、pom.xml
<!--用于计算两点之间的距离--> <dependency> <groupId>org.gavaghan</groupId> <artifactId>geodesy</artifactId> <version>1.1.3</version> </dependency>
2、实体类
//由前端传递 用户所在位置经纬度 @Data public class PlatPunch { /*经度*/ private String longitude; /*纬度*/ private String latitude; }
3、实现方法
/* 活动定位打卡功能 */ @GetMapping(value = "/getPunch") public AjaxResult getPunch(PlatPunch platPunch) { //1、设置目的地经度 String longitudeS = “106.235321” //设置目的纬度 String latitudeS = “37.432579”; // 2、由前端传过来的用户所在位置 经纬度 String longitudeT = platPunch.getLongitude(); String latitudeT = platPunch.getLatitude(); // 3、对比 GlobalCoordinates source = new GlobalCoordinates(Double.parseDouble(latitudeS), Double.parseDouble(longitudeS)); GlobalCoordinates target = new GlobalCoordinates(Double.parseDouble(latitudeT), Double.parseDouble(longitudeT)); //这是两种坐标系计算方法,这是第一种坐标系计算方法(我们用的这种) double geoCurve = getDistanceMeter(source, target, Ellipsoid.Sphere); //这是两种坐标系计算方法,这是第二种坐标系计算方法 double geoCurve2 = getDistanceMeter(source, target, Ellipsoid.WGS84); System.out.println(geoCurve + "----------" + geoCurve2); //如果用户和目的地位置想吃2千米,在不能打卡; if (geoCurve > 2000) { System.out.println("不能打卡!!!"); //反之,可以打卡 } else { System.out.println("能打卡"); } return AjaxResult.success(); } /* 经纬度计算工具类*/ public static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid) { //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离 GeodeticCurve geoCurve = new GeodeticCalculator() .calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo); return geoCurve.getEllipsoidalDistance(); }
Java语言具有功能强大和简单易用两个特征,所以java可以实现很多应用功能,因此如果闲暇的时候,不放自己使用java语言开发一些功能,以此提高自己的技能!最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。
推荐阅读: