微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我写的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,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] 举报,一经查实,本站将立刻删除。

相关推荐