From aa6bca76b368ed90d0ff637b065f975db11b5422 Mon Sep 17 00:00:00 2001 From: yangjie <168149434@qq.com> Date: Sun, 17 Nov 2024 16:02:18 +0800 Subject: [PATCH] 1 --- .gitignore | 43 ++ CHANGELOG.md | 3 + LICENSE | 13 + README.md | 14 + analysis_options.yaml | 8 + lib/src/enums.dart | 104 ++++ lib/src/functions.dart | 1 + lib/src/map_controller.dart | 301 +++++++++++ lib/src/map_service.dart | 9 + lib/src/models.dart | 100 ++++ lib/src/options.dart | 580 ++++++++++++++++++++++ lib/uni_map_platform_interface.dart | 11 + pubspec.lock | 220 ++++++++ pubspec.yaml | 20 + test/uni_map_platform_interface_test.dart | 1 + 15 files changed, 1428 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 lib/src/enums.dart create mode 100644 lib/src/functions.dart create mode 100644 lib/src/map_controller.dart create mode 100644 lib/src/map_service.dart create mode 100644 lib/src/models.dart create mode 100644 lib/src/options.dart create mode 100644 lib/uni_map_platform_interface.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/uni_map_platform_interface_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..ac07159 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,3 @@ +## [0.0.1] - TODO: Add release date. + +* TODO: Describe initial release. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..12fde5f --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2020 yohom + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3f4a83b --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# uni_map_platform_interface + +Uni Map Platform Interface. + +## Getting Started + +This project is a starting point for a Dart +[package](https://flutter.dev/developing-packages/), +a library module containing code that can be shared easily across +multiple Flutter or Dart projects. + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..315cb7e --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,8 @@ +include: package:pedantic/analysis_options.yaml + +linter: + rules: + camel_case_types: false + camel_case_extensions: false + omit_local_variable_types: false + prefer_single_quotes: false \ No newline at end of file diff --git a/lib/src/enums.dart b/lib/src/enums.dart new file mode 100644 index 0000000..efd8ff2 --- /dev/null +++ b/lib/src/enums.dart @@ -0,0 +1,104 @@ +/// 地图类型 +enum MapType { + /// 标准视图 + Standard, + + /// 卫星视图 + Satellite, + + /// 黑夜视图 + Night, + + /// 导航视图 + Navi, + + /// 公交视图 + Bus, +} + +/// 地图语言 +enum Language { + /// 中文 + Chinese, + + /// 英文 + English, +} + +/// 坐标类型 +enum CoordType { + GPS, + Google, + MapBar, + Baidu, + MapABC, + SosoMap, + Aliyun, +} + +/// 线段末端处样式 +enum LineCapType { + /// 普通头 + Butt, + + /// 扩展头 + Square, + + /// 箭头 + Arrow, + + /// 圆形头 + Round, +} + +/// 线段连接处样式 +enum LineJoinType { + /// 斜面连接点 + Bevel, + + /// 斜接连接点 + Miter, + + /// 圆角连接点 + Round, +} + +/// 虚线样式 +enum DashType { + /// 方块样式 + Square, + + /// 圆点样式 + Circle, +} + +enum MyLocationType { + /// 只定位 + Show, + + /// 定位一次, 并移动到中心 + Locate, + + /// 跟随 + Follow, + + /// 跟随, 但不移动到地图中心 + FollowNoCenter, + + /// 方向跟随 + Rotate, +} + +/// 动画重复方式 +enum RepeatMode { + Restart, + Reverse, +} + +enum RideType { + /// 电动车 + elebike, + + /// 自行车 + bike, +} diff --git a/lib/src/functions.dart b/lib/src/functions.dart new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/lib/src/functions.dart @@ -0,0 +1 @@ + diff --git a/lib/src/map_controller.dart b/lib/src/map_controller.dart new file mode 100644 index 0000000..b907a50 --- /dev/null +++ b/lib/src/map_controller.dart @@ -0,0 +1,301 @@ +import 'dart:async'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:core_location_fluttify/core_location_fluttify.dart'; +import 'package:flutter/material.dart'; + +import 'enums.dart'; +import 'models.dart'; +import 'options.dart'; + +/// marker点击事件回调签名 输入[Marker]对象 +typedef OnMarkerClicked = FutureOr Function(IMarker marker); + +/// 地图点击事件回调签名 +typedef OnMapClicked = FutureOr Function(LatLng latLng); + +/// 地图移动事件回调签名 +typedef OnMapMove = FutureOr Function(MapMove move); + +/// Marker拖动回调签名 +typedef OnMarkerDrag = FutureOr Function(IMarker marker); + +/// 地图控制类 +abstract class IMapController { + /// Dispose map controller. + Future dispose(); + + /// Add tile overlay. + Future addUrlTileOverlay(UrlTileOption option); + + /// Get current location. + Future getLocation(); + + /// Show my location with [option]. + Future showMyLocation(MyLocationOption option); + + /// 设置我的位置图标旋转角度 + Future setMyLocationRotateAngle(double angle); + + /// 是否显示室内地图 + Future showIndoorMap(bool show); + + /// 选择显示图层 + Future setMapType(MapType mapType); + + /// 显示路况信息 + Future showTraffic(bool enable); + + /// 显示缩放控件 + Future showZoomControl(bool enable); + + /// 显示指南针 + Future showCompass(bool enable); + + /// 显示定位按钮 + Future showLocateControl(bool enable); + + /// 显示比例尺控件 + Future showScaleControl(bool enable); + + /// 缩放手势使能 + Future setZoomGesturesEnabled(bool enable); + + /// 滑动手势使能 + Future setScrollGesturesEnabled(bool enable); + + /// 旋转手势使能 + Future setRotateGesturesEnabled(bool enable); + + /// 旋转手势使能 + Future setTiltGesturesEnabled(bool enable); + + /// 所有手势使能 + Future setAllGesturesEnabled(bool enable); + + /// 设置缩放大小 + /// + /// 地图的缩放级别一共分为 17 级,从 3 到 19. 数字越大,展示的图面信息越精细 + Future setZoomLevel(double level, {bool animated = true}); + + /// 获取当前缩放大小 + Future getZoomLevel(); + + /// 设置缩放是否以中心点为锚点 + Future setZoomByCenter(bool byCenter); + + /// 放大一个等级 + Future zoomIn({bool animated = true}); + + /// 放大一个等级 + Future zoomOut({bool animated = true}); + + /// 设置地图中心点 + /// + /// [lat]纬度, [lng]经度, [zoomLevel]缩放等级, [bearing]地图选择角度, [tilt]倾斜角 + Future setCenterCoordinate( + LatLng coordinate, { + double? zoomLevel, + double? bearing, + double? tilt, + bool animated = true, + }); + + /// 获取地图中心点 + Future getCenterCoordinate(); + + /// 添加marker + /// + /// 在纬度[lat], 经度[lng]的位置添加marker, 并设置标题[title]和副标题[snippet], [iconUri] + /// 可以是图片url, asset路径或者文件路径. + /// 其中图片参数[imageConfig]如果不知道怎么创建, 那么就直接调用flutter sdk内提供的[createLocalImageConfiguration]方法创建 + Future addMarker(MarkerOption option); + + /// 批量添加marker + /// + /// 根据[options]批量创建Marker + Future> addMarkers(List options); + + /// 把marker列表从地图上移除 + Future clearMarkers(List markers); + + /// 清除地图上所有覆盖物 + /// + /// 根据[keepMyLocation]区分是否保留我的位置的marker + Future clear({bool keepMyLocation = true}); + + /// 屏幕坐标转经纬度坐标 + Future fromScreenLocation(Point point); + + /// 经纬度坐标转屏幕坐标 + Future toScreenLocation(LatLng coordinate); + + /// 添加折线 + /// + /// 可配置参数详见[PolylineOption] + Future addPolyline(PolylineOption option); + + /// 添加多边形 + /// + /// 在点[points]的位置添加线, 可以设置宽度[width]和颜色[strokeColor] + Future addPolygon(PolygonOption option); + + /// 添加圆 + /// + /// 在点[points]的位置添加线, 可以设置宽度[width]和颜色[strokeColor] + Future addCircle(CircleOption option); + + /// 设置marker点击监听事件 + Future setMarkerClickedListener(OnMarkerClicked onMarkerClicked); + + /// 设置marker拖动监听事件 + Future setMarkerDragListener({ + OnMarkerDrag? onMarkerDragStart, + OnMarkerDrag? onMarkerDragging, + OnMarkerDrag? onMarkerDragEnd, + }); + + /// 设置地图点击监听事件 + Future setMapClickedListener(OnMapClicked onMapClick); + + /// 设置地图长按监听事件 + Future setMapLongPressedListener(OnMapClicked onMapLongPress); + + /// 设置地图移动监听事件 + Future setMapMoveListener({ + OnMapMove? onMapMoveStart, + OnMapMove? onMapMoving, + OnMapMove? onMapMoveEnd, + }); + + /// 截图 + Future screenShot(); + + /// 限制地图的显示范围 + /// + /// [southWest]西南角, [northEast]东北角 + Future setMapRegionLimits(LatLng southWest, LatLng northEast); + + /// Marker弹窗点击事件监听 + Future setInfoWindowClickListener(OnMarkerClicked onInfoWindowClicked); + + /// 添加图片覆盖物 + Future addGroundOverlay(GroundOverlayOption option); + + /// 添加热力图 + Future addHeatmapTileOverlay(HeatmapTileOption option); + + /// 将指定的经纬度列表(包括但不限于marker, polyline, polygon等)调整至同一屏幕中显示 + /// + /// [bounds]边界点形成的边界, [padding]地图内边距 + Future zoomToSpan( + List bounds, { + EdgeInsets padding = const EdgeInsets.all(50), + bool animated = true, + }); + + /// 自定义地图 + /// + /// 三个参数对应自定义地图压缩包内的三个文件 + Future setCustomMapStyle({ + String styleDataPath, + String styleExtraPath, + String texturePath, + }); + + /// 添加平滑移动marker + /// + /// 根据[options]批量创建Marker + Future addSmoothMoveMarker(SmoothMoveMarkerOption option); + + /// 添加海量点 + Future addMultiPointOverlay(MultiPointOption option); + + /// 设置地图朝向 + /// + /// [bearing] 朝向角度, 单位为度(°), 范围为[0°,360°] + Future setBearing(double bearing, {bool animated = true}); + + /// 设置地图倾斜度 + Future setTilt(double tilt, {bool animated = true}); + + /// 显示/隐藏3D楼块效果 + Future showBuildings(bool show); + + /// 显示/隐藏地图上的文字标注 + Future showMapText(bool show); + + /// 一次性设置地图视角 + Future setCameraPosition({ + required LatLng coordinate, + double? zoom, + double? tilt, + double? bearing, + bool animated = true, + Duration duration = const Duration(milliseconds: 500), + }); + + /// 设置最大缩放等级 + Future setMaxZoomLevel(double zoomLevel); + + /// 设置最小缩放等级 + Future setMinZoomLevel(double zoomLevel); + + /// 设置地图锚点 + Future setMapAnchor(double anchorU, double anchorV); + + /// 根据起点[from]和终点[to]坐标, 搜索出路径并将驾车路线规划结果[driveRouteResult]添加到地图上, 可以配置交通拥堵情况[trafficOption], + /// 路线的宽度[lineWidth], 自定纹理[customTexture]. + Future addDriveRoute({ + required LatLng from, + required LatLng to, + List? passbyPointList, + TrafficOption? trafficOption, + double lineWidth = 10, + ImageProvider? customTexture, + }); + + /// 添加地区轮廓 + /// + /// 地区名称[districtName], 轮廓宽度[width], 轮廓颜色[strokeColor], 填充颜色[fillColor] + /// + /// 由于一个省份可能包含多个区域, 比如浙江包含很多岛屿, 如果把岛屿也画进去, 那么会非常消耗性能. + /// 业务上而言, 我认为这些岛屿是否画进去基本上不影响使用, 所以增加了[onlyMainDistrict]参数 + /// 来控制是否只显示主要部分的边界, 如果你对地区完整度的需求非常高, 那么就把[onlyMainDistrict] + /// 设置为false, 随之而来像浙江这种地区的边界绘制起来就会非常慢. + /// 我的测试结果是MIX 3, release模式下需要5-6秒才能绘制完成. + /// + /// 采样率[sampleRate]可以控制经纬度列表的密度, 如果地区边界的经纬度列表长度非常长, 造成了卡顿, + /// 那么可以把采样率调低一点, 这样画出来的区域可能没有采样率为1时那么精确, 但是减小了经纬度列表长度, + /// 可以提升绘制速度. + Future> addDistrictOutline( + String districtName, { + double width = 5, + Color strokeColor = Colors.green, + Color fillColor = Colors.transparent, + bool onlyMainDistrict = true, + double sampleRate = 1.0, + }); + + /// 添加回放轨迹 + /// + /// [coordinateList] 路径经纬度列表 + /// [width] 路径宽度 + /// [strokeColor] 路径颜色 + /// [iconProvider] 移动marker的图标 + /// [duration] 移动时长 + Future addPlaybackTrace( + List coordinateList, { + double width = 5, + Color strokeColor = Colors.green, + required ImageProvider iconProvider, + required Duration duration, + }); + + /// 给地图添加padding + Future setPadding(EdgeInsets padding); + + /// 设置的地图刷新帧率 + Future setFps(int fps); +} diff --git a/lib/src/map_service.dart b/lib/src/map_service.dart new file mode 100644 index 0000000..07b8e3f --- /dev/null +++ b/lib/src/map_service.dart @@ -0,0 +1,9 @@ +/// 除了地图以外的功能放在这里, 比如说sdk初始化 +abstract class IMapService { + /// 设置ios和android的app key + Future init({ + String? iosKey, + String? androidKey, + String? webKey, + }); +} diff --git a/lib/src/models.dart b/lib/src/models.dart new file mode 100644 index 0000000..a8398de --- /dev/null +++ b/lib/src/models.dart @@ -0,0 +1,100 @@ +import 'package:core_location_fluttify/core_location_fluttify.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +import 'options.dart'; + +abstract class IOverlay { + Future remove(); +} + +/// 地图标记 +abstract class IMarker extends IOverlay { + /// 获取标题 + Future get title; + + /// 获取副标题 + Future get snippet; + + /// 获取定位信息 + Future get coordinate; + + /// 获取自定义信息 + Future get object; + + /// 设置坐标 + Future setCoordinate(LatLng coordinate); + + /// 设置可见性 + Future setVisible(bool visible); + + /// 显示弹窗 + Future showInfoWindow(); + + /// 关闭弹窗 + Future hideInfoWindow(); + + /// 设置图标 + Future setIcon( + ImageProvider iconProvider, + ImageConfiguration configuration, + ); + + /// 设置动画 + Future startAnimation(MarkerAnimation animation); + + /// 设置角度 + /// + /// 单位度(°) + Future setAngle(double angle); + + /// 设置标题 + Future setTitle(String title); + + /// 设置副标题 + Future setSnippet(String snippet); +} + +/// 平滑移动点 +abstract class ISmoothMoveMarker extends IOverlay { + Future stop(); +} + +/// 折线 +abstract class IPolyline extends IOverlay { + /// 重新设置折线点列表 + /// + /// 可用于轨迹记录 + Future setCoordinateList(List coordinateList); +} + +/// 多边形 +abstract class IPolygon extends IOverlay { + Future contains(LatLng target); +} + +/// 圆形 +abstract class ICircle extends IOverlay { + /// 设置坐标 + Future setCoordinate(LatLng coordinate); + + /// 设置半径 + Future setRadius(double radius); +} + +/// 热力图 +abstract class IHeatmapOverlay extends IOverlay {} + +/// 瓦片图 +abstract class IUrlTileOverlay extends IOverlay {} + +/// 图片覆盖物 +abstract class IGroundOverlay extends IOverlay {} + +/// 海量点 +abstract class IMultiPointOverlay extends IOverlay {} + +/// 回放轨迹 +abstract class IPlaybackTrace extends IOverlay { + Future stop(); +} diff --git a/lib/src/options.dart b/lib/src/options.dart new file mode 100644 index 0000000..b1c4211 --- /dev/null +++ b/lib/src/options.dart @@ -0,0 +1,580 @@ +import 'package:core_location_fluttify/core_location_fluttify.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +import 'enums.dart'; + +/// 我的位置选项 +@immutable +class MyLocationOption { + MyLocationOption({ + this.show = true, + this.myLocationType = MyLocationType.Locate, + this.interval = Duration.zero, + this.strokeColor = Colors.transparent, + this.strokeWidth = 0, + this.fillColor = Colors.transparent, + this.iconProvider, + this.anchorU, + this.anchorV, + }); + + /// 是否显示 + final bool show; + + /// 定位类型 + final MyLocationType myLocationType; + + /// 定位间隔 + final Duration interval; + + /// 边框颜色 + final Color strokeColor; + + /// 边框宽度 + final double strokeWidth; + + /// 填充颜色 + final Color fillColor; + + /// 图标 + /// + /// 资源图片则使用[AssetImage], 网络图片则使用[NetworkImage], 文件图片则使用[FileImage] + final ImageProvider? iconProvider; + + /// 锚点 + final double? anchorU, anchorV; + + @override + String toString() { + return 'MyLocationOption{show: $show, myLocationType: $myLocationType, interval: $interval, strokeColor: $strokeColor, strokeWidth: $strokeWidth, fillColor: $fillColor, iconProvider: $iconProvider, anchorU: $anchorU, anchorV: $anchorV}'; + } +} + +/// Marker创建参数 +@immutable +class MarkerOption { + MarkerOption({ + required this.coordinate, + this.title = '', + this.snippet = '', + this.widget, + this.draggable = false, + this.infoWindowEnabled = true, + this.visible = true, + this.rotateAngle = 0, + this.anchorU = 0.5, + this.anchorV = 0, + this.object, + this.opacity, + this.iconProvider, + this.iconsProvider, + this.animationFps, + this.infoWindow, + }) : assert(!(widget != null && iconProvider != null), + 'widget和iconProvider不能同时设置! '); + + /// 经纬度 + final LatLng coordinate; + + /// 标题 + final String title; + + /// 副标题 + final String snippet; + + /// Widget形式的Marker + /// + /// 不能和[iconProvider]一起用. + /// 注意控制Widget的大小, 比如Column默认是max, 会使用地图的高度, 那么此时需要设置成min. + final Widget? widget; + + /// 是否可拖动 + final bool draggable; + + /// 是否允许弹窗 + final bool infoWindowEnabled; + + /// 是否可见 + final bool visible; + + /// 旋转角度 单位为度(°) + final double rotateAngle; + + /// 横轴锚点 + final double anchorU; + + /// 纵轴锚点 + final double anchorV; + + /// 自定义数据 理论上可以使用任何类型的数据, 但是为了减少意外情况, 这里一律转换成String来保存 + final String? object; + + /// 透明度 + final double? opacity; + + /// 图标 + final ImageProvider? iconProvider; + + /// 帧动画图标 + final List? iconsProvider; + + /// 帧动画帧率 + /// + /// 最大60, 最小3 + final int? animationFps; + + final Widget? infoWindow; + + @override + String toString() { + return 'MarkerOption{coordinate: $coordinate, title: $title, snippet: $snippet, widget: $widget, draggable: $draggable, infoWindowEnabled: $infoWindowEnabled, visible: $visible, rotateAngle: $rotateAngle, anchorU: $anchorU, anchorV: $anchorV, object: $object, iconProvider: $iconProvider}'; + } +} + +/// 平滑移动Marker创建参数 +@immutable +class SmoothMoveMarkerOption { + SmoothMoveMarkerOption({ + required this.path, + required this.duration, + required this.iconProvider, + }); + + /// 轨迹经纬度列表 + final List path; + + /// 图标 + final ImageProvider iconProvider; + + /// 动画时长 + final Duration duration; + + @override + String toString() { + return 'SmoothMoveMarkerOption{path: $path, iconProvider: $iconProvider, duration: $duration}'; + } +} + +/// Polyline创建参数 +@immutable +class PolylineOption { + PolylineOption({ + required this.coordinateList, + this.width = 5, + this.strokeColor = Colors.green, + this.textureProvider, + this.lineCapType, + this.lineJoinType, + this.dashType, + }); + + /// 经纬度列表 + final List coordinateList; + + /// 宽度 + final double width; + + /// 颜色 + final Color strokeColor; + + /// 自定义纹理 + final ImageProvider? textureProvider; + + /// 线段末端样式 + final LineCapType? lineCapType; + + /// 线段连接处样式 + final LineJoinType? lineJoinType; + + /// 是否虚线 + final DashType? dashType; + + @override + String toString() { + return 'PolylineOption{latLngList: $coordinateList, width: $width, strokeColor: $strokeColor, textureProvider: $textureProvider, lineCapType: $lineCapType, lineJoinType: $lineJoinType, dashType: $dashType}'; + } +} + +/// Polygon创建参数 +@immutable +class PolygonOption { + PolygonOption({ + required this.coordinateList, + this.width = 5, + this.strokeColor = Colors.green, + this.fillColor = Colors.transparent, + this.zIndex, + }); + + /// 经纬度列表 + final List coordinateList; + + /// 宽度 + final double width; + + /// 边框颜色 + final Color strokeColor; + + /// 填充颜色 + final Color fillColor; + + /// z index + final double? zIndex; + + @override + String toString() { + return 'PolygonOption{latLngList: $coordinateList, width: $width, strokeColor: $strokeColor, fillColor: $fillColor}'; + } +} + +/// Circle创建参数 +@immutable +class CircleOption { + /// 中心点经纬度 + final LatLng center; + + /// 宽度 + final double radius; + + /// 宽度 + final double width; + + /// 边框颜色 + final Color strokeColor; + + /// 填充颜色 + final Color fillColor; + + CircleOption({ + required this.center, + required this.radius, + this.width = 5, + this.strokeColor = Colors.green, + this.fillColor = Colors.transparent, + }); + + @override + String toString() { + return 'CircleOption{center: $center, radius: $radius, width: $width, strokeColor: $strokeColor, fillColor: $fillColor}'; + } +} + +/// TileOverlay创建参数 +@immutable +class HeatmapTileOption { + HeatmapTileOption({ + required this.coordinateList, + this.gradient, + }); + + /// 中心点经纬度 + final List coordinateList; + + /// 热力图渐变色配置 + /// + /// [RadialGradient.stops]的值范围为(0,1), 默认值为[0.2,0.5,0.9] + /// [RadialGradient.stops]和[RadialGradient.colors]列表的长度必须一致 + final RadialGradient? gradient; + + @override + String toString() { + return 'HeatmapTileOption{latLngList: $coordinateList}'; + } +} + +/// 图片覆盖物创建参数 +@immutable +class GroundOverlayOption { + GroundOverlayOption({ + required this.southWest, + required this.northEast, + required this.imageProvider, + }); + + final LatLng southWest; + final LatLng northEast; + final ImageProvider imageProvider; + + @override + String toString() { + return 'GroundOverlayOption{southWest: $southWest, northEast: $northEast, imageProvider: $imageProvider}'; + } +} + +/// 瓦片图创建参数 +@immutable +class UrlTileOption { + UrlTileOption({ + required this.width, + required this.height, + required this.urlTemplate, + }); + + /// 单位瓦片图宽度 + final int width; + + /// 单位瓦片图高度 + final int height; + + /// 瓦片图地址模板 + /// + /// 瓦片图地址模板是一个包含"{x}","{y}","{z}","{scale}"的字符串,"{x}","{y}","{z}","{scale}"会被tile path的值所替换, + /// 并生成用来加载tile图片数据的URL 。例如 http://server/path?x={x}&y={y}&z={z}&scale={scale} + final String urlTemplate; + + @override + String toString() { + return 'UrlTileOption{width: $width, height: $height, urlTemplate: $urlTemplate}'; + } +} + +/// 海量点创建参数 +@immutable +class MultiPointOption { + MultiPointOption({ + required this.pointList, + this.iconProvider, + }); + + /// 点列表 + final List pointList; + + /// 图标 + final ImageProvider? iconProvider; + + @override + String toString() { + return 'MultiPointOption{pointList: $pointList, iconProvider: $iconProvider}'; + } +} + +/// 海量点中单个点的创建参数 +@immutable +class PointOption { + PointOption({ + required this.coordinate, + this.id, + this.title, + this.snippet, + this.object, + }); + + /// 经纬度 + final LatLng coordinate; + + /// 点的id列表, 用来区分点 + final String? id; + + /// 标题列表 + final String? title; + + /// 副标题列表 + final String? snippet; + + /// 自定义数据 + final String? object; + + @override + String toString() { + return 'PointOption{coordinate: $coordinate, id: $id, title: $title, snippet: $snippet, object: $object}'; + } +} + +/// 地图移动 +@immutable +class MapMove { + MapMove({ + this.coordinate, + this.zoom, + this.tilt, + this.bearing, + this.isAbroad, + }); + + /// 经纬度 + final LatLng? coordinate; + + /// 缩放等级 + final double? zoom; + + /// 倾斜度 + final double? tilt; + + /// 朝向 + final double? bearing; + + /// 是否是国外 + final bool? isAbroad; + + @override + String toString() { + return 'MapMove{latLng: $coordinate, zoom: $zoom, tilt: $tilt, bearing: $bearing, isAbroad: $isAbroad}'; + } +} + +/// 屏幕坐标 +@immutable +class TraceLocation { + TraceLocation({ + required this.latitude, + required this.longitude, + required this.speed, + required this.bearing, + required this.time, + }); + + final double latitude; + final double longitude; + final double speed; + final double bearing; + final int time; + + @override + String toString() { + return 'TraceLocation{latitude: $latitude, longitude: $longitude, speed: $speed, bearing: $bearing, time: $time}'; + } +} + +/// 交通配置 +@immutable +class TrafficOption { + TrafficOption({ + required this.show, + this.goodColor = Colors.green, + this.badColor = Colors.yellow, + this.terribleColor = Colors.red, + this.unknownColor = Colors.blue, + }); + + /// 是否显示 + final bool show; + + /// 通畅路段颜色 + final Color goodColor; + + /// 缓行路段颜色 + final Color badColor; + + /// 拥堵路段颜色 + final Color terribleColor; + + /// 未知路段颜色 + final Color unknownColor; + + @override + String toString() { + return 'TrafficOption{show: $show, goodColor: $goodColor, badColor: $badColor, terribleColor: $terribleColor, unknownColor: $unknownColor}'; + } +} + +/// marker动画基类 +@immutable +class MarkerAnimation { + MarkerAnimation( + this.duration, + this.repeatCount, + this.repeatMode, + this.fromValue, + this.toValue, + ); + + final Duration duration; + final int repeatCount; + final RepeatMode repeatMode; + final double? fromValue; + final double? toValue; + + @override + String toString() { + return 'MarkerAnimation{duration: $duration, repeatCount: $repeatCount, repeatMode: $repeatMode, fromValue: $fromValue, toValue: $toValue}'; + } +} + +/// marker缩放动画 +@immutable +class ScaleMarkerAnimation extends MarkerAnimation { + ScaleMarkerAnimation({ + Duration duration = const Duration(seconds: 1), + int repeatCount = 1, + RepeatMode repeatMode = RepeatMode.Reverse, + double? fromValue, + double? toValue, + }) : super(duration, repeatCount, repeatMode, fromValue, toValue); + + @override + String toString() { + return 'ScaleMarkerAnimation{fromValue: $fromValue, toValue: $toValue}'; + } +} + +/// marker透明度动画 +@immutable +class AlphaMarkerAnimation extends MarkerAnimation { + AlphaMarkerAnimation({ + Duration duration = const Duration(seconds: 1), + int repeatCount = 1, + RepeatMode repeatMode = RepeatMode.Reverse, + double? fromValue, + double? toValue, + }) : super(duration, repeatCount, repeatMode, fromValue, toValue); + + @override + String toString() { + return 'AlphaMarkerAnimation{fromValue: $fromValue, toValue: $toValue}'; + } +} + +/// marker旋转动画 +@immutable +class RotateMarkerAnimation extends MarkerAnimation { + RotateMarkerAnimation({ + Duration duration = const Duration(seconds: 1), + int repeatCount = 1, + RepeatMode repeatMode = RepeatMode.Reverse, + double? fromValue, + double? toValue, + }) : super(duration, repeatCount, repeatMode, fromValue, toValue); + + @override + String toString() { + return 'RotateMarkerAnimation{fromValue: $fromValue, toValue: $toValue}'; + } +} + +/// marker移动动画 +@immutable +class TranslateMarkerAnimation extends MarkerAnimation { + TranslateMarkerAnimation({ + Duration duration = const Duration(seconds: 1), + int repeatCount = 1, + RepeatMode repeatMode = RepeatMode.Reverse, + required this.coordinate, + }) : super(duration, repeatCount, repeatMode, null, null); + + final LatLng coordinate; + + @override + String toString() { + return 'TranslateMarkerAnimation{toValue: $coordinate}'; + } +} + +/// marker动画集合 +@immutable +class MarkerAnimationSet extends MarkerAnimation { + MarkerAnimationSet({ + this.animationSet, + required Duration duration, + int repeatCount = 1, + RepeatMode repeatMode = RepeatMode.Reverse, + }) : super(duration, repeatCount, repeatMode, null, null); + + final List? animationSet; + + @override + String toString() { + return 'MarkerAnimationSet{animationSet: $animationSet}'; + } +} diff --git a/lib/uni_map_platform_interface.dart b/lib/uni_map_platform_interface.dart new file mode 100644 index 0000000..4ebcf10 --- /dev/null +++ b/lib/uni_map_platform_interface.dart @@ -0,0 +1,11 @@ +library uni_map_platform_interface; + +export 'package:core_location_fluttify/core_location_fluttify.dart'; +export 'package:foundation_fluttify/foundation_fluttify.dart'; + +export 'src/enums.dart'; +export 'src/functions.dart'; +export 'src/map_controller.dart'; +export 'src/map_service.dart'; +export 'src/models.dart'; +export 'src/options.dart'; diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..e13cc1f --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,220 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + core_location_fluttify: + dependency: "direct main" + description: + path: "D:\\FlutterProjects\\core_location_fluttify" + relative: false + source: path + version: "0.7.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + foundation_fluttify: + dependency: "direct main" + description: + name: foundation_fluttify + sha256: ca669cd6090a8de44a099e418523badf34ef14f03703a544431f2dd95411062e + url: "https://pub.dev" + source: hosted + version: "0.13.0+1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" + source: hosted + version: "1.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" +sdks: + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..ae32f11 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,20 @@ +name: uni_map_platform_interface +description: Uni Map Platform Interface. +version: 0.7.0-rc.0 + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.17.0" + +dependencies: + flutter: + sdk: flutter + foundation_fluttify: + path: ..\foundation_fluttify + core_location_fluttify: + path: ..\core_location_fluttify + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^1.0.4 \ No newline at end of file diff --git a/test/uni_map_platform_interface_test.dart b/test/uni_map_platform_interface_test.dart new file mode 100644 index 0000000..ab73b3a --- /dev/null +++ b/test/uni_map_platform_interface_test.dart @@ -0,0 +1 @@ +void main() {}