题
与此相似的问题已经很多次了,但是它们似乎都没有给我我想要的东西。我正在使用Windows Phone上的Bing Map Control工作,我想添加一个椭圆形,该椭圆可随着变焦更改而正确缩放。这可以用多边形和多边形来完成,但是没有从MapShapebase得出的椭圆类型。我已经尝试了各种方法,但是他们需要使用像素尺寸来玩耍并填写数学以使其与地理坐标对齐。我想创建一个带有中心和X/y尺寸的椭圆形,并让框架完成其余的。看起来很简单。我错过了某个地方吗?我的另一种方法是在多线线上绘制365条线段,但这似乎非常丑陋,而且由于中心可以移动,我需要绑定每个细分市场的位置。这似乎很重。还有其他想法吗?
具体来说,我想添加一个“ GPS精度”指示器作为当前位置围绕圆的圆。
解决方案
更新
在芒果中,手机会自动显示这样的圆圈。
原始柱
这很容易。您只需使用Pushpin控件即可使用图纸。
1)在您的控件中添加一个Maplayer:
<maps:MapLayer>
<maps:MapPolygon Fill="Gray"
IsHitTestVisible="False"
Locations="{Binding AccuracyLocationCollection}"
Opacity="0.6"
Stroke="Black"
StrokeThickness="2" />
</maps:MapLayer>
2)在您的ViewModel中添加精确度计算属性
public LocationCollection AccuracyLocationCollection
{
get;
set;
}
3)在GeoCoorceartionWatcher_PositionChanged事件处理程序中,计算圆的大小,然后将值设置为准确性计算
ViewModel.AccuracyLocationCollection = DrawMapsCircle(e.Position.Location);
4)drawmapscircle的代码如下:
私有静态双重托拉迪安(双度){返回度 *(Math.pi / 180); }
private static double ToDegrees(double radians)
{
return radians * (180 / Math.PI);
}
public static LocationCollection DrawMapsCircle(GeoCoordinate location)
{
double earthRadiusInMeters = 6367.0 * 1000.0;
var lat = ToRadian(location.Latitude);
var lng = ToRadian(location.Longitude);
var d = location.HorizontalAccuracy / earthRadiusInMeters;
var locations = new LocationCollection();
for (var x = 0; x <= 360; x++)
{
var brng = ToRadian(x);
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));
locations.Add(new Location()
{
Latitude = ToDegrees(latRadians),
Longitude = ToDegrees(lngRadians)
});
}
return locations;
}
结果:(这位于我的家旁边,我可以确认道路之间约有3米,灰色圆圈之间显示)
不隶属于 StackOverflow