flutter 基于百度地图的地图选址,包括移动选址,地区搜索 ,仿微信地图选址

news2024/11/24 19:42:00

flutter 最近有在地图上选择地址的需求,要求如下

1.移动地图获取根据地图中心点获取周边的poi信息

2.搜索,根据搜索内容提示相关地点信息,点击移动到相关位置,显示出该位置周边的poi信息

废话少说,先上视频

flutter百度地图选址

百度地图的集成这个就不说了,直接参考官网集成即可,咱们直接看实现代码

先看布局

布局比较简单,就是上面两个按钮,下面是固定高度的搜索框和列表,有一些我封装的内容,大家可以自行绘制,主要看与地图相关的内容即可

return Column(
      children: [
        Expanded(
            child: Stack(
          children: [
            BMFMapWidget(
              onBMFMapCreated: (controller) {
                viewModel.mapController = controller;
                onBMFMapCreated();
              },
              mapOptions: viewModel.mapOptions,
            ),
            Container(
              padding: const EdgeInsets.fromLTRB(10, 10, 10, 20),
              decoration: const BoxDecoration(
                gradient: LinearGradient(
                  begin: Alignment.topCenter,
                  end: Alignment.bottomCenter,
                  colors: [
                    Color(0x80a6a6a6),
                    //white,
                    transparent,
                  ],
                ),
              ),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  TextView(
                    "取消",
                    textSize: 15,
                    textColor: Colors.white,
                    paddingLeft: 10,
                    paddingRight: 10,
                    paddingTop: 5,
                    paddingBottom: 5,
                    onClick: () {
                      Get.back();
                    },
                  ),
                  TextView(
                    "确定",
                    backgroundColor: green,
                    cornerRadius: 2,
                    textSize: 15,
                    textColor: Colors.white,
                    paddingLeft: 10,
                    paddingTop: 5,
                    paddingBottom: 5,
                    paddingRight: 10,
                    onClick: () {
                      if (viewModel.poiChooseName.isEmpty) {
                        showToast("您还未选择任何地址");
                      }  else{
                        Get.back(result: viewModel.poiInfo);
                      }

                    },
                  )
                ],
              ),
            ),
            Center(
                child: ImageView(
              "assets/images/ic_map_location.png",
              width: 30,
              height: 30,
            )),
          ],
        )),
        MyContainer(
          height: viewModel.contentHieght,
          backgroundColor: Colors.white,
          cornerRadius: 10,
          child: Column(
            children: [
              const SizedBox(
                height: 10,
              ),
              CommonSearchLayout(viewModel.searchController),
              Expanded(
                child: MyListView(
                    viewModel.isSearch
                        ? viewModel.suggestList
                        : viewModel.poiList,
                    dividerHeight: 1,
                    dividerColor: dividerColor, (context, index) {
                  if (viewModel.isSearch) {
                    //搜索
                    return SuggestItem(viewModel.suggestList[index], index,
                        (index1) {
                      onSuggestChoose(index1);
                    });
                  } else {
                    //选择
                    return PoiItem(
                        viewModel.poiList[index], viewModel.poiChooseName,
                        (text) {
                      viewModel.poiChooseName = text;
                      viewModel.poiInfo = viewModel.poiList[index];
                      notifyChanges();
                    });
                  }
                }),
              )
            ],
          ),
        )
      ],
    );

展现出来的样式

注意地图创建后调用的发方法onBMFMapCreated(),当地图创建之后,判断地图是否确实是被加载好了,加载好了之后就调用一个获取用户位置的方法,把用户当前定位挪到地图中心去,然后设置地图监听,也就是当地区的中心区域有变化的时候,重新获取地图中心点周边的poi信息

void onBMFMapCreated() {
    //地图被创建
    viewModel.mapController.setMapDidLoadCallback(callback: () {
      //地图已加载,地图中心移动到用户所在的位置
      showUserLocation();
    });

    //监听地图区域变化
    viewModel.mapController.setMapRegionDidChangeWithReasonCallback(callback:
        (BMFMapStatus mapStatus, BMFRegionChangeReason regionChangeReason) {
      print("地图区域变化:${mapStatus.targetGeoPt!.latitude}");
      viewModel.poiChooseName = "";
      //根据地图中心点检索周边事物
      getPoiByLocation(
          mapStatus.targetGeoPt!.latitude, mapStatus.targetGeoPt!.longitude);
      notifyChanges();
    });
  }

 获取用户位置并且把用户位置移动到中央,LocationUtils().getCurrentLocation()是我自己封装的获取用户当前位置的方法,调用的是百度地图官方的sdk的方法,自己封装了一下,这块大家可以自己来写

