在谷歌地图上绘制基于lat lang的路径

Mus*_*bal 12 android google-maps

我想在谷歌地图上绘制路径.

基本上我在特定时间间隔后跟踪用户位置.当用户到达某个目的地时,我需要画出他到达目的地的路径.

它工作正常,但问题是它显示之字形路径.见下图.

我想要的是:

我想绘制一条正确的路径,然后跟踪我在跟踪期间得到的点.

我试过的

我搜索并找到了这个链接,我们可以通过最多8点来获取方向.这是Google地图的非商业用户允许的最高限额.有没有其他方法来实现这一目标.因为我在地图上画了很多分.

绘制折线的代码

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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

感谢帮助. 图片

Nir*_*tel 6

我同意安东尼奥的回答.问题不在于你的绘图功能.您只需绘制路径,无论您的位置是什么设备.问题是您的设备没有给出准确的位置.

让我简单介绍一下位置功能.

设备中有三种提供商提供位置.

1 GPS提供商.

该提供商使用卫星确定位置.根据条件,此提供程序可能需要一段时间才能返回位置修复程序.需要权限ACCESS_FINE_LOCATION.

GPS位置提供程序的附加包可以包含以下键/值对:

卫星 - 用于导出修复的卫星数量

2网络提供商.

该提供商根据蜂窝塔和WiFi接入点的可用性确定位置.通过网络查找检索结果.

3被动提供者.

当其他应用程序或服务请求时,此提供程序可用于被动地接收位置更新,而无需自己实际请求位置.此提供程序将返回其他提供程序生成的位置.您可以查询getProvider()方法以确定位置更新的来源.需要权限ACCESS_FINE_LOCATION,但如果未启用GPS,则此提供程序可能仅返回粗略修复.

参考:

Android位置管理器

Android位置提供商 - GPS或网络提供商?

根据我的经验,我可以说GPS Provider是给你准确的位置比较Network Provider但需要开放的环境,GPS provider在建筑物内部没有给出准确的位置.

getAccuracy().

返回描述此提供程序的水平精度的常量.如果提供者返回更精细的谷物或确切位置,ACCURACY_FINE则返回,否则如果该位置仅为近似,则ACCURACY_COARSE返回.

当位置从GPS提供商更改时,此方法将返回精确值,否则将返回近似值或0值.

参考:Location.getAccuracy()

解:

  1. 仅使用GPS提供商

  2. 找出您的位置是否准确.

建议使用Google客户端 示例示例.


ant*_*nio 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)