C# 如何在windows phone 8中在地理坐标上绘制1500米范围的脱机圆

C# 如何在windows phone 8中在地理坐标上绘制1500米范围的脱机圆,c#,windows-phone-8,bing-maps,C#,Windows Phone 8,Bing Maps,我想在windows phone中的地理坐标上绘制脱机圆 这个圆圈的射程为1500米,它在这个范围内搜索目标 这是我的图片,我有点画圆使用宽度和高度,但我想画圆 在缩放时使用半径,圆的范围也会受到影响 也可以搜索该范围内的目标 // double metersPerPixels = (Math.Cos(geo.Latitude * Math.PI / 180) * 2 * Math.PI * 6378137) / (256 * Math.Pow(2, map.ZoomLevel));

我想在windows phone中的地理坐标上绘制脱机圆 这个圆圈的射程为1500米,它在这个范围内搜索目标

这是我的图片,我有点画圆使用宽度和高度,但我想画圆 在缩放时使用半径,圆的范围也会受到影响

也可以搜索该范围内的目标

    //  double metersPerPixels = (Math.Cos(geo.Latitude * Math.PI / 180) * 2 * Math.PI * 6378137) / (256 * Math.Pow(2, map.ZoomLevel));
    // double radius = 1000 / metersPerPixels;



    map.Layers.Add(new MapLayer()
          {
            new MapOverlay()
            {
                GeoCoordinate = geo,                   
                PositionOrigin = new Point(0.5,0.5),   
                 Content = new Ellipse
                {   

                    Opacity=.4,
                    Fill = new SolidColorBrush(color),
                    Width = 100,//radius * 2 
                    Height =100 //adius * 2 

                }
             }                
          });

现在,您可以通过更改此帮助器中的
位置
类将其用于自己的类

下面是一个示例帮助器,用于创建一个以米为单位的初始点和半径外的圆:

/// <summary>
/// The geo drawing helper.
/// </summary>
public class GeoDrawingHelper
{
    #region Constants

    /// <summary>
    /// The c_ earth radius in kilometers.
    /// </summary>
    public const double c_EarthRadiusInKilometers = 6367.0;

    #endregion

    #region Public Methods and Operators

    /// <summary>
    /// Creates a circle by the initializing point.
    /// </summary>
    /// <param name="center">
    /// The center Point.
    /// </param>
    /// <param name="radius">
    /// The radius in meter.
    /// </param>
    /// <returns>
    /// The <see cref="List"/>.
    /// </returns>
    public static List<Location> CreateCirclePoints(Location center, double radius)
    {
        double lat = ToRadian(center.Latitude); // radians
        double lng = ToRadian(center.Longitude); // radians
        double d = radius / (c_EarthRadiusInKilometers * 1000); // d = angular distance covered on earth's surface
        var locations = new List<Location>();

        for (var x = 0; x <= 360; x++)
        {
            // Calculate the coordinates of the point
            double brng = ToRadian(x);
            double latRadians = Math.Asin((Math.Sin(lat) * Math.Cos(d)) + (Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng)));
            double lngRadians = lng
                                + Math.Atan2(
                                    Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), 
                                    Math.Cos(d) - (Math.Sin(lat) * Math.Sin(latRadians)));

