如何根据GPS定位信息ios 地图绘制运动轨迹迹

后使用快捷导航没有帐号?
暂时没有人问过相似的问题,你可以做第一个提问题的人
查看: 4202|回复: 5
如何根据GPS定位信息绘制运动轨迹
需要实现的功能是:
在获取GPS定位信息之后,在地图上画出轨迹。
我现在使用的方法是,每1秒钟获取一次定位信息。再触发定位SDK的监听函数后,用画折线的方式绘画出轨迹。但是由于GPS的不准确性,会有一些波动。。如图。
有没有好的办法,优化数据,去除波动? 或者改变绘制轨迹的方法。
(70.35 KB, 下载次数: 43)
13:58 上传
帮你顶一下,这个数据的波动是SDK层面没法控制的 。& &
或许你可以人工干预一下....
& &多谢版主。
你可以自己做一个简单的简化嘛...&&比如你可以记录下一段时间定位的经纬度会发现,大量经纬度都是一样的,这些一样都只取一个点。& &还有明明是前进的,出现比较大的左右移动一般可以当作是定位不准确,也可以优化。
你可以自己做一个简单的简化嘛...&&比如你可以记录下一段时间定位的经纬度会发现,大量经纬度都是一样的, ...
还是不知道如何去优化,能具体说一下判断算法么
Powered by经验158 米
在线时间8 小时
积分 169, 距离下一级还需 31 积分
积分 169, 距离下一级还需 31 积分
机型红米手机2 移动 高配版
签到次数11
MIUI版本6.5.5
你们的GPS能够定位记录运动轨迹吗,为啥老版新版都不能用,换了三个牌子的手机都不能用,小米工程师为啥不管呢
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
Copyright (C) 2016 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号19789人阅读
百度地图Android SDK下载:
下面是效果:
采样点取得太频繁所以看起来像是一个个点。。。&& 可以自己设计算法只取有用的点。
为了方便,我直接修改百度提供的示例代码。
要修改的是BMapApiDemoApp.java,LocationOverlay.java还有自定义一个继承自Overlay的RunLineOverlay。
BMapApiDemoApp:
public class BMapApiDemoApp extends Application {
static BMapApiDemoApp mDemoA
//百度MapAPI的管理类
BMapManager mBMapMan = null;
// 授权Key
// TODO: 请输入您的Key,
// 申请地址:/wiki/static/imap/key/
String mStrKey = &你的Key&;
boolean m_bKeyRight = true;
// 授权Key正确,验证通过
// 常用事件监听,用来处理通常的网络错误,授权验证错误等
static class MyGeneralListener implements MKGeneralListener {
public void onGetNetworkState(int iError) {
Log.d(&MyGeneralListener&, &onGetNetworkState error is &+ iError);
Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(), &您的网络出错啦!&,
Toast.LENGTH_LONG).show();
public void onGetPermissionState(int iError) {
Log.d(&MyGeneralListener&, &onGetPermissionState error is &+ iError);
if (iError ==
MKEvent.ERROR_PERMISSION_DENIED) {
// 授权Key错误:
Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(),
&请在BMapApiDemoApp.java文件输入正确的授权Key!&,
Toast.LENGTH_LONG).show();
BMapApiDemoApp.mDemoApp.m_bKeyRight = false;
public void onCreate() {
Log.v(&BMapApiDemoApp&, &onCreate&);
mDemoApp = this;
mBMapMan = new BMapManager(this);
boolean isSuccess = mBMapMan.init(this.mStrKey, new MyGeneralListener());
// 初始化地图sdk成功,设置定位监听时间
if (isSuccess) {
mBMapMan.getLocationManager().enableProvider(MKLocationManager.MK_GPS_PROVIDER);
mBMapMan.getLocationManager().setNotifyInternal(10, 5);
// 地图sdk初始化失败,不能使用sdk
super.onCreate();
//建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
public void onTerminate() {
// TODO Auto-generated method stub
if (mBMapMan != null) {
mBMapMan.destroy();
mBMapMan = null;
super.onTerminate();
mStrKey的值是你申请来的Key,申请地址上面有。
onCreate里加了句mBMapMan.getLocationManager().enableProvider(MKLocationManager.MK_GPS_PROVIDER);用来打开GPS位置。
RunLineOverlay:
public class RunLineOverlay extends Overlay {
private List&GeoPoint& mL
public RunLineOverlay() {
// TODO Auto-generated constructor stub
mList=new ArrayList&GeoPoint&();
public void draw(Canvas arg0, MapView arg1, boolean arg2) {
// TODO Auto-generated method stub
super.draw(arg0, arg1, arg2);
Projection projection = arg1.getProjection();
Paint paint=new Paint();
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5.0f);
Point p1=projection.toPixels(mList.get(0), null);
Point p2=projection.toPixels(mList.get(0), null);
for (GeoPoint item : mList) {
p1.x=p2.x;
p1.y=p2.y;
p2=projection.toPixels(item, null);
arg0.drawLine(p1.x, p1.y, p2.x, p2.y, paint);
public List&GeoPoint& getmList() {
public void setmList(List&GeoPoint& mList) {
this.mList = mL
public void addGeoPoint(GeoPoint point){
mList.add(point);
这是一个自定义的用于在底图上根据点画出轨迹的覆盖物。Projection用于经纬度和屏幕像素点的转换。大概功能就是取出经纬度点然后转成屏幕像素点然后连成轨迹。
LocationOverlay:
public class LocationOverlay extends MapActivity {
MapView mMapView = null;
LocationListener mLocationListener = null;//onResume时注册此listener,onPause时需要Remove
MyLocationOverlay mLocationOverlay = null;
//定位图层
RunLineOverlay mRunLine=null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapviewdemo);
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
if (app.mBMapMan == null) {
app.mBMapMan = new BMapManager(getApplication());
app.mBMapMan.init(app.mStrKey, new BMapApiDemoApp.MyGeneralListener());
app.mBMapMan.start();
// 如果使用地图SDK,请初始化地图Activity
super.initMapActivity(app.mBMapMan);
mMapView = (MapView)findViewById(R.id.bmapView);
mMapView.setBuiltInZoomControls(true);
//设置在缩放动画过程中也显示overlay,默认为不绘制
mMapView.setDrawOverlayWhenZooming(true);
// 添加定位图层
mLocationOverlay = new MyLocationOverlay(this, mMapView);
mMapView.getOverlays().add(mLocationOverlay);
// 注册定位事件
mLocationListener = new LocationListener(){
public void onLocationChanged(Location location) {
if (location != null){
GeoPoint pt = new GeoPoint((int)(location.getLatitude()*1e6),
(int)(location.getLongitude()*1e6));
if(mRunLine==null)
{mRunLine=new RunLineOverlay();
mRunLine.addGeoPoint(pt);
mMapView.getOverlays().add(mRunLine);}else
mRunLine.addGeoPoint(pt);
mMapView.getController().animateTo(pt);
protected void onPause() {
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
app.mBMapMan.getLocationManager().removeUpdates(mLocationListener);
mLocationOverlay.disableMyLocation();
mLocationOverlay.disableCompass(); // 关闭指南针
app.mBMapMan.stop();
super.onPause();
protected void onResume() {
BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();
// 注册定位事件,定位后将地图移动到定位点
app.mBMapMan.getLocationManager().requestLocationUpdates(mLocationListener);
mLocationOverlay.enableMyLocation();
mLocationOverlay.enableCompass(); // 打开指南针
app.mBMapMan.start();
super.onResume();
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
主要修改的代码是
public void onLocationChanged(Location location) {&&&&&&&&&&&&&&& if (location != null){&&&&&&&&&&&&&&&&&&& GeoPoint pt = new GeoPoint((int)(location.getLatitude()*1e6),&&&&&&&&&&&&&&&&&&&&&&&&&&& (int)(location.getLongitude()*1e6));&&&&&&&&&&&&&&&&&&& if(mRunLine==null)&&&&&&&&&&&&&&&&&&& {mRunLine=new RunLineOverlay();&&&&&&&&&&&&&&&&&&& mRunLine.addGeoPoint(pt);&&&&&&&&&&&&&&&&&&& mMapView.getOverlays().add(mRunLine);}else&&&&&&&&&&&&&&&&&&&&&&& mRunLine.addGeoPoint(pt);&&&&&&&&&&&&&&&&&&& mMapView.getController().animateTo(pt);&&&&&&&&&&&&&&& }
当位置改变是这个方法会被调用。功能就是把新位置放入mRunLine。当然第一次要mMapView.getOverlays().add(mRunLine);把mRunLine放进mMapView的覆盖物列表,这样当mMapView被重绘时mRunLine的draw方法就会被调用。
改好后运行程序,列表点击Overlaytest,然后出去转一圈。
&script type=&text/javascript&&&!--
google_ad_client = &ca-pub-8447&;
/* cnblogs 首页横幅 */
google_ad_slot = &&;
google_ad_width = 728;
google_ad_height = 90;
//--&&/script&&script type=&text/javascript& src=&/pagead/show_ads.js&&&/script&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8092005次
积分:85396
积分:85396
排名:第10名
原创:435篇
转载:4678篇
译文:22篇
评论:1667条
文章:21篇
阅读:46009
文章:15篇
阅读:34855
文章:22篇
阅读:202286
(4)(8)(28)(21)(47)(1)(1)(8)(170)(814)(1012)(1351)(969)(262)(207)(2)(3)(2)(61)(19)(2)(28)(22)(37)(1)(3)(4)(6)(9)(10)(26)精准定位!GPS定位及轨迹记录器DIY教程
  基于C3-370C的GPS定位及轨迹记录仪!
  在邮购部买了C3-370C的GPS,准备做GPS轨迹记录,因为我一直想在旅游的照片上加上坐标信息&&
  开始用M48作控制mcu,结果写着写着,发现Flash空间不足,想换个M8或M88的,不过不好买,手上正好还有两块STC90C52,8K的,于是就换上C52了。
  C52不带AD,那电池检测又成问题,于是从坏的万用表上拆下一个2904运放,做了个简单的电池电压检测。
  现在整个设备的供电都由锂电池直接提供,配一块880mah的手机电池,可以用6小时左右;
  我用24C64记录轨迹信息,包括日期时间、经纬度在内的一组信息,可存储512条,按1min/条,可存8小时。
  数据通过串口传给上位机,上位机软件转换数据,也可直接输出KML文件,在Goole earth中打开。
  按键0: 短按(可见卫星信息|坐标数据); 长按(运行|暂停);
  按键1: 短按(记录当前坐标数据); 长按(暂停时长按删除所有数据);
  按键2: 短按(背光灯); 长按(记录模式切换H/A90s/A60s/A30s/A10s);
  图1 实物图
  背光灯开启
  界面说明
  液晶背后的主控板
  30S自动记录模式
  可见卫星信息
除非注明,本站均为原创或编译,转载请注明:文字来自
分享给朋友:
请勿进行人身攻击,谩骂以及任何违法国家相关法律法规的言论。

我要回帖

更多关于 js 绘制小球运动轨迹 的文章

 

随机推荐