根据视口中的航向计算纬度和经度
Calculate Latitude and Longitude based on heading in a viewport
有没有人有根据航向计算视图的纬度和经度角的解决方案?
我有一个函数可以在航向为 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;
}
您似乎在尝试计算地图的边界框。使用度每像素将不起作用,因为此值随纬度值而变化。而是看看这里关于如何在 WP8.1 中计算地图边界框的解决方案(这是 Win10 地图控件的基础)Get view bounds of a Map
获取可见地图区域边界框的最简单解决方案是直接从地图控件获取值。
对于 Microsoft 的内置地图控件,您有 MapControl.GetLocationFromOffset
方法,该方法采用 Point
相对于控件和 returns 该点的地理位置。
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 时计算视图的 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;
}
您似乎在尝试计算地图的边界框。使用度每像素将不起作用,因为此值随纬度值而变化。而是看看这里关于如何在 WP8.1 中计算地图边界框的解决方案(这是 Win10 地图控件的基础)Get view bounds of a Map
获取可见地图区域边界框的最简单解决方案是直接从地图控件获取值。
对于 Microsoft 的内置地图控件,您有 MapControl.GetLocationFromOffset
方法,该方法采用 Point
相对于控件和 returns 该点的地理位置。
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