Arcobjects:根据折线长度设置度量

时间:2017-10-02 22:40:37

标签: arcobjects measures

我目前正在线性地引用一组道路。使用IMSegmatation2.SetMsAsDistance2适用于单部分折线,但对于多部分折线,我想将M值设置为沿折线到点的长度,而不是折线的点和起点之间的最短距离。 SetMsAsDistance2函数将平行线上的Measures设置为相等。我希望他们与众不同。

除了为每个折线顶点设置M值之外,是否有人知道将M设置为折线长度的方法?

1 个答案:

答案 0 :(得分:0)

解决方案是使用IMSegmentation3.SetAndInterpolateMsBetween函数。 请注意,解决方案假定构成要素的几何图形的顺序正确。它按几何图形分配度量。

这个代码是:

    public static void measuresAdd_NonDuplicating(ref IFeature pFeat, bool bHasZ, bool bIgnoreGaps, out string sError)
    {
        // Add non-duplicating measures to the feature
        sError = "";
        IMSegmentation3 pSeg;
        IGeometryCollection pGeomColl;
        //IGeometryCollection pNewGeomColl; // Use if geometries are to be re-ordered.
        IGeometry pGeom;
        IPolyline4 pPoly;
        IQueryFilter pQ;
        IMAware pMAware;
        IZAware pZAware;
        double dStartMeasure;
        double dToMeasure;
        double dMeasure;
        double dLen;

        try
        {


                if (pFeat.ShapeCopy.IsEmpty == false)
                {
                    pGeomColl = (IGeometryCollection)new PolylineClass();
                    pGeomColl = (IGeometryCollection)pFeat.ShapeCopy;
                    if (pGeomColl.GeometryCount == 1)
                    {
                        // Single line geometry. Duplication not an issue.
                        pMAware = (IMAware)pFeat.ShapeCopy;
                        pMAware.MAware = true;
                        pSeg = (IMSegmentation3)pMAware;
                        pPoly = geometryToPolyline((IGeometry)pFeat.ShapeCopy, out sError);
                        if (sError.Length > 0)
                        {
                            sError = "measuresAdd_NonDuplicating\r\n" + sError;
                            return;
                        }
                        pSeg.SetMsAsDistance2(pPoly.FromPoint, 1, 0, bIgnoreGaps);
                        pFeat.Shape = (IGeometry)pSeg;
                        pFeat.Store();
                    }
                    else
                    {
                        // For re-ordering geometries. Not currently used.
                        //pNewGeomColl = (IGeometryCollection)new Polyline();
                        //IZAware pZawareNew = (IZAware)pNewGeomColl;
                        //pZawareNew.ZAware = bHasZ;
                        //IMAware pMAwareNew = (IMAware)pNewGeomColl;
                        //pMAwareNew.MAware = true;

                        dStartMeasure = 0;
                        dMeasure = 0;
                        // MultiGeometry. Place them in order and set the measures on each part increasing.
                        // Currently assumes the existing order is correct.
                        for (int i = 0; i < pGeomColl.GeometryCount; i++)
                        {
                            pGeom = pGeomColl.Geometry[i];

                            pPoly = geometryToPolyline(pGeom, out sError);
                            if (sError.Length > 0)
                            {
                                sError = "measuresAdd_NonDuplicating\r\n" + sError;
                                return;
                            }
                            // Measure Values
                            dStartMeasure = dMeasure;
                            if (i > 0) dStartMeasure += 0.01;
                            dLen = pPoly.Length;
                            dToMeasure = dMeasure + dLen;
                            // Set Measures
                            pMAware = (IMAware)pPoly;
                            pMAware.MAware = true;
                            pZAware = (IZAware)pPoly;
                            pZAware.ZAware = bHasZ;
                            pSeg = (IMSegmentation3)pPoly;
                            pSeg.SetAndInterpolateMsBetween(dStartMeasure, dToMeasure);

                            // If geometries are re-ordered into a connecting network
                            //IGeometryCollection pXGeomColl = new PolylineClass();
                            //pMAware = (IMAware)pXGeomColl;
                            //pMAware.MAware = true;
                            //pZAware = (IZAware)pXGeomColl;
                            //pZAware.ZAware = bHasZ;
                            //pXGeomColl = (IGeometryCollection)pPoly;
                            //for (int j = 0; j < pXGeomColl.GeometryCount; j++)
                            //    pNewGeomColl.AddGeometry(pXGeomColl.Geometry[j]);

                            dMeasure += dLen;

                        }

                        pFeat.Shape = (IGeometry)pGeomColl;
                    }
            }

        }
        catch (Exception ex)
        {
            System.Diagnostics.StackTrace pStack = new System.Diagnostics.StackTrace(ex, true);
            System.Diagnostics.StackFrame pFrame = pStack.GetFrame(pStack.FrameCount - 1);
            int iLineNo = pFrame.GetFileLineNumber();

            sError = "ERROR: measuresAdd_NonDuplicating; Line: " + iLineNo + "\n" + ex.ToString();
        }


    }