GPS - 在跑步和行走时获得距离,时间

时间:2012-03-12 05:51:13

标签: android google-maps gps latitude-longitude

我有一种需要使用GPS技术的情况。

当人走路时,我需要找到两点之间的距离。

当该人开始行走时,他会点击Start button,当他停止时,他会点击stop button

之后应该告诉他

1.时间 2.在Kms旅行。 3.从哪里到哪里(地名)例如:a到b

我需要谷歌地图吗?

我在这里看到了link代码,以获取当前位置,该位置为我提供纬度经度。

请帮助您了解如何使用

**

编辑:

**

这是我正在使用的代码

private EditText editTextShowLocation;
    private Button buttonGetLocation;
    private ProgressBar progress;

    private LocationManager locManager;
    private LocationListener locListener = new MyLocationListener();

    private boolean gps_enabled = false;
    private boolean network_enabled = false;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        editTextShowLocation = (EditText) findViewById(R.id.editTextShowLocation);

        progress = (ProgressBar) findViewById(R.id.progressBar1);
        progress.setVisibility(View.GONE);

        buttonGetLocation = (Button) findViewById(R.id.buttonGetLocation);
        buttonGetLocation.setOnClickListener(this);

        locManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    }

    @Override
    public void onClick(View v) {
        progress.setVisibility(View.VISIBLE);
        // exceptions will be thrown if provider is not permitted.
        try {
            gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        try {
            network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
        }

        // don't start listeners if no provider is enabled
        if (!gps_enabled && !network_enabled) {
            AlertDialog.Builder builder = new Builder(this);
            builder.setTitle("Attention!");
            builder.setMessage("Sorry, location is not determined. Please enable location providers");
            builder.setPositiveButton("OK", this);
            builder.setNeutralButton("Cancel", this);
            builder.create().show();
            progress.setVisibility(View.GONE);
        }

        if (gps_enabled) {
            locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
        }
        if (network_enabled) {
            locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
        }
    }

    class MyLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location location) {
            if (location != null) {
                // This needs to stop getting the location data and save the battery power.
                locManager.removeUpdates(locListener); 

                String londitude = "Londitude: " + location.getLongitude();
                String latitude = "Latitude: " + location.getLatitude();
                String altitiude = "Altitiude: " + location.getAltitude();
                String accuracy = "Accuracy: " + location.getAccuracy();
                String time = "Time: " + location.getTime();

                editTextShowLocation.setText(londitude + "\n" + latitude + "\n" + altitiude + "\n" + accuracy + "\n" + time);
                progress.setVisibility(View.GONE);
            } 
        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        if(which == DialogInterface.BUTTON_NEUTRAL){
            editTextShowLocation.setText("Sorry, location is not determined. To fix this please enable location providers");
        }else if (which == DialogInterface.BUTTON_POSITIVE) {
            startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        }
    }

显示我从emulator control.

输入的逻辑纬度

在此我手动输入经度和纬度的详细信息 转到window->showview->other->emulator control进行模拟器测试 但我需要的是我将有两个edittext,我输入地名(A)和(B)

它应该给我距离

请帮助

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

您可以使用Spherical Trigonometry

找出两个地点之间的距离(纬度和经度)

时间利用简单的日期对象并比较startTime和endTime。

(OR)

您可以使用以下代码获得近似距离

double distance;  

Location locationA = new Location("point A");  

locationA.setLatitude(latA);  
locationA.setLongitude(lngA);  

Location locationB = new Location("point B");  

locationB.setLatitude(latB);  
LocationB.setLongitude(lngB);  

distance = locationA.distanceTo(locationB); 

答案 2 :(得分:0)

您可以使用currentTimeinMillis()来获取旅程的开始和结束时间。

然后,您可以使用解释here的公式来查找距离,最后您必须使用反向地理编码服务(例如Nominatim)才能从GPS获取地点的地址坐标。

话虽这么说,距离公式会得到一点与下一点之间的距离,而不是实际位移。如果这不是您需要的,而是您想要实际行进的距离,则需要以较短的间隔计算该值。

答案 3 :(得分:0)

我想这个问题就是行走......

你是走在街上,还是像乌鸦一样飞过?

如果它是街道,并且您连接到网络,请使用google的api ..它根据两点计算路由并返回XML ..应该很容易弄明白。

如果它是乌鸦..那么,只做(a * a)+(b * b)=(c * c)这是到目前为止更容易.. 你可以让你的用户点击大转弯。或者你可以保持一个可运行的每10秒钟从它们开始时运行,并绘制点数。还是a * a + b * b = c * c但只是一堆步骤。

当然你必须在服务中运行它。如果选择我会选择那个选项。您可以根据行驶速度调整循环时间。更快的是更小的停顿。 它对您的dataplan要求较少。

<小时/> 修改
啊......我明白你在找什么。这不是我以为你要求的。 简化..将lat / long转换为GPS。然后对存储的最后一点

进行简单的数学运算
void addDistance()
{
  newX = ...
  newY = ...
  deltaX = absolute(m_oldX - newX)
  deltaY = absolute(m_oldY = newY)
  m_distance += sqrt(deltaX^2 + deltaY^2);
  m_oldX = newX;
  m_oldY = newY;
}
void startOver()
{
  newX = ...
  newY = ...
  m_distance = 0;
  m_oldX = newX;
  m_oldY = newY;

}

答案 4 :(得分:0)

为了获得2点(A到B)之间的距离,在android中有一个名为 distanceTo 的函数。

例如 double distance = startLocation.distanceTo(finishLocation)/ 1000;

npinti表示您可以使用currentTimeinMillis()或者也可以使用Timer并在用户点击开始按钮时将其显示给用户。就像秒表一样。

<强>被修改

放置A - 纽约

地方B - 巴黎

在这种情况下,您首先需要将字符串转换为位置(即您需要纬度和经度)。为此,您使用了地理编码的概念。

List<Address> foundGeocode = null;
foundGeocode = new Geocoder(this).getFromLocationName("address here", 1);
 foundGeocode.get(0).getLatitude(); //getting latitude
 foundGeocode.get(0).getLongitude();//getting longitude

之后,您可以计算distanceTo方法的距离。 希望这会有所帮助......