2011-09-01 33 views
1

我正在研究Android中的GPS跟踪,以跟踪用户位置并提供记录轨道的功能。我现在能够绘制路径,我想计算轨道距离和时间与此类似假设用户开始跟踪记录,并移动到另一个位置,现在我想计算从谷歌地图的开始到结束位置(用户位置更新)的总距离和时间旅行。我有函数计算2位置的距离,但不适合我的路线,因为路线是多段线,它是灵活的纬度/经度位置。是他们的任何api或谷歌提供的任何功能或服务。任何帮助或建议都很感激。基于我的轨道详细信息的轨道距离和时间

+0

android map view有计算两个地理点之间距离的默认方法。 –

+1

但是你可以使用这个函数。多段线由多个纬度/经度位置组成。计算它们之间的距离并将其相加。像dist1 = distanceBetween(pos1,pos2),dist2 = distanceBetween(pos2,pos3)等。最后totalDist = dist1 + dist2 + ... – evilone

回答

6

我会创建一个名为航点

class WayPoint 
{ 
    DateTime depart; //some date time container 
    DateTime arrive; //some date time container 
    Coordinate position; //some gps coordinate 
} 

然后创建这些类的列表,允许元素的插入在其中是有帮助的,如果你的路由变化的任何位置类:

List<WayPoint> journey = new ArrayList<WayPoint>(); 

//just add your waypoints 

journey.add(startWayPoint); 
journey.add(wayPoint_1); 
journey.add(wayPoint_2); 
//... 
journey.add(wayPoint_n_minus_2); 
journey.add(wayPoint_n_minus_1); 
journey.add(endWayPoint); 

然后转换排列和计算总数:

WayPoint[] wayPoints = journey.toArray(); 

double total_distance = 0.0f; //distance in metres 
double total_travel_time = 0.0f; // time in hours 

//start at index 1 because there are n-1 segments 
if(wayPoints.length>1) 
foreach(int i=1; i<wayPoints.length;i++) 
{ 
    total_distance += calcDistanceBetween(
     wayPoints[i-1].position, 
     wayPoints[i].position); 

    total_time += calcTimeInHoursBetween(
     wayPoints[i-1].depart, 
     wayPoints[i].arrive); 
} 

log.d("Total Distance",String.valueOf(total_distance)); 
log.d("Total Travel Time",String.valueOf(total_travel_time)); 
1

如果在时间线内有一组纬度/经度数据,则可以通过该时间线中每组之间的距离之和来计算总距离。

我不知道你使用的计算距离,公式,但它是好的,看一看here

这是一个非常明智的话题,因为你是一个类似的东西表面上计算距离。我怎么能说..桃花。

为了说明的想法:

  • 下午1时= 50 21 50N,004 09 25W
  • 下午5点= 45 21 50N,008 09 25W
  • 下午十点00 = 42 21 04N,009 02 27W

总时间:9小时

总距离:(A-> b + B-> C)=630公里+342.4公里=972.4公里

2

我已经实现了我的方式,我创建了内部类w HICH扩展了覆盖类来绘制地图的路径/路由

private class TrackOverlay extends Overlay { 
    private List<GeoPoint> polyline; 

    private Paint mPaint; 
    private Point p1; 
    public TrackOverlay() { 
     polyline = new ArrayList<GeoPoint>(); 

     mPaint = new Paint(); 
     mPaint.setDither(true); 
     mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(5); 
     mPaint.setARGB(150, 62, 184, 240); 

     p1 = new Point(); 
    } 

    @Override 
    public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
     super.draw(canvas, mapView, shadow); 
     if (drawTrack && polyline.size() > 0) { 
      mPaint.setARGB(120, 212, 51, 51); 
      drawTrackPath(canvas); 
     } 
     if (showTrack && polyline.size() > 0) { 
      mPaint.setARGB(150, 62, 184, 240); 
      drawTrackPath(canvas); 
     } 
    } 

    private void drawTrackPath(Canvas canvas) { 
     int x1 = 0, y1 = 0, x2 = 0, y2 = 0; 
     for (GeoPoint gp : polyline) { 
      mapView.getProjection().toPixels(gp, p1); 
      x2 = p1.x; 
      y2 = p1.y; 

      if (x1 != 0 && y1 != 0) { 
       canvas.drawLine(x1, y1, x2, y2, mPaint); 
      } 
      x1 = x2; 
      y1 = y2; 
     } 
    } 

    void addTrackPoint(GeoPoint geoPoint) { 
     polyline.add(geoPoint); 
    } 

    List<GeoPoint> getPolylineTrack() { 
     return polyline; 
    } 
} 

创建这个类的新对象,并添加到地图叠加像这样

trackOverlay = new TrackOverlay(); 
mapView.getOverlays().add(trackOverlay); 

现在我已经绘制的路径时,用户点击按钮记录轨道,并找到我已创建更新方法的总距离和时间,当GPS获取新位置时,将使用locationChange()方法调用该位置,该位置将传递给地图活动并存储到折线中TrackOverlay类的对象。

public static void updateMap() { 
    if (ServiceLocation.curLocation != null) { 
     curTime = ServiceLocation.curLocation.getTime(); 
     curLat = ServiceLocation.curLocation.getLatitude(); 
     curLng = ServiceLocation.curLocation.getLongitude(); 

     if (mapView != null) { 
      point = new GeoPoint((int) (curLat * 1e6), (int) (curLng * 1e6)); 

      mc.animateTo(point); 
      if (drawTrack && trackOverlay != null) { 
       trackOverlay.addTrackPoint(point); 
       if(prevTime>0) 
        totalSec += (curTime-prevTime); 

       double x1 = 0, x2 = 0, y1 = 0, y2 = 0, temp_dist=0,temp_speed=0; 
       if(trackOverlay.polyline.size()>1){ 
        x1 = trackOverlay.polyline.get(trackOverlay.polyline.size()-2).getLatitudeE6()/1e6; 
        y1 = trackOverlay.polyline.get(trackOverlay.polyline.size()-2).getLongitudeE6()/1e6; 

        x2 = trackOverlay.polyline.get(trackOverlay.polyline.size()-1).getLatitudeE6()/1e6; 
        y2 = trackOverlay.polyline.get(trackOverlay.polyline.size()-1).getLongitudeE6()/1e6; 

        dist += (Geo_Class.distFrom(x1, y1, x2, y2)/METER_KILOMETER); 

        double totalMeter = dist * METER_KILOMETER; 
        double total_sec = (totalSec/1000) * KILOMETER_HOUR; 

        speed = totalMeter/total_sec; 

        txt_msg.setText("Distance " + round(dist,5,BigDecimal.ROUND_HALF_UP) + " km"); 
        speed_msg.setText("Speed " + round(speed,3,BigDecimal.ROUND_HALF_UP) + " kmph \n time " +(totalSec/1000) + " sec"); 
       } 

      }else{ 
       totalSec = 0; 
      } 
      mapView.invalidate(); 
      prevTime = curTime; 
     } 
    } 
} 

确定每次这个方法是调用和更新与新点的地图,并在此我必须使用Geo_Class.distFrom(x1, y1, x2, y2)我的创建方法,该方法是计算两个点之间的距离,并获得新的点,当设置为CURR点并且curr点将分配给prev点。以相同的方式计算总时间。并找到使用此的速度

speed = total distance/total time