2016-05-10 275 views
12

我想在谷歌地图上绘制路径。根据经纬度在谷歌地图上绘制路径

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

它工作正常,但问题是它显示曲折的路径。看到下面的图片。

我想要什么:

我想画一条合适的路径,然后,我在跟踪过程中获得积分。

我曾尝试

我搜查,发现this环节中,我们可以通过多达8个点得到的指示。这是允许Google Map的非商业用户使用的最大限制。有没有其他方法可以实现这一点。因为我有很多要画地图的点。

绘制折线

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

+0

我认为你必须借鉴行走或行驶路径? –

+0

并发布您的尝试或代码 –

+0

绘制折线。您可以将点列表(latlng)传递到Polyline,然后将其添加到您的地图https://developers.google.com/android/reference/com/google/android/gms/maps/model/Polyline –

回答

4

问题不在于您的绘图功能,而在于您使用的方法是使用接收位置来获取路径点。

您需要考虑两个因素:

  • 首先,接收到的位置的精确度。您可以使用Location.getAccuracy()方法(documentation)获得准确性。精确度以米为单位,所以越低越好。
  • 另一方面,只有当您的新位置距离您最后一次添加位置的距离超过给定距离时,您才可能想要为您的折线添加新位置。

组合这两个方面的考虑一个例子:

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; 
     } 
    } 
} 
+0

我会尽力让你知道。如果它工作与否 –

9

我同意antonio的答案。问题不在于你绘画功能。你只需绘制路径,无论设备给你的位置。问题是你的设备没有给出准确的位置。

让我给你简要介绍一下位置功能。

设备中有三种提供位置的提供者。

1 GPS Provider。

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

为GPS位置提供可以包含下列的键/值对的额外软件包:

卫星 - 用于导出修复

2网络提供商的卫星数量。

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

3 Passive Provider。

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

参考:

Android Location Manager

Android Location Providers - GPS or Network Provider?

按我的经验,我可以说GPS Provider是给你准确的 位置比较Network Provider但需要开放的环境,GPS provider没有提供准确的位置在大厦里面。

getAccuracy()。

返回一个描述此提供程序水平准确性的常量。如果提供商返回更精细的谷物或确切位置,则返回ACCURACY_FINE,否则如果位置仅为近似值,则返回ACCURACY_COARSE

当GPS位置改变时,此方法将返回精确值,否则它将返回近似值或0值。

编号:Location.getAccuracy()

解决方案:

  1. 仅使用GPS提供商

  2. Find out your location is accurate or not.

Recommende d使用谷歌客户端 Sample Example.

1

你看过新的Roads 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