AE代码 积累

  1         /// <summary>
  2         /// 计算两点角度
  3         /// </summary>
  4         /// <param name="p1">original point</param>
  5         /// <param name="p2">end point</param>
  6         /// <returns></returns>
  7         private float Angle(IPoint p1, IPoint p2)
  8         {
  9             double tan = Math.Atan(Math.Abs((p2.Y - p1.Y) / (p2.X - p1.X))) * 180 / Math.PI;
 10             if (p2.X > p1.X && p2.Y > p1.Y) //第一象限
 11                 return -(float.Parse(tan.ToString()));
 12             else if (p2.X > p1.X && p2.Y > p1.Y) //第二象限
 13                 return float.Parse(tan.ToString());
 14             else if (p2.X < p1.X && p2.Y > p1.Y) //第三象限
 15                 return float.Parse(tan.ToString()) - 180;
 16             else //第四象限
 17                 return 180-float.Parse(tan.ToString());                
 18         }
 19         
 20         /// <summary>
 21         /// 获取面图层的质心<IPoint>
 22         /// </summary>
 23         /// <param name="pFeatureLayer">面图层</param>
 24         /// <returns>List<></returns>
 25         private List<pointofpolygon> Get_PointFromPolygon(IFeatureLayer pFeatureLayer)
 26         {
 27             ESRI.ArcGIS.Geodatabase.IQueryFilter pQueryFilter = new ESRI.ArcGIS.Geodatabase.QueryFilterClass();
 28             pQueryFilter.WhereClause = "FID IS NOT null";
 29             IArea pArea;
 30             List<pointofpolygon> pts=new List<pointofpolygon>();
 31             //MessageBox.Show(pFeatureLayer.FeatureClass.FeatureCount(pQueryFilter).ToString());
 32             for (int i = 0; i < pFeatureLayer.FeatureClass.FeatureCount(pQueryFilter); i++)
 33             {
 34                 pArea = pFeatureLayer.FeatureClass.GetFeature(i).Shape as IArea;
 35                 pts.Insert(i, new pointofpolygon(pFeatureLayer.FeatureClass.GetFeature(i).OID, pArea.Centroid));
 36             }
 37             return pts;
 38         }
 39 
 40         /// <summary>
 41         /// 计算p1点相对p2点的角度,整栋方向为0度
 42         /// </summary>
 43         /// <param name="p1">polyline上的点</param>
 44         /// <param name="p2">original point,面的重心</param>
 45         /// <returns></returns>
 46         private float Get_Angle(IPoint p1, IPoint p2)
 47         {
 48             if (p1.X == p2.X && p1.Y == p2.Y)
 49                 return -1;
 50             IPoint p3=new PointClass();
 51             p3.Y=p2.Y;
 52             p3.X=p2.X+10;
 53             float c = (float)Math.Sqrt(Math.Pow((p1.X - p2.X), 2) + Math.Pow(p1.Y - p2.Y, 2)) * 
 54                 (float)Math.Sqrt(Math.Pow(p3.X - p2.X, 2) + Math.Pow(p3.Y - p2.Y, 2));
 55             if (c == 0) return -1;
 56             float angle = (float)Math.Acos(((p1.X - p2.X) * (p3.X - p2.X) + (p1.Y - p2.Y) * (p3.Y - p2.Y)) / c);
 57             return angle;
 58         }
 59 
 60         /// <summary>
 61         /// 清空属性表中需要计算的字段的值
 62         /// </summary>
 63         /// <param name="pFLyr">输入图层</param>
 64         private void ClearAttributeTable(IFeatureLayer pFLyr)
 65         {
 66             IDataset dataset = (IDataset)pFLyr.FeatureClass;
 67             IWorkspace workspace = dataset.Workspace;
 68             IWorkspaceEdit workspaceedit = (IWorkspaceEdit)workspace;
 69             workspaceedit.StartEditing(true);
 70             workspaceedit.StartEditOperation();
 71             for (int i = 0; i < pFLyr.FeatureClass.FeatureCount(new QueryFilter()); i++)
 72             {
 73                 IFeature pFeature = FlyrtoF(pFLyr, i);
 74                 pFeature.set_Value(pFeature.Fields.FindField("inner"),null);
 75                 pFeature.set_Value(pFeature.Fields.FindField("near"), null);
 76                 pFeature.set_Value(pFeature.Fields.FindField("far"), null);
 77                 pFeature.set_Value(pFeature.Fields.FindField("direction"), null);
 78                 pFeature.set_Value(pFeature.Fields.FindField("sum"), null);
 79                 pFeature.Store();
 80             }
 81             workspaceedit.StopEditing(true);
 82             workspaceedit.StopEditOperation();
 83         }
 84 
 85         /// <summary>
 86         /// 创建内存中的FeatureClass
 87         /// </summary>
 88         /// <param name="point"></param>
 89         public void CreateFeatureClassInMemory(IPoint point)
 90         {
 91             IWorkspaceFactory pWorkspaceFactory = new InMemoryWorkspaceFactoryClass();
 92             IWorkspaceName pWorkspaceName = pWorkspaceFactory.Create("", "pWorkspace", null, 0);
 93             IName pName = (IName)pWorkspaceName;
 94             IWorkspace pWorkspace = (IWorkspace)pName.Open();
 95             IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
 96             IFields pFields = new FieldsClass();
 97             IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
 98             IField pField = new FieldClass();
 99             IFieldEdit pFieldEdit = pField as IFieldEdit;
100             pFieldEdit.Name_2 = "SHAPE";
101             pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
102             IGeometryDef pGeometryDef = new GeometryDefClass();
103             IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
104             pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;
105             //为FeatureClass赋参考系,不写会出错***************************************
106             ISpatialReferenceFactory pSpatialReferenceFactory = new SpatialReferenceEnvironmentClass();
107             ISpatialReference pSpatialReference = pSpatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
108             pGeometryDefEdit.SpatialReference_2 = pSpatialReference;
109             //************************************************************************
110             pFieldEdit.GeometryDef_2 = pGeometryDef;
111             pFieldsEdit.AddField(pField);
112             pField = new FieldClass();//不要省略写!容易出问题
113             //pFieldEdit = pField as IFieldEdit;
114             //pFieldEdit.AliasName_2 = "高程";
115             //pFieldEdit.Name_2 = "elevation";
116             //pFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
117             pFieldsEdit.AddField(pField);
118             IFeatureClass pFeatureClass = pFeatureWorkspace.CreateFeatureClass("1", pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
119 
120             //插入到新建的FeatureClass中
121             IWorkspaceEdit pWorkspaceEdit = pWorkspace as IWorkspaceEdit;
122             pWorkspaceEdit.StartEditing(true);
123             pWorkspaceEdit.StartEditOperation();
124             IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer();
125             IFeatureCursor pFeatureCursor = pFeatureClass.Insert(true);
126             pFeatureBuffer.Shape = point;
127             pFeatureCursor.InsertFeature(pFeatureBuffer);
128             
129             pFeatureCursor.Flush();
130             pWorkspaceEdit.StopEditOperation();
131             pWorkspaceEdit.StopEditing(true);
132 
133             pFCInMemory = pFeatureClass;
134         }
135 
136         /// <summary>
137         /// 计算pt是否在point的可视范围中
138         /// </summary>
139         /// <param name="pRasterLayer">dem</param>
140         /// <param name="point">polyline转的点</param>
141         /// <param name="pt">polygon转的点</param>
142         /// <returns>返回值为1或者0,1为可视,0为不可视</returns>
143         private bool CalViewshed(IRasterLayer pRasterLayer, IPoint point, IPoint pt)
144         {
145             //获取两个点的高程
146             IRasterSurface pRasterSurface = new RasterSurfaceClass();
147             pRasterSurface.PutRaster(pRasterLayer.Raster, 0);
148             ISurface pSurface = pRasterSurface as ISurface;
149             double elv_point = pSurface.GetElevation(point);
150             point.Z = elv_point;
151             double elv_pt = pSurface.GetElevation(pt);
152             pt.Z = elv_pt;
153             //IPolyline pPolyline = AxMapC.TrackLine() as IPolyline;
154             IPoint pPoint = null;
155             Boolean pBool = true;
156             IPolyline pVPolyline = null;
157             IPolyline pInPolyline = null;
158             object pRef = 0.13;
159             pSurface.GetLineOfSight(point, pt, out pPoint, out pVPolyline, out pInPolyline, out pBool, false, false, ref pRef);
160             //如果pt在pVPolyline上,则可视;否则不可视
161             return pBool;
162         }
163 
164         /// <summary>
165         /// 计算点所在栅格的值
166         /// </summary>
167         /// <param name="point"></param>
168         /// <param name="rasterlayer">栅格</param>
169         /// <returns>返回栅格值</returns>
170         private int GetPointInRasterValue(IPoint point, IRasterLayer rasterlayer)
171         {
172             //第一种方法
173             object obj=null;
174             IRasterProps rasterprops = (IRasterProps)rasterlayer.Raster;
175             long dHeight = rasterprops.Height;
176             long dWidth = rasterprops.Width;
177             double dx = rasterprops.MeanCellSize().X;
178             double dy = rasterprops.MeanCellSize().Y;
179             rstPixelType pixelType = rasterprops.PixelType;
180             IPnt pnt = new PntClass();
181             pnt.SetCoords(dx,dy);
182             IPixelBlock pixelBlock = rasterlayer.Raster.CreatePixelBlock(pnt);
183             IPnt pnt1 = new PntClass();
184             double xx = rasterprops.Extent.XMin;
185             double yy = rasterprops.Extent.YMax;
186             int row = (int)Math.Abs((yy - point.Y) / dx)+1;
187             int col = (int)Math.Abs((xx - point.X) / dy)+1;
188             pnt1.SetCoords(row,col);
189             rasterlayer.Raster.Read(pnt1, pixelBlock); ;
190             if (pixelBlock != null)
191             {
192                 obj = pixelBlock.GetVal(0, 0, 0);
193             }
194             if (obj != null)
195                 return (int)obj;
196             else return -1;
197             //第二种方法
198             IRasterSurface pRasterSurface=new RasterSurfaceClass();
199             pRasterSurface.PutRaster(rasterlayer.Raster,0);
200             ISurface pSurface=pRasterSurface as ISurface;
201             double elv = pSurface.GetElevation(point);
202         }
203 
204         /// <summary>
205         /// IRasterLayer类型转换成IGeoDataset
206         /// </summary>
207         /// <param name="pRasterLyr">输入DEM图层</param>
208         /// <returns>pSurfaceOP.Visibility的第一个参数</returns>
209         private IGeoDataset GetGeoDatasetFromLayer(IRasterLayer pRasterLyr)
210         {
211             IRaster pRaster = pRasterLyr.Raster;
212             IRasterBandCollection pRasterBandCollection = pRaster as IRasterBandCollection;
213             IRasterBand pRasterBand = pRasterBandCollection.Item(0);
214             IRasterDataset pRasterDataset = pRasterBand as IRasterDataset;
215             return pRasterDataset as IGeoDataset;
216         }
217 
218         /// <summary>
219         /// IgeoDataset转换成IRasterLayer
220         /// </summary>
221         /// <param name="geodataset"></param>
222         /// <returns></returns>
223         private IRasterLayer GetRasterLayerFromGeoDataset(IGeoDataset geodataset)
224         {
225             IRasterLayer pRasterLayer = new RasterLayerClass();
226             pRasterLayer.CreateFromDataset(geodataset as IRasterDataset);
227             return pRasterLayer;
228         }
229 
230         /// <summary>
231         /// FeatureLayer To FeatureClass
232         /// </summary>
233         /// <param name="pFeatureLyr"></param>
234         /// <returns></returns>
235         private IFeatureClass FLyrToFC(IFeatureLayer pFeatureLyr)
236         {
237             return pFeatureLyr.FeatureClass;
238         }
239         /// <summary>
240         /// FeatureLayer To Feature
241         /// </summary>
242         /// <param name="pFeatureLyr"></param>
243         /// <param name="index"></param>
244         /// <returns></returns>
245         private IFeature FlyrtoF(IFeatureLayer pFeatureLyr,int index)
246         {
247             IFeatureClass pFeatureClass=FLyrToFC(pFeatureLyr);
248             return pFeatureClass.GetFeature(index);
249         }
250 
251         /// <summary>
252         /// 编辑属性表
253         /// </summary>
254         /// <param name="pt_polyline">多条polyline上的节点</param>
255         /// <param name="pt_polygon">polygon的质心</param>
256         /// <param name="pFeatureLyr">polygo Layer</param>
257         private void Calulatation(List<List<IPoint>> pt_polyline,List<pointofpolygon> pt_polygon, IFeatureLayer pFeatureLyr)
258         {
259             //使图层处于编辑状态
260             IDataset dataset = (IDataset)pFeatureLyr.FeatureClass;
261             IWorkspace workspace = dataset.Workspace;
262             IWorkspaceEdit workspaceedit = (IWorkspaceEdit)workspace;
263             workspaceedit.StartEditing(true);
264             workspaceedit.StartEditOperation();
265             IFeature feature;
266             float dir = 0, buf = 0;
267             int direction=0;
268 
269             //修改某一记录某一字段的
270             feature.set_Value(feature.Fields.FindField("direction"), (float)feature.get_Value(feature.Fields.FindField("far")) + 0); 
271             feature.Store();
272             //关闭要素的编辑状态
273             workspaceedit.StopEditing(true);
274             workspaceedit.StopEditOperation();
275         }

 

posted @ 2015-01-18 14:42  xiaominmin54  阅读(1055)  评论(0编辑  收藏  举报