2016-08-02 11 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

ありがとう同等ViewportPointToLocation方法があります。このコードはうまくいくようですが、ユーザーがマップキャンバスの上部と下部を移動するときにこのコードの問題が発生しました。 – Startail

+0

このコードは、ユーザがあまりにも遠くに、または遠くにナビゲートしたときの問題を解決します。それがtry/catchのためのものです。地点が地図内にない場合は、85/-85の緯度の限界にスナップします。実際には90/-90ですが、ゼロ除算のため計算がエラーになります。 – rbrundritt

+0

私が得る問題は、catchコードがGetLocationFromOffsetで例外をスローすることです。 Point(x、y)座標が無効な場合はエラーをスローし、bottomRightまたはtopLeftはnullになります。私はtry {} catch {}文の中にこれらのコードの部分を入れてこれを解決しました。これが失敗しても何もしないので、一般的な使用には適していない可能性があります。しかし、私は、ユーザーがキャンバスの上/下のデータを取得するとは思わない。これは、アプリケーションがクラッシュするのを防ぐためです。 – Startail

2

可視の地図領域の境界ボックスを取得する最も簡単な解決策は、マップコントロールから直接値を取得します。

Microsoftの組み込みマップコントロールでは、コントロールに対してPointをとり、その地点の地理的位置を返すMapControl.GetLocationFromOffsetメソッドがあります。

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 
); 

ポイントがマップコントロールの範囲外の場合にこのメソッドが例外をスローすることに注意してください。

マップが回転しているため、4つのコーナーの値を取得する必要があります。

この方法の詳細については、see MSDNを参照してください。

サードパーティXAMLマップコントロールを使用している場合は、

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

あなたは歓迎です:-) –

関連する問題