Exemplo n.º 1
0
        public static void SetGeometry(IGeometry pGeometry, IFeature pFeature)
        {
            double        num;
            double        num1;
            IFeatureClass @class = pFeature.Class as IFeatureClass;

            try
            {
                int          num2        = @class.FindField(@class.ShapeFieldName);
                IGeometryDef geometryDef = @class.Fields.Field[num2].GeometryDef;
                if (!geometryDef.HasZ)
                {
                    ((IZAware)pGeometry).ZAware = false;
                }
                else
                {
                    ((IZAware)pGeometry).ZAware = true;
                    if (pGeometry is IZ)
                    {
                        IZ igeometry0 = (IZ)pGeometry;
                        geometryDef.SpatialReference.GetZDomain(out num, out num1);
                        igeometry0.SetConstantZ(num);
                    }
                    else if (pGeometry is IPoint)
                    {
                        geometryDef.SpatialReference.GetZDomain(out num, out num1);
                        (pGeometry as IPoint).Z = num;
                    }
                }
                if (!geometryDef.HasM)
                {
                    ((IMAware)pGeometry).MAware = false;
                }
                else
                {
                    ((IMAware)pGeometry).MAware = true;
                }
                IFeature feature = @class.CreateFeature();
                (pGeometry as ITopologicalOperator6).SimplifyAsFeature();
                feature.Shape = pGeometry;
                try
                {
                    ((IRowSubtypes)feature).InitDefaultValues();
                }
                catch (Exception exception)
                {
                    Logger.Current.Error("", exception, null);
                }
                EditorEvent.NewRow(feature);
                feature.Store();
            }
            catch (COMException cOMException)
            {
                Logger.Current.Error("", cOMException, null);
            }
            catch (Exception exception1)
            {
                Logger.Current.Error("", exception1, null);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 三维场景中绘制面要素 20110609
        /// </summary>
        /// <param name="pGeometry">面要素</param>
        /// <param name="r"></param>
        /// <param name="g"></param>
        /// <param name="b"></param>
        /// <param name="Z"></param>
        /// <param name="Width"></param>
        /// <returns></returns>
        public static IElement DrawPolygonZ(IGeometry pGeometry, int r, int g, int b, int Z, double Width)
        {
            IPolygon pEnvPolygon = (IPolygon)pGeometry;
            IZAware  pZAware     = (IZAware)pEnvPolygon;

            ((IZAware)pZAware).ZAware = true;
            IZ pZ = (IZ)pEnvPolygon;

            pZ.SetConstantZ(Z);
            IElement        pElement;
            IPolygonElement pPolygonElement = new PolygonElementClass();

            pElement = pPolygonElement as IElement;
            IFillShapeElement pFillShapeElement = pPolygonElement as IFillShapeElement;

            ISimpleFillSymbol pSimpleFillSymbol = new SimpleFillSymbolClass();

            pSimpleFillSymbol.Style = esriSimpleFillStyle.esriSFSCross;
            pSimpleFillSymbol.Color = getRGB(r, g, b);
            ISimpleLineSymbol pSimpleLineSymbol = new SimpleLineSymbolClass();

            pSimpleLineSymbol.Style = esriSimpleLineStyle.esriSLSDashDotDot;
            pSimpleLineSymbol.Color = getRGB(r, g, b);
            pSimpleLineSymbol.Color.Transparency = 10;
            pSimpleLineSymbol.Width = Width;
            ISymbol pSymbol = pSimpleLineSymbol as ISymbol;

            pSymbol.ROP2 = esriRasterOpCode.esriROPNotXOrPen;
            pSimpleFillSymbol.Outline = pSimpleLineSymbol;
            pElement.Geometry         = pZ as IGeometry;
            pFillShapeElement.Symbol  = pSimpleFillSymbol;

            return(pElement);
        }
Exemplo n.º 3
0
        public void AddShapeToTin()
        {
            object           Missing = Type.Missing;
            IPointCollection ptc     = pGeometry as IPointCollection;

            if (ptc == null)
            {
                return;
            }
            //for (int i = 0; i < ptc.PointCount; i++)
            //{
            //    IPoint pt = ptc.get_Point(i);
            //    IZAware pza = pt as IZAware;
            //    pza.ZAware = true;
            //    pt.Z = dHeight;
            //}
            IZAware pza = pGeometry as IZAware;

            pza.ZAware = true;
            IZ pz = pGeometry as IZ;

            pz.SetConstantZ(dHeight);
            try
            {
                pTinEdit.AddShapeZ(pGeometry, esriTinSurfaceType.esriTinHardReplace, 0, ref Missing);
            }
            catch (SystemException e)
            {
            }
            if (pMapCtr != null)
            {
                pMapCtr.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);
            }
        }
Exemplo n.º 4
0
 private void CreateFeature(IGeometry geo, IMap pMap, IFeatureClass fc)
 {
     try
     {
         if (geo == null || fc == null || pMap == null)
         {
             return;
         }
         IDataset       pDataset       = fc as IDataset;
         IWorkspaceEdit pWorkspaceEdit = pDataset.Workspace as IWorkspaceEdit;
         int            index          = fc.FindField(fc.ShapeFieldName);
         IGeometryDef   pGD            = fc.Fields.get_Field(index).GeometryDef;
         if (pGD.HasZ)
         {
             IZAware pZA = geo as IZAware;
             pZA.ZAware = true;
             IZ     pZ = geo as IZ;
             double zmin = -1000, zmax = 1000;
             if (pGD.SpatialReference.HasZPrecision())
             {
                 pGD.SpatialReference.GetZDomain(out zmin, out zmax);
             }
             if (pZ != null)
             {
                 pZ.SetConstantZ(0);
             }
             else
             {
                 IPoint p = geo as IPoint;
                 if (p.Z.ToString() == "非数字")
                 {
                     p.Z = 0;
                 }
             }
         }
         if (pGD.HasM)
         {
             IMAware pMA = geo as IMAware;
             pMA.MAware = true;
         }
         if (!pWorkspaceEdit.IsBeingEdited())
         {
             pWorkspaceEdit.StartEditing(true);
             pWorkspaceEdit.StartEditOperation();
         }
         IFeature pFeature = fc.CreateFeature();
         pFeature.Shape = geo;
         pFeature.Store();
         if (pWorkspaceEdit.IsBeingEdited())
         {
             pWorkspaceEdit.StartEditOperation();
             pWorkspaceEdit.StopEditing(true);
         }
         pMap.ClearSelection();
     }
     catch (System.Exception ex)
     {
         return;
     }
 }
Exemplo n.º 5
0
 public static void MakeConstantZ(IGeometry igeometry_0, double double_0)
 {
     if (igeometry_0 is IZ)
     {
         Utils3D.MakeZMAware(igeometry_0, true);
         IZ iZ = igeometry_0 as IZ;
         iZ.CalculateNonSimpleZs();
         iZ.SetConstantZ(double_0);
     }
 }
Exemplo n.º 6
0
 public static void MakeConstantZ(IGeometry igeometry_0, double double_0)
 {
     if (igeometry_0 is IZ)
     {
         GeometryOperator.MakeZMAware(igeometry_0, true);
         IZ igeometry0 = igeometry_0 as IZ;
         igeometry0.CalculateNonSimpleZs();
         igeometry0.SetConstantZ(double_0);
     }
 }
Exemplo n.º 7
0
        public static int CreateFeature(IGeometry pGeometry, IFeatureClass pFeatureClass)
        {
            double num;
            double num1;
            int    oID;

            try
            {
                if ((pGeometry == null ? false : pFeatureClass != null))
                {
                    int          num2        = pFeatureClass.FindField(pFeatureClass.ShapeFieldName);
                    IGeometryDef geometryDef = pFeatureClass.Fields.Field[num2].GeometryDef;
                    if (geometryDef.HasZ)
                    {
                        ((IZAware)pGeometry).ZAware = true;
                        if (pGeometry is IZ)
                        {
                            IZ igeometry0 = (IZ)pGeometry;
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            igeometry0.SetConstantZ(num);
                        }
                        else if (pGeometry is IPoint)
                        {
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            (pGeometry as IPoint).Z = num;
                        }
                    }
                    if (geometryDef.HasM)
                    {
                        ((IMAware)pGeometry).MAware = true;
                    }
                    IFeature feature = pFeatureClass.CreateFeature();
                    feature.Shape = pGeometry;
                    try
                    {
                        ((IRowSubtypes)feature).InitDefaultValues();
                    }
                    catch (Exception exception)
                    {
                        Logger.Current.Error("", exception, null);
                    }
                    EditorEvent.NewRow(feature);
                    feature.Store();
                    EditorEvent.AfterNewRow(feature);
                    oID = feature.OID;
                    return(oID);
                }
            }
            catch (Exception exception1)
            {
                Logger.Current.Error("", exception1, null);
            }
            oID = -1;
            return(oID);
        }
Exemplo n.º 8
0
        public static void CreateFeature2(IGeometry pGeometry, IFeatureClass pFeatureClass)
        {
            double num;
            double num1;

            if (pGeometry != null && !pGeometry.IsEmpty)
            {
                pGeometry.Envelope.Expand(10, 10, false);
                try
                {
                    int          num2        = pFeatureClass.FindField(pFeatureClass.ShapeFieldName);
                    IGeometryDef geometryDef = pFeatureClass.Fields.Field[num2].GeometryDef;
                    if (geometryDef.HasZ)
                    {
                        ((IZAware)pGeometry).ZAware = true;
                        if (pGeometry is IZ)
                        {
                            IZ igeometry0 = (IZ)pGeometry;
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            igeometry0.SetConstantZ(num);
                        }
                        else if (pGeometry is IPoint)
                        {
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            (pGeometry as IPoint).Z = num;
                        }
                    }
                    if (geometryDef.HasM)
                    {
                        ((IMAware)pGeometry).MAware = true;
                    }
                    IFeature feature = pFeatureClass.CreateFeature();
                    feature.Shape = pGeometry;
                    try
                    {
                        ((IRowSubtypes)feature).InitDefaultValues();
                    }
                    catch (Exception exception)
                    {
                        Logger.Current.Error("", exception, null);
                    }
                    EditorEvent.NewRow(feature);
                    feature.Store();
                }
                catch (COMException cOMException)
                {
                    Logger.Current.Error("", cOMException, null);
                }
                catch (Exception exception1)
                {
                    Logger.Current.Error("", exception1, null);
                }
            }
        }
Exemplo n.º 9
0
 public static void MakeConstantZAsMaxZ(IPolyline ipolyline_0)
 {
     if (ipolyline_0 is IZ)
     {
         IZAware iZAware = ipolyline_0 as IZAware;
         iZAware.ZAware = true;
         IZ iZ = ipolyline_0 as IZ;
         iZ.SetConstantZ(iZ.ZMax);
     }
     else
     {
         System.Windows.Forms.MessageBox.Show("Geometry is not IZ.", "MakeConstantZAsMaxZ");
     }
 }
Exemplo n.º 10
0
        private void CreateParallel(IGeometry pGeometry, IFeatureClass pFeatureClass)
        {
            double num;
            double num1;

            try
            {
                if ((pGeometry == null ? false : pFeatureClass != null))
                {
                    int          num2        = pFeatureClass.FindField(pFeatureClass.ShapeFieldName);
                    IGeometryDef geometryDef = pFeatureClass.Fields.Field[num2].GeometryDef;
                    if (geometryDef.HasZ)
                    {
                        ((IZAware)pGeometry).ZAware = true;
                        if (pGeometry is IZ)
                        {
                            IZ igeometry0 = (IZ)pGeometry;
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            igeometry0.SetConstantZ(num);
                        }
                        else if (pGeometry is IPoint)
                        {
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            (pGeometry as IPoint).Z = num;
                        }
                    }
                    if (geometryDef.HasM)
                    {
                        ((IMAware)pGeometry).MAware = true;
                    }
                    IFeature feature = pFeatureClass.CreateFeature();
                    feature.Shape = pGeometry;
                    try
                    {
                        ((IRowSubtypes)feature).InitDefaultValues();
                    }
                    catch (Exception exception)
                    {
                        // CErrorLog.writeErrorLog(this, exception, "");
                    }
                    feature.Store();
                }
            }
            catch (Exception exception1)
            {
                //CErrorLog.writeErrorLog(null, exception1, "");
            }
        }
        public void EraseOper()
        {
            //空间查询
            ISpatialFilter tSF = new SpatialFilterClass();

            tSF.Geometry   = pEnvelope;
            tSF.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;
            IFeatureCursor tFeatureCursor = pFeatureClass.Search(tSF, false);
            IFeature       tFeature       = tFeatureCursor.NextFeature();

            while (tFeature != null)
            {
                if (tFeature.Shape.SpatialReference != pEnvelope.SpatialReference)  //sourceGeometry为被裁剪的图形
                {
                    pEnvelope.Project(tFeature.Shape.SpatialReference);
                }
                //此处应保持裁剪与被裁剪图层的空间参考一致,否则容易发生异常
                switch (tFeature.Shape.GeometryType)
                {
                case esriGeometryType.esriGeometryPolygon:
                    ITopologicalOperator tTope1 = pEnvelope as ITopologicalOperator;
                    tTope1.Simplify();
                    ITopologicalOperator tTope2 = tFeature.ShapeCopy as ITopologicalOperator;
                    tTope2.Simplify();
                    IGeometry tGeoDe = tTope2.Difference((IGeometry)tTope1);

                    if (tFeature.Fields.get_Field(tFeature.Fields.FindField("Shape")).GeometryDef.HasZ)
                    {
                        IZAware zAware = (IZAware)tGeoDe;
                        zAware.ZAware = true;
                        IZ iz = (IZ)tGeoDe;
                        iz.SetConstantZ(0);
                    }

                    tFeature.Shape = tGeoDe;
                    tFeature.Store();
                    tFeature = tFeatureCursor.NextFeature();
                    break;

                default:
                    break;
                }
                tFeature = tFeatureCursor.NextFeature();
            }
            ReleaseCom(tFeatureCursor);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Geometry中Z值和M值处理
        /// </summary>
        /// <params name="feature"></params>
        /// <params name="geometry"></params>
        /// <params name="zValue"></params>
        public static void HandleZMValue(IFeature feature, IGeometry geometry, double zValue)
        {
            //先判断图层要素是否有Z值
            int index;

            index = feature.Fields.FindField(GIS_Const.FIELD_SHAPE);
            IGeometryDef pGeometryDef;

            pGeometryDef = feature.Fields.get_Field(index).GeometryDef as IGeometryDef;

            IPointCollection pPointCollection = geometry as IPointCollection;

            if (pGeometryDef.HasZ)
            {
                IZAware pZAware = (IZAware)geometry;
                pZAware.ZAware = true;

                if (geometry.GeometryType == esriGeometryType.esriGeometryPoint)
                {
                    IPoint point = (IPoint)geometry;
                    point.Z = zValue;
                }
                else
                {
                    IZ iz1 = (IZ)geometry;
                    iz1.SetConstantZ(zValue);  //将Z值设置为zValue
                }
            }
            else
            {
                IZAware pZAware = (IZAware)geometry;
                pZAware.ZAware = false;
            }

            if (pGeometryDef.HasM)
            {
                IMAware pMAware = (IMAware)geometry;
                pMAware.MAware = true;
            }
            else
            {
                IMAware pMAware = (IMAware)geometry;
                pMAware.MAware = false;
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// Geometry中Z值和M值处理
        /// </summary>
        /// <params name="feature"></params>
        /// <params name="geometry"></params>
        /// <params name="zValue"></params>
        public static void HandleZMValue(IFeature feature, IGeometry geometry)
        {
            //先判断图层要素是否有Z值
            int index;

            index = feature.Fields.FindField(GIS_Const.FIELD_SHAPE);
            IGeometryDef pGeometryDef;

            pGeometryDef = feature.Fields.get_Field(index).GeometryDef as IGeometryDef;

            IPointCollection pPointCollection = geometry as IPointCollection;

            if (pGeometryDef.HasZ)
            {
                IZAware pZAware = (IZAware)geometry;
                pZAware.ZAware = true;
                if (geometry.Envelope.ZMax.ToString() == "非数字" || geometry.Envelope.ZMax.ToString() == "NaN")
                {
                    IZ iz1 = (IZ)geometry;
                    iz1.SetConstantZ(0);  //将Z值设置为0
                }
                //IPoint point = (IPoint)geometry;
                //point.Z = 0;
            }
            else
            {
                IZAware pZAware = (IZAware)geometry;
                pZAware.ZAware = false;
            }

            if (pGeometryDef.HasM)
            {
                IMAware pMAware = (IMAware)geometry;
                pMAware.MAware = true;
            }
            else
            {
                IMAware pMAware = (IMAware)geometry;
                pMAware.MAware = false;
            }
        }
Exemplo n.º 14
0
        public static IGeometry ModifyGeometryZMValue(IObjectClass featureClass, IGeometry modifiedGeometry)
        {
            IFeatureClass targetFeatureClass = featureClass as IFeatureClass;

            if (targetFeatureClass == null)
            {
                return(null);
            }
            string           shapeFieldName  = targetFeatureClass.ShapeFieldName;
            IFields          fields          = targetFeatureClass.Fields;
            int              geometryIndex   = fields.FindField(shapeFieldName);
            IField           field           = fields.get_Field(geometryIndex);
            IGeometryDef     geometryDef     = field.GeometryDef;
            IPointCollection pointCollection = modifiedGeometry as IPointCollection;

            if (geometryDef.HasZ)
            {
                IZAware zAware = modifiedGeometry as IZAware;
                zAware.ZAware = true;
                IZ iz = modifiedGeometry as IZ;
                //将Z值设置为0
                iz.SetConstantZ(0);
            }
            else
            {
                IZAware zAware = modifiedGeometry as IZAware;
                zAware.ZAware = false;
            }
            if (geometryDef.HasM)
            {
                IMAware mAware = modifiedGeometry as IMAware;
                mAware.MAware = true;
            }
            else
            {
                IMAware mAware = modifiedGeometry as IMAware;
                mAware.MAware = false;
            }

            return(modifiedGeometry);
        }
Exemplo n.º 15
0
        public static IGeometry ModifyGeomtryZMValue(IObjectClass featureClass, IGeometry modifiedGeo)
        {
            IFeatureClass trgFtCls = featureClass as IFeatureClass;

            if (trgFtCls == null)
            {
                return(null);
            }
            string           shapeFieldName   = trgFtCls.ShapeFieldName;
            IFields          fields           = trgFtCls.Fields;
            int              geometryIndex    = fields.FindField(shapeFieldName);
            IField           field            = fields.get_Field(geometryIndex);
            IGeometryDef     pGeometryDef     = field.GeometryDef;
            IPointCollection pPointCollection = modifiedGeo as IPointCollection;

            if (pGeometryDef.HasZ)
            {
                IZAware pZAware = modifiedGeo as IZAware;
                pZAware.ZAware = true;
                IZ iz1 = modifiedGeo as IZ;
                //将z值设置为0
                iz1.SetConstantZ(0);
            }
            else
            {
                IZAware pZAware = modifiedGeo as IZAware;
                pZAware.ZAware = false;
            }
            if (pGeometryDef.HasM)
            {
                IMAware pMAware = modifiedGeo as IMAware;
                pMAware.MAware = true;
            }
            else
            {
                IMAware pMAware = modifiedGeo as IMAware;
                pMAware.MAware = false;
            }
            return(modifiedGeo);
        }
Exemplo n.º 16
0
        /// <summary>
        /// 创建地理要素
        /// </summary>
        /// <param name="pGeom"></param>
        /// <param name="pMap"></param>
        /// <param name="pCurrentLayer"></param>
        public static void CreateFeature(IGeometry pGeom, IMap pMap, IFeatureClass pFeatureClass)
        {
            if (pGeom != null)
            {
                IDataset       pDataset;
                IWorkspaceEdit pWorkspaceEdit;

                if (pFeatureClass == null)
                {
                    return;
                }

                pDataset = (IDataset)pFeatureClass;

                pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;
                int          index = pFeatureClass.FindField(pFeatureClass.ShapeFieldName);
                IGeometryDef pGD   = pFeatureClass.Fields.get_Field(index).GeometryDef;
                if (pGD.HasZ)
                {
                    IZAware pZA = (IZAware)pGeom;
                    pZA.ZAware = true;
                    IZ     pZ = pGeom as IZ;
                    double zmin = -1000, zmax = 1000;
                    if (pGD.SpatialReference.HasZPrecision())
                    {
                        pGD.SpatialReference.GetZDomain(out zmin, out zmax);
                    }
                    if (pZ != null)
                    {
                        //pZ.SetConstantZ(zmin);
                        pZ.SetConstantZ(0);
                    }
                    else
                    {
                        IPoint p = (pGeom as IPoint);
                        if (p != null)
                        {
                            if (p.Z.ToString() == "非数字")
                            {
                                //p.Z = zmin;
                                p.Z = 0;
                            }
                        }
                    }
                }

                if (pGD.HasM)
                {
                    IMAware pMA = (IMAware)pGeom;
                    pMA.MAware = true;
                }

                if (!pWorkspaceEdit.IsBeingEdited())
                {
                    pWorkspaceEdit.StartEditing(true);
                    pWorkspaceEdit.StartEditOperation();
                }

                IFeature pFeature;
                pFeature = pFeatureClass.CreateFeature();

                try
                {
                    pFeature.Shape = pGeom;
                    pFeature.Store();
                }
                catch (System.Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                }

                if (pWorkspaceEdit.IsBeingEdited())
                {
                    pWorkspaceEdit.StopEditOperation();
                    pWorkspaceEdit.StopEditing(true);
                }

                pMap.ClearSelection();  //清除所有选择
            }
        }
Exemplo n.º 17
0
        /// <summary>
        /// 存储范围线
        /// </summary>
        /// <param name="geo"></param>
        /// <param name="strRegionName"></param>
        /// <param name="fc"></param>
        private void SaveFanWei(IGeometry geo, string strRegionName, IFeatureClass fc)
        {
            try
            {
                int      index1, index2, index3, index4;
                IFeature pFea;

                index1 = fc.FindField("REGIONNAME");
                index2 = fc.FindField("SMSCODE");
                index3 = fc.FindField("GEOOBJNUM");
                index4 = fc.FindField("Mark");

                //存储范围线
                pFea = fc.CreateFeature();
                pFea.set_Value(index1, strRegionName);
                pFea.set_Value(index2, "更新范围");
                pFea.set_Value(index3, "194013");
                pFea.set_Value(index4, "已导出,未导入更新");

                int          index = fc.FindField(fc.ShapeFieldName);
                IGeometryDef pGD   = fc.Fields.get_Field(index).GeometryDef;
                if (pGD.HasZ)
                {
                    IZAware pZA = geo as IZAware;
                    pZA.ZAware = true;
                    IZ     pZ = geo as IZ;
                    double zmin = -1000, zmax = 1000;
                    if (pGD.SpatialReference.HasZPrecision())
                    {
                        pGD.SpatialReference.GetZDomain(out zmin, out zmax);
                    }
                    if (pZ != null)
                    {
                        pZ.SetConstantZ(0);
                    }
                    else
                    {
                        IPoint p = geo as IPoint;
                        if (p != null)
                        {
                            if (p.Z.ToString() == "非数字")
                            {
                                p.Z = 0;
                            }
                        }
                    }
                }

                if (pGD.HasM)
                {
                    IMAware pMA = geo as IMAware;
                    pMA.MAware = true;
                }
                (geo as ITopologicalOperator).Simplify();
                pFea.Shape = geo as IGeometry;
                pFea.Store();
            }
            catch (System.Exception ex)
            {
            }
        }
Exemplo n.º 18
0
 public void CreateFeature(IGeometry igeometry_0)
 {
     try
     {
         if (igeometry_0 != null)
         {
             IFeatureLayer  featureLayer  = Yutai.ArcGIS.Common.Editor.Editor.CurrentEditTemplate.FeatureLayer;
             IDataset       dataset       = (IDataset)featureLayer.FeatureClass;
             IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)dataset.Workspace;
             int            index         = featureLayer.FeatureClass.FindField(featureLayer.FeatureClass.ShapeFieldName);
             IGeometryDef   geometryDef   = featureLayer.FeatureClass.Fields.get_Field(index).GeometryDef;
             if (geometryDef.HasZ)
             {
                 IZAware iZAware = (IZAware)igeometry_0;
                 iZAware.ZAware = true;
                 IZ     iZ = (IZ)igeometry_0;
                 double constantZ;
                 double num;
                 geometryDef.SpatialReference.GetZDomain(out constantZ, out num);
                 iZ.SetConstantZ(constantZ);
             }
             if (geometryDef.HasM)
             {
                 IMAware iMAware = (IMAware)igeometry_0;
                 iMAware.MAware = true;
             }
             workspaceEdit.StartEditOperation();
             IFeature feature = featureLayer.FeatureClass.CreateFeature();
             if (igeometry_0 is ITopologicalOperator)
             {
                 (igeometry_0 as ITopologicalOperator).Simplify();
             }
             feature.Shape = igeometry_0;
             try
             {
                 IRowSubtypes rowSubtypes = (IRowSubtypes)feature;
                 rowSubtypes.InitDefaultValues();
             }
             catch (Exception exception_)
             {
                 CErrorLog.writeErrorLog(this, exception_, "");
             }
             feature.Store();
             workspaceEdit.StopEditOperation();
             EditorEvent.AddFeature(featureLayer, feature);
             IActiveView activeView = (IActiveView)_context.FocusMap;
             _context.FocusMap.ClearSelection();
             _context.FocusMap.SelectFeature(featureLayer, feature);
             if (igeometry_0.GeometryType == esriGeometryType.esriGeometryPoint)
             {
                 double distance = Common.ConvertPixelsToMapUnits((IActiveView)_context.FocusMap, 30.0);
                 ITopologicalOperator topologicalOperator = (ITopologicalOperator)igeometry_0;
                 topologicalOperator.Buffer(distance);
                 activeView.Refresh();
             }
             else
             {
                 activeView.Refresh();
             }
         }
     }
     catch (COMException ex)
     {
         if (ex.ErrorCode == -2147220936)
         {
             System.Windows.Forms.MessageBox.Show("坐标值或量测值超出范围!", "创建要素",
                                                  System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Hand);
         }
     }
 }
Exemplo n.º 19
0
        /// <summary>
        /// 裁切一个几何对象,不需要传出
        /// </summary>
        /// <param name="shape"></param>
        /// <param name="geometryType"></param>
        /// <param name="ply"></param>
        /// <param name="geoObjNum"></param>
        /// <returns></returns>
        private bool ClipGeometry(ref IGeometry inGeometry, esriGeometryType geometryType, IPolygon clipPolygon, string GeoObjNum)
        {
            IPolycurve pPolyCurve;

            bool                 returnValue   = false;
            IGeometry            tempGeometry  = null;
            IGeometry            tempGeometry1 = null;
            ITopologicalOperator topologyOper  = clipPolygon as ITopologicalOperator;

            topologyOper.Simplify();
            IRelationalOperator relationOper = clipPolygon as IRelationalOperator;

            IZAware             zIn = inGeometry as IZAware;
            IMAware             mAware;
            IPoint              pPoint, pPoint1;
            IPointCollection    pPtC;
            ICurve              pCurve;
            IGeometryCollection pGeoC;
            bool HasM = true;

            IHitTest         pHitTest;
            double           dblHitDist   = 0;
            int              partIndex    = 0;
            int              segmentIndex = 0;
            bool             bRightSide   = true;
            IPoint           hitPoint     = new PointClass(); //返回击中位置
            IPath            pPath;
            IPointCollection pPointC;
            IPoint           P1, P2;

            switch (geometryType)
            {
            case esriGeometryType.esriGeometryPoint:
                //如果点包含在多边形中
                if (relationOper.Contains(inGeometry))
                {
                    //tempGeometry = inGeometry;
                    returnValue = true;
                }
                break;

            case esriGeometryType.esriGeometryPolyline:
                //'如果多义线穿越多边形或包含在多边形中
                if (relationOper.Contains(inGeometry))
                {
                    returnValue = true;
                    //tempGeometry = inGeometry;
                }
                else     //if(relationOper.Crosses(inGeometry))    2008.1.29 TianK 注释掉  解决了裁切丢数据的问题
                {
                    pPolyCurve = inGeometry as IPolycurve;
                    pPolyCurve.Generalize(0.03);

                    if (DIRECTIONLINE.IndexOf(GeoObjNum) != -1)         //如果是有方向的线性地物
                    {
                        pHitTest = (IHitTest)inGeometry;

                        mAware = inGeometry as IMAware;                       ////2008.1.27TianK 修改 确保裁切后的线不反向
                        if (mAware.MAware == true)
                        {
                            HasM = true;
                            pPtC = inGeometry as IPointCollection;
                            for (int i = 0; i < pPtC.PointCount; i++)
                            {
                                pPoint   = pPtC.get_Point(i);
                                pPoint.M = i;
                                pPtC.UpdatePoint(i, pPoint);
                            }
                        }
                        else
                        {
                            HasM          = false;
                            mAware.MAware = true;
                            pPtC          = inGeometry as IPointCollection;
                            for (int i = 0; i < pPtC.PointCount; i++)
                            {
                                pPoint   = pPtC.get_Point(i);
                                pPoint.M = i;
                                pPtC.UpdatePoint(i, pPoint);
                            }
                        }
                        tempGeometry1 = topologyOper.Intersect(inGeometry, esriGeometryDimension.esriGeometry1Dimension);
                        tempGeometry  = (inGeometry as ITopologicalOperator).Difference(tempGeometry1);
                        ////2008.1.27TianK 修改 确保裁切后的线不反向
                        mAware        = tempGeometry as IMAware;
                        mAware.MAware = true;
                        pGeoC         = tempGeometry as IGeometryCollection;
                        for (int j = 0; j < pGeoC.GeometryCount; j++)
                        {
                            pPtC    = pGeoC.get_Geometry(j) as IPointCollection;
                            pPoint  = pPtC.get_Point(0);
                            pPoint1 = pPtC.get_Point(pPtC.PointCount - 1);
                            if (double.IsNaN(pPoint.M))
                            {
                                if (pHitTest.HitTest(pPoint, 0.01, esriGeometryHitPartType.esriGeometryPartBoundary,
                                                     hitPoint, ref dblHitDist, ref partIndex, ref segmentIndex, ref bRightSide)) //如果击中该要素
                                {
                                    pPath   = (IPath)(inGeometry as IGeometryCollection).get_Geometry(partIndex);
                                    pPointC = (IPointCollection)pPath;    //接口跳转

                                    P1 = pPointC.get_Point(segmentIndex);
                                    P2 = pPointC.get_Point(segmentIndex + 1);
                                    AddM_P1_P2(P1, P2, ref pPoint);
                                    pPtC.UpdatePoint(0, pPoint);
                                }
                            }
                            if (double.IsNaN(pPoint1.M))
                            {
                                if (pHitTest.HitTest(pPoint1, 0.01, esriGeometryHitPartType.esriGeometryPartBoundary,
                                                     hitPoint, ref dblHitDist, ref partIndex, ref segmentIndex, ref bRightSide)) //如果击中该要素
                                {
                                    pPath   = (IPath)(inGeometry as IGeometryCollection).get_Geometry(partIndex);
                                    pPointC = (IPointCollection)pPath;    //接口跳转

                                    P1 = pPointC.get_Point(segmentIndex);
                                    P2 = pPointC.get_Point(segmentIndex + 1);
                                    AddM_P1_P2(P1, P2, ref pPoint1);
                                    pPtC.UpdatePoint(pPtC.PointCount - 1, pPoint1);
                                }
                            }
                            pPoint  = pPtC.get_Point(0);
                            pPoint1 = pPtC.get_Point(pPtC.PointCount - 1);
                            if (pPoint.M >= pPoint1.M)
                            {
                                pCurve = pGeoC.get_Geometry(j) as ICurve;
                                pCurve.ReverseOrientation();
                            }
                            if (HasM)
                            {
                                for (int i = 0; i < pPtC.PointCount; i++)
                                {
                                    pPoint   = pPtC.get_Point(i);
                                    pPoint.M = 0;
                                    pPtC.UpdatePoint(i, pPoint);
                                }
                            }
                            else
                            {
                                mAware.MAware = false;
                            }
                        }
                    }
                    else
                    {
                        int    i;
                        IPoint p;
                        tempGeometry1 = topologyOper.Intersect(inGeometry, esriGeometryDimension.esriGeometry1Dimension);
                        tempGeometry  = (inGeometry as ITopologicalOperator).Difference(tempGeometry1);
                    }

                    if (zIn.ZAware)
                    {
                        IZAware zOut = tempGeometry as IZAware;
                        zOut.ZAware = zIn.ZAware;

                        IZ iz = tempGeometry as IZ;
                        try
                        {
                            iz.CalculateNonSimpleZs();
                        }
                        catch
                        {
                            //该值应该传入,表示如果栽得的线如果不能插值出Z值赋一个默认值,或再次计算
                            //可以根据inGeometry计算
                            iz.SetConstantZ(0);
                        }
                    }
                }
                break;

            case esriGeometryType.esriGeometryMultipoint:
            case esriGeometryType.esriGeometryPolygon:
                //如果多边形与裁剪多边形相交或在裁剪多边形中
                if (relationOper.Contains(inGeometry))
                {
                    //tempGeometry = inGeometry;
                    returnValue = true;
                }
                else     //if( relationOper.Overlaps(inGeometry))     2008.1.29 TianK 注释掉
                {
                    pPolyCurve = inGeometry as IPolycurve;
                    pPolyCurve.Generalize(0.03);
                    tempGeometry1 = topologyOper.Intersect(inGeometry, esriGeometryDimension.esriGeometry2Dimension);
                    tempGeometry  = (inGeometry as ITopologicalOperator).Difference(tempGeometry1);

                    if (zIn.ZAware)
                    {
                        IZAware zOut = tempGeometry as IZAware;
                        zOut.ZAware = zIn.ZAware;
                        IZ iz = tempGeometry as IZ;
                        try
                        {
                            iz.CalculateNonSimpleZs();
                        }
                        catch
                        {
                            //该值应该传入,表示如果栽得的线如果不能插值出Z值赋一个默认值,或再次计算
                            //可以根据inGeometry计算
                            iz.SetConstantZ(0);
                        }
                    }
                }
                break;
            }
            if (tempGeometry != null && !tempGeometry.IsEmpty)
            {
                inGeometry = tempGeometry;
            }
            return(returnValue);
        }
Exemplo n.º 20
0
        public static void CreateFeature(IGeometry pGeometry, IActiveView pActiveView, IFeatureLayer pFeatureLayer,
                                         bool IsClearSelection)
        {
            double    num;
            double    num1;
            Exception exception;

            if (pGeometry != null && !pGeometry.IsEmpty)
            {
                IEnvelope envelope = pGeometry.Envelope;
                envelope.Expand(10, 10, false);
                try
                {
                    pGeometry.SpatialReference = pActiveView.FocusMap.SpatialReference;
                    int          num2        = pFeatureLayer.FeatureClass.FindField(pFeatureLayer.FeatureClass.ShapeFieldName);
                    IGeometryDef geometryDef = pFeatureLayer.FeatureClass.Fields.Field[num2].GeometryDef;
                    if (geometryDef.HasZ)
                    {
                        ((IZAware)pGeometry).ZAware = true;
                        if (pGeometry is IZ)
                        {
                            IZ igeometry0 = (IZ)pGeometry;
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            igeometry0.SetConstantZ(num);
                        }
                        else if (pGeometry is IPoint)
                        {
                            geometryDef.SpatialReference.GetZDomain(out num, out num1);
                            (pGeometry as IPoint).Z = num;
                        }
                    }
                    if (geometryDef.HasM)
                    {
                        ((IMAware)pGeometry).MAware = true;
                    }
                    IWorkspaceEdit workspace = (IWorkspaceEdit)((IDataset)pFeatureLayer.FeatureClass).Workspace;
                    workspace.StartEditOperation();
                    IFeature feature = pFeatureLayer.FeatureClass.CreateFeature();
                    feature.Shape = pGeometry;
                    try
                    {
                        ((IRowSubtypes)feature).InitDefaultValues();
                    }
                    catch (Exception exception1)
                    {
                        exception = exception1;
                        Logger.Current.Error(exception.Message);
                    }
                    if (Editor.CurrentEditTemplate != null)
                    {
                        Editor.CurrentEditTemplate.SetFeatureValue(feature);
                    }
                    EditorEvent.NewRow(feature);
                    feature.Store();
                    workspace.StopEditOperation();
                    EditorEvent.AfterNewRow(feature);
                    if (IsClearSelection)
                    {
                        if (pActiveView.FocusMap.SelectionCount > 0)
                        {
                            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
                            pActiveView.FocusMap.ClearSelection();
                            pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
                        }
                    }
                    pActiveView.FocusMap.SelectFeature(pFeatureLayer, feature);
                    if (pGeometry.GeometryType != esriGeometryType.esriGeometryPoint)
                    {
                        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, envelope);
                    }
                    else
                    {
                        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, envelope);
                    }
                    if (pFeatureLayer.FeatureClass.ShapeType == esriGeometryType.esriGeometryPoint)
                    {
                        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, envelope);
                    }
                }
                catch (COMException cOMException1)
                {
                    COMException cOMException = cOMException1;
                    if (cOMException.ErrorCode != -2147220936)
                    {
                        MessageBox.Show(cOMException.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    }
                    else
                    {
                        MessageBox.Show("几何坐标超出边界!", "", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    }
                    if (pGeometry.GeometryType != esriGeometryType.esriGeometryPoint)
                    {
                        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, envelope);
                    }
                    else
                    {
                        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, null);
                    }
                    Logger.Current.Error("", cOMException, null);
                }
                catch (Exception exception2)
                {
                    exception = exception2;
                    Logger.Current.Error("", exception, null);
                    if (pGeometry.GeometryType != esriGeometryType.esriGeometryPoint)
                    {
                        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, envelope);
                    }
                    else
                    {
                        pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pFeatureLayer, null);
                    }
                    MessageBox.Show(exception.Message);
                }
            }
        }
