基于经纬度在谷歌地图上绘制路径

12

我想在谷歌地图上画路径。

基本上,我正在跟踪用户位置,在特定时间间隔后。 当用户到达某个目的地时,我需要绘制他到达目的地所经过的路径。

这个功能工作得很好,但问题是它显示了错乱的路径。 请参见下面的图像。

我想要什么:

我想要绘制出沿途经过的正确路径。

我尝试过的方法

我搜索并找到了这个链接,我们可以通过该链接传递最多8个点来获取方向。 这是非商业用户使用谷歌地图的最大限制。 是否有其他方法可以实现这一点。 因为我有很多要在地图上绘制的点。

用于绘制折线的代码

private void drawPath() {
        if (mMap != null)
            mMap.clear();
        int count = 0;
        LatLng prev = null;
        String[] mProjection = {LocTable.COLUMN_ID, LocTable.COLUMN_LONGITUDE, LocTable.COLUMN_LATITUDE};
        String mSelectionClause = LocTable.COLUMN_ID + "> ?";
        String[] mSelectionArgs = {"0"};
        String mSortOrder = LocTable.COLUMN_ID;

        Cursor mCursor = getContentResolver().query(
                LocContentProvider.CONTENT_URI,   // The content URI of the words table
                mProjection,                        // The columns to return for each row
                mSelectionClause,                    // Selection criteria
                mSelectionArgs,                     // Selection criteria
                mSortOrder); 


        if(mCursor != null && mCursor.getCount()!=0) {

            Log.i("cursor", "Count: " + mCursor.getCount() + "|Column count: " + mCursor.getColumnCount());
            if (mCursor.moveToFirst()) {
                do {
                    if (mMap != null) {

                        float lon = mCursor.getFloat(1);
                        float lat = mCursor.getFloat(2);
                        LatLng current = new LatLng(lat, lon);

                        markerPoints.add(current);
                        if (count == 0){
                            prev = current;
                        }
                        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(current, 19);
                        mMap.animateCamera(cameraUpdate);
                        mMap.addPolyline((new PolylineOptions())
                                .add(prev, current).width(6).color(Color.BLUE)
                                .visible(true));
                        prev=current;
                        count++;
                    }
                } while (mCursor.moveToNext());
            }

            mCursor.close();
        }
    }
感谢您的帮助。image

我认为你需要在步行或驾车时绘制路径吗? - Ravi Vaghela
and post your try or code - Ravi Vaghela
绘制折线。您可以将点(latlng)列表传递给Polyline,然后将其添加到地图中。https://developers.google.com/android/reference/com/google/android/gms/maps/model/Polyline - Pedro Oliveira
@Ravi 我需要绘制两种类型的路径... 在代码中,我只是在本地数据库中绘制谷歌折线。 - Mustanser Iqbal
只需获取所有的经纬度并在地图上绘制路径。 - Ravi Vaghela
显示剩余6条评论
4个回答

6
我同意Antonio的答案。问题不在于你的绘制函数,而在于你只是根据设备位置绘制路径。问题在于你的设备无法提供准确的位置。
让我简要介绍一下位置功能。
设备提供了三种提供位置的方式。

1 GPS 提供者。

该提供者使用卫星确定位置。取决于条件,该提供者可能需要一段时间才能返回位置修复。需要ACCESS_FINE_LOCATION权限。
GPS位置提供程序的extras Bundle可以包含以下键值对:
卫星 - 用于推导fix的卫星数量

2 网络提供者。

该提供者基于基站和WiFi接入点的可用性确定位置。结果是通过网络查找来检索的。

3 被动提供者。

当其他应用程序或服务请求位置更新时,可以使用此提供程序被动地接收位置更新,而无需自己请求位置。此提供程序将返回其他提供程序生成的位置。您可以查询getProvider()方法以确定位置更新的来源。需要ACCESS_FINE_LOCATION权限,尽管如果未启用GPS,则此提供程序可能仅返回粗略的修复。
参考资料: Android Location Manager Android Location Providers - GPS or Network Provider?

根据我的经验,我可以说GPS提供者相对于网络提供者给出了准确的位置,但需要开放环境,GPS提供者在室内不会给出准确的位置。

getAccuracy()。

返回常量,描述此提供程序的水平精度。如果提供程序返回更细致的或精确的位置,则返回ACCURACY_FINE,否则如果位置仅是近似的,则返回ACCURACY_COARSE。
当从GPS提供程序更改位置时,此方法将返回确切值,否则将返回近似值或0值。
参考资料:Location.getAccuracy() 解决方案:
  1. 只使用GPS Provider
  2. 找出您的位置是否准确。
推荐使用 Google 客户端示例。

4
问题不在于您的绘图功能,而在于您使用的方法获取路径点时使用了接收到的位置。
您需要考虑两个因素:
首先,接收到的位置精度。您可以使用Location.getAccuracy()方法(文档)获取精度。精度以米为单位,越低越好。
另一方面,您可能只想在新位置距离上一个已添加位置的距离大于给定距离时才将新位置添加到折线中。
以下是结合这两个考虑因素的示例:
private static final float MINIMUM_ACCURACY = 10; // If the accuracy of the measurement is worse than 10 meters, we will not take the location into account
private static final float MINIMUM_DISTANCE_BETWEEN_POINTS = 20; // If the user hasn't moved at least 20 meters, we will not take the location into account
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;
        }
    }
}

1

你是否了解新的道路API?它可以计算准确度并返回最合理的数值以绘制线路。它还提供当前道路的速限。


0

补充@antonio的答案。您可以按照以下方式指定优先级和位移。这将确保您可以获得最大可能的准确性。

    private int mInterval =5;
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    private static final float MIN_ACCURACY = 10;
    private Location lastKnownLocation;

            @Override
            public void onConnected(Bundle bundle) {

                locationRequest = LocationRequest.create();
                locationRequest.setInterval(mInterval * 1000); // milliseconds
                locationRequest.setFastestInterval(mInterval * 1000);
                locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                locationRequest.setSmallestDisplacement(MIN_DISTANCE_CHANGE_FOR_UPDATES);//distance change
                int permissionCheck = ContextCompat.checkSelfPermission(appContext, Manifest.permission.ACCESS_COARSE_LOCATION);
                if (permissionCheck!= PackageManager.PERMISSION_DENIED)
                {    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,
 locationRequest, this);
                }
            }

现在在onLocationChanged方法中按建议进行操作。

@Override
    public void onLocationChanged(Location location) {
        if (location.getAccuracy() < MIN_ACCURACY ) {
            if (lastKnownLocation == null || lastKnownLocation.distanceTo(location) > MIN_DISTANCE_CHANGE_FOR_UPDATES) {

                lastKnownLocation = location;
            }
        }
    }

注意:

从NetworkProvider检索位置更快,即使设备静止,特定时间间隔内接收到的位置也会有所不同。以上逻辑将为我们提供避免无关值并跟踪/处理有效值的机会。

Fused Location Provider Api Details


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接