gpt4 book ai didi

android - 如何在 Android 上使用视口(viewport)标记管理

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:37:07 24 4
gpt4 key购买 nike

我还没有找到关于如何在 Android 上使用此技术的任何完整解释,所以我决定创建一个问答线程。

如果您的应用程序必须在谷歌地图上显示大量标记并且将它们聚集在一起不足以防止您的应用程序运行太慢,那么您最好的选择之一就是使用这种视口(viewport)标记管理技术。您可以在这里阅读理论解释:https://developers.google.com/maps/articles/toomanymarkers

我在下面写了一个简短的指南...

最佳答案

1°--- 在创建 map 的 Activity 中,您必须设置 OnCameraChangeListener 并像这样获取屏幕的边界:

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {

@Override
public void onCameraChange(CameraPosition arg0) {

LatLngBounds bounds = mapa.getProjection().getVisibleRegion().latLngBounds;

}

2°--- 此步骤可能会有所不同,具体取决于您获取标记数据的方式。基本上,您要做的是计算每个标记的纬度和经度是否在屏幕范围内。我将向您展示如何通过从 SQLite 数据库中获取数据来完成此操作,该数据库将纬度和经度存储在标记表内的两个不同的 DOUBLE clomun 中。

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {

@Override
public void onCameraChange(CameraPosition arg0) {

LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;

LatLng northeast = bounds.northeast;
String boundLat = String.valueOf(northeast.latitude);
String boundLong = String.valueOf(northeast.longitude);

LatLng southwest = bounds.southwest;

String boundLat2 = String.valueOf(southwest.latitude);
String boundLong2 = String.valueOf(southwest.longitude);

//Remove all markers from map

mMap.clear(); // or if your a using cluster manager:
//mClusterManager.clearItems();

String[] fields = new String[] { "name", "latitude", "longitude" };
String[] args = new String[] {boundLat, boundLong, boundLat2, boundLong2,};

Cursor markers = dataBase.query("markers", fields, "latitude<=? AND longitude<=? AND latitude>=? AND longitude>=?");

if (markers.moveToFirst()) {
do {
mMap.addMarker(new MarkerOptions()
.position(new LatLng(marker.getDouble(1), marker.getDouble(2)))
.title(marker.getString(0)) );

// or if you are using cluster manager create and add the items as you normaly do.

} while (c.moveToNext());

//if using cluster manager add :
//mClusterManager.cluster();
}
}
});

这个想法很简单,只要记住你的标记纬度和经度必须小于屏幕的东北位置并大于西南角,或者只使用 LatLngBounds.contains 函数。

已编辑:

要避免在点击不在屏幕中央的标记时关闭 InfoWindow,您可以更改标记点击监听器的默认操作,移除相机移动。

map.setOnMarkerClickListener(new OnMarkerClickListener() {

@Override
public boolean onMarkerClick(Marker arg0) {
arg0.showInfoWindow();

return true; //must be true, if not, it will execute the default code after yours
}

});

关于android - 如何在 Android 上使用视口(viewport)标记管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com