Exemplo n.º 21
0
        //合并要素
        private void UnionFeatures(IEnumFeature selectedFeatures, IFeature pMergeFeature)
        {
            try
            {
                IFeature feature = null;
                object   missing = Type.Missing;
                selectedFeatures.Reset();
                feature = selectedFeatures.Next();
                if (feature == null)
                {
                    return;
                }
                IFeatureClass featureClass = feature.Class as IFeatureClass;
                switch (featureClass.ShapeType)
                {
                case esriGeometryType.esriGeometryPolyline:
                case esriGeometryType.esriGeometryPolygon:
                    break;

                default:
                    MessageBox.Show("请选择线或者面要素", "提示");
                    return;
                }
                IGeometryCollection geometries    = new GeometryBagClass();
                IDataset            dataset       = featureClass as IDataset;
                IWorkspaceEdit      workspaceEdit = dataset.Workspace as IWorkspaceEdit;
                while (feature != null)
                {
                    if (!feature.ShapeCopy.IsEmpty)
                    {
                        IGeometry           pGeometry           = feature.ShapeCopy;
                        IGeometryCollection pGeometryCollection = pGeometry as IGeometryCollection;
                        int geomCount = pGeometryCollection.GeometryCount;
                        if (geomCount > 1)
                        {
                            for (int k = 0; k < geomCount; k++)
                            {
                                IFeature     newFeature  = (feature.Class as IFeatureClass).CreateFeature();
                                IFeatureEdit featureEdit = feature as IFeatureEdit;
                                featureEdit.SplitAttributes(newFeature);
                                IGeometry newGeom = pGeometryCollection.Geometry[k];
                                if (feature.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolygon)
                                {
                                    IGeometryCollection polyGonC = new PolygonClass();
                                    polyGonC.AddGeometry(newGeom as IGeometry);
                                    IGeometry pGeoNew2 = polyGonC as IGeometry;
                                    pGeoNew2.SpatialReference = feature.ShapeCopy.SpatialReference;
                                    int          index        = feature.Fields.FindField("Shape");
                                    IGeometryDef pGeometryDef = pGeometryDef = feature.Fields.get_Field(index).GeometryDef as IGeometryDef;
                                    if (pGeometryDef.HasZ)
                                    {
                                        IZAware pZAware = (IZAware)pGeoNew2;
                                        pZAware.ZAware = true;
                                        IZ iz1 = (IZ)pGeoNew2;
                                        iz1.SetConstantZ(0);   //将Z值设置为0
                                    }
                                    else
                                    {
                                        IZAware pZAware = (IZAware)pGeoNew2;
                                        pZAware.ZAware = false;
                                    }
                                    if (pGeometryDef.HasM)
                                    {
                                        IMAware pMAware = (IMAware)pGeoNew2;
                                        pMAware.MAware = true;
                                    }
                                    else
                                    {
                                        IMAware pMAware = (IMAware)pGeoNew2;
                                        pMAware.MAware = false;
                                    }
                                    newFeature.Shape = pGeoNew2;
                                }
                                if (feature.ShapeCopy.GeometryType == esriGeometryType.esriGeometryPolyline)
                                {
                                    IGeometryCollection polyGonC = new PolylineClass();
                                    polyGonC.AddGeometry(newGeom as IGeometry);
                                    IGeometry pGeoNew2 = polyGonC as IGeometry;
                                    pGeoNew2.SpatialReference = feature.ShapeCopy.SpatialReference;
                                    int          index        = feature.Fields.FindField("Shape");
                                    IGeometryDef pGeometryDef = pGeometryDef = feature.Fields.get_Field(index).GeometryDef as IGeometryDef;
                                    if (pGeometryDef.HasZ)
                                    {
                                        IZAware pZAware = (IZAware)pGeoNew2;
                                        pZAware.ZAware = true;
                                        IZ iz1 = (IZ)pGeoNew2;
                                        iz1.SetConstantZ(0);   //将Z值设置为0
                                    }
                                    else
                                    {
                                        IZAware pZAware = (IZAware)pGeoNew2;
                                        pZAware.ZAware = false;
                                    }
                                    if (pGeometryDef.HasM)
                                    {
                                        IMAware pMAware = (IMAware)pGeoNew2;
                                        pMAware.MAware = true;
                                    }
                                    else
                                    {
                                        IMAware pMAware = (IMAware)pGeoNew2;
                                        pMAware.MAware = false;
                                    }
                                    newFeature.Shape = pGeoNew2;
                                }
                                newFeature.Store();
                            }
                            feature.Delete();
                        }
                    }
                    feature = selectedFeatures.Next();
                }
                workspaceEdit.StopEditOperation();
                selectedFeatures.Reset();
                //如果没有IWorkspaceEdit则无法进行撤销重做操作
            }
            catch (Exception ex)
            {
                //SysLogHelper.WriteOperationLog("要素合并错误", ex.Source, "数据编辑");
                MessageBox.Show(ex.Message);
            }
        }