public static double get_polygon_vertices(IPolygon polygon) { double vertices = 0; if (polygon != null) { polygon.SnapToSpatialReference(); double x = 0; double y = 0; IPoint pt; int partIndx; int vertxIndx; IPointCollection pt_cl = polygon as IPointCollection; IEnumVertex2 en = pt_cl.EnumVertices as IEnumVertex2; en.Reset(); en.Next(out pt, out partIndx, out vertxIndx); while (pt != null) { x = x + pt.X - 130000; y = y + pt.Y - 373600; vertices = x + y; en.Next(out pt, out partIndx, out vertxIndx); } } return(vertices); }
private void btnRun_Click(object sender, EventArgs e) { frmProgress pfrmProgress = new frmProgress(); pfrmProgress.Show(); pfrmProgress.lblStatus.Text = "Collecting Information"; int intProgress = 0; pfrmProgress.bgWorker.ReportProgress(intProgress); //Get Sample Table setting string strTableName = txtSampleTable.Text; if (strTableName == "") { return; } string strSourceFolder = System.IO.Path.GetDirectoryName(strTableName); string strSourceFile = System.IO.Path.GetFileName(strTableName); IWorkspaceFactory workspaceFactory = new ShapefileWorkspaceFactory(); IWorkspace workspace = workspaceFactory.OpenFromFile(strSourceFolder, 0); IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace; IFeatureClass pFClass = featureWorkspace.OpenFeatureClass(strSourceFile); //string strXNewFld = "NewRefX"; string strXNewFld = "NewRefX1"; int intXNewFldIdx = pFClass.FindField(strXNewFld); if (intXNewFldIdx == -1) { AddFld(pFClass, strXNewFld, esriFieldType.esriFieldTypeDouble); intXNewFldIdx = pFClass.FindField(strXNewFld); } //string strYNewFld = "NewRefY"; string strYNewFld = "NewRefY1"; int intYNewFldIdx = pFClass.FindField(strYNewFld); if (intYNewFldIdx == -1) { AddFld(pFClass, strYNewFld, esriFieldType.esriFieldTypeDouble); intYNewFldIdx = pFClass.FindField(strYNewFld); } string strFlagFld = "Flag"; int intFlagFldIdx = pFClass.FindField(strFlagFld); if (intFlagFldIdx == -1) { AddFld(pFClass, strFlagFld, esriFieldType.esriFieldTypeSmallInteger); intFlagFldIdx = pFClass.FindField(strFlagFld); } //Get Reference Street file string strRefStreet = txtRefStreet.Text; if (strRefStreet == "") { return; } string strRefSource = System.IO.Path.GetDirectoryName(strRefStreet); string strRefName = System.IO.Path.GetFileName(strRefStreet); IWorkspace pwsRef = workspaceFactory.OpenFromFile(strRefSource, 0); IFeatureWorkspace pfwsRef = pwsRef as IFeatureWorkspace; IFeatureClass pRefFClass = pfwsRef.OpenFeatureClass(strRefName); //Get Reference Street File //string[] addFldNames = new string[] { "JOINID", "Length", "RLMean", "LLMean", "CompassA", "DirMean", "AveX", "AveY", "AveLen" }; List <RefStreetVertices> lstRefStreetInfo = new List <RefStreetVertices>(); //RefStreetInfo pRefStreetInfo = new RefStreetInfo(); //int intInforCnt = addFldNames.Length; //int[] intInfoIdxs = new int[intInforCnt]; //for (int i = 0; i < intInforCnt; i++) // intInfoIdxs[i] = pRefFClass.FindField(addFldNames[i]); int intJoinIDIdx = pRefFClass.FindField("JOINID"); //int intRefStreetCnt = pRefFClass.FeatureCount(null); IFeatureCursor pRefFCursor = pRefFClass.Search(null, false); IFeature pRefFeature = pRefFCursor.NextFeature(); while (pRefFeature != null) { RefStreetVertices pRefStreetInfo = new RefStreetVertices(); pRefStreetInfo.JoinID = pRefFeature.get_Value(intJoinIDIdx).ToString(); IPolyline pPolyLine = (IPolyline)pRefFeature.ShapeCopy; IPointCollection pPointCollection = (IPointCollection)pPolyLine; pRefStreetInfo.pointCollection = pPointCollection; lstRefStreetInfo.Add(pRefStreetInfo); pRefFeature = pRefFCursor.NextFeature(); } int intRefXIdx = pFClass.FindField(cboXRef.Text); int intRefYIdx = pFClass.FindField(cboYRef.Text); string strRefID = "Ref_ID"; int intRefIDIdx = pFClass.FindField(strRefID); IQueryFilter pQFilter = new QueryFilterClass(); //pQFilter.WhereClause = "Status = 'M'"; pQFilter.WhereClause = "Score > 0"; IFeatureCursor pFCursor = pFClass.Update(pQFilter, true); IFeature pFeature = pFCursor.NextFeature(); int intFlag = 0; while (pFeature != null) { intFlag = 0; TargetPoint p = new TargetPoint(); p.x = Convert.ToDouble(pFeature.get_Value(intRefXIdx)); p.y = Convert.ToDouble(pFeature.get_Value(intRefYIdx)); string strJoinID = pFeature.get_Value(intRefIDIdx).ToString(); RefStreetVertices pRefStreetVertices = lstRefStreetInfo.Find(x => x.JoinID == strJoinID); int intVerticeCnt = pRefStreetVertices.pointCollection.PointCount; List <VerticesDist> lstVerDist = new List <VerticesDist>(); IEnumVertex2 pEnumVertex = pRefStreetVertices.pointCollection.EnumVertices as IEnumVertex2; pEnumVertex.Reset(); //Get the next vertex IPoint outVertex; int partIndex; int vertexIndex; pEnumVertex.Next(out outVertex, out partIndex, out vertexIndex); while (outVertex != null) { VerticesDist pVerDist = new VerticesDist(); pVerDist.x = outVertex.X; pVerDist.y = outVertex.Y; pVerDist.ID = vertexIndex; pVerDist.Distance = GetDistance(p.x, p.y, pVerDist.x, pVerDist.y); lstVerDist.Add(pVerDist); pEnumVertex.Next(out outVertex, out partIndex, out vertexIndex); } int intMinDistIdx = lstVerDist.FindIndex(x => x.Distance == lstVerDist.Min(t => t.Distance)); TargetPoint l1 = new TargetPoint(); l1.x = lstVerDist[intMinDistIdx].x; l1.y = lstVerDist[intMinDistIdx].y; TargetPoint l2 = new TargetPoint(); TargetPoint pMovedRefPoint = new TargetPoint(); int intSecondMinDistIdx = 0; if (intMinDistIdx == 0) { intSecondMinDistIdx = intMinDistIdx + 1; l2.x = lstVerDist[intSecondMinDistIdx].x; l2.y = lstVerDist[intSecondMinDistIdx].y; pMovedRefPoint = GetMovedReferencePoint(p, l1, l2); } else if (intMinDistIdx == lstVerDist.Count - 1) { intSecondMinDistIdx = intMinDistIdx - 1; l2.x = lstVerDist[intSecondMinDistIdx].x; l2.y = lstVerDist[intSecondMinDistIdx].y; pMovedRefPoint = GetMovedReferencePoint(p, l1, l2); } else { TargetPoint pCandPt1 = new TargetPoint(); TargetPoint pCandPt2 = new TargetPoint(); intSecondMinDistIdx = intMinDistIdx - 1; l2.x = lstVerDist[intSecondMinDistIdx].x; l2.y = lstVerDist[intSecondMinDistIdx].y; pCandPt1 = GetMovedReferencePoint(p, l1, l2); intSecondMinDistIdx = intMinDistIdx + 1; l2.x = lstVerDist[intSecondMinDistIdx].x; l2.y = lstVerDist[intSecondMinDistIdx].y; if (pCandPt1 == null) { pMovedRefPoint = GetMovedReferencePoint(p, l1, l2); } else { pCandPt2 = GetMovedReferencePoint(p, l1, l2); if (pCandPt2 != null) { double distToCPt1 = GetDistance(p.x, p.y, pCandPt1.x, pCandPt1.y); double distToCPt2 = GetDistance(p.x, p.y, pCandPt2.x, pCandPt2.y); if (distToCPt1 > distToCPt2) { pMovedRefPoint = pCandPt2; } else { pMovedRefPoint = pCandPt1; } } else { pMovedRefPoint = pCandPt1; } } } if (pMovedRefPoint == null) { pMovedRefPoint = l1; intFlag = 1; } pFeature.set_Value(intXNewFldIdx, pMovedRefPoint.x); pFeature.set_Value(intYNewFldIdx, pMovedRefPoint.y); pFeature.set_Value(intFlagFldIdx, intFlag); pFeature.Store(); pFeature = pFCursor.NextFeature(); } MessageBox.Show("Done"); ////Spatial Reference from Reference dataseat //IGeoDataset geoDataset = pRefFClass as IGeoDataset; //ISpatialReference pSpatialRef = geoDataset.SpatialReference; ////Create ShapeFile First //string strOutput = txtOutput.Text; //if (strOutput == "") // return; //string strOutputSource = System.IO.Path.GetDirectoryName(strOutput); //string strOutputFile = System.IO.Path.GetFileName(strOutput); ////IFeatureClass pFClass = CreateShapeFile(strOutputSource, strOutputFile, pSpatialRef, esriGeometryType.esriGeometryPoint); }