为啥我在 Google 地图中使用 GroundOverlay 设置图像时会变形?

Posted

技术标签:

【中文标题】为啥我在 Google 地图中使用 GroundOverlay 设置图像时会变形?【英文标题】:Why does an image is distorted when I set it using GroundOverlay in my Google Map?为什么我在 Google 地图中使用 GroundOverlay 设置图像时会变形? 【发布时间】:2017-11-28 18:32:12 【问题描述】:

我正在尝试使用 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

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

已编辑

我可以通过图像中心的 LatLng 坐标和图像的宽度来设置图像而不会失真,但问题是 GroundOverlayOptions 对象需要以公里为单位的宽度,我使用捕获的那一刻图像的两个机器人点之间的距离进行计算。

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

【问题讨论】:

看来你的代码没问题。可能borders 有错误的坐标。可能是因为borders = GoogleMap.getProjection().getVisibleRegion().latLngBounds; 在不合适的地方调用。尝试在GoogleMap.OnMapLoadedCallback 中调用它。 感谢您的回复。我试过了,但我得到了完全相同的结果。我编辑了我的问题,因为现在我可以设置它而不会失真,但不是在正确的位置。希望你能帮助我@AndriiOmelchenko 似乎问题出在borders 对象中。尝试使用 Logcat 进行协调和分析。 我做到了,有中心和边框,但它们被拍得很好。我现在用.position(center, distance); 做这件事。中心很好,但我认为问题是距离(计算为Location.distanceBetween(...)和两个南边界的纬度和经度),在我将其更改为米之后(根据需要使用浮点数)你认为是问题吗那个?还能是什么?谢谢@AndriiOmelchenko 您能通过邮件联系我并寻求帮助吗?我很生气,对我的论文有很大帮助 trollmada@gmail.com @AndriiOmelchenko 【参考方案1】:

试试这个代码,它会在mScreenshotButton press 上获取屏幕截图,而不是将其添加为 mAddOverlayButton press 上的覆盖:

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

【讨论】:

是的!有用!你知道如何正确设置旋转吗?因为如果我在截屏时旋转地图,图像也会失真。非常感谢您的回复伙伴! @thEmadA 1. 欢迎您! 2.这是另一个问题。 你是对的,我创建了一个新帖子here

以上是关于为啥我在 Google 地图中使用 GroundOverlay 设置图像时会变形?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Google 地图在我的 Android 应用程序中显示空白屏幕?

为啥我的自定义 Google 地图图标在 PC 浏览器中显示,但在 Android 浏览器中不显示?

为啥我在地图stl中搜索时差很大?

为啥这不是 google.maps.Map 的地图实例? InvalidValueError:setMap:不是 Map 的实例;

为啥我在地图箭头功能中不断收到未定义的错误?

为啥触发 Firebase onDataChange() 方法后,我的 Google Map 会不断创建新的地图实例?