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); } }
/// <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); }
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); } }
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; } }
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); } }
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); } }
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); }
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); } } }
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"); } }
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); }
/// <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; } }
/// <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; } }
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); }
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); }
/// <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(); //清除所有选择 } }
/// <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) { } }
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); } } }
/// <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); }
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); } } }
//合并要素 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); } }