Skip to content

Commit ca8509c

Browse files
committed
Added MapController.pointToLatLng() to get LatLng of given screen point
Ref fleaflet#496, ref fleaflet#607, ref fleaflet#981, ref fleaflet#1010
1 parent 95a8d26 commit ca8509c

File tree

5 files changed

+91
-1
lines changed

5 files changed

+91
-1
lines changed

example/lib/main.dart

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_map_example/pages/map_inside_listview.dart';
33
import 'package:flutter_map_example/pages/network_tile_provider.dart';
4+
import 'package:flutter_map_example/pages/point_to_latlng.dart';
45

56
import './pages/animated_map_controller.dart';
67
import './pages/circle.dart';
78
import './pages/custom_crs/custom_crs.dart';
89
import './pages/esri.dart';
910
import './pages/home.dart';
11+
import './pages/interactive_test_page.dart';
1012
import './pages/live_location.dart';
1113
import './pages/many_markers.dart';
1214
import './pages/map_controller.dart';
@@ -28,7 +30,6 @@ import './pages/tile_builder_example.dart';
2830
import './pages/tile_loading_error_handle.dart';
2931
import './pages/widgets.dart';
3032
import './pages/wms_tile_layer.dart';
31-
import 'pages/interactive_test_page.dart';
3233

3334
void main() => runApp(MyApp());
3435

@@ -72,6 +73,7 @@ class MyApp extends StatelessWidget {
7273
StatefulMarkersPage.route: (context) => StatefulMarkersPage(),
7374
MapInsideListViewPage.route: (context) => MapInsideListViewPage(),
7475
ResetTileLayerPage.route: (context) => ResetTileLayerPage(),
76+
PointToLatLngPage.route: (context) => PointToLatLngPage(),
7577
},
7678
);
7779
}
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_map/flutter_map.dart';
3+
import 'package:latlong2/latlong.dart';
4+
5+
import '../widgets/drawer.dart';
6+
7+
class PointToLatLngPage extends StatefulWidget {
8+
static const String route = 'point_to_latlng';
9+
10+
@override
11+
PointToLatlngPage createState() {
12+
return PointToLatlngPage();
13+
}
14+
}
15+
16+
class PointToLatlngPage extends State<PointToLatLngPage> {
17+
late final MapController mapController;
18+
final pointX = 100.0;
19+
final pointY = 100.0;
20+
final pointSize = 20.0;
21+
late final mapEventSubscription;
22+
23+
@override
24+
void initState() {
25+
super.initState();
26+
mapController = MapController();
27+
28+
mapEventSubscription = mapController.mapEventStream.listen(onMapEvent);
29+
}
30+
31+
@override
32+
Widget build(BuildContext context) {
33+
return Scaffold(
34+
appBar: AppBar(title: Text('PointToLatlng')),
35+
drawer: buildDrawer(context, PointToLatLngPage.route),
36+
body: Stack(
37+
children: [
38+
FlutterMap(
39+
mapController: mapController,
40+
options: MapOptions(
41+
center: LatLng(51.5, -0.09),
42+
zoom: 5.0,
43+
maxZoom: 5.0,
44+
minZoom: 3.0,
45+
),
46+
layers: [
47+
TileLayerOptions(
48+
urlTemplate:
49+
'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
50+
subdomains: ['a', 'b', 'c']),
51+
],
52+
),
53+
Positioned(
54+
top: pointY,
55+
left: pointX,
56+
child: Container(
57+
color: Colors.red, width: pointSize, height: pointSize))
58+
],
59+
),
60+
);
61+
}
62+
63+
void onMapEvent(MapEvent mapEvent) {
64+
if (mapEvent is MapEventMove) {
65+
final latLng = mapController.pointToLatLng(CustomPoint(pointX, pointY));
66+
67+
print('top left of square is hovering $latLng');
68+
}
69+
}
70+
}

example/lib/widgets/drawer.dart

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_map_example/pages/map_inside_listview.dart';
33
import 'package:flutter_map_example/pages/marker_rotate.dart';
44
import 'package:flutter_map_example/pages/network_tile_provider.dart';
5+
import 'package:flutter_map_example/pages/point_to_latlng.dart';
56

67
import '../pages/animated_map_controller.dart';
78
import '../pages/circle.dart';
@@ -228,6 +229,8 @@ Drawer buildDrawer(BuildContext context, String currentRoute) {
228229
),
229230
_buildMenuItem(context, const Text('Map inside listview'),
230231
MapInsideListViewPage.route, currentRoute),
232+
_buildMenuItem(context, const Text('Point to LatLng'),
233+
PointToLatLngPage.route, currentRoute),
231234
],
232235
),
233236
);

lib/flutter_map.dart

+2
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ abstract class MapController {
141141

142142
Stream<MapEvent> get mapEventStream;
143143

144+
LatLng? pointToLatLng(CustomPoint point);
145+
144146
factory MapController() => MapControllerImpl();
145147
}
146148

lib/src/map/map.dart

+13
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,19 @@ class MapControllerImpl implements MapController {
7777
return _state.rotate(degree, id: id, source: MapEventSource.mapController);
7878
}
7979

80+
@override
81+
LatLng? pointToLatLng(CustomPoint localPoint) {
82+
final width = _state.size.x;
83+
final height = _state.size.y;
84+
85+
var localPointCenterDistance =
86+
CustomPoint((width / 2) - localPoint.x, (height / 2) - localPoint.y);
87+
var mapCenter = _state.options.crs.latLngToPoint(_state.center, _state.zoom);
88+
89+
var point = mapCenter - localPointCenterDistance;
90+
return _state.options.crs.pointToLatLng(point, _state.zoom);
91+
}
92+
8093
@override
8194
Stream<MapEvent> get mapEventStream => _mapEventSink.stream;
8295
}

0 commit comments

Comments
 (0)