예제 #1
0
 private void btnSetCoorSys_Click(object sender, EventArgs e)
 {
     try
     {
         csDiag = new CoordSysDialog();
         string strCrs = csDiag.ShowDialog(gviLanguage.gviLanguageChineseSimple);
         if (strCrs != "")
         {
             coorSys = coorFactory.CreateFromWKT(strCrs);
             if (coorSys == null)
             {
                 MessageBox.Show("无效的空间坐标系");
                 this.txtCoorSys.Text = @"UNKNOWNCS[\""unnamed\""]";;
                 this.txtCoorSys.Focus();
             }
             else
             {
                 this.txtCoorSys.Text = strCrs;
             }
         }
     }
     catch (System.Exception ex)
     {
         System.Diagnostics.Trace.WriteLine(ex.Message);
     }
 }
예제 #2
0
        /// <summary>
        /// 离散Polygon
        /// </summary>
        /// <param name="polygon"></param>
        /// <param name="distance"></param>
        private IPolygon DiscretePolygon(IPolygon polygon, double distance)
        {
            string wkt = "PROJCS[\"<Custom Coordinate>\",GEOGCS[\"GCS_Beijing_1954\",DATUM[\"D_Beijing_1954\",SPHEROID[\"Krasovsky_1940\",6378245.0,298.3]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"false_easting\",64685.26],PARAMETER[\"false_northing\",-3267460.1405],PARAMETER[\"central_meridian\",120.0],PARAMETER[\"scale_factor\",1.0],PARAMETER[\"latitude_of_origin\",0.0],UNIT[\"Meter\",1.0]]";
            ICoordinateReferenceSystem tempcrs = crsFactory.CreateFromWKT(wkt);
            IRing    ring       = polygon.ExteriorRing;
            IPolygon resPolygon = geoFactory.CreateGeometry(gviGeometryType.gviGeometryPolygon, gviVertexAttribute.gviVertexAttributeZ) as IPolygon;

            resPolygon.SpatialCRS = crs as ISpatialCRS;
            for (int i = 0; i < ring.PointCount - 1; i++)
            {
                IPoint point1 = ring.GetPoint(i);
                IPoint point2 = ring.GetPoint(i + 1);
                resPolygon.ExteriorRing.AppendPoint(point1);
                point1.Project(tempcrs as ISpatialCRS);
                point2.Project(tempcrs as ISpatialCRS);
                IVector3    p1    = point1.Position;
                IVector3    p2    = point2.Position;
                IEulerAngle angle = this.axRenderControl1.Camera.GetAimingAngles(p1, p2);

                p2.MultiplyByScalar(-1);
                double length = p1.Add(p2).Length;
                for (int j = 0; j < (int)(length / distance); j++)
                {
                    IVector3 tempv3    = this.axRenderControl1.Camera.GetAimingPoint(p1, angle, (distance * (j + 1)));
                    IPoint   tempPoint = geoFactory.CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                    tempPoint.Position   = tempv3;
                    tempPoint.SpatialCRS = tempcrs as ISpatialCRS;
                    tempPoint.Project(crs as ISpatialCRS);
                    resPolygon.ExteriorRing.AppendPoint(tempPoint);
                }
            }
            resPolygon.Close();
            return(resPolygon);
        }
예제 #3
0
        private void toolStripButtonLoadTerrain_Click(object sender, System.EventArgs e)
        {
            OpenFileDialog od = new OpenFileDialog();

            od.Filter = "地形文件(*.ted)|*.ted";
            if (System.IO.Directory.Exists(strMediaPath))
            {
                od.InitialDirectory = strMediaPath + @"\terrain";
            }
            od.RestoreDirectory = true;
            if (DialogResult.OK == od.ShowDialog())
            {
                string wkt = this.axRenderControl1.GetTerrainCrsWKT(od.FileName, "");
                this.axRenderControl1.Reset2(wkt);
                this.axRenderControl1.Terrain.RegisterTerrain(od.FileName, "");
                if (this.axRenderControl1.Terrain.IsPlanarTerrain)
                {
                    string  tmpSkyboxPath = strMediaPath + @"\skybox";
                    ISkyBox skybox        = this.axRenderControl1.ObjectManager.GetSkyBox(0);
                    skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBack, tmpSkyboxPath + "\\1_BK.jpg");
                    skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBottom, tmpSkyboxPath + "\\1_DN.jpg");
                    skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageFront, tmpSkyboxPath + "\\1_FR.jpg");
                    skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageLeft, tmpSkyboxPath + "\\1_LF.jpg");
                    skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageRight, tmpSkyboxPath + "\\1_RT.jpg");
                    skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageTop, tmpSkyboxPath + "\\1_UP.jpg");
                }
                crs = crsFactory.CreateFromWKT(wkt);
                this.axRenderControl1.Terrain.FlyTo(gviTerrainActionCode.gviFlyToTerrain);
            }
        }
