Java地图定位实现方法教程
分类:Java
时间:2023年03月10日 12:24:25
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 中有多种方法可以实现字符串的反转,以下是其中的两种方法。 第一种方法是使用 StringBuilder 的 reverse() 方法将字符串原地反转,代码如下: ```java String str = "Hello, world!"; StringBuilder sb = new Str…
在 Java 中实现字符串反转操作可以使用如下的代码: ```java public class StringReverseExample { public static void main(String[] args) { String str = "Hello world!"; String r…
在Java中,可以使用增强的for循环来遍历集合并打印每个元素的值。以下是一个示例代码: ``` List list = new ArrayList(); list.add("apple"); list.add("banana"); list.add("orange"); for (String e…
在 Java 中,可以使用以下方法处理空指针异常: 1. 使用 if 语句检查对象是否为 null。例如: ```java if (object != null) { // 对象不为空,可以进行操作 } else { // 对象为空,需要进行处理 } ``` 2. 使用 try-catch 块捕获空…
Java中实现多线程编程可以通过以下两种方式实现: 1. 继承Thread类并重写run方法 实现多线程最简单的方式是创建一个新类,并继承Thread类。然后在该类中重写run()方法,run方法里面是线程执行的代码逻辑。最后,创建类的实例并调用start()方法来启动线程。 示例代码如下: ```…
如下: public class MyThread extends Thread { @Override public void run() { // Your code here } } public static void main(String[] args) { MyThread t1 = …
多线程编程可以使用Java的Thread类和Runnable接口来实现。 示例代码: //实现Runnable接口 public class MyRunnable implements Runnable { @Override public void run() { System.out.print…
public class MyThread extends Thread { @Override public void run() { System.out.println("线程" + Thread.currentThread().getName() + "正在执行"); } public st…
public class MultiThread { public static void main(String[] args) { // 创建一个线程 Thread t1 = new Thread(new Runnable() { @Override public void run() { Sy…
1. 使用Amazon Web Services(AWS)的Simple Storage Service(S3)来存储数据: ```java // 创建Amazon S3客户端 AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); //…
随机推荐
- Qoo10趣天日本广告投标助手
- 西西趣天采集插件2.0升级版
- 西西电商图片下载助手
- 西西趣天韩国批量上货助手最新版
- 西西趣天日本批量上货助手最新版
- HeidiSQL_12.12绿色版
- WPS office 10.1.0.7311精简版(无联网功能)无广告超级好用
- dupeGuru – 电脑重复文件查找工具,支持跨平台使用!
- Caesium – 图片批量压缩软件
- 7-Zip 免费解压软件
- TrayS 绿色免安装版 (任务栏美化工具)
- AirDroid 3.7.2.1 Android 设备管家远程控制
- Snipaste截图软件下载
- Everything 1.4.1.1026 文件搜索工具
- chromium浏览器伪造sni工具网页版
