import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'dart:math' as math; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_polyline_algorithm/google_polyline_algorithm.dart'; import 'package:ride/constant/colors.dart'; import 'package:ride/constant/credential.dart'; import 'package:ride/constant/links.dart'; import 'package:ride/constant/style.dart'; import 'package:ride/controller/functions/crud.dart'; class MapController extends GetxController { bool isloading = true; TextEditingController placeController = TextEditingController(); List data = []; List bounds = []; List places = []; LatLngBounds? boundsdata; List markers = []; List polylines = []; LatLng mylocation = const LatLng(32.111965, 36.067427); LatLng mydestination = const LatLng(32.115295, 36.064773); final List polylineCoordinates = []; BitmapDescriptor markerIcon = BitmapDescriptor.defaultMarker; double height = 200; changeHeight() { if (places.isEmpty) { height = 0; update(); } height = 200; update(); } hidePlaces() { height = 0; update(); } Future getPlaces() async { var url = '${AppLink.googleMapsLink}place/nearbysearch/json?keyword=${placeController.text}&location=32.111946,${mylocation.longitude}&radius=10000&type=restaurant&language=ar&key=${AppCredintials.mapAPIKEY}'; var response = await CRUD().getGoogleApi(link: url, payload: {}); places = response['results']; print(places); update(); } LatLng fromString(String location) { List parts = location.split(','); double lat = double.parse(parts[0]); double lng = double.parse(parts[1]); return LatLng(lat, lng); } void clearpolyline() { polylines = []; polylineCoordinates.clear(); update(); } void addCustomPicker() { ImageConfiguration config = const ImageConfiguration( size: Size(20, 20), // scale: 1.0, ); BitmapDescriptor.fromAssetImage(config, 'assets/images/picker.png') .then((value) { markerIcon = value; update(); }); } GoogleMapController? mapController; void onMapCreated(GoogleMapController controller) { mapController = controller; controller.getVisibleRegion(); update(); } getMap(String origin, destination) async { var origin1 = fromString(origin); var destination1 = fromString(destination); isloading = false; mydestination = destination1; mylocation = origin1; update(); var url = ('${AppLink.googleMapsLink}directions/json?&language=en&avoid=tolls|ferries&destination=$destination&origin=$origin&key=${AppCredintials.mapAPIKEY}'); var response = await CRUD().getGoogleApi(link: url, payload: {}); data = response['routes'][0]['legs']; final points = decodePolyline(response["routes"][0]["overview_polyline"]["points"]); for (int i = 0; i < points.length; i++) { double lat = points[i][0].toDouble(); double lng = points[i][1].toDouble(); polylineCoordinates.add(LatLng(lat, lng)); } // // Define the northeast and southwest coordinates final bounds = response["routes"][0]["bounds"]; // LatLng northeast = // LatLng(bounds['northeast']['lat'], bounds['northeast']['lng']); // LatLng southwest = // LatLng(bounds['southwest']['lat'], bounds['southwest']['lng']); // // Create the LatLngBounds using the coordinates // boundsdata = LatLngBounds(northeast: northeast, southwest: southwest); // update(); // print(boundsdata); //////////////////////////////////////////// // Create the northeast and southwest LatLng objects LatLng northeast = LatLng(bounds['northeast']['lat'], bounds['northeast']['lng']); LatLng southwest = LatLng(bounds['southwest']['lat'], bounds['southwest']['lng']); // Create the LatLngBounds object LatLngBounds boundsData = LatLngBounds(northeast: northeast, southwest: southwest); // Calculate padding for the bounding box double distance = math.sqrt( math.pow(northeast.latitude - southwest.latitude, 2) + math.pow(northeast.longitude - southwest.longitude, 2), ); // Define the map padding final double padding = 50.0; // Get the screen dimensions final screenSize = Get.size; print(screenSize.width); print('================'); // Adjust the bounding box to include padding LatLngBounds adjustedBounds = LatLngBounds( southwest: LatLng(boundsData.southwest.latitude - padding, boundsData.southwest.longitude - padding), northeast: LatLng(boundsData.northeast.latitude + padding, boundsData.northeast.longitude + padding), ); // Calculate the zoom level based on the distance and screen size double zoomLevel = getZoomLevel(distance, screenSize.width); // Animate the camera to the adjusted bounds mapController!.animateCamera(CameraUpdate.newLatLngBounds( adjustedBounds, screenSize.width, )); if (polylines.isNotEmpty) { clearpolyline(); } else { var polyline = Polyline( polylineId: PolylineId(response["routes"][0]["summary"]), points: polylineCoordinates, width: 10, color: Colors.blue, ); polylines.add(polyline); update(); } } double getZoomLevel(double distance, double screenWidth) { const double zoomFactor = 15.0; const double pixelRatio = 156543.03392; // Earth circumference in pixels at zoom level 0 double zoomLevel = (math.log(pixelRatio * screenWidth / (distance * zoomFactor))) / math.log(2); return zoomLevel; } double getDistanceFromText(String distanceText) { // Remove any non-digit characters from the distance text String distanceValue = distanceText.replaceAll(RegExp(r'[^0-9.]+'), ''); // Parse the extracted numerical value as a double double distance = double.parse(distanceValue); return distance; } void bottomSheet() { String distanceText = data[0]['distance']['text']; String durationText = data[0]['duration']['text']; double distance = getDistanceFromText(distanceText); double duration = getDistanceFromText(durationText); double cost = distance * 0.21; double costDuration = duration * 0.05; double totalPassenger = cost + costDuration; Get.bottomSheet( Container( height: 130, color: AppColor.secondaryColor, child: data.isEmpty ? Center( child: Text( 'Where are you want to go..', style: AppStyle.title, )) : Center( child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text( 'distance is ${data[0]['distance']['text']}', style: AppStyle.title, ), Text( 'duration is ${data[0]['duration']['text']}', style: AppStyle.title, ), ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Text( 'Cost for .21/km $cost ', style: AppStyle.title, ), Text( 'Cost duration .05/m $costDuration ', style: AppStyle.title, ), ], ), Text( 'Total cost $totalPassenger ', style: AppStyle.title, ), ], ), ), ), elevation: 6, enableDrag: true, isDismissible: true, useRootNavigator: true, backgroundColor: AppColor.secondaryColor, barrierColor: AppColor.accentColor.withOpacity(.4), persistent: true, ); } List polylineCoordinate = []; double calculateCost(double distance) { const double costRate = 0.27; // double distanceInKm = distance / 1000; // convert distance to kilometers double cost = costRate * distance; return cost; } @override void onInit() { // getPolyLine(); // getMap(); addCustomPicker(); super.onInit(); } }