//获取用户位置并移动地图到人员中心
  void showUserLocation() {
    LocationUtils().getCurrentLocation(context, (info) {
      viewModel.mapOptions = BMFMapOptions(
        center: BMFCoordinate(info.latitude!, info.longitude!),
        zoomLevel: viewModel.mapLevel,
      );
      viewModel.mapController.updateMapOptions(viewModel.mapOptions);
      getPoiByLocation(info.latitude!, info.longitude!);
    });
  }

然后重点来了getPoiByLocation(),这个方法很重要,这个方法是干什么的呢,这个方法就是根据坐标获取周边poi信息的方法,本质上就是坐标转地址(反地理编码),他会给出很多这个坐标周边的poi信息,这个周边的poi信息就是咱们最关键最需要的信息

这里面相应的位置点的名称、地址、坐标什么的就都获取到了,List<BMFPoiInfo>? list,这个就是获取到的poi信息的列表,里面我做了一些小处理,根据搜索的内容把转化的poi信息与之相符的放在第一位,这个列表获取到了,后续怎么处理根据需求自行处理即可

//反地理编码,根据坐标查询poi信息
void getPoiByLocation(double latitude, double longitude) async {
    BMFReverseGeoCodeSearchOption reverseGeoCodeSearchOption =
        BMFReverseGeoCodeSearchOption(
            location: BMFCoordinate(latitude, longitude));
    // 检索实例
    BMFReverseGeoCodeSearch reverseGeoCodeSearch = BMFReverseGeoCodeSearch();
    // 逆地理编码回调
    reverseGeoCodeSearch.onGetReverseGeoCodeSearchResult(callback:
        (BMFReverseGeoCodeSearchResult result, BMFSearchErrorCode errorCode) {
      List<BMFPoiInfo>? list = result.poiList;
      viewModel.poiList.clear();
      if (result.poiList!.isNotEmpty) {
        viewModel.poiList.addAll(result.poiList!);
        if (viewModel.poiChooseName.isNotEmpty) {
          late BMFPoiInfo info;
          for (int i = 0; i < viewModel.poiList.length; i++) {
            if (viewModel.poiList[i].name == viewModel.poiChooseName) {
              viewModel.poiInfo = viewModel.poiList[i];
              viewModel.poiList.removeAt(i);
              viewModel.poiList.insert(0, viewModel.poiInfo);
            }
          }
        }
        notifyChanges();
        for (int i = 0; i < list!.length; i++) {
          BMFPoiInfo info = list[i];
          print("poi信息:${info.name!}---${info.address!}");
          print("poi信息:${info.pt!.longitude}---${info.pt!.latitude}");
        }
      } else {
        print("poi信息:空");
      }
      //print(`逆地理编码  errorCode = ${errorCode}  \n result = ${result?.toMap()}`);
      // 解析reslut,具体参考demo
    });
    await reverseGeoCodeSearch.reverseGeoCodeSearch(reverseGeoCodeSearchOption);
  }

再然后就是搜索了,因为我搜索和现实位置的时候用的是同一个listview,所以我加了一个状态的判断

//当前是否是搜索的状态
  bool isSearch = false;

以此来判断当前是显示poi信息,还是显示的搜索结果,监听输入框,当输入文字有变化的时候,搜索内容,关键方法searchLocation(),cityname给一个就行,不给会报错,是可以进行全国范围内搜索的,这个点不要怕

