我写的silverlight bing map control加载GeoServer地图的方法,请高手指教
2012-07-16 01:23
381 查看
先贴代码
地图是我用GeoServer发布的一张矿上的巷段图,坐标系用的是EPSG 4326.我发现当缩放级别比较小的时候,地图的一部分不能正常显示,在1级的时候时有一部分不能显示,放大到3级以后就能够正常的显示地图的全部了,还有就是放置图钉,在放大地图以后图钉的位置与原先放置的位置有偏移。不知道什么原因。希望有高手能进来指教一下,也希望我的能给大家一个思路。
经过我仔细查看,发现问题原来出在程序里面,我在算每个tile加载的地图范围的时候将一个公式弄错了。改好以后,上面的问题全部解决了。其实很简单,将
double yLeftDown = maxY - yDis * y;(在CalculateBounds函数中)改成:minY + (tilesCount - y - 1) * yDis就行了。
/// <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就行了。
相关文章推荐
- ArcGIS API for Silverlight 加载BingMap,GoogleMap,WorldImageryMap,OpenStreetMap,BaiduMap方法
- ArcGIS API for Silverlight加载BingMap遥感地图
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps
- 【Bing Map学习系列】(3)——如何通过Bing Maps Silverlight Control控制地图
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps
- 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图
- 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图
- 【Bing Map学习系列】(2)——如何通过Bing Maps Silverlight Control显示地图
- 学习使用Bing Maps Silverlight Control(六):自定义“鹰眼”地图
- Windows Phone 加载BingMap中文地图
- Silverlight学习笔记十七BingMap(四)之部署Google地图系统
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps
- 学习使用Bing Maps Silverlight Control(三):向地图添加标记
- Silverlight学习笔记十七BingMap(三)之地图的地区标识
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps
- 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图
- Silverlight学习笔记十七BingMap(五)之中文地图系统
- 学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式
- 【Silverlight】Bing Maps学习系列(二):通过Bing Maps Silverlight Control如何显示地图(转)
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps 推荐