根据视口中的标题计算纬度和经度

时间:2016-08-02 00:00:05

标签: c# google-maps uwp bing-maps uwp-maps

有没有人有解决方案来根据标题计算视图的纬度和经度角?

如果标题为0,我有一个计算视图LatLng角的函数。但是如果用户旋转地图,我希望找到一种基于新标题计算角点的方法。

我现在用Heading = 0做的代码就是这个。

public GeoboundingBox GetBounds(MapControl map)
    {
        if(map.Center.Position.Latitude == 0) { return default(GeoboundingBox); }

        /*
         * resolution m/px = 15653.04 m/px * Cos(LatInRad) / 2^zoomLevel
         * 111325 m/deg
         */

        double latInRad = Math.Cos(map.Center.Position.Latitude * Math.PI / 180);
        double lngInRad = Math.Cos(map.Center.Position.Longitude * Math.PI / 180);

        double degreePerPixel = (156543.04 * latInRad * lngInRad) / (111325 * Math.Pow(2, map.ZoomLevel));

        double mHalfWidthInDegrees = map.ActualWidth * degreePerPixel / 0.89;
        double mHalfHeightInDegrees = map.ActualHeight * degreePerPixel / 1.65;

        double mNorth = map.Center.Position.Latitude + mHalfHeightInDegrees;
        double mWest = map.Center.Position.Longitude - mHalfWidthInDegrees;
        double mSouth = map.Center.Position.Latitude - mHalfHeightInDegrees;
        double mEast = map.Center.Position.Longitude + mHalfWidthInDegrees;

        GeoboundingBox mBounds = new GeoboundingBox(
            new BasicGeoposition()
            {
                Latitude = mNorth,
                Longitude = mWest
            },
            new BasicGeoposition()
            {
                Latitude = mSouth,
                Longitude = mEast
            });
      return mBounds;
 }

2 个答案:

答案 0 :(得分:2)

获取可见地图区域边界框的最简单方法是直接从地图控件中获取值。

对于Microsoft的内置地图控件,您使用MapControl.GetLocationFromOffset方法,该方法相对于控件获取Point并返回该点的地理位置。

mapControl.GetLocationFromOffset(
   new Point(0, 0),
   out upperLeftGeoPoint
);
mapControl.GetLocationFromOffset (
   new Point( mapControl.ActualWidth, 0 ), 
   out upperRightGeoPoint
);
mapControl.GetLocationFromOffset (
   new Point( 0, mapControl.ActualHeight ), 
   out bottomLeftGeoPoint
);
mapControl.GetLocationFromOffset (
   new Point( mapControl.ActualWidth, mapControl.ActualHeight ), 
   out bottomRightGeoPoint
);

请注意,如果该点超出地图控件的范围,该方法将抛出异常。

在您的情况下,您需要获取所有四个角的值,因为它会旋转地图。

有关此方法的更多文档,请see MSDN

如果您使用的是第三方XAML地图控件,则使用等效的ViewportPointToLocation方法

var northWestCorner = mapControl.ViewportPointToLocation( 
   new Point( 0, 0 )
);
var southEastCorner = mapControl.ViewportPointToLocation(
   new Point( mapControl.ActualWidth, mapControl.ActualHeight )
);
//analogous for north east, south west

答案 1 :(得分:0)

看起来您正在尝试计算地图的边界框。使用每像素度数将不起作用,因为此值随纬度值而变化。相反,请看一下如何在WP8.1中计算地图边界框的解决方案(这是Win10地图控件的基础)Get view bounds of a Map