//根据输入的内容搜索相应的位置
  void searchLocation() async {
    viewModel.suggestList.clear();
    BMFSuggestionSearchOption suggestionSearchOption =
        BMFSuggestionSearchOption(
            keyword: viewModel.searchController.text, cityname: '北京市');
    BMFSuggestionSearch suggestionSearch = BMFSuggestionSearch();
    suggestionSearch.onGetSuggestSearchResult(callback:
        (BMFSuggestionSearchResult result, BMFSearchErrorCode errorCode) {
      if (result.suggestionList!.isNotEmpty) {
        //有搜索结果
        viewModel.suggestList.addAll(result.suggestionList!);
        for (int i = 0; i < result.suggestionList!.length; i++) {
          print("提醒位置:${result.suggestionList![i].key}");
        }
      } else {
        print("提醒位置:空");
      }
      notifyChanges();
    });
    await suggestionSearch.suggestionSearch(suggestionSearchOption);
  }

当选择了搜索的位置之后,就需要把地图移动到相应的位置,然后重新获取次位置周边的poi信息

,主要方法onSuggestChoose(),当搜索提示的位置选择之后需要做的处理

void onSuggestChoose(int index) {
    //选中此项
    viewModel.suggestInfo = viewModel.suggestList[index];
    viewModel.poiChooseName = viewModel.suggestInfo.key!;
    //位置移动到此处
    viewModel.mapOptions = BMFMapOptions(
      center: BMFCoordinate(viewModel.suggestInfo.location!.latitude,
          viewModel.suggestInfo.location!.longitude),
      //zoomLevel: viewModel.mapLevel,
    );
    viewModel.mapController.updateMapOptions(viewModel.mapOptions);
    //关闭键盘
    SystemChannels.textInput.invokeMethod('TextInput.hide');
    //搜索周边poi
    getPoiByLocation(viewModel.suggestInfo.location!.latitude,
        viewModel.suggestInfo.location!.longitude);
    //搜索状态改为选择状态
    viewModel.isSearch = false;
    notifyChanges();
  }

核心代码基本上就是这样,其中一些组件是我封装的,无非也就是一些textfield,text,listview之类的,整体是封装了state,使用的是get_it这个库进行状态管理

下面我把完整的代码贴上来,大家参考一下

主要页面,大家的布局直接放在build里面就行,我外面进行了一次封装

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:flutter_baidu_mapapi_search/flutter_baidu_mapapi_search.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'package:get/get.dart';
import 'package:status_bar_control/status_bar_control.dart';
import 'package:zuguantong/activity/map/choose/item_poi.dart';
import 'package:zuguantong/activity/map/choose/item_suggest.dart';
import 'package:zuguantong/activity/map/choose/mapchoose_view_model.dart';
import 'package:zuguantong/yuchuangbase/const/colors.dart';
import 'package:zuguantong/yuchuangbase/utils/location_utils.dart';
import 'package:zuguantong/yuchuangbase/widget/ImageView.dart';
import 'package:zuguantong/yuchuangbase/widget/MyContainer.dart';
import 'package:zuguantong/yuchuangbase/widget/MyListView.dart';
import 'package:zuguantong/yuchuangbase/widget/TextView.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import '../../../yuchuangbase/base/base_state.dart';
import '../../../yuchuangbase/widget/CommonSearchLayout.dart';

///地图选址
class MapChooseActivity extends StatefulWidget {
  var keyboardVisibilityController = KeyboardVisibilityController();

  MapChooseActivity({Key? key}) : super(key: key);

  @override
  State<MapChooseActivity> createState() => _MapChooseActivityState();
}

