通过一些计算,您可以获得所需的结果。 (提到的实用功能请参考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”为中心)
样本(不居中)