private void SetEnvelope() { GeoDo.RSS.Core.DF.CoordEnvelope evp = _dataProvider.CoordEnvelope; switch (_dataProvider.CoordType) { case enumCoordType.Raster: case enumCoordType.PrjCoord: if (evp == null) { evp = new DF.CoordEnvelope(new DF.CoordPoint(0, 0), _dataProvider.Width, _dataProvider.Height); } _envelope = new DrawEngine.CoordEnvelope(evp.MinX, evp.MaxX, evp.MinY, evp.MaxY); if (_dataProvider.SpatialRef != null) { _projectionTransform = ProjectionTransformFactory.GetProjectionTransform(SpatialReference.GetDefault(), _dataProvider.SpatialRef); } _canvas.CoordTransform.DataCoordType = enumDataCoordType.Prj; break; case enumCoordType.GeoCoord: //这里未处理其他坐标系统//??? _projectionTransform = ProjectionTransformFactory.GetDefault(); double[] xs = new double[] { evp.MinX, evp.MaxX }; double[] ys = new double[] { evp.MinY, evp.MaxY }; _projectionTransform.Transform(xs, ys); _envelope = new DrawEngine.CoordEnvelope(xs[0], xs[1], ys[0], ys[1]); _canvas.CoordTransform.DataCoordType = enumDataCoordType.Geo; break; } _originalEnvelope = _envelope.Clone(); _originalResolutionX = (float)(_originalEnvelope.Width / _dataProvider.Width); _originalResolutionY = (float)(_originalEnvelope.Height / _dataProvider.Height); // if (_dataProvider.SpatialRef == null) { _canvas.CoordTransform.SpatialRefOfViewer = new SpatialReference(new GeographicCoordSystem()); } else { _canvas.CoordTransform.SpatialRefOfViewer = _dataProvider.SpatialRef.Clone(); } }
private void button18_Click(object sender, EventArgs e) { string wkt = "GEOGCS[\"等经纬度投影\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.017453292519943295]]"; wkt = "PROJCS[\"Hammer投影\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Hammer-Aitoff (world)\"]PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],PARAMETER[\"central_meridian\",105],UNIT[\"Meter\",1]]"; ISpatialReference srcSpatialRef = SpatialReferenceFactory.GetSpatialReferenceByWKT(wkt, enumWKTSource.EsriPrjFile); string proj4 = srcSpatialRef.ToProj4String(); ISpatialReference inverSpatialRef = SpatialReferenceFactory.GetSpatialReferenceByProj4String(proj4); inverSpatialRef.IsSame(srcSpatialRef); IProjectionTransform tr = ProjectionTransformFactory.GetProjectionTransform(srcSpatialRef, SpatialReference.GetDefault()); double[] x = new double[] { 1534910 }; double[] y = new double[] { 4255978 }; x = new double[] { 121.913 }; y = new double[] { 38.957 }; tr.InverTransform(x, y); tr.Transform(x, y); }
/// <summary> /// 根据给出的经纬度数据集或者投影坐标数据集,计算其是否在指定的范围内,并且计算出有效率,以及实际输出范围 /// </summary> /// <param name="xs"></param> /// <param name="ys"></param> /// <param name="validEnv"></param> /// <param name="oSpatialRef"></param> /// <param name="tSpatialRef"></param> /// <param name="validRate"></param> /// <param name="outEnv"></param> /// <returns></returns> public bool VaildEnvelope(double[] xs, double[] ys, PrjEnvelope validEnv, ISpatialReference oSpatialRef, ISpatialReference tSpatialRef, out double validRate, out PrjEnvelope outEnv) { if (validEnv == null || validEnv.IsEmpty) { throw new ArgumentNullException("validEnv", "参数[有效范围]不能为空"); } if (tSpatialRef == null) { tSpatialRef = SpatialReference.GetDefault(); } if (oSpatialRef == null) { oSpatialRef = SpatialReference.GetDefault(); } using (IProjectionTransform transform = ProjectionTransformFactory.GetProjectionTransform(oSpatialRef, tSpatialRef)) { if (!oSpatialRef.IsSame(tSpatialRef)) { transform.Transform(xs, ys); } bool isLatLong = (tSpatialRef.ProjectionCoordSystem == null && tSpatialRef.GeographicsCoordSystem != null); return(PrjEnvelope.HasValidEnvelope(xs, ys, validEnv, out validRate, out outEnv)); } }
/// <summary> ///数据集投影 /// </summary> /// <typeparam name="T">数据集类型</typeparam> /// <param name="sourcedata">原始数据集</param> /// <param name="srcEnvelope">原始数据集坐标范围(正弦坐标系)</param> /// <param name="dstEnvelope">目标数据集坐标范围(品面坐标系)</param> /// <param name="outSize">输出范围</param> /// <param name="dstResoultion">输出分辨率</param> /// <param name="srcResoultionX">原始数据集分辨率X</param> /// <param name="srcResoultionY">原始数据集分辨率Y</param> /// <returns></returns> private static SDataByProject <T> GetDataByProject <T>(T[,] sourcedata, PrjEnvelope srcEnvelope, PrjEnvelope dstEnvelope, Size inSize, Size outSize, float dstResoultion, float srcResoultionX, float srcResoultionY, T fillValue, ISpatialReference dstSpatialRef, out UInt16[] rows, out UInt16[] cols, out Size srcStepSize) { rows = null; cols = null; srcStepSize = Size.Empty; IProjectionTransform _projectionTransform; //初始化原始坐标系转化对象 //ISpatialReference dstSpatialRef = SpatialReference.GetDefault(); string proj4str = "proj4 = +proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs"; ISpatialReference srcSpatialRef = SpatialReference.FromProj4(proj4str); _projectionTransform = ProjectionTransformFactory.GetProjectionTransform(srcSpatialRef, dstSpatialRef); //坐标系转换 int rowStep = outSize.Height; for (int oRow = 0; oRow < outSize.Height; oRow += rowStep) { if (oRow + rowStep > outSize.Height) { rowStep = outSize.Height - oRow; } Size outStepSize = new Size(outSize.Width, rowStep); double[] xs = new double[outSize.Width * rowStep]; double[] ys = new double[outSize.Width * rowStep]; double oY = oRow * dstResoultion; Parallel.For(0, rowStep, j => { double x; double y; int index; y = dstEnvelope.LeftTop.Y - j * dstResoultion - oY; for (int i = 0; i < outSize.Width; i++) { x = dstEnvelope.LeftTop.X + i * dstResoultion; index = i + j * outSize.Width; xs[index] = x; ys[index] = y; } }); _projectionTransform.InverTransform(xs, ys); PrjEnvelope tEnvelope = PrjEnvelope.GetEnvelope(xs, ys, null); tEnvelope.Extend(srcResoultionX, srcResoultionY * 4); tEnvelope = PrjEnvelope.Intersect(tEnvelope, srcEnvelope); if (tEnvelope == null || tEnvelope.IsEmpty) { continue; } Size tSize = tEnvelope.GetSize(srcResoultionX, srcResoultionY); int tBeginRow = -1, tEndRow = -1, tBeginCol = -1, tEndCol = -1; int oBeginRow = -1, oEndRow = -1, oBeginCol = -1, oEndCol = -1; PrjBlockHelper.ComputeBeginEndRowCol(srcEnvelope, new Size(inSize.Width, inSize.Height), tEnvelope, tSize, ref oBeginRow, ref oBeginCol, ref oEndRow, ref oEndCol, ref tBeginRow, ref tBeginCol, ref tEndRow, ref tEndCol); int srcStepWidth = oEndCol - oBeginCol; int srcStepHeight = oEndRow - oBeginRow; srcStepSize = new Size(srcStepWidth, srcStepHeight); T[,] dstData = new T[outSize.Height, outSize.Width]; //double srcStepLeftTopX = tEnvelope.MinX; //double srcStepLeftTopY = tEnvelope.MaxY; //double srcStepRightBottomX = tEnvelope.MaxX; //double srcStepRightBottomY = tEnvelope.MinY; double srcStepLeftTopX = srcEnvelope.MinX; double srcStepLeftTopY = srcEnvelope.MaxY; double srcStepRightBottomX = srcEnvelope.MaxX; double srcStepRightBottomY = srcEnvelope.MinY; UInt16[] rowTemps = new UInt16[outSize.Width * rowStep]; //正向查找表 UInt16[] colTemps = new UInt16[outSize.Width * rowStep]; //正向查找表 Parallel.For(0, rowStep, j => { double x; double y; int index; for (int i = 0; i < outSize.Width; i++) { index = i + j * outSize.Width; x = xs[index]; y = ys[index]; if (x >= srcStepLeftTopX && x <= srcStepRightBottomX && y <= srcStepLeftTopY && y >= srcStepRightBottomY) { colTemps[index] = (UInt16)((x - srcStepLeftTopX) / srcResoultionX + 0.5); rowTemps[index] = (UInt16)((srcStepLeftTopY - y) / srcResoultionY + 0.5); } } }); rows = rowTemps; cols = colTemps; return(DoProject <T>(sourcedata, fillValue, ref outStepSize, ref srcStepSize, dstData, rows, cols)); } return(null); }