private void drawChangeLineRadian(List<PointLatLng> ps) {
removeRadianCircles();
List<double> degrees = new List<double>();
if (ps.Count > 2)
{
for (int i = 1; i < ps.Count; ++i)
{
PointLatLng curPoint = ps[i];
PointLatLng prevPoint = ps[i - 1];
double angle = mapUtil.calculateDirection(prevPoint, curPoint);
degrees.Add(angle);
if (degrees.Count > 1)
{
// 两条线的夹角
double degreeSubtract = degrees[i - 1] - degrees[i - 2];
double includeAngle = 0;
// 方位
double position = 0;
// > 0
if (degreeSubtract > 0)
{
if (degreeSubtract < 180)
{
includeAngle = 180 - degreeSubtract;
position = (degrees[i - 1] + includeAngle / 2) % 360;
}
if (degreeSubtract > 180)
{
includeAngle = 180 - (360 - degreeSubtract);
position = (degrees[i - 1] - includeAngle / 2) % 360;
}
}
if (degreeSubtract < 0)
{
if (degreeSubtract < -180)
{
includeAngle = 180 - (360 - Math.Abs(degreeSubtract));
position = (degrees[i - 1] + includeAngle / 2) % 360;
}
if (degreeSubtract > -180)
{
includeAngle = 180 - Math.Abs(degreeSubtract);
position = ((degrees[i - 2] + 180) + includeAngle / 2) % 360;
}
}
double aHalfIncludeAngle = includeAngle / 2;
double distance = centralRadius / Math.Sin(aHalfIncludeAngle * Math.PI / 180);
// 切点距离
double tangency_distance = distance * Math.Sin(aHalfIncludeAngle * Math.PI/180);
// 找出对照点 为上一个点 prevPoint
// 计算上一个点的纬度周长
double latGrith = earthRadius * Math.Cos(prevPoint.Lat * Math.PI / 180) * Math.PI * 2;
// 东北方向 degreeAndLat 与纬度的夹角
if (position > 0 && position < 90)
{
double degreeAndLat = 90 - position;
double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
// 距离转 度数
double veritalDegree = veritalDistance / lngGrith * 360;
double horizontalDegree = horizontalDistance / latGrith * 360;
double lat = prevPoint.Lat + veritalDegree;
double lng = prevPoint.Lng + horizontalDegree;
PointLatLng latLng = new PointLatLng(lat, lng);
GMapMarker hoverCircle = new GMapMarker(latLng);
Circle c = new Circle(hoverCircle, 100, MainMap);
c.SetColor(Brushes.Yellow, 3);
hoverCircle.Shape = c;
MainMap.Markers.Add(hoverCircle);
radianCircles.Add(hoverCircle);
}
// 东南方向
else if (position > 90 && position < 180)
{
double degreeAndLat = position - 90;
double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
// 距离转 度数
double veritalDegree = veritalDistance / lngGrith * 360;
double horizontalDegree = horizontalDistance / latGrith * 360;
// 中心点
double lat = prevPoint.Lat - veritalDegree;
double lng = prevPoint.Lng + horizontalDegree;
// 两个切点
PointLatLng latLng = new PointLatLng(lat, lng);
GMapMarker hoverCircle = new GMapMarker(latLng);
Circle c = new Circle(hoverCircle, 100, MainMap);
c.SetColor(Brushes.Yellow, 3);
hoverCircle.Shape = c;
MainMap.Markers.Add(hoverCircle);
radianCircles.Add(hoverCircle);
}
// 西南方向
else if (position > 180 && position < 270)
{
double degreeAndLat = 270 - position;
double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
// 距离转 度数
double veritalDegree = veritalDistance / lngGrith * 360;
double horizontalDegree = horizontalDistance / latGrith * 360;
double lat = prevPoint.Lat - veritalDegree;
double lng = prevPoint.Lng - horizontalDegree;
PointLatLng latLng = new PointLatLng(lat, lng);
GMapMarker hoverCircle = new GMapMarker(latLng);
Circle c = new Circle(hoverCircle, 100, MainMap);
c.SetColor(Brushes.Yellow, 3);
hoverCircle.Shape = c;
MainMap.Markers.Add(hoverCircle);
radianCircles.Add(hoverCircle);
}
// 西北方向
else if (position > 270 && position < 360)
{
double degreeAndLat = position - 270;
double veritalDistance = distance * Math.Sin(degreeAndLat * Math.PI / 180);
double horizontalDistance = distance * Math.Cos(degreeAndLat * Math.PI / 180);
// 距离转 度数
double veritalDegree = veritalDistance / lngGrith * 360;
double horizontalDegree = horizontalDistance / latGrith * 360;
double lat = prevPoint.Lat + veritalDegree;
double lng = prevPoint.Lng - horizontalDegree;
PointLatLng latLng = new PointLatLng(lat, lng);
GMapMarker hoverCircle = new GMapMarker(latLng);
Circle c = new Circle(hoverCircle, 100, MainMap);
c.SetColor(Brushes.Yellow, 3);
hoverCircle.Shape = c;
MainMap.Markers.Add(hoverCircle);
radianCircles.Add(hoverCircle);
}
}
}
}
}