Flutter高德地图集成插件xbr_gaode_amap的使用
Flutter高德地图集成插件xbr_gaode_amap的使用
介绍,高德系列:
基础包
高德地图合包:xbr_gaode_map
,包含地图+检索+定位
高德导航合包:xbr_gaode_navi_map
,包含地图+检索+定位+内置导航
码云地址:https://gitee.com/mywentop/xbr_gaode_navi_amap
演示:
主要功能
-
增加地图查询插件,查询功能如下
- 关键字检索 POI
- POI详情
- 线路规划
- 货车线路规划(先去高德客服申请)
- 查询输入提示 InputTips
- 地理编码(地址转坐标)
- 逆地理编码(坐标转地址)
-
定位功能
- 原生部分完全使用官方提供的SDK:
amap_flutter_location
;未额外增加任何功能,可以使用官方SDK所有方法 - 处理了定位返回数据:iOS和Android兼容(官方SDK只返回Map,而且iOS和Android返回的字段不一致)
- 简化了定位回调,使用:
XbrGaodeLocation.startLocation(callback:...)
- 原生部分完全使用官方提供的SDK:
-
地图功能在官方SDK(
amap_flutter_map
)做了以下调整- 原生部分完全使用官方提供的SDK:
amap_flutter_map
;未额外增加任何功能,但修复了一些BUG - 简化地图绘制流程,增加地图UI绘制器:
AMapUIController()
- 增加了利用多边形绘制圆的方法
- 修复Marker不能平铺在地图上,使用
FMarker
增加了flat
字段,为true时可以平铺在地图上 - 协调了地图查询功能和地图的整合,可以一键绘制路线
- 原生部分完全使用官方提供的SDK:
安装教程
xbr_gaode_amap: ^6.0.0
使用说明
xbr_gaode_amap
已经集成了xbr_gaode_search
和xbr_gaode_location
,导入如下:
import 'package:xbr_gaode_search/xbr_gaode_search.dart';
xbr_gaode_location
在官方SDK上重新封装过,如需使用,可单独引入:- 定位权限配置,使用第三方
permission_handler
动态权限工具,使用方法请参考permission_handler
文档。 xbr_gaode_location
使用
- 定位权限配置,使用第三方
// 开始单次定位,定位成功自动销毁
XbrGaodeLocation.instance().execOnceLocation(callback: (LocationInfo? location) {
// location 对iOS和Android数据已兼容处理
});
// 开启连续定位
XbrGaodeLocation.instance().startTimeLocation(callback: (LocationInfo? location) {
// location 对iOS和Android数据已兼容处理
});
[@override](/user/override)
void dispose() {
mapController?.dispose();
uiController.dispose();
// 销毁连续定位
XbrGaodeLocation.instance().destroyTimeLocation();
super.dispose();
}
- 地图使用:
AMapUIController uiController = AMapUIController();
// 简单使用,默认了地图部分功能,快速使用
XbrAmapWidget(
initCameraPosition: CameraPosition(target: LatLng(26.653841, 106.642904), bearing: 45, zoom: 12, tilt: 15),
uiController: uiController,
onMapCreated: (AMapController controller) {
// 地图加载完成
},
onCameraMove: (CameraPosition position) {
// 地图移动
},
onCameraMoveEnd: (CameraPosition position) {
// 地图移动结束
},
)
// 或者使用需要满足地图所有功能时使用,绘制需要自己控制和刷新,uiController无法使用
AMapWidget(
privacyStatement: XbrGaodeAmap.instace().statement,
apiKey: XbrGaodeAmap.instace().apikey,
mapType: widget.mapType ?? MapType.normal,
markers: Set.of(markers.values),
polylines: Set.of(polylines.values),
polygons: Set.of(polygons.values),
initialCameraPosition: widget.initCameraPosition,
gestureScaleByMapCenter: widget.gestureScaleByMapCenter,
onCameraMove: widget.onCameraMove,
onCameraMoveEnd: widget.onCameraMoveEnd,
onMapCreated: widget.onMapCreated,
scaleEnabled: false,
)
// 线路规划
AmapSearchUtil.routePlanning(
// 最多支持18个点,第一个为起点,最后一个为终点,中间为途径点
wayPoints: list,
callBack: (code, linePoints, bounds) {
// code 1000为成功
// linePoints 返回的线点集合,如果需要导航数据,使用方法:XbrAmapSearch.routeSearch() 返回全部数据
// bounds 计算了一个包含线路所有点位的矩形坐标盒(最大可视面积),移动相机时可以直接使用,如下所示
// 绘制规划线 pathlineId 是唯一值 需自定义
// customTexture:线路Texture图片,可以不设置,使用颜色
uiController.savePolyline("pathlineId", Polyline(
customTexture: lineImgPath != null ? BitmapDescriptor.fromIconPath(lineImgPath) : null,
joinType: JoinType.round,
capType: CapType.round,
points: linePoints,
color: lineColor ?? Colors.blueAccent,
width: 14,
));
// 利用MAP控制器移动相机到线路最大可视面积,边距50,时间1000毫秒,可自行更改
mapController.moveCamera(CameraUpdate.newLatLngBounds(bounds, 50), duration: 1000);
...
/// 绘制完要刷新地图
uiController.refeashUI();
}
)
// 地图绘制
// 1. 绘制线
uiController.savePolyline("pathlineId", Polyline(..));
// 2. 绘制marker (flat:可将图片贴在地图上,随3d地图旋转)
uiController.saveMarker("markerId", FlatMarker(flat:...));
// 3. 绘制圆
// 获取圆数据:latLng中心点,radius圆的半径(真实半径:单位-米(m),可以制作电子围栏)
var points = AmapUtil.getCirclePoints(center: latLng, radiusMi: radius);
// 利用绘制多边形绘制圆
uiController.savePolygon("polygonId", Polygon(points: points, ...));
/// 绘制完要刷新地图
uiController.refeashUI();
示例代码
import 'package:flutter/material.dart';
import 'package:xbr_gaode_amap/xbr_gaode_amap.dart';
import 'package:xbr_gaode_amap_example/core/confirm_dialog.dart';
import 'package:xbr_gaode_amap_example/core/permission_util.dart';
import 'demo_page/amap_search_page.dart';
import 'demo_page/location_map_page_page.dart';
import 'demo_page/planning_map_page_page.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
[@override](/user/override)
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
[@override](/user/override)
void initState() {
super.initState();
// 测试时可以用下面的KEY,这是本人申请的个人账户,上线自己申请
initKey(
androidKey: "0d0a960349e6b9cfcbffa6bf5d8b553e",
iosKey: "6576199a6c246345e57fee50d2edc8d1",
);
}
// 建议在工具类一键处理 key应该都一样
void initKey({androidKey, iosKey}) {
// 地图初始化
XbrGaodeAmap.initKey(androidKey: androidKey, iosKey: iosKey);
XbrGaodeAmap.updatePrivacy(hasContains: true, hasShow: true, hasAgree: true);
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage(),
);
}
}
/// 测试页
class HomePage extends StatefulWidget {
[@override](/user/override)
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool permissionSuccess = false;
String permissionMessage = "正在授权";
[@override](/user/override)
void initState() {
super.initState();
initPermission();
}
/// 动态权限
initPermission() {
PermissionUtil.requestPermissions(context, (success, msg) {
setState(() {
permissionSuccess = success;
permissionMessage = msg;
});
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('小镖人高德地图测试'),
),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(permissionMessage),
SizedBox(height: 20),
ElevatedButton(
child: Text("打开高德地图--显示定位,位置标注"),
onPressed: () {
if (permissionSuccess == false) {
ConfirmDialog.show(context, title: "授权未成功", text: "重新授权?", surePass: () {
initPermission();
});
return;
}
Navigator.push(context, MaterialPageRoute(builder: (context) => LocationMapPage()));
},
),
ElevatedButton(
child: Text("打开高德地图--地址搜索"),
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => AmapSearchPage()));
},
),
ElevatedButton(
child: Text("打开高德地图--线路规划"),
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => PlanningMapPage()));
},
),
ElevatedButton(
child: Text("猎鹰轨迹--日志窗口"),
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => PlanningMapPage()));
},
),
],
),
),
);
}
}
更多关于Flutter高德地图集成插件xbr_gaode_amap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter高德地图集成插件xbr_gaode_amap的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中集成并使用xbr_gaode_amap
插件的示例代码。这个插件允许你在Flutter应用中集成高德地图功能。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加xbr_gaode_amap
依赖:
dependencies:
flutter:
sdk: flutter
xbr_gaode_amap: ^最新版本号 # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
2. 配置高德地图API Key
在android/app/src/main/AndroidManifest.xml
中添加你的高德地图API Key:
<application
... >
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="你的高德地图API Key"/>
...
</application>
对于iOS,你需要在Info.plist
中添加以下键和值:
<key>io.flutter.embedded_views_preview</key>
<true/>
<key>AMapServicesKey</key>
<string>你的高德地图API Key</string>
3. 初始化高德地图
在你的Flutter应用中,你需要初始化高德地图插件。以下是一个简单的示例,展示了如何在Flutter中显示高德地图:
import 'package:flutter/material.dart';
import 'package:xbr_gaode_amap/xbr_gaode_amap_flutter.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MapScreen(),
);
}
}
class MapScreen extends StatefulWidget {
@override
_MapScreenState createState() => _MapScreenState();
}
class _MapScreenState extends State<MapScreen> {
late AMapController _amapController;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('高德地图集成示例'),
),
body: AMapView(
apiKey: '你的高德地图API Key', // 你可以在这里再次指定API Key,但通常在AndroidManifest和Info.plist中指定即可
onMapCreated: (AMapController controller) {
_amapController = controller;
// 可以在这里设置初始中心点等
_amapController.moveCamera(
CameraPosition(
target: LatLng(39.9042, 116.4074), // 北京天安门
zoom: 16.0,
),
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 示例:添加一个标记
_amapController.addMarker(
MarkerOptions(
position: LatLng(39.9042, 116.4074),
title: '天安门',
snippet: '北京的中心',
),
);
},
tooltip: '添加标记',
child: Icon(Icons.add),
),
);
}
}
4. 运行应用
完成上述步骤后,你可以通过运行flutter run
命令来启动你的Flutter应用,并查看高德地图的集成效果。
注意事项
- 确保你已经正确获取并配置了高德地图的API Key。
- 在实际项目中,不要将API Key硬编码在客户端代码中,可以使用更安全的方式来管理API Key,比如环境变量或后端服务。
- 插件的API可能会随着版本更新而变化,请参考插件的官方文档以获取最新的使用方法和最佳实践。
希望这个示例代码能帮助你成功集成并使用xbr_gaode_amap
插件。