0

我想創建一個地圖,顯示Google Map上指定人物的位置。我已經建立了一個帶有MySQL數據庫的Web服務器。每當android應用程序運行時,它都會將用戶的當前位置存儲在數據庫中。之後,每當onLocationChanged()被稱爲,該應用程序獲取(例如,10公里)的位置數據(例如,50公里)到用戶位置。使用這些位置座標,我在地圖上添加了多個標記。現在我面臨以下問題:Google Maps android:多個標記的實時更新位置

  1. 當10人的位置發生變化的數據,正在創建,而不是原來的標記改變其位置的新標誌。

  2. 當從數據庫中刪除10人中的任何人的位置數據時,相應的標記仍保留在地圖上。

注:我使用JSON來從服務器的數據和分析在IntentService JSON數據創建標記。

這是怎麼了JSON解析:

@Override 
    protected void onHandleIntent(Intent intent) { 

     if (intent != null) { 

      String json_result = intent.getExtras().getString("JSON Data"); 
      try { 
       JSONObject jsonObject = new JSONObject(json_result); 
       JSONArray jsonArray = jsonObject.getJSONArray("location data"); 

       int counter = 0; 
       String name, lat, lng; 
       double dist; 
       int arrayLength; 

       while (counter < jsonArray.length()) { 

        JSONObject object = jsonArray.getJSONObject(counter); 
        name = object.getString("name"); 
        lat = object.getString("lat"); 
        lng = object.getString("lng"); 
        dist = object.getDouble("distance"); 
        arrayLength = jsonArray.length(); 

        Intent jsonDataIntent = new Intent(); 
        jsonDataIntent.setAction(Constants.STRING_ACTION); 
        jsonDataIntent.putExtra(Constants.STRING_NAME, name); 
        jsonDataIntent.putExtra(Constants.STRING_LAT, lat); 
        jsonDataIntent.putExtra(Constants.STRING_LNG, lng); 
        jsonDataIntent.putExtra(Constants.STRING_DIST, dist); 
        jsonDataIntent.putExtra(Constants.STRING_LENGTH, arrayLength); 
        jsonDataIntent.putExtra(Constants.STRING_ID, counter); 
        LocalBroadcastManager.getInstance(this).sendBroadcast(jsonDataIntent); 


        counter++; 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

這裏是如何我已經使用解析的JSON數據來創建標記:

private class ParseJSONDataReceiver extends BroadcastReceiver { 

     Marker usersMarker; 
     double lat, lng, dist; 
     int numberOfConnections, id; 
     HashMap<Marker,Integer> hashMap = new HashMap<>(); 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      if (intent != null) { 

       String name = intent.getExtras().getString(ParseJSONDataService.Constants.STRING_NAME); 
       lat = Double.parseDouble(intent.getExtras().getString(ParseJSONDataService.Constants.STRING_LAT)); 
       lng = Double.parseDouble(intent.getExtras().getString(ParseJSONDataService.Constants.STRING_LNG)); 
       dist = intent.getExtras().getDouble(ParseJSONDataService.Constants.STRING_DIST); 
       numberOfConnections = intent.getExtras().getInt(ParseJSONDataService.Constants.STRING_LENGTH); 
       id = intent.getExtras().getInt(ParseJSONDataService.Constants.STRING_ID) + 1; 


       usersMarker = mMap.addMarker(new MarkerOptions() 
         .position(new LatLng(lat, lng)) 
         .title("Name: " + name) 
         .snippet(id + ": Distance: " + dist + " Km") 
         .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); 

       hashMap.put(usersMarker,id); 

      } 

     } 
    } 

誰能幫我解決以上問題? ??

回答

2

要更新您需要更改現有的標記代碼TU使用HashMap<Integer, Marker>代替HashMap<Marker, Integer>這樣你就可以通過用戶ID查詢地圖中的位置:

HashMap<Integer, Marker> hashMap = new HashMap<>(); 

然後,您可以添加我們的標記像這樣(更新現有的):

if (hashMap.containsKey(id)) { 
    Marker marker = hashMap.get(id); 
    marker.setPosition(new LatLng(lat, lng)); // Update your marker 
} else { 
    usersMarker = mMap.addMarker(new MarkerOptions() 
      .position(new LatLng(lat, lng)) 
      .title("Name: " + name) 
      .snippet(id + ": Distance: " + dist + " Km") 
      .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); 

    hashMap.put(id, usersMarker); 
} 

如果你想刪除你還需要從地圖刪除其標記用戶,並從HashMap

Marker marker = hashMap.get(id); 
if (marker!= null) { 
    marker.remove(); 
    hashMap.remove(id); 
} 
+0

嗨安東尼奧。非常感謝您的回覆。我已經能夠使用您的建議代碼成功更新標記的位置。但是,我不清楚應該如何使用「刪除標記」代碼。我的意思是如何知道某個特定條目是否已從MySQL數據庫中刪除?我嘗試使用'if(marker.getposition == null)',但它不起作用。 @antonio –

相關問題