使用GPS获取用户设备的精确位置

时间:2017-11-12 13:24:20

标签: android google-maps gps

在我的Android应用程序中,我需要使用汽车行驶的道路,并使用谷歌Android方向API和GPS检查。

但问题是有时候GPS的位置不准确,一些讲座我会得到10Km的错误,这意味着在150km的总行程中,我的“行走距离”可能是250km,这是错误的!< / p>

昨天我在高速公路上进行测试,问题是当标记位于高速公路外时,计算从我当前位置行驶的距离和最后一个位于公路上的标记是非常错误的(在这种情况下是在高速公路之外) )。

有一些最好的方法可以使用手机与汽车一起旅行吗? 也许一些更好的代码可以获得更精确的GPS位置? 这是我的代码:

private void getUserLocation() {

    Log.d(TAG, "getUserLocation()");
    checkLocationPermission();
    mFusedLocationClient.getLastLocation()
            .addOnSuccessListener(getActivity(), new OnSuccessListener<Location>() {
                @Override
                public void onSuccess(Location location) {
                    // Got last known location. In some rare situations this can be null.
                    if (location != null) {
                        // Logic to handle location object
                        String stringStartLat, stringStartLng;

                        double lat = location.getLatitude();
                        double lng = location.getLongitude();

                        //Start position of device
                        if (travelInfo.getStartLat() == 0 && travelInfo.getStartLng() == 0) {
                            travelInfo.setStartLat(lat);
                            travelInfo.setStartLng(lng);
                            //Set lastcoordinates equals to start
                            travelInfo.setLastLat(lat);
                            travelInfo.setLastLng(lng);
                        }
                        //Current position of device
                        travelInfo.setCurrentLat(lat);
                        travelInfo.setCurrentLng(lng);

                        stringStartLat = Double.toString(travelInfo.getStartLat());
                        stringStartLng = Double.toString(travelInfo.getStartLng());
                        //Set the TextView in the fragment with start coordinates
                        Log.d(TAG,"LatitudeStart: " + stringStartLat);
                        Log.d(TAG,"LongitudeStart: " + stringStartLng);

                        if (startMarker == null) {
                            //Add the user location to the map with a marker
                            LatLng userLoction = new LatLng(travelInfo.getStartLat(), travelInfo.getStartLng());
                            startMarker = googleMap.addMarker(new MarkerOptions()
                                    .position(userLoction)
                                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
                                    .title("Start Position")
                                    .snippet("Show the start position of user"));

                            // For zooming automatically to the location of the marker
                            CameraPosition cameraPosition = new CameraPosition.Builder().target(userLoction).zoom(9).build();
                            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                        } else {

                            LatLng currentLocation = new LatLng(travelInfo.getCurrentLat(), travelInfo.getCurrentLng());
                            currentPositionMarker = googleMap.addMarker(new MarkerOptions()
                                    .position(currentLocation)
                                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW))
                                    .title("Current Position")
                                    .snippet("Show the current position of user during travel"));

                            // For zooming automatically to the location of the marker
                            CameraPosition cameraPosition = new CameraPosition.Builder().target(currentLocation).zoom(11).build();
                            googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
                        }

                        if (travelInfo.getEndLat() != 0 && travelInfo.getEndLng() != 0) {
                            Log.i(TAG, "Dentro if userlocation");
                            //Get total distance of travel
                            getTotalDistanceTime(travelInfo);
                            //Get the percurred distance from last known coordinates
                            getPercurredDistance(travelInfo);
                        }
                    }
                }
            });
}

getpercurredDistance使用带有此网址的google方向API

    String url = "https://maps.googleapis.com/maps/api/directions/json?origin=" + obj.getLastLat() + "," + obj.getLastLng() + "&destination=" + obj.getCurrentLat() + "," + obj.getCurrentLng() + "&mode=driving&key=AI*******************I";

用于从最后一个标记和当前位置标记移动距离。 但有时候它把局部位置放在离实际位置太远的地方......如何避免这种情况?

修改

我使用的方法对我的工作有好处吗? mFusedLocationClient.getLastLocation()

2 个答案:

答案 0 :(得分:2)

没有可能从Android设备的GPS传感器获得更精确的GPS位置,但您可以过滤&#34;错误&#34;指出这种方式:

1)对于每个旅行点,获取LatLng的多个值,丢弃最小值和最大值并平均剩余值;

2)记录每个旅行点的时间戳并将其与两个相邻点进行比较:速度(两点之间的距离除以该点的时间间隔)大于最大值。汽车速度(例如250公里/小时),这意味着第二点是错误的(如果第一点当然是好的)。

3)使用Google Maps Roads API找到一组给定GPS坐标的最佳路面几何形状。

另请查看this问题。

答案 1 :(得分:1)

对于实时位置,位置更新允许您以不同的时间间隔请求位置更新。请参阅android developer location documentation。您想要的功能是myapp.mymodel.pkey

GPS(或任何其他广泛使用的定位技术)没有理由为单个位置估计给出10km的误差。如果您得到这个,那么在您进行位置估算和请求它之间存在很大的不匹配。