位置使用折线选项更改地图上的毛刺

时间:2016-05-14 11:04:45

标签: java android google-maps gps

我面临着我的应用程序的一些问题,特别是在我的谷歌地图上的路线图/绘图。我在我家附近做了测试路线,发现GPS提供商不像runtastic或endomondo这样的类似应用程序那么准确。

有时,位置监听器会在我的地图上进行难以理解的更改,然后折线会在我的位置附近的地图上绘制任何线条,即使是完美的GPS信号也是如此。
在其他时间,它只是不起作用。它不听取位置变化。

任何人都可以解释我(像我五)其他健身应用程序如何获得他们当前的位置和情节路线到谷歌地图?谢谢!

//地图片段

    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.fragment1)).getMap();
    map.setMyLocationEnabled(true);
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

    Criteria criteria = new Criteria();
    String provider = locationManager.getBestProvider(criteria, true);

//Permission gain

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION},
                MY_PERMISSION_ACCESS_COURSE_LOCATION);
        return;
    }
    isLocationEnabled(getApplicationContext());

    Location myLocation = locationManager.getLastKnownLocation(provider);
    if (myLocation != null) {
        latitude = myLocation.getLatitude();
        longitude = myLocation.getLongitude();
        float zoom = (float) 17.0;
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), zoom));
        Log.e("TAG", "GPS is on");
        Toast.makeText(MainActivity.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show();
    } else {
        locationManager.requestLocationUpdates(provider, 5000, 0, this);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 10, this);

    }

 public void onLocationChanged(Location mylocation) {

    if (lastLocationloc == null) {
        lastLocationloc = mylocation;
    }
    LatLng lastLatLng = locationToLatLng(lastLocationloc);
    LatLng thisLatLng = locationToLatLng(mylocation);
    map.addPolyline(new PolylineOptions().add(lastLatLng).add(thisLatLng).width(6).color(Color.RED));
    lastLocationloc = mylocation;
    Toast.makeText(MainActivity.this, "!!!!Location CHANGE!!!!", Toast.LENGTH_SHORT).show();

}

public static LatLng locationToLatLng(Location loc) {
    if (loc != null)
        return new LatLng(loc.getLatitude(), loc.getLongitude());
    return null;
}


For example, I want to plot it like this:


But my application works its own way..

1 个答案:

答案 0 :(得分:0)

首先,您需要考虑接收位置的准确性。您可以使用Location.getAccuracy()方法(documentation)获得准确性。精度以米为单位,因此越低越好:

if (location.getAccuracy() < MINIMUM_ACCURACY) {
    // Add the new location to your polyline
}

例如,您可以将MINIMUM_ACCURACY设置为10米。

另一方面,只有当您的新位置距离上次添加的位置的给定距离更远时,您可能还想为折线添加新位置。举个例子:

private static final float MINIMUM_ACCURACY = 10;
private static final float MINIMUM_DISTANCE_BETWEEN_POINTS = 20;
private Location lastLocationloc;

// ...

public void onLocationChanged(Location mylocation) {
    if (mylocation.getAccuracy() < MINIMUM_ACCURACY) {
        if (lastLocationloc == null || lastLocationloc.distanceTo(mylocation) > MINIMUM_DISTANCE_BETWEEN_POINTS) {
            // Add the new location to your polyline

            lastLocationloc = mylocation;
        }
    }
}