Flutter - APP跳转高德、百度、腾讯、谷歌地图

这篇具有很好参考价值的文章主要介绍了Flutter - APP跳转高德、百度、腾讯、谷歌地图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

demo 地址: https://github.com/iotjin/jh_flutter_demo
代码不定时更新,请前往github查看最新代码

这里介绍的是不需要自己开发地图,直接通过给定的经纬度,跳转到三方地图APP调用导航的方式
一种是写的工具类,一种是通过调用三方库map_launcher实现的

官方文档:

  • 跳转高德导航 - 路径规划
    高德地图官方文档 - Android
    高德地图官方文档 - iOS

  • 跳转高德导航
    高德地图官方文档

  • 跳转百度导航 - 路径规划
    百度地图官方文档

  • 跳转腾讯导航
    腾讯地图官方文档

参考文章:

Flutter 跳转地图软件调起导航:百度、高德、腾讯、苹果
Flutter 实战调起三方地图导航(高德、百度、腾讯、苹果)

插件:
map_launcher
flutter_map
maps_launcher

实现

在 pubspec.yaml 文件中添加依赖插件:文章来源地址https://www.toymoban.com/news/detail-808571.html

  # url打开工具 https://pub.flutter-io.cn/packages/url_launcher
  url_launcher: ^6.1.14
  # 打开地图工具 https://pub.flutter-io.cn/packages/map_launcher
  map_launcher: ^2.5.0+1

示例demo

///  map_jump_test_page.dart
///
///  Created by iotjin on 2023/10/16.
///  description: 跳转三方地图APP

import 'package:flutter/material.dart';
import 'package:map_launcher/map_launcher.dart';
import '/jh_common/utils/jh_map_utils.dart';
import '/jh_common/widgets/jh_text_list.dart';

// ignore_for_file: avoid_print

final List titleData = [
  '高德(JhMapUtils)',
  '高德2(JhMapUtils)',
  '百度(JhMapUtils)',
  '腾讯(JhMapUtils)',
  '三方库跳转高德(map_launcher)',
  '三方库弹出地图列表(map_launcher)',
];

class MapJumpTestPage extends StatefulWidget {
  const MapJumpTestPage({Key? key}) : super(key: key);

  
  State<MapJumpTestPage> createState() => _MapJumpTestPageState();
}

class _MapJumpTestPageState extends State<MapJumpTestPage> {
  var latitude = 39.922869448132474;
  var longitude = 116.40748500823975;

  
  Widget build(BuildContext context) {
    return JhTextList(
      title: '跳转三方地图导航',
      dataArr: titleData,
      callBack: (index, str) {
        if (str == '高德(JhMapUtils)') {
          JhMapUtils.openAMapNavi(dLatitude: latitude, dLongitude: longitude);
        }
        if (str == '高德2(JhMapUtils)') {
          JhMapUtils.openAMapNavi2(latitude: latitude, longitude: longitude);
        }
        if (str == '百度(JhMapUtils)') {
          JhMapUtils.openBaiduMapNavi(dLatitude: latitude, dLongitude: longitude);
        }
        if (str == '腾讯(JhMapUtils)') {
          JhMapUtils.openTencentMapNavi(dLatitude: latitude, dLongitude: longitude);
        }
        if (str == '三方库跳转高德(map_launcher)') {
          _gotoMap();
        }
        if (str == '三方库弹出地图列表(map_launcher)') {
          _openMapsSheet(context);
        }
      },
    );
  }

