0

我在我的 Android 应用程序的 HERE 地图上显示了多个位置。总共有 4 个标记,其中 3 个标记在一个城市,1 个在另一个城市。目前,我的地图缩放到一个城市中只有 3 个标记可见,而第 4 个不可见的级别。为了看到那个标记,我必须缩小一个相当大的水平。

有没有办法,我可以显示地图范围内的所有标记?

这是我的代码:-

 m_map = mapFragment.getMap();
                m_map.setZoomLevel((m_map.getMaxZoomLevel() + m_map.getMinZoomLevel()) / 2);
                m_map.setMapScheme(Map.Scheme.NORMAL_DAY);

  final GeoCoordinate finalZoomLatLng = m_map.getCenter();
        new Handler().postDelayed(() -> {
            m_map.setCenter(finalZoomLatLng, Map.Animation.NONE);
            m_map.zoomTo(m_map.getBoundingBox(), Map.Animation.NONE, Map.MOVE_PRESERVE_ORIENTATION);
        }, 1000); 

编辑

在 Rahul 的回答的帮助下,我取得了这样的成就:-

for (int i = 0; i < tasks.size(); i++)
{
    final GeoCoordinate latLng = m_getPosition(tasks[i]);
    LatLng mLatLng = new LatLng(latLng.getLatitude(), latLng.getLongitude());
    mLatLngBounds.include(mLatLng);
}

GeoCoordinate finalZoomLatLng = new GeoCoordinate(mLatLngBounds.build().getCenter().latitude, mLatLngBounds.build().getCenter().longitude);
            new Handler().postDelayed(() -> {
                m_map.setCenter(finalZoomLatLng, Map.Animation.NONE);
                m_map.zoomTo(new GeoBoundingBox(finalZoomLatLng, 0.0f, 200000.0f), Map.Animation.NONE, Map.MOVE_PRESERVE_ORIENTATION);
            }, 1000);

现在有了这个,地图在地图的中心放大,周围的所有位置。但是,这个位置没有标记,所以我必须缩小一点才能看到所有标记。我该如何解决这个问题?

非常感谢任何帮助。

4

6 回答 6

1

我用这个实现了同样的事情。

val geoCoordinateList = ArrayList<GeoCoordinate>()
val geoBoundingBox = GeoBoundingBox.getBoundingBoxContainingGeoCoordinates(geoCoordinateList)
map.zoomTo(geoBoundingBox, Map.Animation.LINEAR, Map.MOVE_PRESERVE_TILT)

在此处输入图像描述

于 2019-10-17T07:55:42.263 回答
0

您需要在应用缩放之前在地图上设置填充

// (left, Top, right, Bottom)
map.setPadding(100, 100, 800, 400)

然后你创建 GeoBoundingBox 并实现缩放,或者如果你得到一个计算出的路线,那么你可以通过这种方式得到它:

routeResult.route.boundingBox?.let { boundingBox ->
      map.zoomTo(boundingBox, Map.Animation.BOW, Map.MOVE_PRESERVE_ORIENTATION)
}

我正在使用 HERE 地图 3.18.2 版本

于 2021-05-07T18:12:12.880 回答
0

您可以使用计算出的地图路线的boundingBox。

val boundingBox = mapRoute?.route?.boundingBox

或者,如果它为 null 或者您想为特定标记创建 boundingBox,请使用此方法:

val geoCoordinateList = arrayListOf<GeoCoordinate>()
selectedMarkersOrLocations.forEach {
    geoCoordinateList.add(GeoCoordinate(it.latitude?:0.0, it.longitude?:0.0))
}
val boundingBox = GeoBoundingBox.getBoundingBoxContainingGeoCoordinates(geoCoordinateList)

然后将带填充的缩放设置为 boundingBox :

val dpPadding = 100   //you can change this
val padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpPadding.toFloat(), resources.displayMetrics)

if (boundBox != null && (mHereMap?.width != 0 || mHereMap?.height != 0)){
    val viewRect = ViewRect(padding, padding, (mHereMap?.width?:0) - padding * 2, (mHereMap?.height?:0) - padding * 2)
    map.zoomTo(boundBox, viewRect, Map.Animation.LINEAR, Map.MOVE_PRESERVE_ORIENTATION)
}
于 2021-11-18T08:39:38.553 回答
0

根据这个问题:https://github.com/heremaps/here-android-sdk-examples/issues/176你需要像这样缩放:

private void navigateToMapMarkers(List<MapMarker> markers, int padding) {
        // find max and min latitudes and longitudes in order to calculate
        // geo bounding box so then we can map.zoomTo(geoBox, ...) to it.
        double minLat = 90.0d;
        double minLon = 180.0d;
        double maxLat = -90.0d;
        double maxLon = -180.0d;

        for (MapMarker marker : markers) {
            GeoCoordinate coordinate = marker.getCoordinate();
            double latitude = coordinate.getLatitude();
            double longitude = coordinate.getLongitude();
            minLat = Math.min(minLat, latitude);
            minLon = Math.min(minLon, longitude);
            maxLat = Math.max(maxLat, latitude);
            maxLon = Math.max(maxLon, longitude);
        }

        GeoBoundingBox box = new GeoBoundingBox(new GeoCoordinate(maxLat, minLon),
                new GeoCoordinate(minLat, maxLon));

        ViewRect viewRect = new ViewRect(padding, padding, m_map.getWidth() - padding * 2,
                m_map.getHeight() - padding * 2);
        m_map.zoomTo(box, viewRect, Map.Animation.LINEAR, Map.MOVE_PRESERVE_ORIENTATION);
}
于 2020-12-19T21:31:52.970 回答
0

您必须使用 CameraUpdate 类来执行(可能)所有程序化地图移动。

为此,首先计算所有标记的边界,如下所示:

LatLngBounds.Builder builder = new LatLngBounds.Builder();
//All Marker List to get Position
for (Marker marker : markers) {
 builder.include(marker.getPosition());
}
//Create Latlong Bounds.
LatLngBounds bounds = builder.build();

然后使用工厂获取一个运动描述对象:CameraUpdateFactory 石灰如下:

int padding = 0; // offset from edges of the map in pixels


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

现在我们可以在 Map 中使用它,如下所示:

googleMap.moveCamera(cu);
于 2019-09-23T05:35:16.617 回答
0

您可以使用LatLngBounds.Builder()使多个标记在地图下可见。

它有一个方法include,允许您添加多个 LAT LNG 位置。

val bounds: LatLngBounds = locatebuilder.build() // locatebuilder is LatLngBounds.Builder
val padding = 200 // offset from edges of the map in pixels
val cu = CameraUpdateFactory.newLatLngBounds(bounds, padding)
mMap!!.animateCamera(cu)

编辑

在地图中添加标记时制作一个新的标记列表

for (mark in markers) { // markers is a list of markers added in the map
    locatebuilder.include(mark.position)
}
于 2019-09-23T05:36:15.420 回答