先贴代码
/// <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,tilesCount); double ydis = Calculatedistance(minY,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就行了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。