  _gotoMap() async {
    // Get list of installed maps and launch first
    final availableMaps = await MapLauncher.installedMaps;
    print(availableMaps); // [AvailableMap { mapName: Google Maps, mapType: google }, ...]
    // [
    //   AvailableMap{
    //   mapName: GoogleMaps,
    //   mapType: google
    // },
    //   AvailableMap{
    //   mapName: Amap,
    //   mapType: amap
    // },
    //   AvailableMap{
    //   mapName: BaiduMaps,
    //   mapType: baidu
    // },
    //   AvailableMap{
    //   mapName: Tencent(QQMaps),
    //   mapType: tencent
    // }
    // ]

    // await availableMaps.first.showMarker(
    //   coords: Coords(latitude, longitude),
    //   title: "Ocean Beach",
    // );
    // await availableMaps[1].showMarker(
    //   coords: Coords(latitude, longitude),
    //   title: "Ocean Beach",
    // );

    // Check if map is installed and launch it #
    var canIn = await MapLauncher.isMapAvailable(MapType.amap);
    print('canIn: $canIn');
    if (await MapLauncher.isMapAvailable(MapType.amap) == true) {
      await MapLauncher.showMarker(
        mapType: MapType.amap,
        coords: Coords(latitude, longitude),
        title: 'title',
        description: 'description',
      );
    }
  }

  _openMapsSheet(context) async {
    try {
      const title = "Ocean Beach";
      final availableMaps = await MapLauncher.installedMaps;

      showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return SafeArea(
            child: SingleChildScrollView(
              child: Wrap(
                children: <Widget>[
                  for (var map in availableMaps)
                    ListTile(
                      onTap: () => map.showMarker(coords: Coords(latitude, longitude), title: title),
                      title: Text(map.mapName),
                      leading: const Icon(Icons.map, size: 30),
                    ),
                ],
              ),
            ),
          );
        },
      );
    } catch (e) {
      print(e);
    }
  }
}

jh_map_utils实现代码

///  jh_map_utils.dart
///
///  Created by iotjin on 2023/05/06.
///  description:

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import 'jh_device_utils.dart';

class JhMapUtils {
  /// 跳转其他App
  static Future<void> jumpApp({String? url, String message = '跳转失败!'}) async {
    final Uri uri = Uri.parse(url ?? '');
    if (await canLaunchUrl(uri)) {
      await launchUrl(uri);
    } else {
      debugPrint(message);
      // JhProgressHUD.showText(message);
    }
  }

  /// 判断地图是否有安装
  static Future<bool> isInstallMap(String url) async {
    // var url = Uri.parse(Uri.encodeFull(url));
    final Uri uri = Uri.parse(url);
    bool canLaunch = await canLaunchUrl(uri);
    debugPrint('canLaunch: $canLaunch');
    return canLaunchUrl(uri);
  }

  /// 跳转高德导航 - 路径规划
  /// 高德地图官方文档 - Android: https://lbs.amap.com/api/amap-mobile/guide/android/route
  /// 高德地图官方文档 - iOS: https://lbs.amap.com/api/amap-mobile/guide/ios/route
  static void openAMapNavi({
    double? sLatitude, // 起点纬度
    double? sLongitude, // 起点经度
    String sName = '', // 起点名称
    required double dLatitude, // 终点纬度
    required double dLongitude, // 终点经度
    String dName = '', // 终点名称
    String dev = '0', // 起终点是否偏移。0:lat和lon是已经加密后的,不需要国测加密;1:需要国测加密,可为空,但起点或终点不为空时,不能为空
    String t = '0', // t = 0 驾车;    t = 1 公交;    t = 2 步行;    t = 3 骑行(骑行仅在V788以上版本支持)
    String message = '您没有安装高德地图,请先安装高德地图!',
  }) async {
    if (!JhDeviceUtils.isMobile) {
      return;
    }
    var type = JhDeviceUtils.isIOS ? 'iosamap://path?sourceApplication=applicationName&' : 'amapuri://route/plan/?';
    var url =
        '${type}sid=&slat=${sLatitude ?? ''}&slon=${sLongitude ?? ''}&sname=$sName&dlat=$dLatitude&dlon=$dLongitude&dname=$dName&dev=$dev&t=$t';
    // if (!(await canLaunchUrl(Uri.parse(url)))) {
    //   debugPrint(message);
    //   // JhProgressHUD.showText(message);
    //   return;
    // }
    await launchUrl(Uri.parse(url));
  }

