当我在Google地图中使用GroundOverlay设置图像时,为什么图像会失真?

时间:2017-11-28 18:32:12

标签: android google-maps google-maps-api-3

我正在尝试使用Google地图提供的GroundOverlay将地图的屏幕截图设置为另一个地图。

首先,我在截取屏幕时保存地图的边界。我使用

获取它们
borders = GoogleMap.getProjection().getVisibleRegion().latLngBounds;

使用该边界将屏幕截图设置为GroundOverlay图像后,图像显示失真。我这样做了

GroundOverlayOptions offlineMap = new GroundOverlayOptions()
                            .image(BitmapDescriptorFactory.fromBitmap(myBitmap))
                            .transparency(0)
                            .positionFromBounds(borders);
                    imageOverlay = map.addGroundOverlay(offlineMap);

以下是问题的屏幕截图: Screenshot of the image overlay distorted

为什么会这样?如何正确设置图像?

EDITED

我可以通过图像中心的 LatLng 坐标和图像的宽度来设置图像而不会产生扭曲,但事实是 GroundOverlayOptions 对象需要以公里为单位的宽度,我使用捕获的瞬间图像的两个bot点之间的距离进行计算。

我的问题是,图像设置的比例正确,但位置错误。 如何保存属性以将图像设置在地图上与拍摄时完全相同的位置?

1 个答案:

答案 0 :(得分:0)

尝试使用此代码,在mScreenshotButton按下获取屏幕截图,然后将其添加为mAddOverlayButton上的叠加层:

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mGoogleMap;
    private MapFragment mMapFragment;
    private Button mAddOverlayButton;
    private Button mScreenshotButton;
    private Bitmap mScreenshot;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mScreenshotButton = (Button) findViewById(R.id.get_screenshot_button);
        mScreenshotButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getMapScreenshot();
            }
        });

        mAddOverlayButton = (Button) findViewById(R.id.add_overlay_button);
        mAddOverlayButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LatLngBounds borders = mGoogleMap.getProjection().getVisibleRegion().latLngBounds;

                GroundOverlayOptions overlay = new GroundOverlayOptions()
                        .image(BitmapDescriptorFactory.fromBitmap(mScreenshot))
                        .transparency(0f)
                        .positionFromBounds(borders);

                mGoogleMap.addGroundOverlay(overlay);
            }
        });

        mMapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.map_fragment);
        mMapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;
    }

    public void getMapScreenshot()
    {
        GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() {
            Bitmap bitmap;

            @Override
            public void onSnapshotReady(Bitmap snapshot) {
                mScreenshot = snapshot;
            }
        };

        mGoogleMap.snapshot(callback);
    }

}

没有任何失真。似乎你没有正确地获得borders