这并不像看起来那么简单。一种选择是简单地使用位图图像并根据需要对其进行旋转。我需要更多的灵活性(和速度)并使用绘图功能来执行此任务。
假设您能够使用局部坐标(像素)在地图上绘制多边形,您可以手动绘制一些指示符。例如这段代码:
int position_size = 20;
GPoint gp = FromLatLngToLocal(longlatposition);
Point[] pnts = new Point[4];
pnts[0] = new Point((int)gp.X - (position_size * 2), (int)gp.Y + (position_size * 2));
pnts[1] = new Point((int)gp.X, (int)gp.Y - (position_size * 4));
pnts[2] = new Point((int)gp.X + (position_size * 2), (int)gp.Y + (position_size * 2));
pnts[3] = new Point((int)gp.X, (int)gp.Y + position_size);
float heading_ = 45; //this is where you define how much to rotate
pnts = Rotate(pnts, new PointF(gp.X, gp.Y), heading_);
g.FillPolygon(new SolidBrush(color), pnts);
将绘制一个如下所示的箭头:
旋转功能是这篇文章的一个变体:Rotate bunch of points thourgh an origin)。
private static PointF[] Rotate(PointF[] point, PointF pivot, double angleDegree)
{
double angle = angleDegree * Math.PI / 180;
double cos = Math.Cos(angle);
double sin = Math.Sin(angle);
PointF[] rotated = new PointF[point.Length];
for (int i = 0; i < point.Length; i++)
{
float dx = point[i].X - pivot.X;
float dy = point[i].Y - pivot.Y;
double x = (cos * dx) - (sin * dy) + pivot.X;
double y = (sin * dx) + (cos * dy) + pivot.Y;
rotated[i] = new PointF((float)x, (float)y);
}
return rotated;
}
现在最困难的部分是使用 GMap 插件整合所有这些。有几种方法可以做到这一点。我个人选择修改 GMap 源代码,因为它在处理像素坐标时提供了最大的灵活性。另一个选项,假设您不想修改源,是创建一个新的多边形叠加层并在您想要显示新的位置和航向时更新点。请记住,多边形叠加层采用 lng lat 坐标,因此您需要进行一些转换才能使其正常工作,特别是如果您不希望位置指示器与其他所有内容一起缩放。
我希望这会有所帮助。