public override void ComputeDstEnvelope(AbstractWarpDataset srcRaster, SpatialReference dstSpatialRef, out PrjEnvelope maxPrjEnvelope, Action <int, string> progressCallback) { InitLocationArgs(srcRaster); var projTrans = ProjectionTransformFactory.GetProjectionTransform(_srcSpatialRef, dstSpatialRef); float srcResolutionX = Convert.ToSingle(_srcGeoTrans[1]); float srcResolutionY = Math.Abs(Convert.ToSingle(_srcGeoTrans[5])); double srcLeftTopX = _srcGeoTrans[0]; double srcLeftTopY = _srcGeoTrans[3]; int srcWidth = srcRaster.Width; int srcHeight = srcRaster.Height; Size srcSize = new Size(srcWidth, srcHeight); int wSample = 1; int hSample = 1; if (srcWidth > 1000) { wSample = srcWidth / 1000; } if (srcHeight > 1000) { hSample = srcHeight / 1000; } double[] xs = new double[(srcWidth / wSample) * (srcHeight / hSample)]; double[] ys = new double[(srcWidth / wSample) * (srcHeight / hSample)]; int index = 0; //非真实的索引号,采样后的 for (int rowInx = 0; rowInx <= (srcHeight - hSample); rowInx += hSample) { for (int colInx = 0; colInx <= (srcWidth - wSample); colInx += wSample) { xs[index] = srcLeftTopX + colInx * srcResolutionX; ys[index] = srcLeftTopY - rowInx * srcResolutionY; index++; } } if (dstSpatialRef.IsSame(SpatialReferenceFactory.CreateSpatialReference(4326)) == 1) { projTrans.Transform(xs, ys); GeosCorrection(dstSpatialRef, xs, ys); maxPrjEnvelope = PrjEnvelope.GetEnvelope(xs, ys, null); } else { _rasterProjector.ComputeDstEnvelope(_srcSpatialRef, xs, ys, srcSize, dstSpatialRef, out maxPrjEnvelope, null); } if (_setting != null && _setting.OutEnvelope != null) { //求交 maxPrjEnvelope.Intersect(_setting.OutEnvelope); } }
// 1 public override void Project(AbstractWarpDataset srcRaster, FilePrjSettings prjSettings, SpatialReference dstSpatialRef, Action <int, string> progressCallback) { _dstSpatialRef = dstSpatialRef; _projectionTransform = ProjectionTransformFactory.GetProjectionTransform(_srcSpatialRef, dstSpatialRef); ProjectRaster(srcRaster, prjSettings, _prdWriter, progressCallback, NODATA_VALUE, 0, 1, 1); GC.Collect(); }
private GeoDo.RSS.Core.DrawEngine.CoordEnvelope GeoToPrjEnv(Core.DrawEngine.CoordEnvelope geoAoi, ISpatialReference dstSpatialRef) { IProjectionTransform transform = ProjectionTransformFactory.GetProjectionTransform(SpatialReference.GetDefault(), dstSpatialRef); double[] xs = new double[] { geoAoi.MinX, geoAoi.MaxX }; double[] ys = new double[] { geoAoi.MinY, geoAoi.MaxY }; transform.Transform(xs, ys); return(new GeoDo.RSS.Core.DrawEngine.CoordEnvelope(Math.Min(xs[0], xs[1]), Math.Max(xs[0], xs[1]), Math.Min(ys[0], ys[1]), Math.Max(ys[0], ys[1]))); }
private PrjEnvelope PrjToGeoEnv(PrjEnvelope geoEnv, ISpatialReference dstSpatialRef) { IProjectionTransform transform = ProjectionTransformFactory.GetProjectionTransform(SpatialReference.GetDefault(), dstSpatialRef); double[] xs = new double[] { geoEnv.MinX, geoEnv.MaxX }; double[] ys = new double[] { geoEnv.MinY, geoEnv.MaxY }; transform.InverTransform(xs, ys); return(new PrjEnvelope(Math.Min(xs[0], xs[1]), Math.Max(xs[0], xs[1]), Math.Min(ys[0], ys[1]), Math.Max(ys[0], ys[1]))); }
public override AbstractWarpDataset Project(AbstractWarpDataset srcRaster, FilePrjSettings prjSettings, AbstractWarpDataset dstRaster, int beginBandIndex, Action <int, string> progressCallback) { _dstSpatialRef = dstRaster.SpatialRef; _projectionTransform = ProjectionTransformFactory.GetProjectionTransform(_srcSpatialRef, _dstSpatialRef); ProjectRaster(srcRaster, prjSettings, dstRaster, progressCallback, NODATA_VALUE, beginBandIndex, 1, 1); GC.Collect(); return(dstRaster); }
private void button1_Click(object sender, EventArgs e) { ISpatialReference srcSpatialRef = SpatialReferenceFactory.GetSpatialReferenceByPrjFile("WGS 1984.prj"); string prj4 = srcSpatialRef.ToProj4String(); ISpatialReference dstSpatialRef = SpatialReferenceFactory.GetSpatialReferenceByPrjFile("WGS 1984.prj"); using (IProjectionTransform tran = ProjectionTransformFactory.GetProjectionTransform(srcSpatialRef, dstSpatialRef)) { } }
public void Transform(ISpatialReference srcSpatialRef, double[] srcXs, double[] srcYs, ISpatialReference dstSpatialRef) { using (IProjectionTransform transform = ProjectionTransformFactory.GetProjectionTransform(srcSpatialRef, dstSpatialRef)) { if (!srcSpatialRef.IsSame(dstSpatialRef)) { transform.Transform(srcXs, srcYs); } } }
private void GetMapInfo(out PrjEnvelopeItem[] prjEnvelopeItem, out float resolutionX, out float resolutionY) { prjEnvelopeItem = null; resolutionX = 0; resolutionY = 0; if (rbAllFile.Checked) { resolutionX = ucPrjEnvelopes1.ResolutionX; resolutionY = ucPrjEnvelopes1.ResolutionY; prjEnvelopeItem = null; } else if (rbCenter.Checked) { resolutionX = ucPrjEnvelopes1.ResolutionX; resolutionY = ucPrjEnvelopes1.ResolutionY; if (_dstSpatialRef == null || _dstSpatialRef.ProjectionCoordSystem == null) { prjEnvelopeItem = ucPrjEnvelopes1.PrjEnvelopes; } else { PrjEnvelope env = GetPrjEnvelopeFromCenter(resolutionX, resolutionY); prjEnvelopeItem = new PrjEnvelopeItem[] { new PrjEnvelopeItem("AOI", env) }; } } else if (rbBlocks.Checked)//自定义分幅 { resolutionX = ucPrjEnvelopes1.ResolutionX; resolutionY = ucPrjEnvelopes1.ResolutionY; if (_dstSpatialRef == null || _dstSpatialRef.ProjectionCoordSystem == null) { prjEnvelopeItem = ucPrjEnvelopes1.PrjEnvelopes; } else { PrjEnvelopeItem[] geoItems = ucPrjEnvelopes1.PrjEnvelopes; prjEnvelopeItem = new PrjEnvelopeItem[geoItems.Length]; IProjectionTransform tran = ProjectionTransformFactory.GetProjectionTransform(SpatialReference.GetDefault(), _dstSpatialRef); for (int i = 0; i < geoItems.Length; i++) { double[] xs = new double[] { geoItems[i].PrjEnvelope.LeftTop.X, geoItems[i].PrjEnvelope.RightBottom.X }; double[] ys = new double[] { geoItems[i].PrjEnvelope.LeftTop.Y, geoItems[i].PrjEnvelope.RightBottom.Y }; tran.Transform(xs, ys); double minx = Math.Min(xs[0], xs[1]); double maxx = Math.Max(xs[0], xs[1]); double miny = Math.Min(ys[0], ys[1]); double maxy = Math.Max(ys[0], ys[1]); PrjEnvelope env = new PrjEnvelope(minx, maxx, miny, maxy); prjEnvelopeItem[i] = new PrjEnvelopeItem(geoItems[i].Name, env); } } } }
private void BuildProjectionTransform(ISpatialReference targetSpatialReference) { if (_projectionTransform != null) { _projectionTransform.Dispose(); } _projectionTransform = ProjectionTransformFactory.GetProjectionTransform(new SpatialReference(new GeographicCoordSystem()), targetSpatialReference); if (_vectorMapRuntime != null) { (_vectorMapRuntime as MapRuntime).ChangeProjectionTransform(); } }
private PrjEnvelope GetPrjEnvelopeFromCenter(float resolutionX, float resolutionY) { Size size = ucPrjEnvelopes1.PixelSize; PrjPoint center = ucPrjEnvelopes1.CenterLongLat; double[] xs = new double[] { center.X }; double[] ys = new double[] { center.Y }; using (IProjectionTransform tran = ProjectionTransformFactory.GetProjectionTransform(SpatialReference.GetDefault(), _dstSpatialRef)) { tran.Transform(xs, ys); } PrjEnvelope env = PrjEnvelope.CreateByCenter(xs[0], ys[0], resolutionX * size.Width, resolutionY * size.Height); return(env); }
/// <summary> /// 投影主要方法 /// </summary> /// <param name="srcRaster"></param> /// <param name="prjSettings"></param> /// <param name="dstSpatialRef"></param> /// <param name="progressCallback"></param> /// <param name="dataSets"></param> /// <param name="hdf5attrs"></param> /// <param name="outfilename"></param> public void ProjectNew(IRasterDataProvider srcRaster, FilePrjSettings prjSettings, ISpatialReference dstSpatialRef, Action <int, string> progressCallback, Dictionary <string, H5T.H5Type> dataSets) { ISpatialReference srcSpatialRef = srcRaster.SpatialRef; _projectionTransform = ProjectionTransformFactory.GetProjectionTransform(srcSpatialRef, dstSpatialRef); ArgsCheck(srcRaster, prjSettings, dstSpatialRef); ReadySession(srcRaster, prjSettings, dstSpatialRef, progressCallback); if (prjSettings.OutEnvelope == null || prjSettings.OutEnvelope == PrjEnvelope.Empty) { PrjEnvelope dstEnvelope = null; float srcResolutionX = srcRaster.ResolutionX; float srcResolutionY = srcRaster.ResolutionY; double srcLeftTopX = srcRaster.CoordEnvelope.MinX; double srcLeftTopY = srcRaster.CoordEnvelope.MaxY; int srcWidth = srcRaster.Width; int srcHeight = srcRaster.Height; Size srcSize = new Size(srcWidth, srcHeight); int wSample = 1; int hSample = 1; if (srcWidth > 1000) { wSample = srcWidth / 1000; } if (srcHeight > 1000) { hSample = srcHeight / 1000; } double[] xs = new double[(srcWidth / wSample) * (srcHeight / hSample)]; double[] ys = new double[(srcWidth / wSample) * (srcHeight / hSample)]; int index = 0;//非真实的索引号,采样后的 for (int rowInx = 0; rowInx <= (srcHeight - hSample); rowInx += hSample) { for (int colInx = 0; colInx <= (srcWidth - wSample); colInx += wSample) { xs[index] = srcLeftTopX + colInx * srcResolutionX; ys[index] = srcLeftTopY - rowInx * srcResolutionY; index++; } } _rasterProjector.ComputeDstEnvelope(srcSpatialRef, xs, ys, srcSize, dstSpatialRef, out dstEnvelope, null); prjSettings.OutEnvelope = dstEnvelope; } GC.Collect(); ProjectRaster(srcRaster, prjSettings, progressCallback, dataSets); }
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); }