class _MapChooseActivityState
    extends BaseState<MapChooseActivity, MapChooseViewModel> {
  @override
  void onCreate() async {
    hideTitle();
    showContent();
    viewModel.searchController.addListener(() {
      print("内容变化:开始");
      if (viewModel.searchController.text.isEmpty) {
        viewModel.isSearch = false;
        notifyChanges();
      }  else{
        viewModel.isSearch = true;
        searchLocation();
      }

    });
    //await StatusBarControl.setHidden(true, animation:StatusBarAnimation.NONE);
    widget.keyboardVisibilityController.onChange.listen((bool visible) {
      print('键盘: $visible');
      if (visible) {
        viewModel.isSearch = true;
      } else {
        viewModel.isSearch = false;
      }
      notifyChanges();
    });
  }

  @override
  void dispose() {
    super.dispose();
    SystemChannels.textInput.invokeMethod('TextInput.hide');
  }

  @override
  getContent(BuildContext context) {
    return Column(
      children: [
        Expanded(
            child: Stack(
          children: [
            BMFMapWidget(
              onBMFMapCreated: (controller) {
                viewModel.mapController = controller;
                onBMFMapCreated();
              },
              mapOptions: viewModel.mapOptions,
            ),
            Container(
              padding: const EdgeInsets.fromLTRB(10, 10, 10, 20),
              decoration: const BoxDecoration(
                gradient: LinearGradient(
                  begin: Alignment.topCenter,
                  end: Alignment.bottomCenter,
                  colors: [
                    Color(0x80a6a6a6),
                    //white,
                    transparent,
                  ],
                ),
              ),
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  TextView(
                    "取消",
                    textSize: 15,
                    textColor: Colors.white,
                    paddingLeft: 10,
                    paddingRight: 10,
                    paddingTop: 5,
                    paddingBottom: 5,
                    onClick: () {
                      Get.back();
                    },
                  ),
                  TextView(
                    "确定",
                    backgroundColor: green,
                    cornerRadius: 2,
                    textSize: 15,
                    textColor: Colors.white,
                    paddingLeft: 10,
                    paddingTop: 5,
                    paddingBottom: 5,
                    paddingRight: 10,
                    onClick: () {
                      if (viewModel.poiChooseName.isEmpty) {
                        showToast("您还未选择任何地址");
                      }  else{
                        Get.back(result: viewModel.poiInfo);
                      }

                    },
                  )
                ],
              ),
            ),
            Center(
                child: ImageView(
              "assets/images/ic_map_location.png",
              width: 30,
              height: 30,
            )),
          ],
        )),
        MyContainer(
          height: viewModel.contentHieght,
          backgroundColor: Colors.white,
          cornerRadius: 10,
          child: Column(
            children: [
              const SizedBox(
                height: 10,
              ),
              CommonSearchLayout(viewModel.searchController),
              Expanded(
                child: MyListView(
                    viewModel.isSearch
                        ? viewModel.suggestList
                        : viewModel.poiList,
                    dividerHeight: 1,
                    dividerColor: dividerColor, (context, index) {
                  if (viewModel.isSearch) {
                    //搜索
                    return SuggestItem(viewModel.suggestList[index], index,
                        (index1) {
                      onSuggestChoose(index1);
                    });
                  } else {
                    //选择
                    return PoiItem(
                        viewModel.poiList[index], viewModel.poiChooseName,
                        (text) {
                      viewModel.poiChooseName = text;
                      viewModel.poiInfo = viewModel.poiList[index];
                      notifyChanges();
                    });
                  }
                }),
              )
            ],
          ),
        )
      ],
    );
  }

  void onBMFMapCreated() {
    //地图被创建
    viewModel.mapController.setMapDidLoadCallback(callback: () {
      //地图已加载,地图中心移动到用户所在的位置
      showUserLocation();
    });

    //监听地图区域变化
    viewModel.mapController.setMapRegionDidChangeWithReasonCallback(callback:
        (BMFMapStatus mapStatus, BMFRegionChangeReason regionChangeReason) {
      print("地图区域变化:${mapStatus.targetGeoPt!.latitude}");
      viewModel.poiChooseName = "";
      //根据地图中心点检索周边事物
      getPoiByLocation(
          mapStatus.targetGeoPt!.latitude, mapStatus.targetGeoPt!.longitude);
      notifyChanges();
    });
  }

  //获取用户位置并移动地图到人员中心
  void showUserLocation() {
    LocationUtils().getCurrentLocation(context, (info) {
      viewModel.mapOptions = BMFMapOptions(
        center: BMFCoordinate(info.latitude!, info.longitude!),
        zoomLevel: viewModel.mapLevel,
      );
      viewModel.mapController.updateMapOptions(viewModel.mapOptions);
      getPoiByLocation(info.latitude!, info.longitude!);
    });
  }

  void getPoiByLocation(double latitude, double longitude) async {
    BMFReverseGeoCodeSearchOption reverseGeoCodeSearchOption =
        BMFReverseGeoCodeSearchOption(
            location: BMFCoordinate(latitude, longitude));
    // 检索实例
    BMFReverseGeoCodeSearch reverseGeoCodeSearch = BMFReverseGeoCodeSearch();
    // 逆地理编码回调
    reverseGeoCodeSearch.onGetReverseGeoCodeSearchResult(callback:
        (BMFReverseGeoCodeSearchResult result, BMFSearchErrorCode errorCode) {
      List<BMFPoiInfo>? list = result.poiList;
      viewModel.poiList.clear();
      if (result.poiList!.isNotEmpty) {
        viewModel.poiList.addAll(result.poiList!);
        if (viewModel.poiChooseName.isNotEmpty) {
          late BMFPoiInfo info;
          for (int i = 0; i < viewModel.poiList.length; i++) {
            if (viewModel.poiList[i].name == viewModel.poiChooseName) {
              viewModel.poiInfo = viewModel.poiList[i];
              viewModel.poiList.removeAt(i);
              viewModel.poiList.insert(0, viewModel.poiInfo);
            }
          }
        }
        notifyChanges();
        for (int i = 0; i < list!.length; i++) {
          BMFPoiInfo info = list[i];
          print("poi信息:${info.name!}---${info.address!}");
          print("poi信息:${info.pt!.longitude}---${info.pt!.latitude}");
        }
      } else {
        print("poi信息:空");
      }
      //print(`逆地理编码  errorCode = ${errorCode}  \n result = ${result?.toMap()}`);
      // 解析reslut,具体参考demo
    });
    await reverseGeoCodeSearch.reverseGeoCodeSearch(reverseGeoCodeSearchOption);
  }

  //根据输入的内容搜索相应的位置
  void searchLocation() async {
    viewModel.suggestList.clear();
    BMFSuggestionSearchOption suggestionSearchOption =
        BMFSuggestionSearchOption(
            keyword: viewModel.searchController.text, cityname: '北京市');
    BMFSuggestionSearch suggestionSearch = BMFSuggestionSearch();
    suggestionSearch.onGetSuggestSearchResult(callback:
        (BMFSuggestionSearchResult result, BMFSearchErrorCode errorCode) {
      if (result.suggestionList!.isNotEmpty) {
        //有搜索结果
        viewModel.suggestList.addAll(result.suggestionList!);
        for (int i = 0; i < result.suggestionList!.length; i++) {
          print("提醒位置:${result.suggestionList![i].key}");
        }
      } else {
        print("提醒位置:空");
      }
      notifyChanges();
    });
    await suggestionSearch.suggestionSearch(suggestionSearchOption);
  }

  void onSuggestChoose(int index) {
    //选中此项
    viewModel.suggestInfo = viewModel.suggestList[index];
    viewModel.poiChooseName = viewModel.suggestInfo.key!;
    //位置移动到此处
    viewModel.mapOptions = BMFMapOptions(
      center: BMFCoordinate(viewModel.suggestInfo.location!.latitude,
          viewModel.suggestInfo.location!.longitude),
      //zoomLevel: viewModel.mapLevel,
    );
    viewModel.mapController.updateMapOptions(viewModel.mapOptions);
    //关闭键盘
    SystemChannels.textInput.invokeMethod('TextInput.hide');
    //搜索周边poi
    getPoiByLocation(viewModel.suggestInfo.location!.latitude,
        viewModel.suggestInfo.location!.longitude);
    //搜索状态改为选择状态
    viewModel.isSearch = false;
    notifyChanges();
  }
}

