Beispiel #1
0
        /// <summary>
        /// 设置电子海图显示中心经纬度和显示比例尺
        /// TODO:尚未实现旋转问题
        /// </summary>
        /// <param name="center"></param>
        /// <param name="scale"></param>
        public void setMapCenter(PointD center, double scale)
        {
            _center = center;

            double oldscale = _scale;

            //检查显示比例尺的合理性
            _scale = scale;
            if (_scale < MinMapScale)
            {
                _scale = MinMapScale;
            }
            if (_scale > MaxMapScale)
            {
                _scale = MaxMapScale;
            }

            //TODO:这个算法没看出什么严格的数学依据
            //计算缩放因子,20000以下原样显示,900000以上二分之一大小显示
            //20000到900000之间按照(Math.Sin(Math.PI * (40000 / scale + 1) / 6))取值
            if (scale > 900000)
            {
                _zoomFactor = 0.5f;
            }
            else if (scale < 20000)
            {
                _zoomFactor = 1f;
            }
            else
            {
                _zoomFactor = (float)(Math.Sin(Math.PI * (40000 / scale + 1) / 6));
            }

            //计算当前比例尺下像素和米的换算关系
            _scaleRate = _scale * SeeCool.Geometry.Util.CommenData.PPM;

            //计算中心点的大地平面坐标,单位:米
            _centerFlat = _projection.MapToFlat(_center.X, _center.Y);
            //计算四分之一屏幕的大地平面坐标跨度,需要注意:因为是将屏幕中心位置左上角像素作为中心点,所以Width和Height均要减一
            double cx = ((double)(this.ClientRectangle.Width - 1) / 2) * _scaleRate;
            double cy = ((double)(this.ClientRectangle.Height - 1) / 2) * _scaleRate;

            //计算屏幕的经纬度范围
            PointD lt = _projection.FlatToMap(_centerFlat.X - cx, _centerFlat.Y - cy);
            PointD rb = _projection.FlatToMap(_centerFlat.X + cx, _centerFlat.Y + cy);

            _extent = RectangleD.FromLTRB(lt.X, lt.Y, rb.X, rb.Y);
        }