2016-04-05 5 views
0

Ich habe ein Programm geschrieben, in dem auf Knopf klicken ich die nahe gelegenen atms von Json bekomme. Hier ist der LinkWie füge ich mehrere Markierungen in einer Google Map hinzu, die von json array analysiert wurde?

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=19.052696,72.8713694&radius=1000&types=atm&sensor=true&key=AIzaSyA8szrI9Ue4EwyUwTgz7Nk0c39qMal0pN4

ich die atms auf Google Karte darstellen möchten, aber das Problem ist nur das letzte atm

auf der Karte angezeigt werden

Code: Methode der ATM-Namen zu erhalten, Breite , Länge und Umgebung

public void showAtm(){ 
    String getAtmUrl = 
    "https://maps.googleapis.com/maps/api/place/nearbysearch/json? 
    location="+lat+","+lng+"&radius=1000&types=atm&sensor=true 
    &key=AIzaSyA8szrI9Ue4EwyUwTgz7Nk0c39qMal0pN4"; 
    try{ 
     OkHttpClient okHttpClient = new OkHttpClient(); 
     Request request = new Request.Builder().url(getAtmUrl).build(); 
     Call call = okHttpClient.newCall(request); 
     call.enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       e.printStackTrace(); 
       Map_Activity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         Toast.makeText(getBaseContext(), "Request to atm 
         locations failed", Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws 
       IOException { 
       Log.i("response ", "onResponse(): " + response); 
       String result = response.body().string(); 
       Log.i("result",result); 
       try{ 
        JSONObject jsonObject = new JSONObject(result); 
        String resultData = jsonObject.getString("results"); 
        JSONArray urlDetails = new JSONArray(resultData); 
        for (int i = 0 ; i < urlDetails.length(); i++){ 
         JSONObject json = urlDetails.getJSONObject(i); 
         geometry = json.getString(GOEMETRY); 
         vicinity = json.getString(VICINITY); 
         JSONObject jsonGeometry = new JSONObject(geometry); 
         String geoLocation = 
         jsonGeometry.getString(LOCATION); 
         JSONObject jsonLatLng = new JSONObject(geoLocation); 
         atmLat = jsonLatLng.getDouble(LATITUDE); 
         atmLong = jsonLatLng.getDouble(LONGITUDE); 
         atmName = json.getString(ATM_NAME); 
         Log.i("JsonArrayAtm", "" + atmName); 
         Log.i("JsonArrayGeometry",geometry); 
         Log.i("LatLong",""+atmLat+" , "+atmLong); 
         Log.i("Vicinity", vicinity); 
         runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          moveAtmMap(atmLat ,atmLong); 
         } 
        }); 
        } 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 
     }); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 


///////////////////////////// atm locations map /////////////////// 
private void moveAtmMap(Double amtLatitude,Double atmLongitude){ 
    fragment.getMap().clear(); 
    CameraPosition position = CameraPosition.builder() 
      .target(new LatLng(amtLatitude, atmLongitude)) 
      .zoom(16f) 
      .bearing(0.0f) 
      .tilt(0.0f) 
      .build(); 
    String msg = amtLatitude+ ", " + atmLongitude; 
    LatLng latLng = new LatLng(amtLatitude, atmLongitude); 
    fragment.getMap().addMarker(new MarkerOptions() 
      .position(latLng)); 
    fragment.getMap().setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() 
     { 
     @Override 
     public View getInfoWindow(Marker marker) { 
      return null; 
     } 

     @Override 
     public View getInfoContents(Marker marker) { 
      View v = getLayoutInflater().inflate(R.layout.atm_custom_window, 
      null); 
      TextView atmHeader = (TextView) v.findViewById(R.id.atmName); 
      TextView atmLocation = (TextView) 
      v.findViewById(R.id.atmLocation); 
      atmHeader.setText(atmName); 
      atmLocation.setText(vicinity); 
      return v; 
     } 
    }); 
    fragment.getMap().setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    fragment.getMap().setTrafficEnabled(true); 
    fragment.getMap().setMyLocationEnabled(true); 
    fragment.getMap().animateCamera(CameraUpdateFactory 
      .newCameraPosition(position), null); 
} 