            // Add the location
            locations.Add(new Location() { Latitude = ToDegrees(latRadians), Longitude = ToDegrees(lngRadians) });
        }

        return locations;
    }

    /// <summary>
    /// Convert the radian to degrees measure.
    /// </summary>
    /// <param name="radians">
    /// The radians.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToDegrees(double radians)
    {
        return radians * (180 / Math.PI);
    }

    /// <summary>
    /// Convert the degrees to radian measure.
    /// </summary>
    /// <param name="degrees">
    /// The degrees.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToRadian(double degrees)
    {
        return degrees * (Math.PI / 180);
    }

    #endregion
}
//
///地理图形辅助工具。
/// 
公共类GeoDrawingHelper
{
#区域常数
/// 
///以公里为单位的地球半径。
/// 
公共常数双c_接地半径仪=6367.0;
#端区
#区域公共方法和运算符
/// 
///通过初始化点创建一个圆。
/// 
/// 
///中心点。
/// 
/// 
///半径以米为单位。
/// 
/// 
///这个。
/// 
公共静态列表CreateCirclePoints(位置中心,双半径)
{
双纬度=环面(中心纬度);//弧度
双lng=ToRadian(中心经度);//弧度
双d=半径/(c_EarthRadiusInKilometers*1000);/d=地球表面覆盖的角距离
变量位置=新列表();

对于(var x=0;x在这里,您可以通过更改此帮助程序中的
位置
类将其用于您自己的类

下面是一个示例帮助器,用于创建一个以米为单位的初始点和半径外的圆:

/// <summary>
/// The geo drawing helper.
/// </summary>
public class GeoDrawingHelper
{
    #region Constants

    /// <summary>
    /// The c_ earth radius in kilometers.
    /// </summary>
    public const double c_EarthRadiusInKilometers = 6367.0;

    #endregion

    #region Public Methods and Operators

    /// <summary>
    /// Creates a circle by the initializing point.
    /// </summary>
    /// <param name="center">
    /// The center Point.
    /// </param>
    /// <param name="radius">
    /// The radius in meter.
    /// </param>
    /// <returns>
    /// The <see cref="List"/>.
    /// </returns>
    public static List<Location> CreateCirclePoints(Location center, double radius)
    {
        double lat = ToRadian(center.Latitude); // radians
        double lng = ToRadian(center.Longitude); // radians
        double d = radius / (c_EarthRadiusInKilometers * 1000); // d = angular distance covered on earth's surface
        var locations = new List<Location>();

        for (var x = 0; x <= 360; x++)
        {
            // Calculate the coordinates of the point
            double brng = ToRadian(x);
            double latRadians = Math.Asin((Math.Sin(lat) * Math.Cos(d)) + (Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng)));
            double lngRadians = lng
                                + Math.Atan2(
                                    Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), 
                                    Math.Cos(d) - (Math.Sin(lat) * Math.Sin(latRadians)));

            // Add the location
            locations.Add(new Location() { Latitude = ToDegrees(latRadians), Longitude = ToDegrees(lngRadians) });
        }

        return locations;
    }

    /// <summary>
    /// Convert the radian to degrees measure.
    /// </summary>
    /// <param name="radians">
    /// The radians.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToDegrees(double radians)
    {
        return radians * (180 / Math.PI);
    }

    /// <summary>
    /// Convert the degrees to radian measure.
    /// </summary>
    /// <param name="degrees">
    /// The degrees.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToRadian(double degrees)
    {
        return degrees * (Math.PI / 180);
    }

    #endregion
}
//
///地理图形辅助工具。
/// 
公共类GeoDrawingHelper
{
#区域常数
/// 
///以公里为单位的地球半径。
/// 
公共常数双c_接地半径仪=6367.0;
#端区
#区域公共方法和运算符
/// 
///通过初始化点创建一个圆。
/// 
/// 
///中心点。
/// 
/// 
///半径以米为单位。
/// 
/// 
///这个。
/// 
公共静态列表CreateCirclePoints(位置中心,双半径)
{
双纬度=环面(中心纬度);//弧度
双lng=ToRadian(中心经度);//弧度
双d=半径/(c_EarthRadiusInKilometers*1000);/d=地球表面覆盖的角距离
变量位置=新列表();

对于(var x=0;x在这里,您可以通过更改此帮助程序中的
位置
类将其用于您自己的类

下面是一个示例帮助器,用于创建一个以米为单位的初始点和半径外的圆:

/// <summary>
/// The geo drawing helper.
/// </summary>
public class GeoDrawingHelper
{
    #region Constants

    /// <summary>
    /// The c_ earth radius in kilometers.
    /// </summary>
    public const double c_EarthRadiusInKilometers = 6367.0;

    #endregion

    #region Public Methods and Operators

    /// <summary>
    /// Creates a circle by the initializing point.
    /// </summary>
    /// <param name="center">
    /// The center Point.
    /// </param>
    /// <param name="radius">
    /// The radius in meter.
    /// </param>
    /// <returns>
    /// The <see cref="List"/>.
    /// </returns>
    public static List<Location> CreateCirclePoints(Location center, double radius)
    {
        double lat = ToRadian(center.Latitude); // radians
        double lng = ToRadian(center.Longitude); // radians
        double d = radius / (c_EarthRadiusInKilometers * 1000); // d = angular distance covered on earth's surface
        var locations = new List<Location>();

        for (var x = 0; x <= 360; x++)
        {
            // Calculate the coordinates of the point
            double brng = ToRadian(x);
            double latRadians = Math.Asin((Math.Sin(lat) * Math.Cos(d)) + (Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng)));
            double lngRadians = lng
                                + Math.Atan2(
                                    Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), 
                                    Math.Cos(d) - (Math.Sin(lat) * Math.Sin(latRadians)));

            // Add the location
            locations.Add(new Location() { Latitude = ToDegrees(latRadians), Longitude = ToDegrees(lngRadians) });
        }

        return locations;
    }

    /// <summary>
    /// Convert the radian to degrees measure.
    /// </summary>
    /// <param name="radians">
    /// The radians.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToDegrees(double radians)
    {
        return radians * (180 / Math.PI);
    }

    /// <summary>
    /// Convert the degrees to radian measure.
    /// </summary>
    /// <param name="degrees">
    /// The degrees.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToRadian(double degrees)
    {
        return degrees * (Math.PI / 180);
    }

    #endregion
}
//
///地理图形辅助工具。
/// 
公共类GeoDrawingHelper
{
#区域常数
/// 
///以公里为单位的地球半径。
/// 
公共常数双c_接地半径仪=6367.0;
#端区
#区域公共方法和运算符
/// 
///通过初始化点创建一个圆。
/// 
/// 
///中心点。
/// 
/// 
///半径以米为单位。
/// 
/// 
///这个。
/// 
公共静态列表CreateCirclePoints(位置中心,双半径)
{
双纬度=环面(中心纬度);//弧度
双lng=ToRadian(中心经度);//弧度
双d=半径/(c_EarthRadiusInKilometers*1000);/d=地球表面覆盖的角距离
变量位置=新列表();

对于(var x=0;x在这里,您可以通过更改此帮助程序中的
位置
类将其用于您自己的类

下面是一个示例帮助器,用于创建一个以米为单位的初始点和半径外的圆:

/// <summary>
/// The geo drawing helper.
/// </summary>
public class GeoDrawingHelper
{
    #region Constants

    /// <summary>
    /// The c_ earth radius in kilometers.
    /// </summary>
    public const double c_EarthRadiusInKilometers = 6367.0;

    #endregion

    #region Public Methods and Operators

    /// <summary>
    /// Creates a circle by the initializing point.
    /// </summary>
    /// <param name="center">
    /// The center Point.
    /// </param>
    /// <param name="radius">
    /// The radius in meter.
    /// </param>
    /// <returns>
    /// The <see cref="List"/>.
    /// </returns>
    public static List<Location> CreateCirclePoints(Location center, double radius)
    {
        double lat = ToRadian(center.Latitude); // radians
        double lng = ToRadian(center.Longitude); // radians
        double d = radius / (c_EarthRadiusInKilometers * 1000); // d = angular distance covered on earth's surface
        var locations = new List<Location>();

        for (var x = 0; x <= 360; x++)
        {
            // Calculate the coordinates of the point
            double brng = ToRadian(x);
            double latRadians = Math.Asin((Math.Sin(lat) * Math.Cos(d)) + (Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng)));
            double lngRadians = lng
                                + Math.Atan2(
                                    Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), 
                                    Math.Cos(d) - (Math.Sin(lat) * Math.Sin(latRadians)));

            // Add the location
            locations.Add(new Location() { Latitude = ToDegrees(latRadians), Longitude = ToDegrees(lngRadians) });
        }

        return locations;
    }

    /// <summary>
    /// Convert the radian to degrees measure.
    /// </summary>
    /// <param name="radians">
    /// The radians.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToDegrees(double radians)
    {
        return radians * (180 / Math.PI);
    }

    /// <summary>
    /// Convert the degrees to radian measure.
    /// </summary>
    /// <param name="degrees">
    /// The degrees.
    /// </param>
    /// <returns>
    /// The <see cref="double"/>.
    /// </returns>
    public static double ToRadian(double degrees)
    {
        return degrees * (Math.PI / 180);
    }

    #endregion
}
//
///地理图形辅助工具。
/// 
公共类GeoDrawingHelper
{
#区域常数
/// 
///以公里为单位的地球半径。
/// 
公共常数双c_接地半径仪=6367.0;
#端区
#区域公共方法和运算符
/// 
///通过初始化点创建一个圆。
/// 
/// 
///中心点。
/// 
/// 
///半径以米为单位。
/// 
/// 
///这个。
/// 
公共静态列表CreateCirclePoints(位置中心,双半径)
{
双纬度=环面(中心纬度);//弧度
双lng=ToRadian(中心经度);//弧度
双d=半径/(c_EarthRadiusInKilometers*1000);/d=地球表面覆盖的角距离
变量位置=新列表();

对于(var x=0;x,为了防止在塞尔坦纬度上出现椭圆,我使用以下代码:

// Function to draw circle on map:

private void DrawCircle(BasicGeoposition CenterPosition, int Radius)
    {
    Color FillColor = Colors.Purple;
    Color StrokeColor = Colors.Red;
    FillColor.A = 80;
    StrokeColor.A = 80;
    Circle = new MapPolygon
        {
            StrokeThickness = 2,
            FillColor = FillColor,
            StrokeColor = StrokeColor,
            Path = new Geopath(Functions.CalculateCircle(CenterPosition, Radius))
        };
    mpBingMaps.MapElements.Add(Circle);
}

// Constants and helper functions:

const double earthRadius = 6371000D;
const double Circumference = 2D * Math.PI * earthRadius;

public static List<BasicGeoposition> CalculateCircle(BasicGeoposition Position, double Radius)
{
    List<BasicGeoposition> GeoPositions = new List<BasicGeoposition>();
    for (int i = 0; i <= 360; i++)
    {
        double Bearing = ToRad(i);
        double CircumferenceLatitudeCorrected = 2D * Math.PI * Math.Cos(ToRad(Position.Latitude)) * earthRadius;
        double lat1 = Circumference / 360D * Position.Latitude;
        double lon1 = CircumferenceLatitudeCorrected / 360D * Position.Longitude;
        double lat2 = lat1 + Math.Sin(Bearing) * Radius;
        double lon2 = lon1 + Math.Cos(Bearing) * Radius;
        BasicGeoposition NewBasicPosition = new BasicGeoposition();
        NewBasicPosition.Latitude = lat2 / (Circumference / 360D);
        NewBasicPosition.Longitude = lon2 / (CircumferenceLatitudeCorrected / 360D);
        GeoPositions.Add(NewBasicPosition);
    }
    return GeoPositions;
}

private static double ToRad(double degrees)
{
    return degrees * (Math.PI / 180D);
}
//在地图上画圆的函数:
专用空心绘图圆(基本几何位置中心位置,整数半径)
{
颜色FillColor=颜色。紫色;
颜色StrokeColor=颜色。红色;
FillColor.A=80;
StrokeColor.A=80;
圆=新贴图多边形
{
冲程厚度=2,
FillColor=FillColor,
StrokeColor=StrokeColor,
路径=新的地质路径(函数。计算圆(中心位置,半径))
};
mpBingMaps.MapElements.Add(圆形);
}
//常量和辅助函数:
常数双接地半径=6371000D;
常数双周长=2D*Math.PI*接地半径;
公共静态列表计算圆(基本地理位置,双半径)
{
列表地理位置=新列表();

对于(int i=0;i,为了防止在某些纬度上出现省略,我使用以下代码:

// Function to draw circle on map:

private void DrawCircle(BasicGeoposition CenterPosition, int Radius)
    {
    Color FillColor = Colors.Purple;
    Color StrokeColor = Colors.Red;
    FillColor.A = 80;
    StrokeColor.A = 80;
    Circle = new MapPolygon
        {
            StrokeThickness = 2,
            FillColor = FillColor,
            StrokeColor = StrokeColor,
            Path = new Geopath(Functions.CalculateCircle(CenterPosition, Radius))
        };
    mpBingMaps.MapElements.Add(Circle);
}

// Constants and helper functions:

const double earthRadius = 6371000D;
const double Circumference = 2D * Math.PI * earthRadius;

public static List<BasicGeoposition> CalculateCircle(BasicGeoposition Position, double Radius)
{
    List<BasicGeoposition> GeoPositions = new List<BasicGeoposition>();
    for (int i = 0; i <= 360; i++)
    {
        double Bearing = ToRad(i);
        double CircumferenceLatitudeCorrected = 2D * Math.PI * Math.Cos(ToRad(Position.Latitude)) * earthRadius;
        double lat1 = Circumference / 360D * Position.Latitude;
        double lon1 = CircumferenceLatitudeCorrected / 360D * Position.Longitude;
        double lat2 = lat1 + Math.Sin(Bearing) * Radius;
        double lon2 = lon1 + Math.Cos(Bearing) * Radius;
        BasicGeoposition NewBasicPosition = new BasicGeoposition();
        NewBasicPosition.Latitude = lat2 / (Circumference / 360D);
        NewBasicPosition.Longitude = lon2 / (CircumferenceLatitudeCorrected / 360D);
        GeoPositions.Add(NewBasicPosition);
    }
    return GeoPositions;
}

private static double ToRad(double degrees)
{
    return degrees * (Math.PI / 180D);
}
//在地图上画圆的函数:
专用空心绘图圆(基本几何位置中心位置,整数半径)
{
颜色FillColor=颜色。紫色;
颜色StrokeColor=颜色。红色;
FillColor.A=80;
StrokeColor.A=80;
圆=新贴图多边形
{
冲程厚度=2,
FillColor=FillColor,