I started by checking if the point is inside polygon and it worked well. my goal is to allow a user to draw a polygon then to use that list to check if there is any point that is inside drawn polygon. I archeved to allow user draw the polygon now I want to check if there is any point inside that polygon.
the list of latLang that make the polygon is
List<LatLng> _userPolyLinesLatLngList = [];
i want to create new list that i can use for map tool kit that List should have LatLang from above list.
Help me to convert that List so as I can assign as List of latlang for toolkit. therefore what I want is two variable of List the above List and new List that i can use on toolkit to check if the point is inside the polygon.
` //something like this
List<LatLng> _userPolyLinesLatLngList = [];
List<mp.LatLng> newListForToolKit = _userPolyLinesLatLngList;
//this brings error` //then
final points = mp.PolygonUtil.containsLocation(
mp.LatLng(-6.7924, 39.2083), newListForToolKit, true);
`
And Here are the complete code that allow user to draw polygon. I want to check if the point is inside polygon.
`import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'dart:io';
import 'dart:math' as Math;
import 'package:flutter/material.dart';
import 'package:geocoding/geocoding.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:maps_toolkit/maps_toolkit.dart' as mp;
class MyHomePageMap extends StatefulWidget {
MyHomePageMap({Key? key}) : super(key: key);
// print('Distance between London and Paris is $distance km.');
// PolygonUtil.containsLocation - computes whether the given point lies inside the specified polygon.
// final distances = mp.SphericalUtil.computeDistanceBetween(mp.LatLng(51.5073509, -0.1277583), 4.3)
@override
Widget build(BuildContext context) {
return Scaffold(
body: GestureDetector(
onPanUpdate: (_drawPolygonEnabled) ? _onPanUpdate : null,
onPanEnd: (_drawPolygonEnabled) ? _onPanEnd : null,
child: GoogleMap(
mapType: MapType.normal,
initialCameraPosition: _kGooglePlex,
polygons: _polygons,
polylines: _polyLines,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: () {
print("The DISTANCE IS $distance");
final points = mp.PolygonUtil.containsLocation(
mp.LatLng(-6.7924, 39.2083), polygonCoord, true);
print("The POIT IS FOUND ON THE FOLLOWING $points");
// final a = mp._userPolyLinesLatLngList;
// print("The POIT IS FOUND ON THE FOLLOWING $a YES");
List<mp.LatLng> polygonCoords = [
mp.LatLng(37.43296265331129, -122.08832357078792),
mp.LatLng(37.43006265331129, -122.08832357078792),
mp.LatLng(37.43006265331129, -122.08332357078792),
mp.LatLng(37.43296265331129, -122.08832357078792)
];
List<LatLng> _userPolyLinesLatLngList = [];
// ignore: unused_local_variable
double a, b;
// var b;
// var lat;
// List<mp.LatLng> _userPolyLinesLatLngListsUser =
// _userPolyLinesLatLngList;
final pointFromGoogleMap = LatLng(90, 0);
final pointMp = mp.LatLng(
pointFromGoogleMap.latitude, pointFromGoogleMap.longitude);
print("The POIT IS FOUND ON THE FOLLOWING $points YES");
if (points == true) {
print("The POIT IS FOUND ON THE FOLLOWING $points YES");
} else {
print("The POIT IS FOUND ON THE FOLLOWING $points No");
}
},
tooltip: 'Drawing',
child: Icon(Icons.menu),
),
FloatingActionButton(
onPressed: _toggleDrawing,
tooltip: 'Drawing',
child: Icon((_drawPolygonEnabled) ? Icons.cancel : Icons.edit),
),
],
),
);
_onPanUpdate(DragUpdateDetails details) async {
// To start draw new polygon every time.
if (_clearDrawing) {
_clearDrawing = false;
_clearPolygons();
}
if (_drawPolygonEnabled) {
double? x, y;
if (Platform.isAndroid) {
// It times in 3 without any meaning,
// We think it's an issue with GoogleMaps package.
x = details.globalPosition.dx * 3;
y = details.globalPosition.dy * 3;
} else if (Platform.isIOS) {
x = details.globalPosition.dx;
y = details.globalPosition.dy;
}
// Round the x and y.
int xCoordinate = x!.round();
int yCoordinate = y!.round();
// Check if the distance between last point is not too far.
// to prevent two fingers drawing.
if (_lastXCoordinate != null && _lastYCoordinate != null) {
var distance = Math.sqrt(Math.pow(xCoordinate - _lastXCoordinate!, 2) +
Math.pow(yCoordinate - _lastYCoordinate!, 2));
// Check if the distance of point and point is large.
if (distance > 80.0) return;
}
// Cached the coordinate.
_lastXCoordinate = xCoordinate;
_lastYCoordinate = yCoordinate;
ScreenCoordinate screenCoordinate =
ScreenCoordinate(x: xCoordinate, y: yCoordinate);
final GoogleMapController controller = await _controller.future;
LatLng latLng = await controller.getLatLng(screenCoordinate);
// mp.LatLng latLngs = await controller.getLatLng(screenCoordinate);
try {
// Add new point to list.
_userPolyLinesLatLngList.add(latLng);
// _userPolyLinesLatLngListsUser.add(latLngs);
_polyLines.removeWhere(
(polyline) => polyline.polylineId.value == 'user_polyline');
_polyLines.add(
Polyline(
polylineId: PolylineId('user_polyline'),
points: _userPolyLinesLatLngList,
width: 2,
color: Colors.blue,
),
);
} catch (e) {
print(" error painting $e");
}
setState(() {});
}
}
// Yes, you cannot use Google Maps LatLng directly. You should convert Google Maps LatLng into Maps Toolkit LatLng, for ex.:
I started by checking if the point is inside polygon and it worked well. my goal is to allow a user to draw a polygon then to use that list to check if there is any point that is inside drawn polygon. I archeved to allow user draw the polygon now I want to check if there is any point inside that polygon.
the list of latLang that make the polygon is
List<LatLng> _userPolyLinesLatLngList = [];
i want to create new list that i can use for map tool kit that List should have LatLang from above list.
Help me to convert that List so as I can assign as List of latlang for toolkit. therefore what I want is two variable of List the above List and new List that i can use on toolkit to check if the point is inside the polygon.
And Here are the complete code that allow user to draw polygon. I want to check if the point is inside polygon. `import 'dart:async'; import 'dart:collection'; import 'dart:convert'; import 'dart:io'; import 'dart:math' as Math;
import 'package:flutter/material.dart'; import 'package:geocoding/geocoding.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:maps_toolkit/maps_toolkit.dart' as mp;
class MyHomePageMap extends StatefulWidget { MyHomePageMap({Key? key}) : super(key: key);
@override _MyHomePageMapState createState() => _MyHomePageMapState(); }
class _MyHomePageMapState extends State {
static final Completer _controller = Completer();
static final CameraPosition _kGooglePlex = CameraPosition( target: LatLng(37.42796133580664, -122.085749655962), zoom: 14.4746, );
final Set _polygons = HashSet();
final Set _polyLines = HashSet();
bool _drawPolygonEnabled = false; List _userPolyLinesLatLngList = [];
// List _userPolyLinesLatLngListsUser = [];
final pointFromGoogleMap = LatLng(90, 0);
bool _clearDrawing = false; int? _lastXCoordinate, _lastYCoordinate;
var distanceBetweenPoints = mp.SphericalUtil.computeDistanceBetween( mp.LatLng(51.5073509, -0.1277583), mp.LatLng(48.856614, 2.3522219));
final cityLondon = mp.LatLng(51.5073509, -0.1277583); final cityParis = mp.LatLng(48.856614, 2.3522219);
final distance = mp.SphericalUtil.computeDistanceBetween( mp.LatLng(51.5073509, -0.1277583), mp.LatLng(48.856614, 2.3522219)) / 1000.0; // List polygony = [
// (37.43296265331129, -122.08832357078792),
// (37.43006265331129, -122.08832357078792),
// (37.43006265331129, -122.08332357078792),
// ];
// print('Distance between London and Paris is $distance km.'); // PolygonUtil.containsLocation - computes whether the given point lies inside the specified polygon. // final distances = mp.SphericalUtil.computeDistanceBetween(mp.LatLng(51.5073509, -0.1277583), 4.3)
List polygonCoord = [
mp.LatLng(37.43296265331129, -122.08832357078792),
mp.LatLng(37.43006265331129, -122.08832357078792),
mp.LatLng(37.43006265331129, -122.08332357078792),
mp.LatLng(37.43296265331129, -122.08832357078792)
];
@override Widget build(BuildContext context) { return Scaffold( body: GestureDetector( onPanUpdate: (_drawPolygonEnabled) ? _onPanUpdate : null, onPanEnd: (_drawPolygonEnabled) ? _onPanEnd : null, child: GoogleMap( mapType: MapType.normal, initialCameraPosition: _kGooglePlex, polygons: _polygons, polylines: _polyLines, onMapCreated: (GoogleMapController controller) { _controller.complete(controller); }, ), ), floatingActionButton: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ FloatingActionButton( onPressed: () { print("The DISTANCE IS $distance"); final points = mp.PolygonUtil.containsLocation( mp.LatLng(-6.7924, 39.2083), polygonCoord, true); print("The POIT IS FOUND ON THE FOLLOWING $points"); // final a = mp._userPolyLinesLatLngList; // print("The POIT IS FOUND ON THE FOLLOWING $a YES");
}
_toggleDrawing() { _clearPolygons(); setState(() => _drawPolygonEnabled = !_drawPolygonEnabled); }
_onPanUpdate(DragUpdateDetails details) async { // To start draw new polygon every time. if (_clearDrawing) { _clearDrawing = false; _clearPolygons(); }
}
// Yes, you cannot use Google Maps LatLng directly. You should convert Google Maps LatLng into Maps Toolkit LatLng, for ex.:
// import 'package:maps_toolkit/maps_toolkit.dart' as mp; // import 'package:google_maps/google_maps.dart'; // import 'package:test/test.dart';
// void main() { // final pointFromGoogleMap = LatLng(90, 0); // final pointMp = mp.LatLng(pointFromGoogleMap.lat, pointFromGoogleMap.lng);
// bool result = mp.PolygonUtil.containsLocation(pointMp, TOTAL_COVERAGE, false); // }
_onPanEnd(DragEndDetails details) async { // Reset last cached coordinate _lastXCoordinate = null; _lastYCoordinate = null;
}
_clearPolygons() { setState(() { _polyLines.clear(); _polygons.clear(); _userPolyLinesLatLngList.clear(); }); } } `