如何使 Mapbox Marker 可点击并获取其属性?

How to make Mapbox Marker clickable and get their properties?

我有主要 activity,我将所有标记从数据库加载到列表中,然后将它们添加到我的地图中。

public void onMapReady(@NonNull final MapboxMap mapboxMap) {

        MainActivity.this.mapboxMap = mapboxMap;

        StringRequest request = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
              try {

                    JSONArray jsonArray = new JSONArray(response);
                    List<Feature> symbolLayerIconFeatureList = new ArrayList<>();

                    for(int i = 0; i < jsonArray.length(); i++){
                        JSONObject crag = jsonArray.getJSONObject(i);

                        String nome = crag.getString("nome");
                        String tipo = crag.getString("tipo");
                        Double lng = crag.getDouble("longitudine");
                        Double lat = crag.getDouble("latitudine");

                        symbolLayerIconFeatureList.add(Feature.fromGeometry(Point.fromLngLat(lng,lat)));
                        symbolLayerIconFeatureList.get(i).addStringProperty("NAME_PROPERTY_KEY", nome);
                        symbolLayerIconFeatureList.get(i).addStringProperty("TYPE_KEY", tipo);

                    }

                    mapboxMap.setStyle(new Style.Builder().fromUri("mapbox://styles/mapbox/streets-v11")

                            .withSource(new GeoJsonSource(SOURCE_ID,
                                    FeatureCollection.fromFeatures(symbolLayerIconFeatureList)))

                            .withLayer(new SymbolLayer(LAYER_ID, SOURCE_ID)
                                    .withProperties(
                                            iconImage(get("TYPE_KEY")),
                                            iconAllowOverlap(true),
                                            iconIgnorePlacement(true),
                                            textOffset(new Float[]{0f,-2.5f}),
                                            textIgnorePlacement(true),
                                            textAllowOverlap(true),
                                            textField(get("NAME_PROPERTY_KEY"))
                                    )
                            ), new Style.OnStyleLoaded() {
                        @Override
                        public void onStyleLoaded(@NonNull Style style) {
                            mapboxMap.addOnMapClickListener(MainActivity.this);
                            mapboxMap.getUiSettings().setLogoEnabled(false);
                            mapboxMap.getUiSettings().setAttributionEnabled(false);

                            enableLocationComponent(style);

                        }
                    });
                } catch (JSONException e){
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        });

        mQueue.add(request);

        mapView.addOnStyleImageMissingListener(new MapView.OnStyleImageMissingListener() {
            @Override
            public void onStyleImageMissing(@NonNull String id) {
                if(id.equals("Falesia")){
                    addImage(id, R.drawable.icona_falesia);
                }  else{
                    addImage(id, R.drawable.icon_gym);
                }
            }
        });
    }

我不知道如何让它们可点击

我看到了文档和 example,也许我必须实现 onMapClick 方法,但我不知道里面放了什么。

有谁知道如何实现它或通过其他方式使它们可点击?

谢谢。

您可以在 onMapReady-callback 中添加地图点击侦听器。在您的 onMapClick-method 中,您在选定的点设置了一个查询,以查看该位置的符号层中是否有任何特征。然后你会得到一个你可以使用的功能列表。这是我正在使用的一个非常精简的版本:

    private void handleMapClick(LatLng point){
        if (myMapboxMap != null){
            final PointF screenPoint = myMapboxMap.getProjection().toScreenLocation(point);
            List<Feature> features = myMapboxMap.queryRenderedFeatures(screenPoint, SYMBOL_LAYER_ID);
            if (!features.isEmpty()) {
                //do stuff with features in feature list
            }
        }
    }