我正在研究Android中的GPS跟踪,以跟踪用户位置并提供记录轨道的功能。我现在能够绘制路径,我想计算轨道距离和时间与此类似假设用户开始跟踪记录,并移动到另一个位置,现在我想计算从谷歌地图的开始到结束位置(用户位置更新)的总距离和时间旅行。我有函数计算2位置的距离,但不适合我的路线,因为路线是多段线,它是灵活的纬度/经度位置。是他们的任何api或谷歌提供的任何功能或服务。任何帮助或建议都很感激。基于我的轨道详细信息的轨道距离和时间
1
A
回答
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
相关问题
- 1. 商店信息 - 轨道
- 2. Windows Phone上的诺基亚音乐音轨的详细信息?
- 3. 有效的方式来存储用户地址详细信息轨道4
- 4. 存储汇总信息的轨道
- 5. 轨道中的请求时间信息是否准确?
- 6. angularjs +基础轨道
- 7. 命名管道详细信息
- 8. 等距空间轨道物体AS3
- 9. Turbolinks和轨道
- 10. CoreMIDI轨道访问签名信息
- 11. 错误信息不会在轨道上
- 12. Facebook的FQL多渠道流和用户的详细信息
- 13. 什么轨道之间的拟差-d和nohup的轨道服务器和
- 14. 与轨道导轨默认基
- 15. 获取Freebase中每道菜的菜单和详细信息?
- 16. Rspec的轨道
- 17. 单词之间的详细距离
- 18. 资产管道和@字体面在轨道(轨道3.2.3)
- 19. 轨道
- 20. 轨道
- 21. 导轨没有错误生产的详细信息
- 22. 计算基于道路的两个位置之间的距离
- 23. 检索轨道基础URL
- 24. Geokit和轨道3
- 25. Understending STI和轨道
- 26. Crystal Reports详细信息详细信息
- 27. Android主详细信息详细信息
- 28. ::的ActionView时MissingTemplate - 轨道4
- 29. 轨道物体周围轨道物体
- 30. 卡门 - 轨道 - 问题与轨道4
android map view有计算两个地理点之间距离的默认方法。 –
但是你可以使用这个函数。多段线由多个纬度/经度位置组成。计算它们之间的距离并将其相加。像dist1 = distanceBetween(pos1,pos2),dist2 = distanceBetween(pos2,pos3)等。最后totalDist = dist1 + dist2 + ... – evilone