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

先贴代码

 

 

   /// <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就行了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值