2016-05-10 276 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