示例#1
0
        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);
        }
示例#2
0
        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);
        }