  /// 跳转高德导航
  /// 高德地图官方文档: https://lbs.amap.com/api/amap-mobile/guide/android/navigation
  static void openAMapNavi2({
    required double latitude,
    required double longitude,
    String poiName = '',
    String dev = '0', // 是否偏移(0:lat 和 lon 是已经加密后的,不需要国测加密; 1:需要国测加密)
    String message = '您没有安装高德地图,请先安装高德地图!',
  }) async {
    var device = JhDeviceUtils.isAndroid ? 'android' : 'ios';
    var url = '${device}amap://navi?sourceApplication=amap&poiname=$poiName&lat=$latitude&lon=$longitude&dev=$dev';
    // if (!(await canLaunchUrl(Uri.parse(url)))) {
    //   debugPrint(message);
    //   // JhProgressHUD.showText(message);
    //   return;
    // }
    await launchUrl(Uri.parse(url));
  }

  /// 跳转百度导航 - 路径规划
  /// 百度地图官方文档: https://lbsyun.baidu.com/index.php?title=uri/api/android
  static void openBaiduMapNavi({
    double? sLatitude, // 起点纬度
    double? sLongitude, // 起点经度
    String sName = '', // 起点名称
    required double dLatitude, // 终点纬度
    required double dLongitude, // 终点经度
    String dName = '', // 终点名称
    String mode = 'driving', // 导航模式,可选transit(公交)、driving(驾车)、walking(步行)和riding(骑行)默认:driving
    String coordType =
        'gcj02', // 坐标类型,必选参数。coord_type= bd09ll 允许的值为:bd09ll(百度经纬度坐标) bd09mc(百度墨卡托坐标) gcj02(经国测局加密的坐标) wgs84(gps获取的原始坐标)
    String message = '您没有安装百度地图,请先安装百度地图!',
  }) async {
    var url =
        'baidumap://map/direction?origin=name:$sName|latlng:$sLatitude,$sLongitude&destination=name:$dName|latlng:$dLatitude,$dLongitude&mode=$mode&coord_type=$coordType';
    // if (!(await canLaunchUrl(Uri.parse(url)))) {
    //   debugPrint(message);
    //   // JhProgressHUD.showText(message);
    //   return;
    // }
    await launchUrl(Uri.parse(url));
  }

  /// 跳转腾讯导航
  /// 腾讯地图官方文档: https://lbs.qq.com/webApi/uriV1/uriGuide/uriMobileRoute
  static void openTencentMapNavi({
    double? sLatitude, // 起点纬度
    double? sLongitude, // 起点经度
    String sName = '', // 起点名称
    required double dLatitude, // 终点纬度
    required double dLongitude, // 终点经度
    String dName = '', // 终点名称
    String type = 'drive', // 路线规划方式参数:  公交:bus  驾车:drive  步行:walk  骑行:bike
    String referer = 'OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77', // 请填写开发者key,
    String message = '您没有安装腾讯地图,请先安装腾讯地图!',
  }) async {
    // 起点坐标,格式:lat,lng (纬度在前,经度在后,逗号分隔)  功能参数值:CurrentLocation :使用定位点作为起点坐标
    var formInfo = (sLatitude == null || sLongitude == null)
        ? 'from=$sName&CurrentLocation'
        : 'from=$sName&fromcoord=$sLatitude,$sLongitude';
    var url = 'qqmap://map/routeplan?type=$type&${formInfo}&to=$dName&tocoord=$dLatitude,$dLongitude&referer=$referer';
    // if (!(await canLaunchUrl(Uri.parse(url)))) {
    //   debugPrint(message);
    //   // JhProgressHUD.showText(message);
    //   return;
    // }
    await launchUrl(Uri.parse(url));
  }

  static const double earthRadius = 6378.137; //地球半径

  //计算两点间距离
  static double distance(double lat1, double lng1, double lat2, double lng2) {
    double radLat1 = _rad(lat1);
    double radLat2 = _rad(lat2);
    double a = radLat1 - radLat2;
    double b = _rad(lng1) - _rad(lng2);
    double s = 2 * asin(sqrt(pow(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(b / 2), 2)));
    s *= earthRadius;
    s = (s * 10000).round() / 10000;
    return s;
  }

  static double _rad(double d) {
    return d * pi / 180.0; //角度转换成弧度
  }
}

