我想在Bing Map Control上放置一些(透明)圆圈作为叠加层。想想“爆炸半径”或“影响范围”之类的东西。我需要在地图上至少有二十几个这些圆圈以及其他一些多边形,所以确保性能不受影响并且地图继续易于操作似乎是关键。
到目前为止,我可以想到三个选项(其中我试过两个):
为每个圆圈添加n边MapPolygon
个实例到地图。试过这个,原则上工作得很好。但是,每个多边形的顶点数量有点腌渍。太小了,当你放大它看起来很可怕。太多了,性能将开始受到影响。
为每个圈子添加Pushpin
个实例,并将它们样式/模板化为以图钉位置为中心的圆圈。似乎工作,除了cicle的大小然后固定在屏幕大小,而不是地图大小。因此,当您缩放时,圆圈在屏幕上保持相同的大小,同时它们应该随地图缩放。 你能以某种方式将Ellipse
控件(在我使用的样式中的模板中)的大小绑定到父地图控件的Zoom
吗?
创建MapShapeBase
的自定义子类来表示每个圆圈。此实现可以动态更改用于绘制多边形的顶点数量,具体取决于形状在地图上是否可见(=当前视图端口内部)以及缩放级别。也就是说,如果地图形状可以访问此信息。我还没有尝试过这个选项。
你用过什么?你会用什么?您将如何解决上述问题,特别是使用XAML 将样式中使用的模板中的控件的属性绑定到父控件属性?或者你有其他选择我可以尝试让它发挥作用吗?
答案 0 :(得分:1)
在RunKeeper中,我们使用了第一个选项,并将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.
答案 1 :(得分:0)
我建议使用画布作为具有透明背景的叠加层,然后使用与here所述类似的技术将椭圆对象添加到其中。
只有技巧才能使画布的宽高比与地图控件对齐,因为它的显示/更新以及椭圆相对于你瞄准的坐标的位置。
答案 2 :(得分:0)
我建议你离开Bing Map Controls并开始使用ESRI Silverlight / WP7 Toolkit。它们有更多可用的控件,您可以直接使用它们。
http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/
以下是所有样本:http://help.arcgis.com/en/arcgismobile/10.0/apis/windowsphone/samples/start.htm
您需要一个帐户才能下载SDK,但它是免费的(注册和下载)。