问题描述:使用成百上千个GPS坐标画路线,在android上的Google Map显示出来
之前我实现过一次,将每个点都遍历一边,然后在Google Map上画出来,但是由于
数据过多导致Google地图移动位置变得不流畅,每次移动Google地图都会调用draw
方法,那么程序一直遍历一直画图,花费大且不流畅。这次做了下优化,对只在屏幕内
的坐标画线。Google地图比之前流畅多了。
之前实现是画蓝色的线,这次实现只画红色的线。
临界条件是上一个点在屏幕内,下一个点在屏幕外。
运行环境:android版本2.3
package com.ui;
import java.util.ArrayList;
import java.util.List;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Path;
import android.util.Log;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
import com.model.Point;
public class RouteOverlay extends Overlay
{
final static String TAG = "DrawRoutePath";
private List<Point> points = new ArrayList<Point>();
private final Projection projection;
private final Paint paint;
public RouteOverlay(Projection projection) {
this.projection = projection;
// 设置画笔
paint = new Paint();
paint.setColor(Color.RED);
// 画笔的粗细
paint.setStrokeWidth(3);
paint.setAntiAlias(true);
paint.setStrokeMiter(3);
paint.setStyle(Style.STROKE);
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
if(shadow)
{
return;
}
// 这里使用系统提供的Path,Point来画图
Path drawingPath = new Path();
android.graphics.Point pixelPoint = new android.graphics.Point();
// 得到当前屏幕的高*宽
int width = canvas.getWidth();
int height = canvas.getHeight();
GeoPoint bottomRight = projection.fromPixels(width, height);
GeoPoint topLeft = projection.fromPixels(0, 0);
int maxLat = topLeft.getLatitudeE6();
int minLat = bottomRight.getLatitudeE6();
int minLon = topLeft.getLongitudeE6();
int maxLon = bottomRight.getLongitudeE6();
int pointsSize = points.size();
// 之前的布点是否在屏幕中
boolean preOutOfBounds = true;
// 之前的布点是否是新的一段路线的开始
boolean preWasMoveTo = true;
int moveToLat = Integer.MAX_VALUE;
int moveToLon = Integer.MIN_VALUE;
for(int i=0; i<pointsSize; i++)
{
double pointLat = points.get(i).getLat();
int pointLatInt = (int)(pointLat * 1E6);
double pointLon = points.get(i).getLon();
int pointLonInt = (int)(pointLon * 1E6);
// 判断该点有没有超出屏幕显示的范围
boolean currentOutOfBounds = pointLatInt < minLat || pointLatInt > maxLat ||
pointLonInt < minLon || pointLonInt > maxLon;
// 起点或者先前节点和当前节点都在屏幕之外,将preWasMoveTo设为true‘
// 当前坐标在屏幕外,并且之前坐标也在屏幕外,则设置preWasMoveTo为true
if(i == 0 || (preOutOfBounds && currentOutOfBounds))
{
moveToLat = pointLatInt;
moveToLon = pointLonInt;
preWasMoveTo = true;
}
else
{
if(preWasMoveTo)
{
GeoPoint geoPoint = new GeoPoint(moveToLat, moveToLon);
// 将经纬度转换为屏幕画布像素上的点(称之为布点)
projection.toPixels(geoPoint, pixelPoint);
// 设置point.x, point.y为新一段路线的开始
drawingPath.moveTo(pixelPoint.x, pixelPoint.y);
preWasMoveTo = false;
}
GeoPoint geoPoint = new GeoPoint(pointLatInt, pointLonInt);
projection.toPixels(geoPoint, pixelPoint);
// 将最后的布点与该布点之间画一条线
drawingPath.lineTo(pixelPoint.x, pixelPoint.y);
}
preOutOfBounds = currentOutOfBounds;
}
canvas.drawPath(drawingPath, paint);
}
public void setPoints(ArrayList<Point> points) {
this.points = points;
}
}
- 大小: 8.3 KB
分享到:
相关推荐
下面将详细介绍Android GPS坐标的工作原理、使用方法及相关知识点。 1. **Android GPS API** Android提供了Location API来获取GPS坐标。开发者可以使用`LocationManager`服务和`LocationListener`接口来获取实时的...
在Android开发中,涉及到地图应用时,经常需要处理不同坐标系之间的转换,特别是GPS坐标与地图服务提供商坐标之间的转换。本文主要聚焦于Android系统中如何将GPS获取的坐标转换为适用于高德地图的坐标。 首先,我们...
标签“android gps”表明这个问题与Android平台上的GPS功能有关,开发者可能需要获取设备的GPS坐标,并将这些坐标应用到百度地图API中,以在地图上准确地显示位置标记或者进行路线规划。 “GPSConvertBaiDu”这个...
总之,Android应用在与百度地图接口交互时,必须将GPS坐标转换为百度坐标才能正确显示。这个转换过程涉及多个坐标系统的变换,需要理解各个坐标系的特点,并正确使用相应的转换算法。通过`GPSConvertBaiDu`提供的...
本篇文章将深入探讨如何在Android应用中实现GPS定位,获取坐标信息,并利用这些信息进行地理编码(Geocoding)以获取详细的地理位置描述。 首先,为了在Android应用中使用GPS,我们需要在`AndroidManifest.xml`文件...
1. 数据预处理:收集一段时间内的GPS坐标,记录下每个时刻的位置。 2. 滤波算法:根据选择的滤波器类型,对这些位置进行处理。对于卡尔曼滤波,你需要定义状态方程(预测模型)和观测方程(实际测量),然后迭代更新...
这份"Android应用源码之androidGPS及WIFI基站定位坐标源码"提供了实现这两种定位方式的详细示例,帮助开发者更好地理解和运用到自己的项目中。 一、Android GPS定位 Android系统通过Google Play服务提供的Location ...
2. **定位精度**:GPS坐标与实际位置的偏差。 3. **卫星信号质量**:查看设备能够连接到多少颗卫星,以及信号强度如何。 4. **稳定性**:长时间使用下,定位信息是否持续稳定。 5. **功耗**:GPS工作对电池的影响。 ...
#### 一、GPS坐标与偏移坐标的概念 1. **GPS坐标**:全球定位系统(Global Positioning System)提供的一种坐标系统,用来确定地球表面上任何一点的位置。通常采用经纬度表示,其中经度范围在-180到180度之间,纬度...
对于详细的转换算法和步骤,可以查阅《中国GPS坐标转换》等相关技术文档,或者使用已有的开源库,如`bd-geo-coordinate`,它封装了坐标转换的逻辑,可以方便地集成到Android项目中。 总之,Android上的火星坐标...
这份“androidGPS及WIFI基站定位坐标源码.zip”压缩包包含了一些实现这两种定位方式的源代码,对于学习Android定位机制非常有帮助。接下来,我们将深入探讨这两种定位方法及其在源码中的实现细节。 1. GPS定位: ...
这个压缩包“安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip”提供了一个实践示例,展示了如何在Android平台上实现基于GPS和WIFI的定位功能。下面将详细讲解这两个定位技术及其在源码中的应用。 1. GPS...
3. **运动轨迹绘制**:在获取到一系列的GPS坐标点后,可以使用百度地图提供的Overlay类来在地图上绘制轨迹。创建一个自定义的Overlay子类,重写draw()方法,在这个方法中根据坐标点列表绘制Path,并将其添加到...
在GPS测试应用中,`src`目录下的类将实现获取和处理GPS定位数据的功能,`res`中的布局文件则可能包含了显示GPS坐标和其他相关信息的用户界面。 通过对这些文件的分析,我们可以了解到Android Gps Test源码是如何...
// 获取GPS坐标 double latitude = location.getLatitude(); double longitude = location.getLongitude(); // 存储到SQLite数据库 saveToDatabase(latitude, longitude); } private void saveToDatabase...
"Android GPS获取当前经纬度坐标" Android GPS获取当前经纬度坐标是 Android 开发中一个非常重要的知识点,涉及到 Android GPS 位置服务、Android API 和第三方地图 API 的使用。下面将从多方面详细介绍 Android ...
GPS坐标系,如WGS84,是一种大地坐标系统,由经度、纬度和海拔三个参数构成。经度表示东西方向的位置,纬度表示南北方向的位置,海拔则是相对于参考椭球的高度。WGS84是国际航空和航海界广泛采用的标准,也是GPS接收...
本DEMO代码旨在展示如何在Android应用中实现基本的GPS功能,让开发者能够理解和学习如何获取用户的位置坐标。下面我们将深入探讨这个DEMO涉及的关键知识点。 1. **权限声明**:在AndroidManifest.xml文件中,你需要...
由于历史原因,中国境内的GPS坐标通常需要经过WGS84到GCJ-02(火星坐标系)再到BD-09(百度坐标系)的转换,才能准确显示在地图上。这涉及复杂的数学算法,如双线性内插法或牛顿迭代法。 5. **定位精度与速度** `...