到了这里,关于Flutter - APP跳转高德、百度、腾讯、谷歌地图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序学习实录5(H5嵌入小程序、map组件、地图调起功能、腾讯百度高德导航页、返回web-view页)

    创建容器 地图家长 在H5页面引入 //res.wx.qq.com/open/js/jweixin-1.6.0.js ,建议使用高版本; 点击返回按钮 调用微信小程序和H5通用API 判断是否在微信小程序环境中 地图调起,再次返回小程序页 获取H5传递参数的方式为: console.log(options) latitude和longitude必须为数字类型,不支持字符

    2024年02月07日
    浏览(95)
  • 高德地图与百度地图坐标相互转化

    1. WGS-84原始坐标系 ,一般用国际GPS纪录仪记录下来的经纬度,通过GPS定位拿到的原始经纬度,Google和高德地图定位的的经纬度(国外)都是基于WGS-84坐标系的;但是在国内是不允许直接用WGS84坐标系标注的,必须经过加密后才能使用; 2. GCJ-02坐标系 ,又名“火星坐标系

    2024年02月16日
    浏览(43)
  • 微信小程序腾讯地图定位转高德地图定位

    微信小程序获取到了当前用户的定位,需要在高德地图上进行渲染。 发现正常渲染后,偏差几百米。 这里图方便,直接丢到window上了 这里演示“腾讯地图”转“高德地图”

    2024年01月25日
    浏览(95)
  • 高德百度腾讯之间经纬度的转换

    提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 百度地图: 高德地图: 腾讯地图 最后转换结果 可知,高德和腾讯使用的编码方式是一样的,所以最后转换的经纬度基本一样

    2024年02月13日
    浏览(50)
  • flutter高德地图大头针

    1、效果图 2、pub get #地图定位 amap_flutter_map: ^3.0.0 amap_flutter_location: ^3.0.0 3、上代码

    2024年02月11日
    浏览(42)
  • 小程序引入高德/百度地图坐标系详解

    官网最近更新时间:最后更新时间: 2021年08月17日 高德官网之在原生小程序中使用的常见问题 链接 目前在小程序中使用 高德地图只支持以下功能 :地址描述、POI 和实时天气数据 小结:从高德api中获取数据然后更新到腾讯地图的map上 其实还是使用的腾讯地图 只不过数据的来

    2024年02月09日
    浏览(52)
  • 高德地图H5内嵌小程序遇到的跳转地图问题

    h5中的地图是这样展示的,在微信小程序是无法跳转的 引入jweixin.js vue里判断 在小程序这边接收传过来的参数(需要注意的是:高德地图坐标和腾讯坐标是一样的,只需要经纬度反过来即可) 最后在小程序中呈现是这样,就完美实现了

    2024年02月11日
    浏览(46)
  • flutter实现调用原生安卓的高德地图导航功能(插件化)

    查看了高德地图flutter插件的文档,都没有能支持导航的功能,并且flutter的高德插件支持的功能特别少,没办法,只能使用安卓原生的导航,flutter去调用了,具体实现方式如下: 创建 Flutter 插件 使用--template=plugin 声明创建的是同时包含了 iOS 和 Android 代码的 plugin; 使用--o

    2024年02月16日
    浏览(51)
  • uniapp App端使用高德地图

    uniapp App端使用高德地图 先去高德官网申请keyhttps://console.amap.com/dev/key/app 关于SHA1生成方法如下:https://lbs.amap.com/faq/android/map-sdk/create-project/43112 我使用的是使用 keytool(jdk自带工具)获取SHA1 PackageName包名和你需要云打包的项目Android包名一样 打开项目manifest.json文件,将所需的

    2024年02月05日
    浏览(69)
  • uniapp 开发安卓App实现高德地图路线规划导航

    描述这个技术是做什么的/什么情况下会使用到这个技术,学习该技术的原因,技术的难点在哪里。控制在50-100字内。 uniapp的map组件中导航路线的展示。是uniapp开发app时引入地图导航的实现方式。技术难点在于实现map组件时对于属性以及函数的细节使用很容易出现一些奇怪的

    2024年02月01日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包