状态管理自定义的变量

import 'package:flutter/cupertino.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
import 'package:flutter_baidu_mapapi_search/flutter_baidu_mapapi_search.dart';
import 'package:zuguantong/yuchuangbase/base/base_view_model.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';

class MapChooseViewModel extends BaseViewModel {
  //搜索textfield的控制
  TextEditingController searchController = TextEditingController();
  //poi信息列表
  List<BMFPoiInfo> poiList = [];
  //搜索提示列表
  List<BMFSuggestionInfo> suggestList = [];
  //选中的搜索提示信息
  late BMFSuggestionInfo suggestInfo;
  //地图缩放等级
  int mapLevel = 12;
  //选中的位置信息
  late BMFPoiInfo poiInfo;
  //当前是否是搜索的状态
  bool isSearch = false;
  //临时选中的位置名称
  String poiChooseName = "";
  //地图默认的坐标(北京天安门)
  double lat = 39.917215;
  double lon = 116.380341;
  String x = "徐工225H摊铺机";
  //下面白色区域的高度
  double contentHieght = 350;
  //地图控制器
  late BMFMapController mapController;
  //地图初始化时候的Options
  late BMFMapOptions mapOptions = BMFMapOptions(
      center: BMFCoordinate(lat, lon),
      zoomLevel: 12,
      mapPadding: BMFEdgeInsets(left: 30, top: 0, right: 30, bottom: 0));
}

