`

Android GPS坐标 画路线

阅读更多
问题描述:使用成百上千个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
1
0
分享到:
评论
2 楼 Menuz 2012-07-30  
ayeaye 写道
百度地图也可以这样手绘折线吗

百度API没有玩过,不过肯定可以实现的,这是基本功能。
1 楼 ayeaye 2012-07-28  
百度地图也可以这样手绘折线吗

相关推荐

    Android GPS坐标

    下面将详细介绍Android GPS坐标的工作原理、使用方法及相关知识点。 1. **Android GPS API** Android提供了Location API来获取GPS坐标。开发者可以使用`LocationManager`服务和`LocationListener`接口来获取实时的...

    Android中GPS坐标转换为高德地图坐标详解

    在Android开发中,涉及到地图应用时,经常需要处理不同坐标系之间的转换,特别是GPS坐标与地图服务提供商坐标之间的转换。本文主要聚焦于Android系统中如何将GPS获取的坐标转换为适用于高德地图的坐标。 首先,我们...

    GPS转百度坐标demo、

    标签“android gps”表明这个问题与Android平台上的GPS功能有关,开发者可能需要获取设备的GPS坐标,并将这些坐标应用到百度地图API中,以在地图上准确地显示位置标记或者进行路线规划。 “GPSConvertBaiDu”这个...

    Android GPS转百度坐标demo.zip

    总之,Android应用在与百度地图接口交互时,必须将GPS坐标转换为百度坐标才能正确显示。这个转换过程涉及多个坐标系统的变换,需要理解各个坐标系的特点,并正确使用相应的转换算法。通过`GPSConvertBaiDu`提供的...

    Android中GPS定位获取坐标信息

    本篇文章将深入探讨如何在Android应用中实现GPS定位,获取坐标信息,并利用这些信息进行地理编码(Geocoding)以获取详细的地理位置描述。 首先,为了在Android应用中使用GPS,我们需要在`AndroidManifest.xml`文件...

    Android GPS及filter实现

    1. 数据预处理:收集一段时间内的GPS坐标,记录下每个时刻的位置。 2. 滤波算法:根据选择的滤波器类型,对这些位置进行处理。对于卡尔曼滤波,你需要定义状态方程(预测模型)和观测方程(实际测量),然后迭代更新...

    Android应用源码之androidGPS及WIFI基站定位坐标源码_androidGPS.zip

    这份"Android应用源码之androidGPS及WIFI基站定位坐标源码"提供了实现这两种定位方式的详细示例,帮助开发者更好地理解和运用到自己的项目中。 一、Android GPS定位 Android系统通过Google Play服务提供的Location ...

    Android-Gps-Test.rar_GPS纬度_android_android gps test_androits gps

    2. **定位精度**:GPS坐标与实际位置的偏差。 3. **卫星信号质量**:查看设备能够连接到多少颗卫星,以及信号强度如何。 4. **稳定性**:长时间使用下,定位信息是否持续稳定。 5. **功耗**:GPS工作对电池的影响。 ...

    真实GPS坐标转换为偏移坐标

    #### 一、GPS坐标与偏移坐标的概念 1. **GPS坐标**:全球定位系统(Global Positioning System)提供的一种坐标系统,用来确定地球表面上任何一点的位置。通常采用经纬度表示,其中经度范围在-180到180度之间,纬度...

    Android火星坐标转换

    对于详细的转换算法和步骤,可以查阅《中国GPS坐标转换》等相关技术文档,或者使用已有的开源库,如`bd-geo-coordinate`,它封装了坐标转换的逻辑,可以方便地集成到Android项目中。 总之,Android上的火星坐标...

    androidGPS及WIFI基站定位坐标源码.zip

    这份“androidGPS及WIFI基站定位坐标源码.zip”压缩包包含了一些实现这两种定位方式的源代码,对于学习Android定位机制非常有帮助。接下来,我们将深入探讨这两种定位方法及其在源码中的实现细节。 1. GPS定位: ...

    安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip

    这个压缩包“安卓Android源码——androidGPS及WIFI基站定位坐标源码.zip”提供了一个实践示例,展示了如何在Android平台上实现基于GPS和WIFI的定位功能。下面将详细讲解这两个定位技术及其在源码中的应用。 1. GPS...

    Android百度地图画运动轨迹和GPS定位

    3. **运动轨迹绘制**:在获取到一系列的GPS坐标点后,可以使用百度地图提供的Overlay类来在地图上绘制轨迹。创建一个自定义的Overlay子类,重写draw()方法,在这个方法中根据坐标点列表绘制Path,并将其添加到...

    Android Gps Test源码

    在GPS测试应用中,`src`目录下的类将实现获取和处理GPS定位数据的功能,`res`中的布局文件则可能包含了显示GPS坐标和其他相关信息的用户界面。 通过对这些文件的分析,我们可以了解到Android Gps Test源码是如何...

    Android GPS获得定位数据源代码

    // 获取GPS坐标 double latitude = location.getLatitude(); double longitude = location.getLongitude(); // 存储到SQLite数据库 saveToDatabase(latitude, longitude); } private void saveToDatabase...

    Android GPS获取当前经纬度坐标

    "Android GPS获取当前经纬度坐标" Android GPS获取当前经纬度坐标是 Android 开发中一个非常重要的知识点,涉及到 Android GPS 位置服务、Android API 和第三方地图 API 的使用。下面将从多方面详细介绍 Android ...

    GPS坐标转化为百度地图坐标

    GPS坐标系,如WGS84,是一种大地坐标系统,由经度、纬度和海拔三个参数构成。经度表示东西方向的位置,纬度表示南北方向的位置,海拔则是相对于参考椭球的高度。WGS84是国际航空和航海界广泛采用的标准,也是GPS接收...

    一个简单的android GPS DEMO代码

    本DEMO代码旨在展示如何在Android应用中实现基本的GPS功能,让开发者能够理解和学习如何获取用户的位置坐标。下面我们将深入探讨这个DEMO涉及的关键知识点。 1. **权限声明**:在AndroidManifest.xml文件中,你需要...

    Android GPS定位源代码

    由于历史原因,中国境内的GPS坐标通常需要经过WGS84到GCJ-02(火星坐标系)再到BD-09(百度坐标系)的转换,才能准确显示在地图上。这涉及复杂的数学算法,如双线性内插法或牛顿迭代法。 5. **定位精度与速度** `...

Global site tag (gtag.js) - Google Analytics