Android 谷歌地图API v2:CameraPosition的LatLngBounds
有没有一种简单的方法可以通过Android Google Maps API v2从Android 谷歌地图API v2:CameraPosition的LatLngBounds,android,google-maps,android-maps,Android,Google Maps,Android Maps,有没有一种简单的方法可以通过Android Google Maps API v2从CameraPosition获取可见地图的LatLngBounds,这样我就可以使用OnCamerachengelistener获取标记的新数据 mMap.setOnCameraChangeListener(new OnCameraChangeListener() { @Override public void onCameraChange(CameraPositio
CameraPosition
获取可见地图的LatLngBounds
,这样我就可以使用OnCamerachengelistener
获取标记的新数据
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
LatLngBounds bounds = ?;
fetchNewData(bounds);
}
});
你无法从摄像机位置获取LatLngBounds,但你可以从谷歌地图轻松获取
private GoogleMap mMap;
mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
fetchData(bounds);
}
});
自2016年8月以来的更新 摘要现在这个问题的正确答案是使用新的
onCameraIdle
,而不是现在使用的OnCameraChangeListener
。阅读下面的如何
现在,您可以在最新版本的Android版谷歌地图上收听类似“dragEnd”的活动,甚至其他活动
如中所示,通过使用新的侦听器,可以避免对onCamerachenglistener
进行多次(也称为“多次”)调用的问题。例如,您现在可以检查相机移动背后的原因,这是根据请求与fetchData
问题结合的理想选择。以下代码大部分直接取自文档。还有一件事,必须使用
2016年8月之前高效解决方案的变通办法 由于这个问题得到了正确的回答,我想补充一个可能是下一个问题 使用
onCamerachenglistener
从服务器获取数据时会出现问题,因为触发此方法的频率很高
有报道称,在进行简单的地图滑动时,这种方法被触发的频率有多高,因此在问题的示例中,它会触发fetchData
多次连续时间,只需很少的相机更改,即使没有相机更改,是的,相机边界没有更改,但是这个方法会被触发
这可能会影响服务器端的性能,并会通过从服务器连续数十次获取数据而浪费大量设备资源
您可以在该链接中找到解决此问题的方法,但还没有正式的方法,例如,使用理想的dragEnd
,或camerachangened
回调
下面的一个例子,基于那里的例子,是我如何通过处理调用的时间间隔和丢弃具有相同边界的调用来避免上述问题
// Keep the current camera bounds
private LatLngBounds currentCameraBounds;
new GoogleMap.OnCameraChangeListener() {
private static int CAMERA_MOVE_REACT_THRESHOLD_MS = 500;
private long lastCallMs = Long.MIN_VALUE;
@Override
public void onCameraChange(CameraPosition cameraPosition) {
LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;
// Check whether the camera changes report the same boundaries (?!), yes, it happens
if (currentCameraBounds.northeast.latitude == bounds.northeast.latitude
&& currentCameraBounds.northeast.longitude == bounds.northeast.longitude
&& currentCameraBounds.southwest.latitude == bounds.southwest.latitude
&& currentCameraBounds.southwest.longitude == bounds.southwest.longitude) {
return;
}
final long snap = System.currentTimeMillis();
if (lastCallMs + CAMERA_MOVE_REACT_THRESHOLD_MS > snap) {
lastCallMs = snap;
return;
}
fetchData(bounds);
lastCallMs = snap;
currentCameraBounds = bounds;
}
我想知道他们为什么这样设置。可见区域不应该与地图投影有任何关系。@capdragon等等,什么?地图投影正好定义了4个坐标,它们定义了可见区域。我想说的是,它们不应该这样耦合。可见区域只是边界,不管它在什么投影中。无论投影是EPSG:4326还是EPSG:900913,视图都应该是相同的,不管它是在lat/lon坐标系中还是在x/y米坐标系中。因此,我们应该能够独立地执行
mMap.getProjection()
或mMap.getVisibleRegion()
。@h4lc0n:OpenLayers这样做更有意义。map对象允许您使这两个调用相互独立。在这种情况下,“投影”涉及到世界到屏幕的投影(而不是地图投影),并且会考虑到相机的旋转和倾斜。非常好!这可能为我节省了几个小时的工作时间,帮助我理解并解决这个问题。谢谢您还应该检查currentCameraBounds
字段的null
。OnCameradle方法的问题是它被触发的次数太多。在启动时,我看到它被触发了两次,这里的最佳策略是什么?这个监听器是在OnCreate、OnStart和OnResume上触发的吗?@ImRickJames,你是否尝试过全局保留“原因”,并在onCameradle上检查原因是否仍然是原因(原因手势)?如果您在启动时将相机自动移动到用户的位置,它将触发,但有理由使用“开发者”动画。onCameraIdle
会自动调用,尽管我甚至没有触摸地图。有人能帮我吗
// Keep the current camera bounds
private LatLngBounds currentCameraBounds;
new GoogleMap.OnCameraChangeListener() {
private static int CAMERA_MOVE_REACT_THRESHOLD_MS = 500;
private long lastCallMs = Long.MIN_VALUE;
@Override
public void onCameraChange(CameraPosition cameraPosition) {
LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds;
// Check whether the camera changes report the same boundaries (?!), yes, it happens
if (currentCameraBounds.northeast.latitude == bounds.northeast.latitude
&& currentCameraBounds.northeast.longitude == bounds.northeast.longitude
&& currentCameraBounds.southwest.latitude == bounds.southwest.latitude
&& currentCameraBounds.southwest.longitude == bounds.southwest.longitude) {
return;
}
final long snap = System.currentTimeMillis();
if (lastCallMs + CAMERA_MOVE_REACT_THRESHOLD_MS > snap) {
lastCallMs = snap;
return;
}
fetchData(bounds);
lastCallMs = snap;
currentCameraBounds = bounds;
}