import 'package:flutter/material.dart'; import 'package:flutter_bmfbase/BaiduMap/bmfmap_base.dart'; import 'package:flutter_bmfmap/BaiduMap/bmfmap_map.dart'; import 'package:hyzp_ybqx/components/hyxx_data_handle.dart'; ///批量添加定位标记 bool enable = true; bool dragable = true; int g_zoomLevel_default = 14; //地图默认缩放倍数 int g_zoomLevel = 14; //地图缩放倍数 int g_zoomMin = 10; int g_zoomMax = 18; ///批量添加定位标记 List g_listBMFMarker = []; Map g_map_BMFMarkerID_dwIndex = {}; List g_listBMFText = []; //https://www.cnblogs.com/ybmj/p/14408263.html //百度地图的脑残设计,附上代码,为后来的码农们... Future getListBMFMarker({List listDwinfo}) async { if (null == listDwinfo) { listDwinfo = listDwinfoGetList2; } //double _scale = 9900 / 10000; //自己控制off_latitude、off_longitude效果不好 // BMFMarker marker1 = BMFMarker( // position: BMFCoordinate(28.807061, 104.607091), // title: '1、江北振兴大道', // subtitle: 'test', // identifier: 'flutter_marker', // icon: 'assets/images/location.png', // enabled: enable, // draggable: dragable); int len = listDwinfo.length; for (int i = 0; i < len; i++) { BMFMarker marker = BMFMarker( position: getBMFCoordinate(listDwinfo[i]["dwzb"]), // title: '${listDwinfo[i]["id"].toString()}、${listDwinfo[i]["dwmc"]}', title: '${(i + 1).toString()}、${listDwinfo[i]["dwmc"]}', subtitle: 'test', // identifier: '${listDwinfo[i]["id"].toString()}、${listDwinfo[i]["dwmc"]}', identifier: '${(i + 1).toString()}、${listDwinfo[i]["dwmc"]}', icon: 'assets/images/location.png', /// 默认情况下, annotation view的中心位于annotation的坐标位置, /// 可以设置centerOffset改变view的位置,正的偏移使view朝右下方移动,负的朝左上方,单位是像素 /// 目前Android只支持Y轴设置偏移量对应SDK的 yOffset(int yOffset) 方法 /// 添加标记 BMFMarker 百度官方有 centerOffset 偏移参数, /// 文本标签 BMFText 官方没有 centerOffset 偏移参数,我取消了 BMFMarker 的偏移。你看这样行吗? /// 按公司要求,为更准确定位,取消 BMFMarker 的偏移 centerOffset: BMFPoint(0, 0), //标记中心偏移 enabled: enable, draggable: dragable); // 百度地图的脑残设计,用Flutter添加多个BMFMarker时,必须在添加BMFMarker时自己保存ID, // 否则响应点击时无法确定用户点击的是哪个定位标注 // 代码不会自动返回,也没有任何文档说明,是花了一天时间搜索网络无果,是自己翻江倒海摸索出来的 // 下一句是关键代码,将添加的每个BMFMarker的id保存到一个map中, // 这样在用setMapClickedMarkerCallback添加BMFMarker的通用响应函数中,便可以根据id号来判断用户点击的是哪一个定位标注 g_map_BMFMarkerID_dwIndex[marker.getId()] = i; g_listBMFMarker.add(marker); g_listBMFText.add(BMFText( // text: '${listDwinfo[i]["id"].toString()}、${listDwinfo[i]["dwmc"]}', text: '${(i + 1).toString()}、${listDwinfo[i]["dwmc"]}', //纬度偏移-上下 off_latitude, 经度偏移-左右 off_longitude //已经在zoomLevel = 15时调整好定位标记与文本标记的相对位置 // ,当地图缩放时,会发生位置变化,必须使用 Provider 或者 EventBus 进行跟踪更新 //https://time.geekbang.org/column/article/131890 //老师,provider、eventBus的用途有啥区别吗,都可以做状态的通知 // 作者回复: Provider 主要是用来做数据读写共享;event_bus主要是用来做数据状态通知、实现组件间单向数据传递。 //如果我们的应用足够简单,数据流动的方向和顺序是清晰的,我们只需要将数据映射成视图就可以了。 // 作为声明式的框架,Flutter 可以自动处理数据到渲染的全过程,通常并不需要 Provider 状态管理。 // position: getBMFCoordinate(listDwinfo[i]["dwzb"], // off_latitude: -0.0002 * g_zoomLevel * _scale, // off_longitude: -0.00009 * g_zoomLevel * _scale), position: getBMFCoordinate(listDwinfo[i]["dwzb"]), //自己控制off_latitude、off_longitude效果不好 bgColor: Colors.yellow, fontColor: Colors.black, fontSize: 35, // typeFace: // BMFTypeFace(familyName: BMFFamilyName.sMonospace, textStype: BMFTextStyle.BOLD_ITALIC), typeFace: BMFTypeFace(familyName: BMFFamilyName.sMonospace, textStype: BMFTextStyle.BOLD), alignY: BMFVerticalAlign.ALIGN_TOP, alignX: BMFHorizontalAlign.ALIGN_LEFT, rotate: 0.0, zIndex: 99)); } } //文字覆盖物 // 文字(Text)在地图上也是一种覆盖物,由BMFText类定义,示例代码如下: // // /// text经纬度信息 // BMFCoordinate position = new BMFCoordinate(39.73235, 116.350338); // // /// 构造text // BMFText bmfText = BMFText( // text: 'hello world', // position: position, // bgColor: Colors.blue, // fontColor: Colors.red, // fontSize: 40, // typeFace: BMFTypeFace( familyName: BMFFamilyName.sMonospace, // textStype: BMFTextStyle.BOLD_ITALIC), // alignY: BMFVerticalAlign.ALIGN_TOP, // alignX: BMFHorizontalAlign.ALIGN_LEFT, // rotate: 30.0); // // /// 添加text // myMapController.addText(bmfText); //从"dwzb": "104.607091|28.807061",得到BMFCoordinate(28.807061, 104.607091) //纬度偏移-上下 off_latitude, 经度偏移-左右 off_longitude //自己控制off_latitude、off_longitude效果不好 BMFCoordinate getBMFCoordinate(String dwzb, {double off_latitude = 0, double off_longitude = 0}) { off_latitude = 0; //取消偏移 off_longitude = 0; //取消偏移 List _listCoordinateItem = dwzb.trim().split('|'); return BMFCoordinate(double.parse(_listCoordinateItem[1]) - off_latitude, double.parse(_listCoordinateItem[0]) - off_longitude); }