Skip to content

Commit 3abef13

Browse files
author
huangjiahong
committed
添加点聚图功能
1 parent 920a311 commit 3abef13

File tree

10 files changed

+282
-57
lines changed

10 files changed

+282
-57
lines changed

android/src/main/java/com/imfunc/flutter_minemap/FMMMapController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,10 @@ public void onMapReady(final MineMap oMineMap) {
8383
mineMap.setCameraPosition(
8484
new CameraPosition.Builder()
8585
// 设置相机指向的位置
86-
.target(new LatLng(38.913828, 116.405419))
86+
// 116.404844,39.912057
87+
.target(new LatLng(39.912057, 116.404269))
8788
// 设置相机缩放等级
88-
.zoom(13)
89+
.zoom(8)
8990
// 设置相机的俯视角度
9091
.tilt(0)
9192
// 摄像机指向的方向,从北部顺时针方向设置

android/src/main/java/com/imfunc/flutter_minemap/unil/conveter/FMMMapConveter.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.minedata.minemap.geometry.LatLng;
44

5+
import java.util.ArrayList;
6+
import java.util.Iterator;
57
import java.util.List;
68
import java.util.Map;
79

@@ -54,4 +56,34 @@ public static LatLng mapToLatlng(Map<String, Object> latlngMap) {
5456
return new LatLng((double) latitudeObj, (double) longitudeObj);
5557
}
5658

59+
/**
60+
* 将多个map形式的经纬度信息转换为结构化的经纬度数据
61+
*
62+
* @param latlngList
63+
* @return
64+
*/
65+
public static List<LatLng> mapToLatlngs(List<Map<String, Double>> latlngList) {
66+
if (null == latlngList) {
67+
return null;
68+
}
69+
70+
Iterator itr = latlngList.iterator();
71+
ArrayList<LatLng> latLngs = new ArrayList<>();
72+
while (itr.hasNext()) {
73+
Map<String, Object> latlngMap = (Map<String, Object>) itr.next();
74+
LatLng latLng = mapToLatlng(latlngMap);
75+
if (null == latLng) {
76+
break;
77+
}
78+
79+
latLngs.add(latLng);
80+
}
81+
82+
if (latLngs.size() != latlngList.size()) {
83+
return null;
84+
}
85+
86+
return latLngs;
87+
}
88+
5789
}

android/src/main/java/com/imfunc/flutter_minemap/views/mapHandler/ClusterLayerHandler.java

Lines changed: 47 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.imfunc.flutter_minemap.FMMMapController;
1010
import com.imfunc.flutter_minemap.R;
1111
import com.imfunc.flutter_minemap.unil.Constants;
12+
import com.imfunc.flutter_minemap.unil.conveter.FMMMapConveter;
1213
import com.minedata.minemap.geometry.LatLng;
1314
import com.minedata.minemap.overlay.ClusterLayer;
1415
import com.minedata.minemap.overlay.ClusterLayerOptions;
@@ -23,9 +24,10 @@
2324
import io.flutter.plugin.common.MethodChannel;
2425

2526
public class ClusterLayerHandler extends MMapHandler{
27+
private ClusterLayer clusterLayer;
28+
private ClusterLayerOptions options;
29+
2630

27-
ClusterLayer clusterLayer;
28-
2931
public ClusterLayerHandler(FMMMapController mMapController) {
3032
super(mMapController);
3133
}
@@ -42,76 +44,77 @@ public void handlerMethodCallResult(Context context, MethodCall call, MethodChan
4244

4345
switch (methodId) {
4446
case Constants.FMMClusterLayerMethodId.sMapAddClusterLayerMethod:
45-
addClusterLayer(context, call, result);
47+
addAllClusterLayer(context, call, result);
48+
break;
49+
case Constants.FMMClusterLayerMethodId.sMapClearClusterLayerMethod:
50+
clearClusterLayer(result);
4651
break;
4752
default:
4853
break;
4954
}
5055
}
5156

5257
/**
53-
* 添加聚合点图层
58+
* 添加聚合点图层集合
59+
* @param context
5460
* @param call
5561
* @param result
5662
*/
57-
private void addClusterLayer(Context context, MethodCall call,
58-
MethodChannel.Result result) {
63+
private void addAllClusterLayer(Context context, MethodCall call,
64+
MethodChannel.Result result) {
65+
Map params = FMMMapConveter.toMap(call.arguments);
66+
Integer clusterRadius = FMMMapConveter.toInt(params.get("clusterRadius"));
67+
String textColor = (String) params.get("textColor");
68+
Integer textFontSize = FMMMapConveter.toInt(params.get("textFontSize"));
69+
Integer maxZoom = FMMMapConveter.toInt(params.get("maxZoom"));
70+
Integer minZoom = FMMMapConveter.toInt(params.get("minZoom"));
71+
List<LatLng> latLngs = FMMMapConveter.mapToLatlngs((List<Map<String, Double>>) params.get("latLngs"));
5972

60-
if (clusterLayer != null) {
61-
clusterLayer.clear();
62-
}
73+
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
74+
R.drawable.minemap_mylocation_icon_default);
6375

64-
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.minemap_mylocation_icon_default);
6576
String bitmapName = "cluster_icon";
6677
mMapController.getMineMap().addImage(bitmapName, bitmap);
6778
Map<Integer, String> icons = new HashMap<>();
6879
icons.put(0, bitmapName);
6980

70-
ClusterLayerOptions options =
71-
new ClusterLayerOptions(true, "clusterlayer1", "clusterlayer2");
72-
options.setClusterRadius(200);
73-
options.setClusterTextColor(Color.parseColor("#ffff0000"));
74-
options.setClusterTextFontSize(14);
75-
options.setIcons(icons);
76-
options.setMaxZoom(11);
77-
options.setMinZoom(3);
78-
List<MarkerLayerOptions.MarkerItem> items = new ArrayList<>();
79-
LatLng latLng1 = new LatLng(38.913828, 116.405419);
80-
LatLng latLng2 = new LatLng(38.873828, 116.405419);
81-
MarkerLayerOptions.MarkerItem item1 = new MarkerLayerOptions.MarkerItem()
82-
.icon(bitmapName)
83-
.position(latLng1)
84-
.iconRotate(30.0f);
85-
MarkerLayerOptions.MarkerItem item2 = new MarkerLayerOptions.MarkerItem()
86-
.textName("你好")
87-
.position(latLng2)
88-
.textRotate(0.0f);
89-
items.add(item1);
90-
items.add(item2);
91-
options.addAll(items);
81+
Long startTs = System.currentTimeMillis();
9282

83+
options =
84+
new ClusterLayerOptions(true, "clusterlayer1" + startTs, "clusterlayer2" + startTs);
85+
options.setClusterRadius(clusterRadius);
86+
options.setClusterTextColor(Color.parseColor("#" + textColor));
87+
options.setClusterTextFontSize(textFontSize);
88+
options.setIcons(icons);
89+
options.setMaxZoom(maxZoom);
90+
options.setMinZoom(minZoom);
9391
clusterLayer = mMapController.getMineMap().addLayer(options);
94-
result.success(true);
95-
}
9692

97-
/**
98-
* 添加聚合点图层集合
99-
* @param call
100-
* @param result
101-
*/
102-
private void addAllClusterLayer(MethodCall call,
103-
MethodChannel.Result result) {
93+
List<MarkerLayerOptions.MarkerItem> items = new ArrayList<>();
94+
for (int i = 0; i < latLngs.size(); i ++) {
95+
MarkerLayerOptions.MarkerItem item = new MarkerLayerOptions.MarkerItem()
96+
.icon(bitmapName)
97+
.position(latLngs.get(i))
98+
.iconRotate(0f);
99+
items.add(item);
100+
}
104101

102+
options.addAll(items);
103+
clusterLayer.update();
104+
result.success(true);
105105
}
106106

107107
/**
108108
* 清空聚合点图层
109-
* @param call
110109
* @param result
111110
*/
112-
private void clearClusterLayer(MethodCall call,
111+
private void clearClusterLayer(
113112
MethodChannel.Result result) {
114-
113+
if (null != clusterLayer && clusterLayer.isLayerExist()) {
114+
clusterLayer.clear();
115+
clusterLayer.update();
116+
}
117+
result.success(true);
115118
}
116119

117120
/**

android/src/main/java/com/imfunc/flutter_minemap/views/mapHandler/MMapHandlerFactory.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public void dispatchMethodHandler(Context context, MethodCall call,
4848
mMapHandler = mMapHandlerHashMap.get(Constants.MMapHandlerType.MAP_STATE);
4949
break;
5050
case Constants.FMMClusterLayerMethodId.sMapAddClusterLayerMethod:
51+
case Constants.FMMClusterLayerMethodId.sMapClearClusterLayerMethod:
5152
mMapHandler = mMapHandlerHashMap.get(Constants.MMapHandlerType.CLUSTER_LAYER);
5253
break;
5354
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
const List<Map<String, String>> ExpCityData = [{"latitude":"41.6772", "longitude":"123.4631"},
2+
{"latitude":"45.8021", "longitude":"126.5358"},
3+
{"latitude":"40.8415", "longitude":"111.7520"},
4+
{"latitude":"29.5710", "longitude":"106.55714"},
5+
{"latitude":"38.492353", "longitude":"106.238975"},
6+
{"latitude":"34.347499", "longitude":"108.94628"},
7+
{"latitude":"37.876825", "longitude":"112.557051"},
8+
{"latitude":"38.048838", "longitude":"114.520782"},
9+
{"latitude":"32.064752", "longitude":"118.802914"},
10+
{"latitude":"31.236342", "longitude":"121.4737"},
11+
{"latitude":"43.821901", "longitude":"125.330130"},
12+
{"latitude":"31.826835", "longitude":"117.235460"},
13+
{"latitude":"30.5763", "longitude":"104.0648"},
14+
{"latitude":"29.6501", "longitude":"91.1210"},
15+
{"latitude":"36.6234", "longitude":"101.7843"},
16+
{"latitude":"24.8859", "longitude":"102.9397"},
17+
{"latitude":"28.2340", "longitude":"112.9453"},
18+
{"latitude":"30.2799", "longitude":"120.1617"},
19+
{"latitude":"26.0803", "longitude":"119.2965"},
20+
{"latitude":"23.1352", "longitude":"113.2708"},
21+
{"latitude":"22.2048", "longitude":"113.5556"},
22+
{"latitude":"38.5258", "longitude":"102.1942"},
23+
{"latitude":"39.8078", "longitude":"98.2220"},
24+
{"latitude":"37.3828", "longitude":"97.3778"},
25+
{"latitude":"34.4772", "longitude":"100.2513"},
26+
{"latitude":"34.5872", "longitude":"105.7313"},
27+
{"latitude":"32.4418", "longitude":"105.8500"},
28+
{"latitude":"35.8554", "longitude":"104.6174"},
29+
{"latitude":"32.9966", "longitude":"112.5350"},
30+
{"latitude":"36.5910", "longitude":"109.4898"},
31+
{"latitude":"38.8802", "longitude":"115.4710"},
32+
{"latitude":"36.2016", "longitude":"113.1231"},
33+
{"latitude":"36.1038", "longitude":"114.3996"},
34+
{"latitude":"38.2910", "longitude":"109.7412"},
35+
{"latitude":"34.6244", "longitude":"112.4600"},
36+
{"latitude":"34.42036", "longitude":"115.6628"},
37+
{"latitude":"34.6023", "longitude":"119.22957"},
38+
{"latitude":"36.0216", "longitude":"106.24916"},
39+
{"latitude":"40.99985", "longitude":"113.1426"},
40+
{"latitude":"40.9578", "longitude":"117.9698"},
41+
{"latitude":"41.5794", "longitude":"120.45735"},
42+
{"latitude":"37.38845", "longitude":"117.9792"},
43+
{"latitude":"33.9971", "longitude":"116.83465"},
44+
{"latitude":"37.4413", "longitude":"116.36585"},
45+
{"latitude":"37.0768", "longitude":"114.51085"},
46+
{"latitude":"37.52555", "longitude":"111.14805"},
47+
{"latitude":"34.9030", "longitude":"108.9515"},
48+
{"latitude":"32.6906", "longitude":"109.0359"},
49+
{"latitude":"34.0416", "longitude":"113.8588"},
50+
{"latitude":"49.2180", "longitude":"119.7722"},
51+
{"latitude":"49.2180", "longitude":"119.7722"},
52+
{"latitude":"47.3600", "longitude":"123.9245"},
53+
{"latitude":"46.5932", "longitude":"125.1098"},
54+
{"latitude":"47.7333", "longitude":"128.8471"},
55+
{"latitude":"47.3560", "longitude":"130.3042"},
56+
{"latitude":"45.7764", "longitude":"131.00965"},
57+
{"latitude":"46.6588", "longitude":"126.9757"},
58+
{"latitude":"45.6254", "longitude":"122.8453"},
59+
{"latitude":"45.1472", "longitude":"124.8316"},
60+
{"latitude":"45.1472", "longitude":"124.8316"},
61+
{"latitude":"43.8434", "longitude":"126.5560"},
62+
{"latitude":"43.6582", "longitude":"122.2513"},
63+
{"latitude":"42.8912", "longitude":"125.1502"},
64+
{"latitude":"41.7339", "longitude":"125.9465"},
65+
{"latitude":"44.5587", "longitude":"129.6389"},
66+
{"latitude":"44.5587", "longitude":"129.6389"},
67+
{"latitude":"42.0279", "longitude":"121.6765"},
68+
{"latitude":"42.0279", "longitude":"121.6765"},
69+
{"latitude":"41.1140", "longitude":"123.0099"},
70+
{"latitude":"40.7174", "longitude":"120.8434"},
71+
{"latitude":"38.3102", "longitude":"116.8453"},
72+
{"latitude":"37.5192", "longitude":"122.1283"},
73+
{"latitude":"36.0725", "longitude":"120.3894"},
74+
{"latitude":"34.6023", "longitude":"119.2296"},
75+
{"latitude":"31.8168", "longitude":"119.9801"},
76+
{"latitude":"31.6962", "longitude":"113.3891"},
77+
{"latitude":"31.0418", "longitude":"112.2058"},
78+
{"latitude":"32.6351", "longitude":"110.8045"},
79+
{"latitude":"29.8470", "longitude":"114.3290"},
80+
{"latitude":"29.2743", "longitude":"117.1850"},
81+
{"latitude":"30.1355", "longitude":"118.1815"},
82+
{"latitude":"27.9537", "longitude":"116.3646"},
83+
{"latitude":"30.9465", "longitude":"118.7652"},
84+
{"latitude":"29.1226", "longitude":"110.4849"},
85+
{"latitude":"28.4729", "longitude":"119.9295"},
86+
{"latitude":"27.5756", "longitude":"110.0081"},
87+
{"latitude":"25.2798", "longitude":"110.2964"},
88+
{"latitude":"24.6990", "longitude":"108.0919"},
89+
{"latitude":"23.90785", "longitude":"106.6250"},
90+
{"latitude":"24.4094", "longitude":"111.5731"},
91+
{"latitude":"25.4963", "longitude":"103.8027"},
92+
{"latitude":"26.5881", "longitude":"101.7252"},
93+
{"latitude":"23.8905", "longitude":"100.0953"},
94+
{"latitude":"21.4869", "longitude":"109.1266"},
95+
{"latitude":"23.7499", "longitude":"114.7071"},
96+
{"latitude":"25.0811", "longitude":"117.0231"},
97+
{"latitude":"24.8802", "longitude":"118.6823"},
98+
{"latitude":"29.55826", "longitude":"103.7719"},
99+
{"latitude":"31.1467", "longitude":"97.1787"},
100+
{"latitude":"34.76", "longitude":"113.65"}];

example/lib/view/cluster_layer_page.dart

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import 'dart:io';
2+
import 'dart:typed_data';
3+
14
import 'package:flutter/material.dart';
25
import 'package:flutter_minemap/flutter_minemap.dart';
36
import 'package:flutter_minemap/models/fmm_map_models.dart';
47
import 'package:flutter_minemap/models/fmm_types.dart';
8+
import 'package:flutter_minemap_example/assets/exp_city_data.dart';
59
import 'package:flutter_minemap_example/common/scaffold_widget.dart';
610
import 'package:flutter_minemap_example/config/config.dart';
711

@@ -15,12 +19,20 @@ class ClusterLayerPage extends StatefulWidget {
1519
class _ClusterLayerPageState extends State<ClusterLayerPage> {
1620
MineMapController _mineMapController;
1721

22+
@override
23+
void initState() {
24+
super.initState();
25+
}
26+
1827
@override
1928
Widget build(BuildContext context) {
2029
return ScaffoldWidget(
2130
title: '点聚合图',
2231
child: Column(
23-
children: [_map(), _btnListWidget()],
32+
children: [
33+
_map(),
34+
_btnListWidget(),
35+
],
2436
),
2537
);
2638
}
@@ -46,10 +58,11 @@ class _ClusterLayerPageState extends State<ClusterLayerPage> {
4658
Widget _btnListWidget() {
4759
final List<ClusterLayerPageBtnModel> _btnL = [
4860
ClusterLayerPageBtnModel(
49-
'添加聚合点图层', () => _mineMapController.addClusterLayer()),
50-
ClusterLayerPageBtnModel('添加聚合点图层集合', () {}),
51-
ClusterLayerPageBtnModel('清空聚合点图层', () {}),
52-
ClusterLayerPageBtnModel('删除聚合点图层', () {}),
61+
'添加聚合点图层', () => _mineMapController.addClusterLayer(_clusterLayer())),
62+
ClusterLayerPageBtnModel(
63+
'清空聚合点图层', () => _mineMapController.clearClusterLayer()),
64+
// ClusterLayerPageBtnModel('清空聚合点图层', () {}),
65+
// ClusterLayerPageBtnModel('删除聚合点图层', () {}),
5366
];
5467

5568
List<Widget> _l = [];
@@ -71,6 +84,16 @@ class _ClusterLayerPageState extends State<ClusterLayerPage> {
7184
),
7285
);
7386
}
87+
88+
ClusterLayerModel _clusterLayer() {
89+
List<FMMCoordinate> _l = [];
90+
ExpCityData.forEach((e) {
91+
_l.add(FMMCoordinate(
92+
double.parse(e['latitude']), double.parse(e['longitude'])));
93+
});
94+
return ClusterLayerModel(latLngs: _l);
95+
}
96+
7497
}
7598

7699
class ClusterLayerPageBtnModel {

lib/flutter_minemap.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
export 'package:flutter_minemap/minemap_view.dart';
22
export 'package:flutter_minemap/mimemap_controler.dart';
3-
export 'package:flutter_minemap/models/fmm_map_options.dart';
3+
export 'package:flutter_minemap/models/fmm_map_options.dart';
4+
5+
export 'package:flutter_minemap/models/overlays/cluster_layer_model.dart';

0 commit comments

Comments
 (0)