예제 #4
0
 /// <summary>
 /// 由参考系统实例化坐标。
 /// </summary>
 /// <param name="referenceSystem">参考系统</param>
 public GeodeticCoord(ICoordinateReferenceSystem referenceSystem, double lon = 0, double lat = 0, double height = 0, double weight = 0)
     : base(referenceSystem, lon, lat, weight)
 {
     if (!ReferenceSystem.CoordinateSystem.Contains(Ordinate.Height))
     {
         throw new ArgumentException("参考系中没有 Height 轴", "referenceSystem");
     }
     this.Height = height;
 }
예제 #5
0
파일: XyzCoord.cs 프로젝트: yxw027/GNSSer
 /// <summary>
 /// 由参考系统实例化坐标。
 /// </summary>
 /// <param name="referenceSystem">参考系统</param>
 public XyzCoord(ICoordinateReferenceSystem referenceSystem, double x = 0, double y = 0, double z = 0, double weight = 0)
     : base(referenceSystem, x, y, weight)
 {
     if (!ReferenceSystem.CoordinateSystem.Contains(Ordinate.Z))
     {
         throw new ArgumentException("参考系中没有 Z 轴", "referenceSystem");
     }
     this.Z = z;
 }
예제 #6
0
파일: XyCoord.cs 프로젝트: yxw027/GNSSer
 /// <summary>
 /// 由参考系统实例化坐标。
 /// </summary>
 /// <param name="referenceSystem">参考系统</param>
 public XyCoord(ICoordinateReferenceSystem referenceSystem, double x = 0, double y = 0, double weight = 0) : base(referenceSystem, weight)
 {
     if (!ReferenceSystem.CoordinateSystem.Contains(Ordinate.X) ||
         !ReferenceSystem.CoordinateSystem.Contains(Ordinate.Y))
     {
         throw new ArgumentException("参考系中没有 X Y 轴", "referenceSystem");
     }
     this.X = x;
     this.Y = y;
 }
예제 #7
0
        private void MainForm_Load(object sender, System.EventArgs e)
        {
            // 初始化RenderControl控件
            IPropertySet ps = new PropertySet();

            ps.SetProperty("RenderSystem", gviRenderSystem.gviRenderOpenGL);
            this.axRenderControl1.Initialize(true, ps);
            this.axRenderControl1.Camera.FlyTime = 1;

            rootId = this.axRenderControl1.ObjectManager.GetProjectTree().RootID;

            // 设置天空盒

            if (System.IO.Directory.Exists(strMediaPath))
            {
                string  tmpSkyboxPath = strMediaPath + @"\skybox";
                ISkyBox skybox        = this.axRenderControl1.ObjectManager.GetSkyBox(0);
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBack, tmpSkyboxPath + "\\1_BK.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBottom, tmpSkyboxPath + "\\1_DN.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageFront, tmpSkyboxPath + "\\1_FR.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageLeft, tmpSkyboxPath + "\\1_LF.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageRight, tmpSkyboxPath + "\\1_RT.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageTop, tmpSkyboxPath + "\\1_UP.jpg");
            }
            else
            {
                MessageBox.Show("请不要随意更改SDK目录名");
                return;
            }

            // 注册地形
            string tmpTedPath = (strMediaPath + @"\terrain\terrain.ted");

            this.axRenderControl1.Terrain.RegisterTerrain(tmpTedPath, "");
            crs = crsFactory.CreateFromWKT(this.axRenderControl1.GetTerrainCrsWKT(tmpTedPath, ""));
            this.axRenderControl1.Terrain.FlyTo(gviTerrainActionCode.gviFlyToTerrain);

            enableOceanEffect.Checked = this.axRenderControl1.Terrain.EnableOceanEffect;

            // 注册事件
            this.axRenderControl1.RcObjectEditing += new _IRenderControlEvents_RcObjectEditingEventHandler(axRenderControl1_RcObjectEditing);

            this.axRenderControl1.RcObjectEditFinish += new _IRenderControlEvents_RcObjectEditFinishEventHandler(axRenderControl1_RcObjectEditFinish);


            this.toolStripTextBoxWindSpeed.Text     = this.axRenderControl1.Terrain.OceanWindSpeed.ToString();
            this.toolStripTextBoxWindDirection.Text = this.axRenderControl1.Terrain.OceanWindDirection.ToString();

            {
                this.helpProvider1.SetShowHelp(this.axRenderControl1, true);
                this.helpProvider1.SetHelpString(this.axRenderControl1, "");
                this.helpProvider1.HelpNamespace = "Ocean.html";
            }
        }
