多个坐标在地图上显示自动缩放

背景

android上对多个坐标进行显示,由于坐标点位置不确定的原因,需要对地图进行自动缩放,使其能够完整显示相对应的坐标

相关技术

我们使用到了百度SDKzoomBy,而zoomy中的数字就代表着缩放级别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
8,+∞):大于等于8的缩放级别都是10
78):大于等于7小于8的缩放级别都是20
67):大于等于6小于7的缩放级别都是50
56):大于等于5小于6的缩放级别都是100
45):大于等于4小于5的缩放级别都是200
34):大于等于3小于4的缩放级别都是500
23):大于等于2小于3的缩放级别都是1千米
12):大于等于1小于2的缩放级别都是2千米
01):大于等于0小于1的缩放级别都是5千米
-10):大于等于-1小于0的缩放级别都是10千米
-2-1):大于等于-2小于-1的缩放级别都是20千米
-3-2):大于等于-3小于-2的缩放级别都是25千米
-4-3):大于等于-4小于-3的缩放级别都是50千米
-5-4):大于等于-5小于-4的缩放级别都是100千米
-6-5):大于等于-6小于-5的缩放级别都是200千米
-7-6):大于等于-7小于-6的缩放级别都是500千米
-8-7):大于等于-8小于-7的缩放级别都是1000千米
(-∞, -8):小于-8的缩放级别都是2000千米

核心代码

准备数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
val datas = ArrayList<RealTimeLocationResp>()
val timestamp = System.currentTimeMillis()
datas.add(
RealTimeLocationResp(
insertTime = timestamp.toString(),
latitude = "30.553305",
locationName = "测试点0",
longitude = "104.0716",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 3 * 60 * 1000).toString(),
latitude = "30.553313",
locationName = "测试点1",
longitude = "104.071083",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 6 * 60 * 1000).toString(),
latitude = "30.553608",
locationName = "测试点2",
longitude = "104.071061",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 9 * 60 * 1000).toString(),
latitude = "30.553632",
locationName = "测试点3",
longitude = "104.070863",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 12 * 60 * 1000).toString(),
latitude = "30.553997",
locationName = "测试点4",
longitude = "104.070737",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 15 * 60 * 1000).toString(),
latitude = "30.554355",
locationName = "测试点5",
longitude = "104.07063",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 18 * 60 * 1000).toString(),
latitude = "30.554409",
locationName = "测试点6",
longitude = "104.071137",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 21 * 60 * 1000).toString(),
latitude = "30.554417",
locationName = "测试点7",
longitude = "104.071366",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 24 * 60 * 1000).toString(),
latitude = "30.554254",
locationName = "测试点8",
longitude = "104.071636",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 27 * 60 * 1000).toString(),
latitude = "30.554118",
locationName = "测试点9",
longitude = "104.07164",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 30 * 60 * 1000).toString(),
latitude = "30.553842",
locationName = "测试点10",
longitude = "104.071627",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 33 * 60 * 1000).toString(),
latitude = "30.553612",
locationName = "测试点11",
longitude = "104.071654",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 36 * 60 * 1000).toString(),
latitude = "30.553612",
locationName = "测试点12",
longitude = "104.07107",
studentName = "aabbcc"
)
)
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 39 * 60 * 1000).toString(),
latitude = "30.553297",
locationName = "测试点13",
longitude = "104.071088",
studentName = "aabbcc"
)
)
//117.184717,39.139782
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 42 * 60 * 1000).toString(),
latitude = "39.139782",
locationName = "测试点14",
longitude = "117.184717",
studentName = "aabbcc"
)
)
//91.175511,29.654024
datas.add(
RealTimeLocationResp(
insertTime = (timestamp + 45 * 60 * 1000).toString(),
latitude = "29.654024",
locationName = "测试点15",
longitude = "91.175511",
studentName = "aabbcc"
)
)

获取最大经纬度,最小经纬度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
fun getMinMaxLatLng(latLngList: List<TarilBean>): LatLngResult? {
if (latLngList.isNullOrEmpty()) return null
var minLat: Double = 0.0
var minLng: Double = 0.0
var maxLat: Double = 0.0
var maxLng: Double = 0.0
if (latLngList.size == 1) {
minLat = latLngList[0].latlng.latitude
minLng = latLngList[0].latlng.longitude
maxLat = latLngList[0].latlng.latitude
maxLng = latLngList[0].latlng.longitude
} else {
minLat = latLngList[0].latlng.latitude
minLng = latLngList[0].latlng.longitude
maxLat = latLngList[0].latlng.latitude
maxLng = latLngList[0].latlng.longitude
latLngList.forEachIndexed { index, tarilBean ->
val lat = tarilBean.latlng.latitude
val lng = tarilBean.latlng.longitude
if (lat > maxLat) maxLat = lat
if (lng > maxLng) maxLng = lng
if (lat < minLat) minLat = lat
if (lng < minLng) minLng = lng
}
}
return LatLngResult(
minLat,
minLng,
maxLat,
maxLng
)
}

获取缩放系数

通过最大经纬度,最小经纬度获取缩放系数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
fun getZoom(minLat: Double, minLng: Double, maxLat: Double, maxLng: Double): Float {
val zooms = arrayOf(
"5",
"10",
"20",
"50",
"100",
"200",
"500",
"1000",
"2000",
"5000",
"10000",
"20000",
"25000",
"50000",
"100000",
"200000",
"500000",
"1000000"
)
val distance = LocationUtils.getDistance(minLat, minLng, maxLat, maxLng)
var zoomIndex: Float = 0f
when {
distance < zooms[0].toDouble() -> {
zoomIndex = 8f
}
distance > zooms[zooms.size - 1].toDouble() -> {
zoomIndex = -8f
}
else -> {
run outside@{
zooms.asSequence().forEachIndexed { index, s ->
if (s.toDouble() > distance) {
zoomIndex = 26f - (18f + index) + 3f
return@outside
}
}
}
}
}
return zoomIndex
}

根据缩放系数进行缩放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var latLngBounds = LatLngBounds.Builder()
this.laglngs.forEach { e ->
latSum += e.latlng.latitude
lngSum += e.latlng.longitude
latLngBounds.include(e.latlng)
//循环添加坐标点
}
zoomTargetLatLng = LatLng(latSum / this.laglngs.size, lngSum / this.laglngs.size)
baiduMap?.isMyLocationEnabled = true
var mapStatusUpdate = MapStatusUpdateFactory.newLatLngBounds(latLngBounds.build())
baiduMap?.setMapStatus(mapStatusUpdate)
var zoomBy = 8f
val minMaxResult = getMinMaxLatLng(latLngList)
if (minMaxResult != null) {
zoomBy = getZoom(
minMaxResult.minLat,
minMaxResult.minLng,
minMaxResult.maxLat,
minMaxResult.maxLng
)
}
mapStatusUpdate = MapStatusUpdateFactory.zoomBy(zoomBy)
baiduMap?.setMapStatus(mapStatusUpdate)

实现效果

坚持原创技术分享,您的支持将鼓励我继续创作!
关注微信公众号 haibintalk,最新文章主动推送
关注微信公众号: haibintalk