您的位置:首页 > 其它

我写的silverlight bing map control加载GeoServer地图的方法,请高手指教

2012-07-16 01:23 381 查看
先贴代码

/// <summary>
/// 主要思路:根据当前地图缩放级别算出每行和每列有多少个tile
/// 然后根据地图的边界范围(从Geoserver里面可以查到)和tile的x,y坐标
/// 算出每个tile的地图范围,最后生成wms中的bbox参数的值
/// </summary>
public class WMSLocationTileSource : LocationRectTileSource
{
private const int TILE_SIZE = 256;
private static string url = "http://localhost:8088/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=YP:yongping&styles=&bbox={0}&width={1}&height={1}&srs=EPSG:4326&format=image/png";
//地图边界范围
private static double minX = 73579.999;
private static double minY = 20411.591;
private static double maxX = 75495.445;
private static double maxY = 21975.97;

private static Location leftDownCorner = new Location(minX, minY);
private static Location rightUpCorner = new Location(maxX, maxY);

private static LocationRect mapArea = new LocationRect(leftDownCorner, rightUpCorner);
//地图的缩放比例范围
private static Range<double> zoomRange = new Range<double>(1, 10);

public WMSLocationTileSource()
: base(url, mapArea, zoomRange)
{

}

public override Uri GetUri(int x, int y, int zoomLevel)
{
string bbox = CalculateBounds(minX, minY, maxX, maxY, zoomLevel, x, y);
//double mapSize = CalculateMapSize(zoomLevel);
string newUrl = string.Format(url, bbox, 0x100);
Uri uri = new Uri(newUrl, UriKind.RelativeOrAbsolute);
return uri;
}

/// <summary>
/// 计算每个Tile边界
/// </summary>
/// <param name="minX">最小X坐标</param>
/// <param name="minY">最小Y坐标</param>
/// <param name="maxX"></param>
/// <param name="maxY"></param>
/// <param name="zoomLevel">放大级数</param>
/// <param name="x">Tile的X坐标</param>
/// <param name="y">Tile的Y坐标</param>
/// <returns></returns>
private string CalculateBounds(double minX, double minY, double maxX, double maxY, int zoomLevel,
int x, int y)
{
double tilesCount = CalculateTilesCountPerRow(zoomLevel);
double xDis = CalculateDistance(minX, maxX, tilesCount);
double yDis = CalculateDistance(minY, maxY, tilesCount);
double xLeftDown = minX + xDis * x;
double yLeftDown = maxY - yDis * y;
double xRightUp = xLeftDown + xDis;
double yRightUp = yLeftDown + yDis;
return xLeftDown.ToString() + "," + yLeftDown.ToString() + "," + xRightUp.ToString() + "," + yRightUp.ToString();
}

/// <summary>
/// 计算每行或每列Tile数量
/// </summary>
/// <param name="zoomLevel">当前的放大级数</param>
/// <returns></returns>
private double CalculateTilesCountPerRow(int zoomLevel)
{
return Math.Pow(2, zoomLevel);
}

/// <summary>
/// 计算间隔
/// </summary>
/// <param name="minY">最小值</param>
/// <param name="maxY">最大值</param>
/// <param name="TileCount">每行或每列Tile数量</param>
/// <returns></returns>
private double CalculateDistance(double min, double max, double TileCount)
{
double d = (max - min) / TileCount;
return d;
}

/// <summary>
/// 计算地图大小
/// </summary>
/// <param name="zoomLevel">地图放大级数</param>
/// <returns></returns>
private double CalculateMapSize(int zoomLevel)
{
return 256 * CalculateTilesCountPerRow(zoomLevel);
}
}


地图是我用GeoServer发布的一张矿上的巷段图,坐标系用的是EPSG 4326.我发现当缩放级别比较小的时候,地图的一部分不能正常显示,在1级的时候时有一部分不能显示,放大到3级以后就能够正常的显示地图的全部了,还有就是放置图钉,在放大地图以后图钉的位置与原先放置的位置有偏移。不知道什么原因。希望有高手能进来指教一下,也希望我的能给大家一个思路。







经过我仔细查看,发现问题原来出在程序里面,我在算每个tile加载的地图范围的时候将一个公式弄错了。改好以后,上面的问题全部解决了。其实很简单,将

double yLeftDown = maxY - yDis * y;(在CalculateBounds函数中)改成:minY + (tilesCount - y - 1) * yDis就行了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