예제 #8
0
파일: MainForm.cs 프로젝트: batuZ/Samples
        private void MainForm_Load(object sender, System.EventArgs e)
        {
            // 初始化RenderControl控件
            IPropertySet ps = new PropertySet();

            ps.SetProperty("RenderSystem", gviRenderSystem.gviRenderOpenGL);
            this.axRenderControl1.Initialize(true, ps);
            this.axRenderControl1.Camera.FlyTime = 1;

            rootId = this.axRenderControl1.ObjectManager.GetProjectTree().RootID;

            // 设置天空盒

            if (System.IO.Directory.Exists(strMediaPath))
            {
                string  tmpSkyboxPath = strMediaPath + @"\skybox";
                ISkyBox skybox        = this.axRenderControl1.ObjectManager.GetSkyBox(0);
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBack, tmpSkyboxPath + "\\1_BK.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBottom, tmpSkyboxPath + "\\1_DN.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageFront, tmpSkyboxPath + "\\1_FR.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageLeft, tmpSkyboxPath + "\\1_LF.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageRight, tmpSkyboxPath + "\\1_RT.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageTop, tmpSkyboxPath + "\\1_UP.jpg");
            }
            else
            {
                MessageBox.Show("请不要随意更改SDK目录名");
                return;
            }

            // 注册地形
            string tmpTedPath = (strMediaPath + @"\terrain\terrain.ted");

            this.axRenderControl1.Terrain.RegisterTerrain(tmpTedPath, "");
            crs = crsFactory.CreateFromWKT(this.axRenderControl1.GetTerrainCrsWKT(tmpTedPath, ""));
            this.axRenderControl1.Terrain.FlyTo(gviTerrainActionCode.gviFlyToTerrain);
            // 添加节点到界面控件上
            myListNode item = new myListNode("terrain", TreeNodeType.NT_TERRAINLAYER, this.axRenderControl1.Terrain);

            item.Checked = true;
            listView1.Items.Add(item);

            // 注册事件
            this.axRenderControl1.RcObjectEditing += new _IRenderControlEvents_RcObjectEditingEventHandler(axRenderControl1_RcObjectEditing);

            this.axRenderControl1.RcObjectEditFinish += new Gvitech.CityMaker.Controls._IRenderControlEvents_RcObjectEditFinishEventHandler(axRenderControl1_RcObjectEditFinish);


            {
                this.helpProvider1.SetShowHelp(this.axRenderControl1, true);
                this.helpProvider1.SetHelpString(this.axRenderControl1, "");
                this.helpProvider1.HelpNamespace = "TerrainModifier.html";
            }
        }
예제 #9
0
 /// <summary>
 /// 由参考系统实例化坐标。
 /// </summary>
 /// <param name="referenceSystem">参考系统</param>
 public LonLatCoord(ICoordinateReferenceSystem referenceSystem, double lon = 0, double lat = 0, double weight = 0)
     : base(referenceSystem, weight)
 {
     if (!ReferenceSystem.CoordinateSystem.Contains(Ordinate.Lon) ||
         !ReferenceSystem.CoordinateSystem.Contains(Ordinate.Lat))
     {
         throw new ArgumentException("参考系中没有 Lon Lat 轴", "referenceSystem");
     }
     this.Lon = lon;
     this.Lat = lat;
 }
