当前位置: 首页 > 知识库问答 >
问题:

在LatLngBounds builder上设置最大缩放级别

顾嘉德
2023-03-14

我在搜索中没有找到答案,所以有一些答案,但它们对我不起作用。

我在地图上有2个标记,我正在使用LatLngBound生成器,以便让相机缩放到正确的缩放级别以将它们都包括在内。除了一件事之外,一切都如预期的那样工作,当两个标记彼此非常接近时,地图是非常非常缩放的,嗯,这种缩放水平没有任何意义。

LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(firstMarker.getPosition());
builder.include(secondMarker.getPosition());
LatLngBounds bounds = builder.build();

CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, markerPadding);

有没有办法强制进行一定程度的缩放,之后相机将无法缩放?这样可以避免地图太过放大/缩小。基本上,我使用15.0f作为缩放级别。如果这些点太远,我希望缩放可以同时适合它们。如果点越来越近,我不希望缩放级别超过15.0f。

共有3个答案

缪晋
2023-03-14

迟到了,但可能有人和我有同样的问题:我接到的是一个地方的界外球,而不是一个边线。建设者:

我用的是地理位置。距离(…)要找出边界是否太小,然后使用边界中心的最小缩放级别,请执行以下操作:

if (areBoundsTooSmall(bounds, 300)) {
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(bounds.getCenter(), 17));
} else {
    mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 20));
}

检查方法为:

private boolean areBoundsTooSmall(LatLngBounds bounds, int minDistanceInMeter) {
    float[] result = new float[1];
    Location.distanceBetween(bounds.southwest.latitude, bounds.southwest.longitude, bounds.northeast.latitude, bounds.northeast.longitude, result);
    return result[0] < minDistanceInMeter;
}

我使用最小缩放级别17和填充20来表示太小的边界,太小的边界由300米的最小距离定义。您可以根据需要调整数字。

太叔昊苍
2023-03-14

我根据user2808624的答案实现了这个解决方案,但使用Android地图实用程序库中的SphereCalutil进行计算。

final double HEADING_NORTH_EAST = 45;
final double HEADING_SOUTH_WEST = 225;
LatLng center = tmpBounds.getCenter();
LatLng northEast = SphericalUtil.computeOffset(center, 709, HEADING_NORTH_EAST);
LatLng southWest = SphericalUtil.computeOffset(center, 709, HEADING_SOUTH_WEST);
王凯旋
2023-03-14

我有一个类似的例子,我想要一张对角线至少为2公里的地图。因此,我只需向构建器添加两个附加点:原始边界中心西北1公里处的第一个点和中心东南1公里处的第二个点。如果这些在边界内,它们不会改变任何东西。如果超出原始边界,则会将边界增加到有意义的大小。

这是一个完整的代码示例:

public LatLngBounds createBoundsWithMinDiagonal(MarkerOptions firstMarker, MarkerOptions secondMarker) {
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    builder.include(firstMarker.getPosition());
    builder.include(secondMarker.getPosition());
    
    LatLngBounds tmpBounds = builder.build();
    /** Add 2 points 1000m northEast and southWest of the center.
     * They increase the bounds only, if they are not already larger
     * than this. 
     * 1000m on the diagonal translates into about 709m to each direction. */
    LatLng center = tmpBounds.getCenter();
    LatLng northEast = move(center, 709, 709);
    LatLng southWest = move(center, -709, -709);
    builder.include(southWest);
    builder.include(northEast);
    return builder.build();     
}

private static final double EARTHRADIUS = 6366198;
/**
 * Create a new LatLng which lies toNorth meters north and toEast meters
 * east of startLL
 */
private static LatLng move(LatLng startLL, double toNorth, double toEast) {
    double lonDiff = meterToLongitude(toEast, startLL.latitude);
    double latDiff = meterToLatitude(toNorth);
    return new LatLng(startLL.latitude + latDiff, startLL.longitude
            + lonDiff);
}

private static double meterToLongitude(double meterToEast, double latitude) {
    double latArc = Math.toRadians(latitude);
    double radius = Math.cos(latArc) * EARTHRADIUS;
    double rad = meterToEast / radius;
    return Math.toDegrees(rad);
}


private static double meterToLatitude(double meterToNorth) {
    double rad = meterToNorth / EARTHRADIUS;
    return Math.toDegrees(rad);
}

编辑,因为这似乎仍然很受欢迎:

请参见https://stackoverflow.com/a/23092644/2808624下面:现在人们会使用SphereCalutil来移动车床坐标,而不是自己编码。

 类似资料:
  • 我目前正在使用谷歌地图android API v2开发应用程序。我的代码如下。假设地图有几个标记并放大以显示所有标记。 这段代码工作正常,但我想在缩放级别达到17.0f时停止制作动画;地图API似乎没有这样的方法来控制缩放级别。有人知道解决这个问题的办法吗?

  • 我正在使用必应地图v8控件。 这里有一个片段: 您可以看到它在桌面上工作,方法是将上面的代码段粘贴到这里并点击run:https://www.bing.com/api/maps/sdk/mapcontrol/isdk/adddefaultpushpin#js 不幸的是,这个游乐场不允许你在移动模式下自定义脚本,当你在游乐场中来回切换chrome到移动时,行为不会重现(我可以通过在自己的应用程序中的

  • 有可能用新的Google Maps API V2更改myLocation的缩放级别吗? 如果您设置了,您就会在地图上找到一个按钮来查找您的位置。 如果你点击它,那么地图就会把你带到你的位置,并把它放大到某个级别。我可以把这个缩放变小还是变大?

  • 问题内容: using System; using OpenQA.Selenium.IE; using OpenQA.Selenium.Remote; using OpenQA.Selenium; 我正在尝试使用上述代码 在运行我的Selenium脚本时忽略缩放级别和保护模式设置,但是该脚本 在构建解决方案时显示错误。不知道我要去哪里错了。 问题答案: 在使用Selenium 3.x,IEDriv

  • 我正在使用GWT2.5和GoogleMap Api3。 我有两种情况:1.我有地图的中心,上面有几个标记。2.任何一个县,上面有几个标记。 因此,地图应该适当缩放以适应标记。 有没有办法自动检测缩放级别?

  • 嗨,我目前正试图在谷歌地图上显示多个点。除了缩放功能外,一切正常。我无法确定如何设置缩放以便显示所有点。如果点很近,代码显示得很好,但如果点很远,代码显示得不好。我到处搜索过,但找不到任何东西。 有什么帮助吗?