Google Map CameraUpdate 将某个位置居中 [关闭]

Posted

技术标签:

【中文标题】Google Map CameraUpdate 将某个位置居中 [关闭]【英文标题】:Google Map CameraUpdate to center a certain location [closed] 【发布时间】:2021-08-13 05:30:32 【问题描述】:

我为 CameraUpdateFactory 浏览了这个 documentation,我对使用 newLatLngBounds 方法很感兴趣。 我想达到什么目的?

    应该在地图上以列表的形式看到所有传入的位置。 将地图保持在列表的第一个元素的中心。

newLatLngBounds 所做的是它自己计算中心,并且没有公共方法来显式设置它。


(添加到地址清晰)

如何在调用时生成LatLngBounds

CameraUpdateFactory.newLatLngBounds(latLngBounds, padding)

结果是最小边界地图显示以我选择的点为中心,而不是由 LatLngBounds.Builder 计算的中心。

【问题讨论】:

为清晰起见进行了编辑。 【参考方案1】:

通过一些计算,您可以获得所需的结果。 (提到的实用功能请参考SphericalUtil。)

总结

(a) 计算所有点(NW 和 SW 角点)的边界框 (X)。

(b) 计算所需的中心点到 X 的东西边和南北边的最大距离。

(c) 使用最大距离对计算新的 lat-lng 范围 - 您的 latLngBounds (Z)。

(d) 使用 newLatLngBounds 计算边界 (Z)。

图片

详情

因此,要在您的点列表上计算边界框循环,并保持最北和最南端的纬度,并保持最西部和最东端的经度。这是 X。

要计算 (A),请使用 SphericalUtil.computeDistanceBetween 计算从所需中心点到 Xeast 和 Xwest 的距离,并确定这两个距离 (A) 的最大值。同样计算所需中心点到 Xnorth 和 Xsouth 的距离,并确定这两个距离的最大值 (B)。

使用计算出的最大距离 (A,B) 使用 SphericalUtil.computeOffset 使用中心点和最大距离以及航向的 90(或 270)和 0(或 180)导出新点(在示例图中 270 得到A' 和 0 得到 B')。

您现在有了新的边界框 (Z),可用作 LatLngBounds,它以您想要的点为中心。

片段

假设pts 是要显示的点列表。

构建边界框 X

    LatLng Xnw = pts.get(0);
    LatLng Xse = Xnw;

    for (LatLng p : pts) 
        if (p.latitude > Xnw.latitude) 
            Xnw = new LatLng(p.latitude,Xnw.longitude);
        
        if (p.latitude < Xse.latitude) 
            Xse = new LatLng(p.latitude,Xse.longitude);
        
        if (p.longitude < Xnw.longitude) 
            Xnw = new LatLng(Xnw.latitude, p.longitude);
        
        if (p.longitude > Xse.longitude) 
            Xse = new LatLng(Xse.latitude, p.longitude);
        
    

选择任意中心

   LatLng c = pts.get(3);

计算 Z

    double dA0 = SphericalUtil.computeDistanceBetween(c, new LatLng(c.latitude, Xse.longitude));
    double dA1 = SphericalUtil.computeDistanceBetween(c, new LatLng(c.latitude, Xnw.longitude));
    double dB0 = SphericalUtil.computeDistanceBetween(c, new LatLng(Xse.latitude, c.longitude));
    double dB1 = SphericalUtil.computeDistanceBetween(c, new LatLng(Xnw.latitude, c.longitude));

    LatLng Znw = c;
    LatLng Zse = c;

    // Z longitude
    double dA = Math.max(dA0, dA1);
    Zse = new LatLng(Zse.latitude, SphericalUtil.computeOffset(c, dA, 90).longitude);
    Znw = new LatLng(Znw.latitude, SphericalUtil.computeOffset(c, dA, 270).longitude);

    double dB = Math.max(dB0, dB1);
    Zse = new LatLng(SphericalUtil.computeOffset(c, dB, 180).latitude, Zse.longitude);
    Znw = new LatLng(SphericalUtil.computeOffset(c, dB, 0).latitude, Znw.longitude);

通过添加 Z 和点来创建 latLngBounds。

    LatLngBounds.Builder llbb = LatLngBounds.builder();
    for (LatLng p : pts) 
        llbb.include(p);
        MarkerOptions mo = new MarkerOptions().position(p);

        if (p.equals(c)) 
            mo.title("C");
        
        mMap.addMarker(mo);
    
    llbb.include(Znw);
    llbb.include(Zse);

示例(以“c”为中心)

样本(不居中)

【讨论】:

以上是关于Google Map CameraUpdate 将某个位置居中 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

api v2 中的 mapview 和 cameraupdate

从点和填充创建 CameraUpdate 以很好地显示标记

将 Google Map 的标记位置作为 url 插入

php 使用Shortcode和API密钥将Google Map嵌入到页面中

在Google Map API中将画布外部的输入字段定位

如何将变量从 AsyncTask 返回到 Android 中的 Google Map 活动