Plane.FormationCreator/Plane.FormationCreator/ViewModels/ModifyTaskViewModel.cs
pxzleo 7e04c83e26 1.飞机按编号顺序加入飞行列表
2.默认起飞高度为15米
3.修改航点位置改为按住左shift再按下asdw,不按shift则是控制移动飞机
4.修复上下旋转的高度bug
5.为防止碰撞,加入两个按钮,一个为自动计算高度(未实现),一个为自动设为前一步高度,这样一个图案应该有三个同样形状的飞行任务,一个进入(高度不同)一个表演,一个退出(高度不同)
2017-03-17 23:02:08 +08:00

1014 lines
38 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Plane.Collections;
using Plane.Copters;
using Plane.FormationCreator.Formation;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Plane.Geography;
namespace Plane.FormationCreator.ViewModels
{
public class ModifyTaskViewModel : ViewModelBase
{
public ModifyTaskViewModel(FlightTaskManager flightTaskManager, CopterManager copterManager)
{
_flightTaskManager = flightTaskManager;
_copterManager = copterManager;
//_flightTaskManager.SingleCopterInfoChanged += (sender, e) =>
//{
// var changedSingleInfo = e.ChangedSingleCopterInfo;
// if (changedSingleInfo.Copter == _copterManager.SelectedCopters.FirstOrDefault())
// {
// if (changedSingleInfo is FlyToFlightTaskSingleCopterInfo)
// {
// FlyToLat = changedSingleInfo.TargetLat;
// FlyToLng = changedSingleInfo.TargetLng;
// FlyToAlt = changedSingleInfo.TargetAlt;
// }
// }
//};
// TODO: 林俊清, 20150803, 没什么问题就把这段以及 FlyToLat 等属性删了。
//_flightTaskManager.PropertyChanged += (sender, e) =>
//{
// switch (e.PropertyName)
// {
// case nameof(FlightTaskManager.SelectedTask):
// var currentCopter = _copterManager.SelectedCopters.FirstOrDefault();
// if (currentCopter != null)
// {
// var selectedTask = _flightTaskManager.SelectedTask;
// if (selectedTask != null)
// {
// var singleCopterInfo = selectedTask.SingleCopterInfos.Find(i => i.Copter == currentCopter);
// if (singleCopterInfo is FlyToFlightTaskSingleCopterInfo)
// {
// var info = singleCopterInfo as FlyToFlightTaskSingleCopterInfo;
// this.FlyToLat = info.TargetLat;
// this.FlyToLng = info.TargetLng;
// this.FlyToAlt = info.TargetAlt;
// }
// }
// }
// break;
// default:
// break;
// }
//};
//_copterManager.SelectedCoptersChanged += (sender, e) =>
//{
// // TODO: 林俊清, 20150731, 处理多选飞行器时的情况。
// var selectedCopters = _copterManager.SelectedCopters;
// if (selectedCopters.Count() > 1)
// {
// CanModifySingleCopterInfo = false;
// return;
// }
// CanModifySingleCopterInfo = true;
// var currentCopter = e.AddedCopters.FirstOrDefault();
// if (currentCopter != null)
// {
// var selectedTask = _flightTaskManager.SelectedTask;
// if (selectedTask != null)
// {
// var singleCopterInfo = selectedTask.SingleCopterInfos.Find(i => i.Copter == currentCopter);
// if (singleCopterInfo is FlyToFlightTaskSingleCopterInfo)
// {
// var info = singleCopterInfo as FlyToFlightTaskSingleCopterInfo;
// this.FlyToLat = info.TargetLat;
// this.FlyToLng = info.TargetLng;
// this.FlyToAlt = info.TargetAlt;
// }
// }
// }
//};
//this.PropertyChanged += (sender, e) =>
//{
// switch (e.PropertyName)
// {
// case nameof(FlyToLat):
// InvokeForSelectedSingleCopterInfos(info => info.TargetLat = FlyToLat);
// break;
// case nameof(FlyToLng):
// InvokeForSelectedSingleCopterInfos(info => info.TargetLng = FlyToLng);
// break;
// case nameof(FlyToAlt):
// InvokeForSelectedSingleCopterInfos(info => info.TargetAlt = FlyToAlt);
// break;
// case nameof(StaggerRoutes):
// {
// var modifyingTask = _flightTaskManager.SelectedTask as FlyToFlightTask;
// if (modifyingTask != null)
// {
// modifyingTask.StaggerAlt = this.StaggerRoutes;
// }
// }
// break;
// default:
// break;
// }
//};
}
private FlightTaskManager _flightTaskManager;
private CopterManager _copterManager;
public FlightTaskManager FlightTaskManager { get { return _flightTaskManager; } }
public CopterManager CopterManager { get { return _copterManager; } }
//private void InvokeForSelectedSingleCopterInfos(Action<FlightTaskSingleCopterInfo> action)
//{
// var modifyingTask = _flightTaskManager.SelectedTask as FlyToFlightTask;
// if (modifyingTask != null && _copterManager.SelectedCopters.Count() == 1) // 林俊清, 20150731, 目前不处理多选的情况。
// {
// modifyingTask.FlyToFlightTaskSingleCopterInfos
// .Where(i => _copterManager.SelectedCopters.FirstOrDefault() == i.Copter)
// .ForEach(action);
// // TODO: 林俊清, 20150731, 添加同时改多个 SingleCopterInfo 的程序。
// //.Where(i => _copterManager.SelectedCopters.Contains(i.Copter))
// }
//}
private bool _CanModifySingleCopterInfo = true;
public bool CanModifySingleCopterInfo
{
get { return _CanModifySingleCopterInfo; }
set { Set(nameof(CanModifySingleCopterInfo), ref _CanModifySingleCopterInfo, value); }
}
private double _Distancevalue;
public double Distancevalue
{
get { return _Distancevalue; }
set { Set(nameof(Distancevalue), ref _Distancevalue, value); }
}
private int _txtStarindex=0;
public int txtStarindex
{
get { return _txtStarindex; }
set { Set(nameof(txtStarindex), ref _txtStarindex, value); }
}
private int _txtendindex=0;
public int txtendindex
{
get { return _txtendindex; }
set { Set(nameof(txtendindex), ref _txtendindex, value); }
}
private double _FlyToLat;
public double FlyToLat
{
get { return _FlyToLat; }
set { Set(nameof(FlyToLat), ref _FlyToLat, value); }
}
private double _FlyToLng;
public double FlyToLng
{
get { return _FlyToLng; }
set { Set(nameof(FlyToLng), ref _FlyToLng, value); }
}
private float _FlyToAlt;
public float FlyToAlt
{
get { return _FlyToAlt; }
set { Set(nameof(FlyToAlt), ref _FlyToAlt, value); }
}
private bool _StaggerRoutes;
public bool StaggerRoutes
{
get { return _StaggerRoutes; }
set { Set(nameof(StaggerRoutes), ref _StaggerRoutes, value); }
}
private ICommand _ExportTasksCommand;
public ICommand ExportTasksCommand
{
get
{
return _ExportTasksCommand ?? (_ExportTasksCommand = new RelayCommand(() =>
{
var exportedText = _flightTaskManager.ExportTasks();
var dialog = new SaveFileDialog
{
DefaultExt = "fcg",
Filter = "编队飞行任务 (*.fcg)|*.fcg"
};
if (dialog.ShowDialog() == true)
{
File.WriteAllText(dialog.FileName, exportedText);
}
}));
}
}
private ICommand _ImportTasksCommand;
public ICommand ImportTasksCommand
{
get
{
return _ImportTasksCommand ?? (_ImportTasksCommand = new RelayCommand(() =>
{
var dialog = new OpenFileDialog
{
DefaultExt = "fcg",
Filter = "编队飞行任务 (*.fcg)|*.fcg"
};
if (dialog.ShowDialog() == true)
{
int _startindex = txtStarindex;
int _endindex= txtendindex;
var tasksText = File.ReadAllText(dialog.FileName);
if ((txtStarindex == 0) && (txtendindex == 0))
_flightTaskManager.ImportTasks(tasksText);
else
{
_endindex = txtendindex;
if (_startindex == 0)
_startindex = 1;
if (_endindex == 0)
_endindex = _startindex;
_flightTaskManager.ImportTasksindex(tasksText, _startindex, _endindex);
}
}
}));
}
}
private ICommand _LevelAverageCommand;
public ICommand LevelAverageCommand
{
get
{
return _LevelAverageCommand ?? (_LevelAverageCommand = new RelayCommand<int>(async =>
{
double maxlng = 0;
double minlng = 0;
double tlng = 0;
double avgl = 0;
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
int selectednumber = _copterManager.SelectedCopters.Count() - 1;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
if (minlng == 0)
minlng = tlng;
if (tlng > maxlng)
maxlng = tlng;
else if (tlng < minlng)
minlng = tlng;
}
}
avgl = (maxlng - minlng) / selectednumber;
int coptnum = 0;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = minlng + avgl * coptnum;
coptnum++;
}
}
///////////////////////
// await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
private ICommand _VerticlAverageCommand;
public ICommand VerticlAverageCommand
{
get
{
return _VerticlAverageCommand ?? (_VerticlAverageCommand = new RelayCommand<int>(async =>
{
double maxlat = 0;
double tlat = 0;
double minlat = 0;
double avgl = 0;
//////////////////////
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
int selectednumber = _copterManager.SelectedCopters.Count() - 1;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
if (minlat == 0)
minlat = tlat;
if (tlat > maxlat)
maxlat = tlat;
else if (tlat < minlat)
minlat = tlat;
}
}
avgl = (maxlat - minlat) / selectednumber;
int coptnum = 0;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = maxlat - avgl * coptnum;
coptnum++;
}
}
///////////////////////
// await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
private ICommand _LevelAlignmentCommand;
public ICommand LevelAlignmentCommand
{
get
{
return _LevelAlignmentCommand ?? (_LevelAlignmentCommand = new RelayCommand<int>(async =>
{
double maxlat = 0;
double tlat = 0;
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
if (tlat > maxlat)
maxlat = tlat;
}
}
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = maxlat;
}
}
//await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
private ICommand _VerticlAlignmentCommand;
public ICommand VerticlAlignmentCommand
{
get
{
return _VerticlAlignmentCommand ?? (_VerticlAlignmentCommand = new RelayCommand<int>(async =>
{
double maxlng = 0;
double tlng = 0;
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
if (tlng > maxlng)
maxlng = tlng;
}
}
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = maxlng;
}
}
//await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
public static double DistanceOfTwoPoints(double lng1, double lat1, double lng2, double lat2, GaussSphere gs)
{
double radLat1 = Rad(lat1);
double radLat2 = Rad(lat2);
double a = radLat1 - radLat2;
double b = Rad(lng1) - Rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) +
Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2)));
s = s * (gs == GaussSphere.WGS84 ? 6378137.0 : (gs == GaussSphere.Xian80 ? 6378140.0 : 6378245.0));
s = Math.Round(s * 10000) / 10000;
return s;
}
private static double Rad(double d)
{
return d * Math.PI / 180.0;
}
/// <summary>
/// 高斯投影中所选用的参考椭球
/// </summary>
public enum GaussSphere
{
Beijing54,
Xian80,
WGS84,
}
//水平旋转
private ICommand _LevelRotateCommand;
public ICommand LevelRotateCommand
{
get
{
return _LevelRotateCommand ?? (_LevelRotateCommand = new RelayCommand<int>(async RotateLine =>
{
double lngsum = 0;
double latsum = 0;
int selectcount = 0;
double centlng = 0;
double centlat = 0;
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
lngsum+= _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
latsum+= _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
selectcount++;
}
}
//计算旋转中心
if (selectcount > 0)
{
centlng = lngsum / selectcount;
centlat = latsum / selectcount;
}
else return;
//////////计算旋转,经测试用下面的函数组合计算比较准确
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
{
double lpDistance = CalculationLogLatDistance.GetDistanceOne(centlng, centlat,
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng,
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
CalculationLogLatDistance.MyLatLng mypos1, mypos2;
mypos1 = new CalculationLogLatDistance.MyLatLng(centlng, centlat);
mypos2 = new CalculationLogLatDistance.MyLatLng(_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng
, _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
double lpAzimuth = CalculationLogLatDistance.getAngle(mypos1, mypos2);
double lng2 = 0;
double lat2=0;
CalculationLogLatDistance.ConvertDistanceToLogLat(centlng, centlat, lpDistance,
lpAzimuth + (double)RotateLine,out lng2, out lat2);
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = lng2;
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = lat2;
}
}
}
////
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
//垂直旋转
private ICommand _VerticlRotateCommand;
public ICommand VerticlRotateCommand
{
get
{
return _VerticlRotateCommand ?? (_VerticlRotateCommand = new RelayCommand<int>(async RotateLine =>
{
double lngsum = 0;
double latsum = 0;
double altsum = 0;
int selectcount = 0;
double centlng = 0;
double centlat = 0;
double centalt = 0;
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
lngsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
latsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
altsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt;
selectcount++;
}
}
//计算旋转中心
if (selectcount > 0)
{
centlng = lngsum / selectcount;
centlat = latsum / selectcount;
centalt = altsum / selectcount;
}
else return;
//////////计算旋转,经测试用下面的函数组合计算比较准确
double k = (double)RotateLine / 180 * Math.PI;
double dx = 0;
double dy = 0;
double ax = 0;
double ay = 0;
double tlng = 0;
double tlat = 0;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
{
tlng = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
tlat = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
//纬度方向距离单位m
ax = CalculationLogLatDistance.GetDistanceOne(tlng, centlat,tlng,tlat) *1000;
//方向角用于正负,0为正180为负
CalculationLogLatDistance.MyLatLng mypos1, mypos2;
mypos1 = new CalculationLogLatDistance.MyLatLng(tlng,centlat);
mypos2 = new CalculationLogLatDistance.MyLatLng(tlng,tlat);
double lpAzimuth = CalculationLogLatDistance.getAngle(mypos1, mypos2);
if (lpAzimuth > 90)
ax = -ax;
//高度方向距离单位m
ay = (_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt - centalt);
dx = ax * Math.Cos(k) + ay * Math.Sin(k);
dy = -ax * Math.Sin(k) + ay * Math.Cos(k);
//新高度(米)
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt= (float)(centalt + dy);
//计算新纬度
double lng2 = 0;
double lat2 = 0;
if (dx < 0)
lpAzimuth = 180;
else
lpAzimuth = 0;
dx=Math.Abs(dx);
CalculationLogLatDistance.ConvertDistanceToLogLat(
tlng,
centlat, //旋转中心纬度
dx/1000, //新距离
lpAzimuth, //方向垂直
out lng2,
out lat2);
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = lat2;
}
}
}
////
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
private ICommand _AutoaltCommand;
public ICommand AutoaltCommand
{
get
{
return _AutoaltCommand ?? (_AutoaltCommand = new RelayCommand<double>(async =>
{
}));
}
}
private ICommand _PrealtCommand;
public ICommand PrealtCommand
{
get
{
return _PrealtCommand ?? (_PrealtCommand = new RelayCommand<double>(async =>
{
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
{
if (_flightTaskManager.SelectedTaskIndex > 1)
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt =
_flightTaskManager.Tasks[_flightTaskManager.SelectedTaskIndex - 1].SingleCopterInfos[i].TargetAlt;
}
}
}
}));
}
}
//计算距离
private ICommand _calDistinceCommand;
public ICommand calDistinceCommand
{
get
{
return _calDistinceCommand ?? (_calDistinceCommand = new RelayCommand<double>(async =>
{
double lng1=0, lat1=0, alt1=0, lng2=0, lat2=0, alt2=0;
double distance = 0;
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
{
if (lng1 == 0)
{
lng1 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
lat1 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
alt1 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt;
}
else
if (lng2 == 0)
{
lng2 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
lat2 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
alt2 = _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetAlt;
}
else break;
}
}
}
if ((lng1 != 0) && (lng2 != 0))
{
distance = GeographyUtils.CalcDistance(
lat1, lng1, alt1,
lat2, lng2, alt2);
distance = ((double)Math.Round(distance * 100) / 100);
}
Distancevalue = distance;
}));
}
}
//缩放
private ICommand _ScaleCommand;
public ICommand ScaleCommand
{
get
{
return _ScaleCommand ?? (_ScaleCommand = new RelayCommand<int>(async ScaleVale =>
{
double lngsum = 0;
double latsum = 0;
int selectcount = 0;
double centlng = 0;
double centlat = 0;
var selectedCopter = _copterManager.SelectedCopters.FirstOrDefault();
bool copterisselect;
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
copterisselect = false;
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
copterisselect = true;
}
if (copterisselect)
{
lngsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng;
latsum += _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat;
selectcount++;
}
}
//计算缩放中心
if (selectcount > 0)
{
centlng = lngsum / selectcount;
centlat = latsum / selectcount;
}
else return;
//////////计算旋转,经测试用下面的函数组合计算比较准确
for (int i = 0; i < _flightTaskManager.SelectedTask.SingleCopterInfos.Count; i++)
{
selectedCopter = _flightTaskManager.SelectedTask.SingleCopterInfos[i].Copter;
foreach (var capter in _copterManager.SelectedCopters)
{
if (capter == selectedCopter)
{
double lpDistance = CalculationLogLatDistance.GetDistanceOne(centlng, centlat,
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng,
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
CalculationLogLatDistance.MyLatLng mypos1, mypos2;
mypos1 = new CalculationLogLatDistance.MyLatLng(centlng, centlat);
mypos2 = new CalculationLogLatDistance.MyLatLng(_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng
, _flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat);
double lpAzimuth = CalculationLogLatDistance.getAngle(mypos1, mypos2);
double lng2 = 0;
double lat2 = 0;
CalculationLogLatDistance.ConvertDistanceToLogLat(centlng, centlat, lpDistance * (double)ScaleVale/100,
lpAzimuth , out lng2, out lat2);
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLng = lng2;
_flightTaskManager.SelectedTask.SingleCopterInfos[i].TargetLat = lat2;
}
}
}
await Task.Delay(100); // 如果不等待一段时间,很可能会再触发 DataStreamReceived 事件导致飞行器重新出现在地图上。
}));
}
}
}
}