3

アプリケーションにマップが含まれています。マーカーとユーザーの位置を拡大するには、マップが必要ですが、マーカーを中央に保ちます。ズームインは完全に機能しますが、もちろん、マップ上のマーカーを中央に配置しません。

@Override
public void onLocationChanged(Location location) {
    if (mListener != null) {
        mListener.onLocationChanged(location);

        LatLngBounds bounds = new LatLngBounds.Builder()
        .include(new LatLng(location.getLatitude(),location.getLongitude()))
        .include((new LatLng(52.3563, 4.8790)))
        .build();

        mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 35));


    }
}

両方を境界内に保ち、マーカーを中心に保つ最良の方法は何ですか? 公式ドキュメントで解決策を見つけることができないようです。

4

3 に答える 3

6

There are two functions I would call, one for centering the marker and an other one to zoom on the map until your current location is still visible.

My solution for zooming to a point with a 15 zoom level:

myMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLngToCenter, 1));

zooming until all markers are still visible (change code to fit the marker and your position instead):

public void fitZoomAndPositionToMapByMarkers() {

    int minLat = Integer.MAX_VALUE;
    int maxLat = Integer.MIN_VALUE;
    int minLon = Integer.MAX_VALUE;
    int maxLon = Integer.MIN_VALUE;

    List<MyMapMarker> markersShownOnMap = getMarkersToShow();

    for (MyMapMarker item : markersShownOnMap) {

        int lat = (int) (item.getLatitude() * 1E6);
        int lon = (int) (item.getLongitude() * 1E6);

        maxLat = Math.max(lat, maxLat);
        minLat = Math.min(lat, minLat);
        maxLon = Math.max(lon, maxLon);
        minLon = Math.min(lon, minLon);
    }

    double latitudeToGo = (maxLat + minLat) / 1E6 / 2;
    double longitudeToGo = (maxLon + minLon) / 1E6 / 2;
    LatLng toCenter = new LatLng(latitudeToGo, longitudeToGo);

    centerCameraToProperPosition(toCenter);

    LatLng southWestLatLon = new LatLng(minLat / 1E6, minLon / 1E6);
    LatLng northEastLatLon = new LatLng(maxLat / 1E6, maxLon / 1E6);

    zoomInUntilAllMarkersAreStillVisible(southWestLatLon, northEastLatLon);
}

Hope this helps!

private void zoomInUntilAllMarkersAreStillVisible(final LatLng southWestLatLon, final     LatLng northEastLatLon) {

    myMap.setOnCameraChangeListener(new OnCameraChangeListener() {

        @Override
        public void onCameraChange(CameraPosition arg0) {

            myMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(southWestLatLon, northEastLatLon), 50));
            myMap.setOnCameraChangeListener(null);

        }
    });

}
于 2013-02-25T09:05:21.310 に答える
2

こんにちは、私は LatLngbounds を使用して素敵で簡単な方法を見つけました:

googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(new LatLngBounds(latlngSW, latlngNE, 50));

この関数は、最も SW のポイントと最も NE のポイントを使用して、50 のパディングでビューを中央に配置する長方形を作成しますが、最初または 2 番目のパラメーターとしてどのポイントを指定する必要があるかを最初に確認する必要があります。これが私のコードです。

public void centerMap(LatLng latLng){
    if(fenceMarker != null){
        LatLngBounds center; 
        LatLng fence = fenceMarker.getPosition();
        if(fence.latitude < latLng.latitude || fence.longitude < latLng.longitude)
            center = new LatLngBounds(fenceMarker.getPosition(), latLng);
        else{
            center = new LatLngBounds(latLng, fenceMarker.getPosition());
        }
        googleMap.moveCamera(CameraUpdateFactory.newLatLngBounds(center, 50));
    }
}

2 つのポイントは、私の位置 latLng と、GeoFence 用に持っているマーカー、fenceMarker です。

onLocationChanged() からこの関数 centerMap(latLng) を呼び出します。

@Override
public void onLocationChanged(Location location) {
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    centerMap(latLng);
}
于 2013-05-23T16:48:59.013 に答える
0

境界の設定-

メソッドnewLatLngBounds(boundary, width, height, padding)のオーバーロードを使用すると、四角形の幅と高さ
をピクセル単位で指定できます。これは、これらがマップの寸法に対応することを意図しています。四角形は、その中心がマップ ビューの中心と同じになるように配置されます (つまり、指定された寸法がマップ ビューの寸法と同じである場合、四角形はマップ ビューと一致します)。返された CameraUpdate は、必要なパディングを考慮し て、指定されたLatLngBounds が可能な限り最大のズーム レベルで指定された長方形内の画面の中央に配置されるようにカメラを移動します。 参照-

https://developers.google.com/maps/documentation/android/views#target_location

于 2013-02-22T10:29:49.250 に答える