From 805aaed7fddf788853aba4661b58cf8601a39c35 Mon Sep 17 00:00:00 2001 From: dali Date: Fri, 11 Feb 2022 15:57:08 +0100 Subject: [PATCH] feat : add extension to support convert list of geo to string and string to list of geo --- .../lib/src/common/utilities.dart | 28 +++++++++++++++++++ flutter_osm_interface/pubspec.yaml | 2 +- lib/flutter_osm_plugin.dart | 4 ++- lib/src/osm_flutter.dart | 4 +-- test/flutter_osm_plugin_test.dart | 10 +++++++ 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/flutter_osm_interface/lib/src/common/utilities.dart b/flutter_osm_interface/lib/src/common/utilities.dart index 1ece13f0..f8546aab 100644 --- a/flutter_osm_interface/lib/src/common/utilities.dart +++ b/flutter_osm_interface/lib/src/common/utilities.dart @@ -2,8 +2,10 @@ import 'dart:convert'; import 'dart:typed_data'; import 'dart:ui' as ui; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import 'package:google_polyline_algorithm/google_polyline_algorithm.dart'; import '../types/types.dart'; @@ -19,6 +21,32 @@ extension ExtGeoPoint on GeoPoint { } } +extension ExtListGeoPoint on List { + Future encodedToString() async { + final List listGeos = this; + return compute((List geoPoints) async { + final coordinates = geoPoints.map((e) => e.toListNum()).toList(); + return encodePolyline(coordinates); + }, listGeos); + } +} + +extension TransformEncodedPolyLineToListGeo on String { + Future> toListGeo() async { + final String polylineEncoded = this; + try { + return await compute((String encoded) { + final listPoints = decodePolyline(encoded); + return listPoints + .map((e) => GeoPoint(latitude: e.last.toDouble(), longitude: e.first.toDouble())) + .toList(); + }, polylineEncoded); + } catch (e) { + return []; + } + } +} + extension ColorMap on Color { Map> toMap(String key) { return { diff --git a/flutter_osm_interface/pubspec.yaml b/flutter_osm_interface/pubspec.yaml index 1906dfc9..31641926 100644 --- a/flutter_osm_interface/pubspec.yaml +++ b/flutter_osm_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_osm_interface description: osm flutter controller and utilities. -version: 0.1.16 +version: 0.1.17 homepage: https://github.com/liodali/osm_flutter environment: diff --git a/lib/flutter_osm_plugin.dart b/lib/flutter_osm_plugin.dart index 550e5a7f..a7e7a6fe 100644 --- a/lib/flutter_osm_plugin.dart +++ b/lib/flutter_osm_plugin.dart @@ -1,9 +1,11 @@ library osm_flutter; +export 'package:flutter_osm_interface/src/common/utilities.dart' + hide Uint8ListConvert,ListMultiRoadConf, ColorMap,capturePng; export 'package:flutter_osm_interface/src/map_controller/base_map_controller.dart' hide OSMControllerOfBaseMapController, PrivateBaseMapController; -export 'package:flutter_osm_interface/src/types/types.dart'; export 'package:flutter_osm_interface/src/mixin/interface_mixin.dart'; +export 'package:flutter_osm_interface/src/types/types.dart'; export 'src/common/geo_point_exception.dart'; export 'src/common/road_exception.dart'; diff --git a/lib/src/osm_flutter.dart b/lib/src/osm_flutter.dart index 7037cc1f..6a7c8877 100644 --- a/lib/src/osm_flutter.dart +++ b/lib/src/osm_flutter.dart @@ -6,8 +6,8 @@ import 'controller/map_controller.dart'; import 'interface_osm/base_osm_platform.dart'; import 'widgets/copyright_osm_widget.dart'; -typedef OnGeoPointClicked = void Function(GeoPoint); -typedef OnLocationChanged = void Function(GeoPoint); +// typedef OnGeoPointClicked = void Function(GeoPoint); +// typedef OnLocationChanged = void Function(GeoPoint); /// Principal widget to show OSMMap using osm api /// you can track you current location,show static points like position of your stores diff --git a/test/flutter_osm_plugin_test.dart b/test/flutter_osm_plugin_test.dart index 0281ff20..19c4e238 100644 --- a/test/flutter_osm_plugin_test.dart +++ b/test/flutter_osm_plugin_test.dart @@ -19,4 +19,14 @@ void main() { List suggestions = await addressSuggestion("berlin"); expect(suggestions.length, 5); }); + + test("test parse route Encoded to ListGeo", () async { + String routeEncoded = + "mfp_I__vpAYBO@K@[BuBRgBLK@UBMMC?AAKAe@FyBTC@E?IDKDA@K@]BUBSBA?E@E@A@KFUBK@mAL{CZQ@qBRUBmAFc@@}@Fu@DG?a@B[@qAF_AJ[D_E`@SBO@ODA@UDA?]JC?uBNE?OAKACa@AI]mCCUE[AK[iCWqB[{Bk@sE_@_DAICSAOIm@AIQuACOQyAG[Gc@]wBw@aFKu@y@oFCMAOIm@?KAQ?KIuDQmHE}BBQ?Q?OCq@?I?IASAg@OuF?OAi@?c@@c@Du@r@cH@U@I@G@K?E~@kJRyBf@uE@KFi@RaBBMFc@Da@@ETaC@QJ{@Ny@Ha@RiAfBuJF]DOh@yAHSf@aADIR_@\\q@w@y@e@a@CCUQaCkB{@y@GESO?_@?C?[IoCIgDMsEAYOkEAQ@Yj@kENg@ZyBBIHm@FY@GBUJk@JmA?c@?QAQG]LKDEDCHOL]FO^uA@GTu@La@`A_DJ[pAgCJSlAwBJSf@{@b@w@dAqBHQZq@LMLKRIFAL?J@HBFBp@XPHh@TTJNFTRNFd@N\\HF@J@J@@V?N@rA@dB"; + + final list = await routeEncoded.toListGeo(); + final encodedRoute = await list.encodedToString(); + expect(list.isNotEmpty, true); + expect(encodedRoute, routeEncoded); + }); }