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 }