/// <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); }