Wie erreiche ich das oben, kann mir jemand vorschlagen? Dank

Antwort

1

Sie die Methode wie

geschrieben haben
private void moveAtmMap(Double amtLatitude,Double atmLongitude){ 
    fragment.getMap().clear(); 
    ... 
} 

so wird jedes Mal diese Methode aufgerufen werden, werden alle vorherigen Marker löschen, und Sie werden nur die letzte Markierung am Ende mit.

bearbeiten

for (int i = 0 ; i < urlDetails.length(); i++){ 
    JSONObject json = urlDetails.getJSONObject(i); 
    String geometry = json.getString(GOEMETRY); 
    String vicinity = json.getString(VICINITY); 
    JSONObject jsonGeometry = new JSONObject(geometry); 
    String geoLocation = jsonGeometry.getString(LOCATION); 
    JSONObject jsonLatLng = new JSONObject(geoLocation); 
    double atmLat = jsonLatLng.getDouble(LATITUDE); 
    double atmLong = jsonLatLng.getDouble(LONGITUDE); 
    String atmName = json.getString(ATM_NAME); 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      moveAtmMap(atmLat, atmLong, atmName, vicinity, geometry); 
     } 
    }); 
} 

und Änderungsverfahren wie

private void moveAtmMap(Double amtLatitude,Double atmLongitude, String name, String vicinity, String geometry) 

Wenn Sie Markierungen löschen aus früherem Web-Service-Hit, dann es tun, bevor Sie mit dem Hinzufügen Marker für die neuen Service-Hit starten , wie vor der for Schleife.

+0

Ich bekomme mehrere Markierungen, aber das Problem ist, wenn ich auf alle Markierungen klicke, bekomme ich die gleichen Informationen für alle, was ist der letzte JSON-Wert, was zu tun? –

+1

@narahari_arjun Grund für das gleiche Informationsfenster für alle Marker ist, dass Sie 'atmName' und' environment' als Instanzvariablen deklariert haben, so dass sie nur die Werte des letzten Markers haben. Statt dessen versuche ich die Art und Weise, wie ich meine Antwort bearbeitet habe. – gprathour

+0

ja ja Instanzvariablen, das ist was genau ich dachte, danke für das Aufzeigen. –

1

Entfernen Sie diese Zeile aus dem Verfahren moveAtmMap:

fragment.getMap().clear(); 

Zum ersten Mal, schreiben Sie es vor dem for-Schleife in onResponse.

+0

Warum empfehlen Sie mir, dies vor der Schleife zu tun? –

+0

Zum ersten Mal müssen Sie alle zuvor hinzugefügten Markierungen entfernen und dann neue hinzufügen, basierend auf der Antwort des Dienstes. –

0

diesen einfachen Code Versuchen Sie,

for(int i=0;i<jsonArray.length();i++){ 
      MarkerOptions markerOptions; 
      markerOptions = new MarkerOptions().position(new LatLng(lattitude, 
          longitude) 
      ).title("Title").snippet("This is snippet"); 

      markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker_icon)); 
      marker = googleMap.addMarker(markerOptions); 

     } 

Ersetzen Sie einfach lattitude, Länge mit Ihren Werten. Wenn Sie eine Instanz von jedem Marker haben wollen, dann können Sie jedes "Marker" -Objekt mit dem Schlüssel als Marker-ID in hashmap setzen. Lass mich dein Feedback wissen.

Hinweis: Entfernen Sie diese Zeile - fragment.getMap(). Clear(); weil es die Karte jedes Mal löscht, wenn der Compiler in die Schleife kommt und es nur das letzte Objekt braucht. Das passiert gerade jetzt.

Verwandte Themen