繁体   English   中英

我如何在Bing Map应用程序上以一个以英里为单位给出的半径为中心画一个圆

[英]How do I draw a circle on my Bing Map application around a centerpoint with a radius given in miles

我已经能够使用给定中心点周围的纬度和经度值在地图上绘制椭圆。 尽管我在地图上看到了一个形状,但我得到的是椭圆而不是圆形,并且我认为它与指定的距离不匹配。 我打算用它来显示该圆内的对象(稍后,一旦我能使圆正确显示,就将完成此操作,这就是为什么我需要一个圆而不是椭圆的原因,因为它应该是完美的圆)。

我正在使用Bing Maps API。 我希望在通过参数传递的距中心的给定英里(距离)处绘制圆,参数中另一个名为Miles的变量只是保持双精度值1D。 我认为问题在于我的数学计算方式。 有谁知道如何改进此代码以更好地计算里程。

private void drawPoly(SearchLocation center, Double miles)
{
//amount of vertex
double vertexCount = 100D;
         //used by the api to carried out searches
List<SearchLocation> vertices = new List<SearchLocation>();
double v = 0;
double radians = Math.PI / 180D;
double radiansPerDegree = Math.PI / 180D;
double degreePerVertex = 360D / vertexCount;
double radiansPerVertex = degreePerVertex * radiansPerDegree;
var centerOfMap = center;
const double degLatMiles = 68.68637156368D;
double degLonMiles = Math.Cos(center.Latitude.Value) * (68.68637156368D);
double milesLat = (miles * degLatMiles) / 3600;
double milesLon = (miles * degLonMiles) / 3600;
for (v = 0; v < vertexCount; v++)
{
    radians = v * radiansPerVertex;
               //adds the miles from the center point and draws a circle
    double centrLat = center.Latitude.Value + (milesLat * Math.Sin(radians));
    double centrLon = center.Longitude.Value + (milesLon * Math.Cos(radians));
    vertices.Add(new SearchLocation() { Latitude = centrLat, Longitude = centrLon });
}

好的,我误解了你的问题。 这应该工作:

    /// <summary>
    /// Calculates the end-point from a given source at a given range (meters) and bearing (degrees).
    /// This methods uses simple geometry equations to calculate the end-point.
    /// </summary>
    /// <param name="source">Point of origin</param>
    /// <param name="range">Range in meters</param>
    /// <param name="bearing">Bearing in degrees</param>
    /// <returns>End-point from the source given the desired range and bearing.</returns>
    public static PointLatLng CalculateDerivedPosition(PointLatLng source, double range, double bearing)
    {
        double latA = source.Lat * DEGREES_TO_RADIANS;
        double lonA = source.Lng * DEGREES_TO_RADIANS;
        double angularDistance = range / EARTH_RADIUS_M;
        double trueCourse = bearing * DEGREES_TO_RADIANS;

        double lat = Math.Asin(
            Math.Sin(latA) * Math.Cos(angularDistance) +
            Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse));

        double dlon = Math.Atan2(
            Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA),
            Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat));

        double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI;

        return new PointLatLng(
            lat / DEGREES_TO_RADIANS,
            lon / DEGREES_TO_RADIANS);
    }

Juste将您的中心作为来源:

for (int i = 0; i < 360; i++)
{
  vertices.Add(CalculateDerivedPosition(center, circleRadius, 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);
}

该代码对于半径小于几英里的小半径很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM