收缩LatLngBounds 5%

时间:2017-04-17 19:49:42

标签: android google-maps math

好的,所以在读完安东尼奥的评论之后,我在我的代码中就是这个。现在无论我提交的是什么,我仍然认为我的对象在边界框之外。

我的位置是传入的标记。

LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
LatLngBounds newBounds = reduceBy(bounds, 0.05d);

        if(newBounds.contains(myPosition.getPosition())) {
            //If the item is within the the bounds of the screen
        } else{
            //If the marker is off screen
            zoomLevel -= 1;}
    }
    return zoomLevel;
}


public LatLngBounds reduceBy(LatLngBounds bounds, double percentage) {
    double distance = SphericalUtil.computeDistanceBetween(bounds.northeast, bounds.southwest);
    double reduced = distance * percentage;

    double headingNESW = SphericalUtil.computeHeading(bounds.northeast, bounds.southwest);
    LatLng newNE = SphericalUtil.computeOffset(bounds.northeast, reduced/2d, headingNESW);

    double headingSWNE = SphericalUtil.computeHeading(bounds.southwest, bounds.northeast);
    LatLng newSW = SphericalUtil.computeOffset(bounds.southwest, reduced/2d, headingSWNE);

    return LatLngBounds.builder().include(newNE).include(newSW).build();
}

}

我已经设置了所有的缩放级别,但有时我会遇到这样的位置,除了标记在屏幕外之外它还在界限内。我希望有一个稍小的边界框来检测这个,然后仅在这些情况下缩小一个级别。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以使用Google Maps API Utility Library中的SphericalUtil课程进行计算:

public LatLngBounds reduceBy(LatLngBounds bounds, double percentage) {
    double distance = SphericalUtil.computeDistanceBetween(bounds.northeast, bounds.southwest);
    double reduced = distance * percentage;

    double headingNESW = SphericalUtil.computeHeading(bounds.northeast, bounds.southwest);
    LatLng newNE = SphericalUtil.computeOffset(bounds.northeast, reduced/2d, headingNESW);

    double headingSWNE = SphericalUtil.computeHeading(bounds.southwest, bounds.northeast);
    LatLng newSW = SphericalUtil.computeOffset(bounds.southwest, reduced/2d, headingSWNE);

    return LatLngBounds.builder().include(newNE).include(newSW).build();
}

要将边界减少5%(对角线),您可以执行以下操作:

LatLngBounds newBounds = reduceBy(bounds, 0.05d);

答案 1 :(得分:0)

根据您对精度的要求,您可能只想像下面这样使用简单插值:

public LatLngBounds reduceBounds(LatLngBounds bounds, double percentage) {
        double north = bounds.northeast.latitude;
        double south = bounds.southwest.latitude;
        double east = bounds.northeast.longitude;
        double west = bounds.southwest.longitude;
        double lowerFactor = percentage / 2 / 100;
        double upperFactor = (100 - percentage / 2) / 100;
        return new LatLngBounds(new LatLng(south + (north - south) * lowerFactor, west + (east - west) * lowerFactor),
                new LatLng(south + (north - south) * upperFactor, west + (east - west) * upperFactor));
    }

这是使用+-* /的非常简单的数学运算,并且不会花费很多性能。

要将边界尺寸减小10%,您可以这样做:

LatLngBounds newBounds = reduceBounds(bounds, 10);

根据需要添加错误检查和边框案例处理