如何使 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
}
}
}
我有主要 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
}
}
}