【问题标题】:How to add multiple markers on a google map parsed from json array?如何在从 json 数组解析的谷歌地图上添加多个标记?
【发布时间】:2016-04-05 09:37:02
【问题描述】:

我已经编写了一个程序,在该程序中单击按钮我会从 json 获取附近的自动取款机。这是链接

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

我如何实现上述目标,有人可以建议我吗? 谢谢

【问题讨论】:

    标签: android json google-maps


    【解决方案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 循环之前。

    【讨论】:

    • 我得到了多个标记,但问题是当我点击所有标记时,我得到的所有标记都相同,这是最后一个 json 值,该怎么办??
    • @narahari_arjun 为所有标记获取相同信息窗口的原因是您已将 atmNamevicinity 声明为实例变量,因此它们将仅具有最后一个标记的值。而不是这个尝试我在我的答案中编辑的方式。
    • 是的,是实例变量,这正是我所想的,谢谢指出。
    • 我有一个小问题,在我的 moveAtmMap 方法中,当我点击任何标记时,名称和附近显示相同的 json 值,这是最后一个,知道为什么会这样吗?我还在 for 循环之前使用了 fragment.getMap().clear 但仍然没有变化。我还在 setInfoWindowAdapter 之前添加了一条日志语句,我可以正确获取所有 json 值,但我没有在 getInfoContents 方法中获取所有位置和附近的值,你能建议我该怎么做吗?
    【解决方案2】:

    从方法 moveAtmMap 中删除这一行:

    fragment.getMap().clear();
    

    第一次,写在onResponse的for循环之前。

    【讨论】:

    • 你为什么建议我在 for 循环之前这样做??
    • 第一次,您必须删除所有以前添加的标记,然后根据服务的响应添加新的标记。
    【解决方案3】:

    试试这个简单的代码,

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

    只需将纬度、经度替换为您的值即可。 如果你想拥有每个标记的实例,那么你可以将每个“标记”对象放入哈希图中,键作为标记 id。让我知道您的反馈。

    注意:去掉这一行——fragment.getMap().clear();因为每次编译器进入循环时它都会清除地图,并且只需要最后一个对象。这就是现在发生的事情。

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多