打点添加距离
This commit is contained in:
@@ -1256,11 +1256,35 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
|||||||
],
|
],
|
||||||
),
|
),
|
||||||
if (_markedPoints.isNotEmpty && !_isWorkAreaCompleted && _currentRobotMode == RobotMode.point)
|
if (_markedPoints.isNotEmpty && !_isWorkAreaCompleted && _currentRobotMode == RobotMode.point)
|
||||||
|
Stack(
|
||||||
|
// 核心:替换Column为Stack
|
||||||
|
children: [
|
||||||
|
// 1. 蓝色连线
|
||||||
PolylineLayer(
|
PolylineLayer(
|
||||||
polylines: [
|
polylines: [
|
||||||
Polyline(points: [_mapCenter, _markedPoints.last], color: Colors.blue.withOpacity(0.5), strokeWidth: 1.5),
|
Polyline(points: [_mapCenter, _markedPoints.last], color: Colors.blue.withOpacity(0.5), strokeWidth: 1.5),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
// 2. 距离文本Marker
|
||||||
|
MarkerLayer(
|
||||||
|
markers: [
|
||||||
|
Marker(
|
||||||
|
point: _getMiddleLatLng(_mapCenter, _markedPoints.last),
|
||||||
|
width: 100,
|
||||||
|
height: 30,
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
|
||||||
|
child: Text(
|
||||||
|
_calculateLatLngDistance(_mapCenter, _markedPoints.last),
|
||||||
|
style: const TextStyle(color: Colors.red, fontSize: 12, fontWeight: FontWeight.bold),
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
/// 当前定位 Marker
|
/// 当前定位 Marker
|
||||||
if (_currentLatLng != null && __isValidLatLng(_currentLatLng))
|
if (_currentLatLng != null && __isValidLatLng(_currentLatLng))
|
||||||
@@ -2528,3 +2552,35 @@ double _transformLon(double x, double y) {
|
|||||||
ret += (150.0 * sin(x / 12.0 * _pi) + 300.0 * sin(x / 30.0 * _pi)) * 2.0 / 3.0;
|
ret += (150.0 * sin(x / 12.0 * _pi) + 300.0 * sin(x / 30.0 * _pi)) * 2.0 / 3.0;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 计算两个经纬度点之间的地面距离(单位:米,GCJ02/WGS84通用)
|
||||||
|
String _calculateLatLngDistance(LatLng point1, LatLng point2) {
|
||||||
|
const double earthRadius = 6371000; // 地球半径(米)
|
||||||
|
|
||||||
|
// 经纬度转弧度
|
||||||
|
double lat1Rad = point1.latitude * pi / 180;
|
||||||
|
double lat2Rad = point2.latitude * pi / 180;
|
||||||
|
double lng1Rad = point1.longitude * pi / 180;
|
||||||
|
double lng2Rad = point2.longitude * pi / 180;
|
||||||
|
|
||||||
|
// 哈维正弦公式(Haversine)计算地球表面两点实际距离
|
||||||
|
double dLat = lat2Rad - lat1Rad;
|
||||||
|
double dLng = lng2Rad - lng1Rad;
|
||||||
|
double a = sin(dLat / 2) * sin(dLat / 2) + cos(lat1Rad) * cos(lat2Rad) * sin(dLng / 2) * sin(dLng / 2);
|
||||||
|
double c = 2 * atan2(sqrt(a), sqrt(1 - a));
|
||||||
|
double distance = earthRadius * c;
|
||||||
|
|
||||||
|
// 格式化显示:短距离显示米,长距离显示千米
|
||||||
|
if (distance < 1000) {
|
||||||
|
return '${distance.toStringAsFixed(1)} 米';
|
||||||
|
} else {
|
||||||
|
return '${(distance / 1000).toStringAsFixed(2)} 千米';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// 获取两个坐标点的中点坐标(用于显示距离文本)
|
||||||
|
LatLng _getMiddleLatLng(LatLng point1, LatLng point2) {
|
||||||
|
double middleLat = (point1.latitude + point2.latitude) / 2;
|
||||||
|
double middleLng = (point1.longitude + point2.longitude) / 2;
|
||||||
|
return LatLng(middleLat, middleLng);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user