예제 #10
0
파일: Coordinate.cs 프로젝트: yxw027/GNSSer
        /// <summary>
        /// 默认构造函数。初始化为 Empty。
        /// </summary>
        //public Coordinate():this(null) {}
        /// <summary>
        /// 由参考系统实例化坐标。
        /// </summary>
        /// <param name="referenceSystem">参考系统</param>
        public Coordinate(ICoordinateReferenceSystem referenceSystem, double weight = 0, CoordinateType CoordinateType = CoordinateType.Other)
        {
            this.ReferenceSystem = referenceSystem;
            this.Weight          = weight;
            this.CoordDic        = new Dictionary <Ordinate, double>();

            foreach (var item in ReferenceSystem.CoordinateSystem.Axes)
            {
                this.CoordDic.Add(item.Ordinate, 0);
            }
        }
예제 #11
0
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="geodeticCrs">待转换坐标系统,类型必须是GeodeticCs</param>
        /// <param name="xyzCrs">目标坐标系统,类型必须是XyzCs</param>
        public GeodeticToXyzCsTranformOnDifferDatum(ICoordinateReferenceSystem geodeticCrs, ICoordinateReferenceSystem xyzCrs)
            : base(geodeticCrs, xyzCrs)
        {
            //第一个节点,统一坐标到XYZ
            ICoordinateReferenceSystem middleCrs = new CrsFactory().Create(CoordinateSystem.XyzCs, this.SourceCrs.Datum);

            TransformChain = new GeodeticToXyzCsTranform(this.SourceCrs, middleCrs);
            //第二个节点
            AbstractCoordTranform datumTrans = new GeodeticDatumTranform(middleCrs, this.TargetCrs);

            //设置链条
            TransformChain.Successor = (datumTrans);
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="sourceCrs">待转换坐标系统,类型是XyzCs才符合</param>
        /// <param name="targetCrs">目标坐标系统,类型是GeodeticCs才符合</param>
        public XyzToGeodeticCsTranformOnDifferDatum(ICoordinateReferenceSystem sourceCrs, ICoordinateReferenceSystem targetCrs)
            : base(sourceCrs, targetCrs)
        {
            //第一个节点,统一基准
            ICoordinateReferenceSystem middleCrs = new CrsFactory().Create(CoordinateSystem.XyzCs, this.TargetCrs.Datum);

            this.TransformChain = new GeodeticDatumTranform(this.SourceCrs, middleCrs);
            //第二个节点,转换到大地坐标
            AbstractCoordTranform xyzToGeo = new XyzToGeodeticCsTranform(middleCrs, this.TargetCrs);

            //设置链条
            this.TransformChain.Successor = (xyzToGeo);
        }
예제 #13
0
 /// <summary>
 /// 椭球基准的变换.
 /// </summary>
 /// <param name="sourceCrs">待转参考系</param>
 /// <param name="targetCrs">目标参考系</param>
 /// <returns></returns>
 public AbstractCoordTranform CreateGeodeticDatumTranform(
     ICoordinateReferenceSystem sourceCrs = null,
     ICoordinateReferenceSystem targetCrs = null)
 {
     if (sourceCrs == null)
     {
         sourceCrs = SourceCrs;
     }
     if (targetCrs == null)
     {
         targetCrs = TargetCrs;
     }
     return(new GeodeticDatumTranform(sourceCrs, targetCrs));
 }
예제 #14
0
        private void MainForm_Load(object sender, System.EventArgs e)
        {
            this.btnOnProcess.Enabled = false;
            this.btnSimulate.Enabled  = false;

            // 初始化RenderControl控件
            IPropertySet ps = new PropertySet();

            ps.SetProperty("RenderSystem", gviRenderSystem.gviRenderOpenGL);
            this.axRenderControl1.Initialize(true, ps);
            this.axRenderControl1.Camera.FlyTime = 1;

            rootId = this.axRenderControl1.ObjectManager.GetProjectTree().RootID;

            // 设置天空盒

            if (System.IO.Directory.Exists(strMediaPath))
            {
                string  tmpSkyboxPath = strMediaPath + @"\skybox";
                ISkyBox skybox        = this.axRenderControl1.ObjectManager.GetSkyBox(0);
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBack, tmpSkyboxPath + "\\1_BK.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBottom, tmpSkyboxPath + "\\1_DN.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageFront, tmpSkyboxPath + "\\1_FR.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageLeft, tmpSkyboxPath + "\\1_LF.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageRight, tmpSkyboxPath + "\\1_RT.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageTop, tmpSkyboxPath + "\\1_UP.jpg");
            }
            else
            {
                MessageBox.Show("请不要随意更改SDK目录名");
                return;
            }

            // 注册地形
            string tmpTedPath = (strMediaPath + @"\terrain\terrain.ted");

            this.axRenderControl1.Terrain.RegisterTerrain(tmpTedPath, "");
            crs = crsFactory.CreateFromWKT(this.axRenderControl1.GetTerrainCrsWKT(tmpTedPath, ""));
            this.axRenderControl1.Terrain.FlyTo(gviTerrainActionCode.gviFlyToTerrain);


            {
                this.helpProvider1.SetShowHelp(this.axRenderControl1, true);
                this.helpProvider1.SetHelpString(this.axRenderControl1, "");
                this.helpProvider1.HelpNamespace = "Flood.html";
            }
        }
예제 #15
0
        /// <summary>
        ///  大地基准不同,坐标系统也不同,源为大地坐标系,目标为空间直角坐标系。
        //      应该首先统一坐标系,然后统一大地基准
        /// </summary>
        /// <returns></returns>
        public ICrsTranform CreateGeodeticToXyzCsTransformOnDifferDatum(
            ICoordinateReferenceSystem sourceCrs = null,
            ICoordinateReferenceSystem targetCrs = null)
        {
            if (sourceCrs == null)
            {
                sourceCrs = SourceCrs;
            }
            if (targetCrs == null)
            {
                targetCrs = TargetCrs;
            }
            return(new GeodeticToXyzCsTranformOnDifferDatum(sourceCrs, targetCrs));

            //ICrsFactory crsFac = new CrsFactory();
            ////第一个节点,统一坐标到XYZ
            //ICoordinateReferenceSystem middleCrs = crsFac.Create(CoordinateSystem.XyzCs, this.SourceCrs.Datum);
            //AbstractCoordTranform geoToXyz = CreateGeodeticToXyzCsTranform(this.SourceCrs, middleCrs);
            ////第二个节点
            //AbstractCoordTranform datumTrans = CreateGeodeticDatumTranform(middleCrs, this.TargetCrs);
            ////设置链条
            //geoToXyz.Successor = (datumTrans);
            //return geoToXyz;
        }
예제 #16
0
        /// <summary>
        ///  大地基准不同,坐标系统也不同。源为空间直角坐标系,目标为大地坐标系。
        /// </summary>
        /// <returns></returns>
        public ICrsTranform CreateXyzToGeodeticCsTransformOnDifferDatum(
            ICoordinateReferenceSystem sourceCrs = null,
            ICoordinateReferenceSystem targetCrs = null)
        {
            if (sourceCrs == null)
            {
                sourceCrs = SourceCrs;
            }
            if (targetCrs == null)
            {
                targetCrs = TargetCrs;
            }
            return(new XyzToGeodeticCsTranformOnDifferDatum(sourceCrs, targetCrs));

            //ICrsFactory crsFac = new CrsFactory();
            ////第一个节点,统一基准
            //ICoordinateReferenceSystem middleCrs = crsFac.Create(CoordinateSystem.XyzCs, this.TargetCrs.Datum);
            //AbstractCoordTranform datumTrans = CreateGeodeticDatumTranform(this.SourceCrs, middleCrs);
            ////第二个节点,转换到大地坐标
            //AbstractCoordTranform xyzToGeo = CreateXyzToGeodeticCsTranform(middleCrs, this.TargetCrs);
            ////设置链条
            //datumTrans.Successor = (xyzToGeo);
            //return datumTrans;
        }
예제 #17
0
 /// <summary>
 /// 实例化一个通用坐标转换器,自动判断参考系的类型,组成责任链。
 /// </summary>
 /// <param name="sourceCrs">待转参考系</param>
 /// <param name="targetCrs">目标参考系</param>
 public CoordinateTransformFactory(ICoordinateReferenceSystem sourceCrs, ICoordinateReferenceSystem targetCrs)
 {
     this.SourceCrs = sourceCrs;
     this.TargetCrs = targetCrs;
 }
예제 #18
0
 /// <summary>
 /// 大地基准转换实例
 /// </summary>
 /// <param name="sourceDatum">原大地基准</param>
 /// <param name="targetCrs">目标大地基准</param>
 public GeodeticDatumTranform(ICoordinateReferenceSystem sourceCrs, ICoordinateReferenceSystem targetCrs)
     : base(sourceCrs, targetCrs)
 {
 }
예제 #19
0
 /// <summary>
 /// 判断坐标系类型
 /// </summary>
 /// <param name="srs"></param>
 /// <returns></returns>
 bool isENU(ICoordinateReferenceSystem srs)
 {
     return(srs.IsENU());
 }
예제 #20
0
 /// <summary>
 /// 实例化一个坐标工厂。
 /// </summary>
 /// <param name="reference">坐标参考系</param>
 public CoordinateFactory(ICoordinateReferenceSystem reference)
 {
     this.ReferenceSystem = reference;
 }
예제 #21
0
        /// <summary>
        /// 由输入输出的参考系类型,自动选择合适的转换器,并可以组成责任链。
        /// </summary>
        /// <returns></returns>
        public ICrsTranform Create(
            ICoordinateReferenceSystem sourceCrs = null,
            ICoordinateReferenceSystem targetCrs = null)
        {
            if (sourceCrs == null)
            {
                sourceCrs = SourceCrs;
            }
            if (targetCrs == null)
            {
                targetCrs = TargetCrs;
            }

            //判断并设置转换器
            //现在只支持几种情况:
            //1.椭球基准不变,大地坐标与空间直角坐标的转换;
            //2.在空间直角坐标下,转换椭球基准;
            //3.以上两种转换的组合。
            if (sourceCrs.Datum is IGeodeticDatum && targetCrs.Datum is IGeodeticDatum) //1.大地基准下。
            {
                if (sourceCrs.Datum.Equals(targetCrs.Datum))                            //1.1 大地基准相同
                {
                    //1.1.1 LonLatHeight  ->  XYZ
                    if (sourceCrs.CoordinateSystem.CoordinateType == CoordinateType.LonLatHeight &&
                        targetCrs.CoordinateSystem.CoordinateType == CoordinateType.XYZ)
                    {
                        return(CreateGeodeticToXyzCsTranform());
                    }
                    //1.1.2 XYZ  ->  LonLatHeight
                    if (sourceCrs.CoordinateSystem.CoordinateType == CoordinateType.XYZ &&
                        targetCrs.CoordinateSystem.CoordinateType == CoordinateType.LonLatHeight)
                    {
                        return(CreateXyzToGeodeticCsTranform());
                    }
                }
                else//1.2 大地基准不同
                {
                    //1.2.1 坐标系相同,则基准(椭球)转换 XYZ -> XYZ
                    if (sourceCrs.CoordinateSystem.CoordinateType == CoordinateType.XYZ &&
                        targetCrs.CoordinateSystem.CoordinateType == CoordinateType.XYZ)
                    {
                        return(CreateGeodeticDatumTranform());
                    }
                    //1.2.2 大地基准不同,坐标系统也不同,源为大地坐标系,目标为空间直角坐标系。
                    //      应该首先统一坐标系,然后统一大地基准
                    if (sourceCrs.CoordinateSystem.CoordinateType == CoordinateType.LonLatHeight &&
                        targetCrs.CoordinateSystem.CoordinateType == CoordinateType.XYZ)
                    {
                        return(CreateGeodeticToXyzCsTransformOnDifferDatum());
                    }
                    //1.2.3 大地基准不同,坐标系统也不同。源为空间直角坐标系,目标为大地坐标系。
                    if (sourceCrs.CoordinateSystem.CoordinateType == CoordinateType.XYZ &&
                        targetCrs.CoordinateSystem.CoordinateType == CoordinateType.LonLatHeight)
                    {
                        return(CreateXyzToGeodeticCsTransformOnDifferDatum());
                    }
                }
            }
            //兜底条款
            throw new ArgumentException("我们很遗憾的告诉你:当前本程序,还不支持您所输入参考系之间的转换。进一步信息请联系我们。");
        }
예제 #22
0
 /// <summary>
 /// 创建一个实例。
 /// </summary>
 /// <param name="sourceCrs">待转换参考系统</param>
 /// <param name="targetCrs">目标参考系统</param>
 public AbstractCompositCoordTranform(ICoordinateReferenceSystem sourceCrs, ICoordinateReferenceSystem targetCrs)
     : base(sourceCrs, targetCrs)
 {
 }
예제 #23
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="sourceCrs">待转换坐标系统,类型是XyzCs才符合</param>
 /// <param name="targetCrs">目标坐标系统,类型是GeodeticCs才符合</param>
 public XyzToGeodeticCsTranform(ICoordinateReferenceSystem sourceCrs, ICoordinateReferenceSystem targetCrs)
     : base(sourceCrs, targetCrs)
 {
 }
예제 #24
0
 /// <summary>
 /// 创建一个实例。
 /// </summary>
 /// <param name="sourceCrs">待转换参考系统</param>
 /// <param name="targetCrs">目标参考系统</param>
 public AbstractCoordTranform(ICoordinateReferenceSystem sourceCrs, ICoordinateReferenceSystem targetCrs)
 {
     this.SourceCrs         = sourceCrs;
     this.TargetCrs         = targetCrs;
     this.CoordinateFactory = new CoordinateFactory(targetCrs);
 }
예제 #25
0
파일: MainForm.cs 프로젝트: batuZ/Samples
        private void MainForm_Load(object sender, EventArgs e)
        {
            // 初始化RenderControl控件
            IPropertySet ps = new PropertySet();

            ps.SetProperty("RenderSystem", gviRenderSystem.gviRenderOpenGL);
            this.axRenderControl1.Initialize(true, ps);

            rootId = this.axRenderControl1.ObjectManager.GetProjectTree().RootID;
            this.axRenderControl1.Camera.FlyTime = 1;

            // 设置天空盒

            if (System.IO.Directory.Exists(strMediaPath))
            {
                string  tmpSkyboxPath = strMediaPath + @"\skybox";
                ISkyBox skybox        = this.axRenderControl1.ObjectManager.GetSkyBox(0);
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBack, tmpSkyboxPath + "\\1_BK.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageBottom, tmpSkyboxPath + "\\1_DN.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageFront, tmpSkyboxPath + "\\1_FR.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageLeft, tmpSkyboxPath + "\\1_LF.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageRight, tmpSkyboxPath + "\\1_RT.jpg");
                skybox.SetImagePath(gviSkyboxImageIndex.gviSkyboxImageTop, tmpSkyboxPath + "\\1_UP.jpg");
            }
            else
            {
                MessageBox.Show("请不要随意更改SDK目录名");
                return;
            }

            #region 加载FDB场景
            try
            {
                IConnectionInfo ci = new ConnectionInfo();
                ci.ConnectionType = gviConnectionType.gviConnectionFireBird2x;
                string tmpFDBPath = (strMediaPath + @"\ClosedTrimesh.FDB");
                ci.Database = tmpFDBPath;
                IDataSourceFactory dsFactory = new DataSourceFactory();
                IDataSource        ds        = dsFactory.OpenDataSource(ci);
                string[]           setnames  = (string[])ds.GetFeatureDatasetNames();
                if (setnames.Length == 0)
                {
                    return;
                }
                IFeatureDataSet dataset = ds.OpenFeatureDataset(setnames[0]);
                crs = dataset.SpatialReference;
                string[] fcnames = (string[])dataset.GetNamesByType(gviDataSetType.gviDataSetFeatureClassTable);
                if (fcnames.Length == 0)
                {
                    return;
                }
                fcMap = new Hashtable(fcnames.Length);
                foreach (string name in fcnames)
                {
                    IFeatureClass fc = dataset.OpenFeatureClass(name);
                    // 找到空间列字段
                    List <string>        geoNames   = new List <string>();
                    IFieldInfoCollection fieldinfos = fc.GetFields();
                    for (int i = 0; i < fieldinfos.Count; i++)
                    {
                        IFieldInfo fieldinfo = fieldinfos.Get(i);
                        if (null == fieldinfo)
                        {
                            continue;
                        }
                        IGeometryDef geometryDef = fieldinfo.GeometryDef;
                        if (null == geometryDef)
                        {
                            continue;
                        }
                        geoNames.Add(fieldinfo.Name);
                    }
                    fcMap.Add(fc, geoNames);
                }
            }
            catch (COMException ex)
            {
                System.Diagnostics.Trace.WriteLine(ex.Message);
                return;
            }

            // CreateFeautureLayer
            bool hasfly = false;
            foreach (IFeatureClass fc in fcMap.Keys)
            {
                List <string> geoNames = (List <string>)fcMap[fc];
                foreach (string geoName in geoNames)
                {
                    if (!geoName.Equals("Geometry"))
                    {
                        continue;
                    }

                    IFeatureLayer featureLayer = this.axRenderControl1.ObjectManager.CreateFeatureLayer(
                        fc, geoName, null, null, rootId);
                    __fc = fc;
                    __fl = featureLayer;

                    if (!hasfly)
                    {
                        IFieldInfoCollection fieldinfos  = fc.GetFields();
                        IFieldInfo           fieldinfo   = fieldinfos.Get(fieldinfos.IndexOf(geoName));
                        IGeometryDef         geometryDef = fieldinfo.GeometryDef;
                        env = geometryDef.Envelope;
                        if (env == null || (env.MaxX == 0.0 && env.MaxY == 0.0 && env.MaxZ == 0.0 &&
                                            env.MinX == 0.0 && env.MinY == 0.0 && env.MinZ == 0.0))
                        {
                            continue;
                        }
                        angle.Set(0, -20, 0);
                        IPoint p = (new GeometryFactory()).CreatePoint(gviVertexAttribute.gviVertexAttributeZ);
                        p.SpatialCRS = fc.FeatureDataSet.SpatialReference;
                        p.Position   = env.Center;
                        this.axRenderControl1.Camera.LookAt2(p, 1000, angle);
                    }
                    hasfly = true;
                }
            }
            #endregion


            // 注册事件
            this.axRenderControl1.RcObjectEditing += new _IRenderControlEvents_RcObjectEditingEventHandler(axRenderControl1_RcObjectEditing);

            this.axRenderControl1.RcObjectEditFinish += new _IRenderControlEvents_RcObjectEditFinishEventHandler(axRenderControl1_RcObjectEditFinish);

            this.axRenderControl1.RcMouseClickSelect += new _IRenderControlEvents_RcMouseClickSelectEventHandler(axRenderControl1_RcMouseClickSelect);



            {
                this.helpProvider1.SetShowHelp(this.axRenderControl1, true);
                this.helpProvider1.SetHelpString(this.axRenderControl1, "");
                this.helpProvider1.HelpNamespace = "GetSolidProfile.html";
            }
        }
