如何获取FlutterMap上被Container遮挡区域的地理坐标(LatLng)
获取FlutterMap右下角遮挡区域的地理坐标方案
核心思路
通过屏幕坐标转地理坐标的方式,先定位遮挡Container的屏幕范围,再借助FlutterMap的控制器将该范围转换为对应的LatLng区域,最终实现点位遮挡判断。
具体实现步骤
步骤1:获取遮挡Container的屏幕边界
给右下角的Container绑定GlobalKey,通过其RenderObject获取组件的屏幕偏移和尺寸:final GlobalKey _obscureContainerKey = GlobalKey(); // 构建Widget时给Container设置key @override Widget build(BuildContext context) { return Stack( children: [ FlutterMap(/* 地图配置 */), Positioned( bottom: 16, right: 16, child: Container( key: _obscureContainerKey, child: Row(/* 选点按钮组 */), ), ), ], ); } // 获取Container的屏幕坐标范围 Rect getContainerScreenBounds() { final renderBox = _obscureContainerKey.currentContext?.findRenderObject() as RenderBox?; if (renderBox == null) return Rect.zero; final offset = renderBox.localToGlobal(Offset.zero); // 相对于屏幕左上角的偏移 final size = renderBox.size; return Rect.fromLTWH(offset.dx, offset.dy, size.width, size.height); }步骤2:将屏幕边界转换为地理坐标(LatLng)
利用FlutterMap的MapController提供的screenPointToLatLng方法,把屏幕坐标转为对应的地理坐标:final MapController _mapController = MapController(); // 获取遮挡区域的LatLng范围 Future<LatLngBounds?> getObscuredLatLngBounds() async { final screenBounds = getContainerScreenBounds(); if (screenBounds.isEmpty) return null; // 转换对角屏幕坐标为LatLng,确定矩形范围 final topLeft = _mapController.screenPointToLatLng(Offset(screenBounds.left, screenBounds.top)); final bottomRight = _mapController.screenPointToLatLng(Offset(screenBounds.right, screenBounds.bottom)); if (topLeft == null || bottomRight == null) return null; return LatLngBounds(northEast: topLeft, southWest: bottomRight); }步骤3:判断点位是否被遮挡
通过FlutterMap自带的LatLngBounds.contains方法,直接判断目标点位是否在遮挡区域内:bool isPointObscured(LatLng point, LatLngBounds bounds) { return bounds.contains(point); }步骤4:动态更新遮挡区域
在地图状态变化(拖拽、缩放)或屏幕尺寸改变时,重新计算遮挡区域:- 监听FlutterMap的
onPositionChanged回调,触发重新计算 - 监听屏幕旋转、窗口尺寸变化事件,调用
getObscuredLatLngBounds更新范围
- 监听FlutterMap的
内容的提问来源于stack exchange,提问作者jpgorganizer
相关产品推荐
相关产品推荐

