我想在必应 map 控件上放置一些(透明)圆圈作为叠加层。想想“爆炸半径”或“影响范围”之类的东西。我需要在 map 上至少有两打这样的圆圈,以及其他一些多边形,因此确保性能不会受到影响并且 map 继续易于操作似乎是关键。
到目前为止,我可以想到三个选项(其中我尝试了两个):
MapPolygon
每个圆圈的 map 实例。试过这个,原则上工作正常。但是,每个多边形的顶点数有点麻烦。太少了,放大后看起来很丑。太多了,性能将开始受到影响。 Pushpin
每个圆圈的实例,并将它们样式/模板化为以图钉位置为中心的圆圈。似乎工作,除了 cicle 的大小然后固定在屏幕大小,而不是 map 大小。因此,当您缩放时,圆圈在屏幕上的大小保持不变,而它们应该随 map 一起缩放。可以绑定(bind)Ellipse
的大小吗控制(在我使用的样式的模板中)到 Zoom
以某种方式的父 map 控件..? MapShapeBase
的自定义子类代表每个圆圈。此实现可以根据形状在 map 上是否可见(=在当前视口(viewport)内)以及缩放级别来动态更改用于绘制多边形的顶点数。也就是说,如果 map 形状可以访问此信息。我还没有尝试过这个选项。 你用了什么?你会用什么?您将如何解决上述问题,尤其是使用 XAML 将样式中使用的模板中的控件属性绑定(bind)到父控件属性?或者你还有其他选择我可以尝试让它工作吗?
最佳答案
在 RunKeeper 中,我们使用了第一个选项并绑定(bind)了 Locations
属性到 LocationCollection
360 个点创建如下:
protected void UpdateAccuracyCircle()
{
var location = this.CurrentLocation;
if (null != location)
{
var lat = location.Latitude * (Math.PI / 180);
var lng = location.Longitude * (Math.PI / 180);
var d = (this.Accuracy / 1000.0) / Constants.EarthRadius;
var circle = new LocationCollection();
for (int x = 0; x <= 360; x++)
{
var brng = x * (Math.PI / 180);
var latRadians =
Math.Asin(
Math.Sin(lat) *
Math.Cos(d) +
Math.Cos(lat) *
Math.Sin(d) *
Math.Cos(brng));
var lngRadians =
lng +
Math.Atan2(
Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat),
Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians));
circle.Add(
new GeoCoordinate(
latRadians * (180 / Math.PI),
lngRadians * (180 / Math.PI)));
}
Dispatcher.BeginInvoke(() => this.AccuracyCircle = circle);
}
}
在这种情况下,我们只处理一个圆圈(用于准确性指示),因此如果您需要多个圆圈,可能不是特别有效。
鉴于创建圆的逻辑在此示例中的代码中,我认为您可以轻松调整逻辑以根据 ZoomLevel 使用更多/更少的点来满足选项 3。
关于xaml - 如何在 WP7 Bing Map 控件上放置多个圆形叠加层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7358434/