コード例 #1
0
        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);
            }
        }
コード例 #2
0
ファイル: GeosProject.cs プロジェクト: v2535v/FYProjection
 // 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();
 }
コード例 #3
0
        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])));
        }
コード例 #4
0
        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])));
        }
コード例 #5
0
ファイル: GeosProject.cs プロジェクト: v2535v/FYProjection
 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);
 }
コード例 #6
0
ファイル: Form1.cs プロジェクト: configare/hispeed
        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))
            {
            }
        }
コード例 #7
0
ファイル: RasterProjector.cs プロジェクト: configare/hispeed
 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);
         }
     }
 }
コード例 #8
0
 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);
             }
         }
     }
 }
コード例 #9
0
ファイル: AgileMapControll.cs プロジェクト: configare/hispeed
 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();
     }
 }
コード例 #10
0
        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);
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
ファイル: RasterDrawing.cs プロジェクト: configare/hispeed
        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();
            }
        }
コード例 #13
0
        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);
        }
コード例 #14
0
ファイル: RasterProjector.cs プロジェクト: configare/hispeed
 /// <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));
     }
 }
コード例 #15
0
        /// <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);
        }