예제 #26
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="geodeticCrs">待转换坐标系统,类型必须是GeodeticCs</param>
 /// <param name="xyzCrs">目标坐标系统,类型必须是XyzCs</param>
 public GeodeticToXyzCsTranform(ICoordinateReferenceSystem geodeticCrs, ICoordinateReferenceSystem xyzCrs)
     : base(geodeticCrs, xyzCrs)
 {
 }
예제 #27
0
파일: MainForm.cs 프로젝트: batuZ/Samples
        private void createDataSetToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DataSetForm setForm = new DataSetForm();

            if (setForm.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            IDataSource     ds   = null;
            IFeatureDataSet dset = null;

            try
            {
                myTreeNode      node = (myTreeNode)selectNode;
                IConnectionInfo ci   = node.con;
                ds = dsFactory.OpenDataSource(ci);
                ICoordinateReferenceSystem coorSys = coorFactory.CreateFromWKT(setForm.CoordString);
                dset = ds.CreateFeatureDataset(setForm.DatasetName, coorSys as SpatialCRS);

                //开起事务:往普通表里插入记录
                ds.StartEditing();
                bool saveEditing = false;
                if (CreateLCRecordOfFDS(ds, dset.Name))
                {
                    saveEditing = true;
                }
                else
                {
                    saveEditing = false;
                }
                ds.StopEditing(saveEditing);
                // 如果事务失败,则回退创建dataset动作
                if (saveEditing == false)
                {
                    ds.DeleteFeatureDataset(dset.Name);
                    MessageBox.Show("创建失败");
                    return;
                }

                // 往树上挂节点
                TreeNode setNode = new TreeNode(setForm.DatasetName, 1, 1);
                node.Nodes.Add(setNode);
                setNode.ContextMenuStrip = this.contextMenuStrip2;
            }
            catch (COMException ex)
            {
                System.Diagnostics.Trace.WriteLine(ex.Message);
            }
            finally
            {
                if (ds != null)
                {
                    //Marshal.ReleaseComObject(ds);
                    ds = null;
                }
                if (dset != null)
                {
                    //Marshal.ReleaseComObject(dset);
                    dset = null;
                }
            }
        }