2016-04-05 10 views
0

私は、ボタンをクリックすると、近くのatmsをjsonから取得しているプログラムを書いています。これは、リンクjson配列から解析されたGoogleマップに複数のマーカーを追加するにはどうすればよいですか?

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

私はグーグルマップ上の気圧をプロットしたいですが、問題は、マップ

コードに表示されている唯一の最後の気圧です:ATM名を取得する方法、緯度、経度とその周辺

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

私はどのように上記を達成するのですか? 、初めて

fragment.getMap().clear(); 

onResponseでforループの前にそれを書く: おかげ

答えて

1

あなたはので、このメソッドが呼び出されますたびに、それは以前のすべてのマーカーをクリアし、あなただけの最後のマーカーを持つことになります

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

、などの方法が書かれています。

編集

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

と変更方法のように、

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

あなたは新しいサービスのヒットのためのマーカーの追加を開始する前にそれを行う、その後、以前のWebサービスのヒットからマーカーをクリアしたい場合、前のようにforループ。

+0

私は複数のマーカーを取得していますが、すべてのマーカーをクリックすると問題が発生します。すべてのマーカーが同じ情報を取得しています。これは最後のjson値です。 –

+1

@narahari_arjunすべてのマーカーに対して同じ情報ウィンドウを表示する理由は、インスタンス変数として 'atmName'と' vicinity'を宣言しているので、最後のマーカーのみの値を持ちます。代わりに私の答えで編集した方法を試してみてください。 – gprathour

+0

はいはいインスタンス変数、これは私が考えていたものです。指摘してくれてありがとう。 –

1

はメソッドmoveAtmMapからこの行を削除します。

+0

なぜあなたはforループの前にこれを行うように提案しますか? –

+0

初めて、以前に追加したマーカーをすべて削除してから、サービスの応答に基づいて新しいマーカーを追加する必要があります。 –

0

この単純なコードを試してみて、

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

     } 

はちょうどあなたの値を持つlattitude、経度を交換してください。 各マーカーのインスタンスを作成する場合は、マーカーIDをkeyとしたハッシュマップに各マーカーオブジェクトを配置できます。あなたのフィードバックを教えてください。

注:この行を削除します - fragment.getMap()。clear();なぜなら、コンパイラがループに入るたびにマップをクリアし、最後のオブジェクトだけを取るからです。これは今のところ起こっていることです。

関連する問題