主要就是里面的几个核心的方法,我都抽离出来单独讲了,大家有问题可以留言交流,有错欢迎指正,感谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

菜鸟Linux(2):进程优先级与进程状态

"才一年,看着世界变迁,有种沧海桑田" 一、进程调度 与 进程优先级 (1)何为优先级 双击.exe(可执行程序)文件 会发生什么&#xff1f; 但是,当我们使用电脑的时候,不仅仅只会 启动一个程序&#xff01; 系统中一定会有多个 进程同时存在&#xff01; 然而,需求是无…

什么是云手机?云手机的原理是什么?

什么是云手机? 云手机(Cloud Phone)是在云上运行APP的仿真手机。云手机服务根据不同场景提供多种规格的云手机&#xff0c;稳定24小时不间断&#xff0c;全面兼容Android原生APP&#xff0c;流畅运行大型手游&#xff0c;是移动办公好助手。云手机服务为您提供高性能、安全、…

微服务Spring Boot 整合 Redis 实现好友关注 – Feed流实现推送到粉丝收件箱

文章目录⛄引言一、Redis 实现好友关注 -- Feed流实现推送到粉丝收件箱⛅Feed 流实现方案⚡推送到粉丝收件箱三、Redis 实现好友关注 -- 实现分页滚动查询 实时获取信息⛵小结⛄引言 本博文参考 黑马 程序员B站 Redis课程系列 在点评项目中&#xff0c;有这样的需求&#xff…

【正点原子I.MX6U-MINI】删除开机内核Logo和进度条界面Logo

一、编译内核 内核源码1、例程源码-》3、正点原子 Uboot 和 Linux 出厂源码-》linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2。 在 Ubuntu 中新建名为“alientek_linux”的文件夹&#xff0c;然后将 linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2 这个压缩包拷贝到前面新建的 aliente…

Revit中用楼板编辑创建坡道的两种方法

在绘制坡道的时候&#xff0c;有一种两侧带坡度的坡道&#xff0c;一般我们采用楼板编辑的方式来创建。 方法有两种&#xff1a; 第一种是听过添加子图元的点来创建&#xff0c;方法如下&#xff0c; 首先绘制设计所需的楼板尺寸&#xff0c;完成之后点击楼板&#xff0c;形状编…

【Flutter 组件】004-基础组件:图片及 ICON

【Flutter 组件】004-基础组件&#xff1a;图片及 ICON 文章目录【Flutter 组件】004-基础组件&#xff1a;图片及 ICON一、图片1、Image概述Image 的几个构造方法常用属性ImageProvider2、从 asset 中加载图片第一步&#xff1a;准备图片第二步&#xff1a;使用图片第三步&…

9.高性能计算 期末复习

文章目录1.提纲2.第二章 并行硬件&程序设计2.1 SIMD&MIMD2.2 可扩展性2.7 串行程序并行化&#xff08;poster四步&#xff1a;划分、通信、聚合、分配&#xff09;3.mpi2.1 点对点gemm2.2集合通信gemmsend/recv实现reducesend/recv 实现ring AllReduce2.3 加速比2.4 奇…

数据预处理的方法有哪些?

数据处理的工作时间占据了整个数据分析项目的70%以上。因此&#xff0c;数据的质量直接决定了分析模型的准确性。那么&#xff0c;数据预处理的方法有哪些呢&#xff1f;比如数据清洗、数据集成、数据规约、数据变换等&#xff0c;其中最常用到的是数据清洗与数据集成&#xff…

医学影像篇

影像组学研究的基本流程知识点 01 准备工作 研究前我们先要做好准备工作&#xff1a;&#xff08;这个准备工作呢就好像小白做菜&#xff09; 最开始&#xff0c;我们往往主动提出或者被提出了一个临床问题&#xff08;临床问题可能是老板直接安排的&#xff0c;也可能是在临…

【网管日记】Nginx基本介绍、安装与使用

