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