0

Ich versuche, eine Karte mit der Position der angegebenen Personen auf Google Map erstellen. Ich habe einen Webserver mit MySQL-Datenbank eingerichtet. Immer wenn die Android-App ausgeführt wird, speichert sie den aktuellen Standort des Benutzers in der Datenbank. Danach, , wenn die onLocationChanged() heißt, holt die App die Standortdaten von (sagen wir, 10 Personen) in der Nähe von (sagen wir 50Km) zum Benutzerstandort. Mithilfe dieser Positionskoordinaten habe ich mehrere Markierungen auf der Karte hinzugefügt. Jetzt bin ich mit Blick auf folgende Fragen:Google Maps Android: Live-Update-Position von mehreren Markierungen

  1. Wenn die Standortdaten von 10 Personen Änderungen, neue Marker statt ursprünglichen Markierungs Änderung seiner Position geschaffen.

  2. Wenn die Standortdaten einer der 10 Personen aus der Datenbank gelöscht werden, bleibt der entsprechende Marker auf der Karte.

Anmerkung: Ich bin mit JSON-Daten vom Server abzurufen und die JSON-Daten in einem IntentService analysiert Marker zu erstellen.

Hier ist, wie ich JSON bin Parsen:

@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(); 
      } 

     } 
    } 

Und hier ist, wie ich geparsten JSON-Daten verwendet haben, Marker zu erstellen:

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); 

      } 

     } 
    } 

Kann jemand mir helfen über Probleme zu lösen ?? ??

Antwort

2

Um die Position der vorhandenen Markierungen aktualisieren Sie Ihren Code tu ein HashMap<Integer, Marker> anstelle eines HashMap<Marker, Integer> so können Sie Ihre Karte durch den Benutzer-ID-Abfrage verwenden, ändern müssen:

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

Dann Sie unsere Markierungen hinzufügen wie folgt aus (die Aktualisierung der bestehenden):

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); 
} 

Wenn Sie einen Benutzer müssen Sie auch löschen möchten ihre Marker aus der Karte löschen und aus dem HashMap:

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

Hallo Antonio. Vielen Dank für Ihre Antwort. Ich war in der Lage, die Position von Markern mit dem von Ihnen vorgeschlagenen Code erfolgreich zu aktualisieren. Allerdings bin ich mir nicht sicher, wie ich den "Löschmarker" -Code verwenden soll. Ich meine, wie die hashmap herausfinden wird, ob ein bestimmter Eintrag aus der MySQL-Datenbank gelöscht wurde? Ich habe versucht mit 'if (marker.getposition == null)' aber es funktioniert nicht. @Antonio –