【问题标题】:Adding multiple markers to google maps API from volley repose in android Java从 android Java 中的 volley repose 向 google maps API 添加多个标记
【发布时间】:2021-11-17 03:25:00
【问题描述】:

我是 Google Maps API for android 的新手,但我想在我的 android 应用程序中创建一个视图,以显示数据库中某些提供商的位置。 到目前为止,我已经完成了以下工作:

      public void onResponse(String response) {
            Log.d(TAG, "Response: " + response);
            try {
                JSONObject jsonObject;
                JSONObject drinkObject = new JSONObject(response);
                JSONArray jsonArray = drinkObject.getJSONArray("vendors");
                for(int i=0; i<jsonArray.length();i++){
                    jsonObject = jsonArray.getJSONObject(i);
                    latlngs.add(new LatLng(jsonObject.getDouble("latitude"), jsonObject.getDouble("longitude")));
                }
                for (LatLng point : latlngs) {
                    options.position(point);
                    options.title("mama fua service provider");
                    options.snippet("someDesc");
                    googleMap.addMarker(options);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

有了这个,我已经能够添加标记,但它们都被组合成一个完整的世界地图页面,如此处所示 这意味着用户必须手动放大才能查看其他制造商。 我怎样才能做到这一点?我必须对我的代码进行哪些更改,或者有人可以指出我正确的方向吗? 在按照@Andy 的建议回答了类似问题后,我已将代码更新为

public void onMapReady(GoogleMap googleMap) {

    final String TAG = ItemisedMapsActivity.class.getSimpleName();

    StringRequest strReq = new StringRequest(Request.Method.POST, Link.URL_PROVIDER, response -> {
        Log.d(TAG, "Response: " + response);
        try {
            JSONObject jsonObject;
            JSONObject drinkObject = new JSONObject(response);
            JSONArray jsonArray = drinkObject.getJSONArray("vendors");
            for(int i=0; i<jsonArray.length();i++){
                jsonObject = jsonArray.getJSONObject(i);
                LatLng vnr = new LatLng(jsonObject.getDouble("latitude"), jsonObject.getDouble("longitude"));
                MarkerOptions vnrMarker = new MarkerOptions();
                vnrMarker.position(vnr);
                vnrMarker.title(jsonObject.getString("name"));
                vnrMarker.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
                markerList.add(vnrMarker);
            }
            showAllMarkers(googleMap);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }, error -> {
        Log.e(TAG, "Request Error: " + error.getMessage());
        Toast.makeText(this, " An error has occurred "+error.getMessage(), Toast.LENGTH_LONG).show();
    }) {
        @Override
        protected Map<String, String> getParams() {
            // Posting params to register url
            Map<String, String> params = new HashMap<>();
            params.put("town", town);
            return params;
        }
    };
    // Adding request to request queue
    RequestQueue providerRequestQue = Volley.newRequestQueue(this);
    providerRequestQue.add(strReq);
}

private void showAllMarkers(GoogleMap googleMap) {
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (MarkerOptions m : markerList) {
        builder.include(m.getPosition());
    }
    LatLngBounds bounds = builder.build();
    int width = getResources().getDisplayMetrics().widthPixels;
    int height = getResources().getDisplayMetrics().heightPixels;
    int padding = (int) (width * 0.30);
    // Zoom and animate the google map to show all markers
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);
    googleMap.animateCamera(cu);
}

这确实放大了标记的实际位置,除了标记未显示在地图上

【问题讨论】:

  • 你在同一个帖子上问了很多问题,你需要专注于一个问题。
  • @javdromero 更新了具体问题
  • 这个答案展示了如何构建一个LatLngBounds 并使用它以编程方式进行缩放:stackoverflow.com/a/14828739/2711811
  • @Andy 我已经按照答案更新了我的代码,但只提供了平移和缩放,但现在标记不可见
  • 参考您更新的代码,看起来您只是忘记将标记添加到地图中(在jsonArray 循环中) - 可能最简单的方法是将其添加到showAllMarkers 循环中:googleMap.addMarker(m);

标签: java android google-maps-api-3 android-volley


【解决方案1】:

经过多次搜索并遵循 cmets 中的一些有用建议,我解决了这个问题,下面是可以工作的代码,以防将来有人遇到同样的问题。 地图准备好后,使用 volley 检索发球信息,然后遍历响应数组并将标记添加到标记选项数组列表中

public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    banPoint =BitmapDescriptorFactory.fromResource(R.drawable.pincode);

    final String TAG = ItemisedMapsActivity.class.getSimpleName();

    StringRequest strReq = new StringRequest(Request.Method.POST, Link.URL_PROVIDER, response -> {
        try {
            JSONObject jsonObject;
            JSONObject drinkObject = new JSONObject(response);
            JSONArray jsonArray = drinkObject.getJSONArray("vendors");
            for(int i=0; i<jsonArray.length();i++){
                jsonObject = jsonArray.getJSONObject(i);
                LatLng vnr = new      LatLng(jsonObject.getDouble("latitude"), jsonObject.getDouble("longitude"));
                MarkerOptions vnrMarker = new MarkerOptions();
                vnrMarker.position(vnr);
                vnrMarker.title(jsonObject.getString("name"));
                vnrMarker.snippet("Mama fua service provider");
                vnrMarker.icon(banPoint);
                markerList.add(vnrMarker);
            }
            showAllMarkers(mMap);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }, error -> {
        Log.e(TAG, "Request Error: " + error.getMessage());
        Toast.makeText(this, " An error has occurred "+error.getMessage(), Toast.LENGTH_LONG).show();
    }) {
        @Override
        protected Map<String, String> getParams() {
            // Posting params to register url
            Map<String, String> params = new HashMap<>();
            params.put("town", town);
            return params;
        }
    };
    // Adding request to request queue
    RequestQueue providerRequestQue = Volley.newRequestQueue(this);
    providerRequestQue.add(strReq);
}

然后创建一个方法来计算所有标记的位置并缩放到它们在地图中显示所有标记的点

      private void showAllMarkers(GoogleMap mMap) {
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (MarkerOptions m : markerList) {
        builder.include(m.getPosition());
        // add the parkers to the map
        mMap.addMarker(m);
    }
    LatLngBounds bounds = builder.build();
    int width = getResources().getDisplayMetrics().widthPixels;
    int height = getResources().getDisplayMetrics().heightPixels;
    int padding = (int) (width * 0.30);
    // Zoom and animate the google map to show all markers
    CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, width, height, padding);
    mMap.animateCamera(cu);
}

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2017-04-28
    • 2016-09-12
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多