Nginx基本使用 基本介绍 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是 占用内存少&#xff0c;并发能力强 &#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好&#xff0c;中国大陆使用ngin…

AntV-G6:图表自动居中显示/画布自适应/fitView

需求描述 图表节点较多时&#xff0c;可能分布到屏幕可视范围之外&#xff0c;期望图表自动居中显示 调研分析 阅读官网文档&#xff1a;G6.Graph配置项&#xff0c;一下就看到了这个配置项&#xff1a; 看起来只要在初始化图表的配置里加上“fitView: true”就能万事大吉了…

解决PyCharm中opencv不自动补全的问题

解决PyCharm中opencv不自动补全的问题前言解决办法前言 今天下载opencv后&#xff0c;发现用pycharm打开并没有出现代码补全的情况&#xff0c;对于我这种新手极其不友好&#xff0c;故我去网上寻找方法。 opencv版本&#xff1a;4.6.0 寻找半天 有的说&#xff0c;要移动cv…

数据结构——二叉树的顺序存储(堆)

二叉树的顺序存储 顺序结构存储就是使用数组来存储&#xff0c;一般使用数组只适合表示完全二叉树&#xff0c;因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储&#xff0c;关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组&…

玩转MySQL:如何在高并发大流量情况下正确分库分表海量数据

引言 本篇数据库专栏内容&#xff0c;主要会讲解不同高并发场景下的MySQL架构设计方案&#xff0c;也包括对于各类大流量/大数据该如何优雅的处理&#xff0c;也包括架构调整后带来的后患又该如何解决&#xff1f;其中内容会涵盖库内分表、主从复制、读写分离、双主热备、垂直分…

极简而高效的沟通管理法(有点长,但都是干货)

我想说的意思不是说为了体现工作的价值&#xff0c;要故意提高工作的沟通成本&#xff0c;相反&#xff0c;我们的确需要通过归纳总结梳理标准话的流程、甚至是工具化的手段来降低一个领域的沟通&#xff0c;但我们同时工作在找更复杂、更需要去沟通的场景中&#xff0c;去创造…

【PTA-训练day16】L2-028 秀恩爱分得快 + L1-064 估值一亿的AI核心代码

&#xff01;L2-028 秀恩爱分得快 - 分块大模拟 PTA | 程序设计类实验辅助教学平台 这个题还是挺考验 函数合理运用 和 数据模拟处理能力 的 思路&#xff1a; 因为可能出现-0这种输入 所以不能是int型 stoi() 将字符串转化为整数先把每张照片的人 按照片编号储存因为题目只要…

手慢无!阿里云神作被《Spring Boot进阶原理实战》成功扒下,限时

小编又来给大家分享好书了&#xff1a;郑天民老师的 《Spring Boot进阶:原理、实战与面试题分析》&#xff0c;别问网上有没有开源版本&#xff01;问就是我也不知道&#xff0c;哈哈&#xff01;小编会在文末附电子版下载方式。 郑天民是谁&#xff1f; 资深架构师和技术专家…

非程序员,到底该不该学Python

前言 最近被各种Python的小广告轰炸。也有很多非程序员的朋友咨询Python相关的事儿。&#xff08;前两年是前端&#xff09; 所以今天不讲技术&#xff0c;纯BB。 进入正题吧&#xff1a; Python是啥&#xff1a; 编程语言。和大多数编程语言一样。它只能帮助人类完成一些…

3000字带你读懂:BI能解决报表解决不了的什么问题?

一、BI不等于报表 工作原因&#xff0c;老李经常跟不同行业的人打交道。不聊不知道&#xff0c;在大肆谈论“数字化转型”、“信创”、“业务对象数字化”、“BI”这类大而广的词语之下&#xff0c;隐藏着的却是国人的无知。搞业务的朋友不太懂这类工具和概念&#xff0c;我也…

mac怎么删除硬盘里面的东西?为什么苹果电脑无法删除移动硬盘文件?

mac怎么删除硬盘里面的东西&#xff1f;由于移动硬盘的文件系统是NTFS格式的&#xff0c;而这种格式与Mac电脑是不兼容的&#xff0c;Mac电脑没有权限对移动硬盘上的数据进行操作&#xff0c;Mac上不能把移动硬盘的数据删除了&#xff0c;那么&#xff0c;有没有什么操作方法&a…