2016-08-02 82 views
1

有沒有人有基於標題計算視圖的緯度和經度角的解決方案?根據視口中的標題計算經度和緯度

我有一個函數可以在標題爲0的情況下計算視圖的LatLng角點。但是我希望找到一種方法來計算基於新標題的角點,例如用戶旋轉地圖。

我現在用代碼= 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; 
} 

回答

0

它看起來像你試圖計算地圖的邊界框。由於此值隨緯度值而變化,因此每像素使用度數不起作用。相反,請看這裏的解決方案,瞭解如何計算WP8.1中的地圖邊界框(這是Win10地圖控件的基礎)Get view bounds of a Map

+0

謝謝。這段代碼看起來效果最好,但是當用戶在地圖畫布的頂部和底部之外導航時,我遇到了一些與此代碼有關的問題。 – Startail

+0

這段代碼解決了用戶導航過度或過低的問題。這就是嘗試/捕獲的目的。如果一個點不在地圖內,它會捕捉到85/-85的緯度限制。實際上它是90/-90,但是由於除以零而計算出錯。 – rbrundritt

+0

我得到的問題是catch代碼拋出GetLocationFromOffset異常。如果Point(x,y)座標無效,則會拋出錯誤,bottomRight或topLeft將爲空。我已經解決了這個問題,將代碼的這些部分放在try {} catch {}語句中。這可能不適合一般用途,因爲如果它們失敗,我什麼也不做。但我不希望我的用戶在畫布的頂部/底部獲取任何數據。這只是爲了防止應用程序崩潰。 – Startail

2

獲取可見地圖區域邊界框的最簡單方法是直接從地圖控件獲取值。

對於Microsoft的內置Map控件,您有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 
+0

不客氣:-) –