arcgis IFeature 转 geojson

 

        public GeoJSON.Net.Feature.Feature CreateJsonFeature(ESRI.ArcGIS.Geodatabase.IRow pRow)

        {

            GeoJSON.Net.Geometry.IGeometryObject geometryObject = null;

            int nFieldCount = pRow.Fields.FieldCount;

            Dictionary<string, object> dictProp = new Dictionary<string, object>() { };

            for (int n = 0; n < nFieldCount; n++)

            {

                ESRI.ArcGIS.Geodatabase.IField pField = pRow.Fields.get_Field(n);

                esriFieldType fieldType = pField.Type;

                switch (fieldType)

                {

                    case esriFieldType.esriFieldTypeDate:

                    case esriFieldType.esriFieldTypeDouble:

                    case esriFieldType.esriFieldTypeGUID:

                    case esriFieldType.esriFieldTypeGlobalID:

                    case esriFieldType.esriFieldTypeInteger:

                    case esriFieldType.esriFieldTypeOID:

                    case esriFieldType.esriFieldTypeSingle:

                    case esriFieldType.esriFieldTypeSmallInteger:

                    case esriFieldType.esriFieldTypeString:

                        dictProp.Add(pField.Name, pRow.get_Value(n));

                        break;

                    case esriFieldType.esriFieldTypeGeometry:

                        geometryObject = CreateGeometryObjectFromEsriGeometry((pRow as ESRI.ArcGIS.Geodatabase.IFeature).Shape);

                        break;

                    case esriFieldType.esriFieldTypeBlob:

                    case esriFieldType.esriFieldTypeRaster:

                    case esriFieldType.esriFieldTypeXML:

                    default:

                        break;

                }

            }

            return new GeoJSON.Net.Feature.Feature(geometryObject, dictProp);

        }

 

        public static IGeometryObject CreateGeometryObjectFromEsriGeometry(IGeometry pGeometry)

        {

            //判断是否存在圆弧,是则简化图形

            if (IsGeometryExistArc(pGeometry))

            {

                WeedGeometryOpera(ref pGeometry, 0.001);

            }

 

            switch (pGeometry.GeometryType)

            {

                case esriGeometryType.esriGeometryPoint:

                case esriGeometryType.esriGeometryMultipoint:

                    return GetPoint(pGeometry);

                case esriGeometryType.esriGeometryLine:

                case esriGeometryType.esriGeometryPath:

                case esriGeometryType.esriGeometryPolyline:

                    return GetLine(pGeometry);

                case esriGeometryType.esriGeometryRing:

                case esriGeometryType.esriGeometryPolygon:

                case esriGeometryType.esriGeometryEnvelope:

                    return GetPolygon(pGeometry);

                default:

                    break;

            }

            return null;

        }

 

        /// <summary>

        /// 判断图形是否存在圆弧

        /// </summary>

        /// <param name="geo"></param>

        /// <returns></returns>

        public static bool IsGeometryExistArc(IGeometry geo)

        {

            if (null == geo)

            {

                return false;

            }

            switch (geo.GeometryType)

            {

                case esriGeometryType.esriGeometryBezier3Curve:

                case esriGeometryType.esriGeometryCircularArc:

                case esriGeometryType.esriGeometryEllipticArc:

                    return true;

                case esriGeometryType.esriGeometryPolygon:

                case esriGeometryType.esriGeometryPolyline:

                case esriGeometryType.esriGeometryRing:

                    var pSegmentColl = geo as ISegmentCollection;

                    int iCount = pSegmentColl.SegmentCount;

                    for (int i = 0; i < iCount; i++)

                    {

                        switch (pSegmentColl.Segment[i].GeometryType)

                        {

                            case esriGeometryType.esriGeometryBezier3Curve:

                            case esriGeometryType.esriGeometryCircularArc:

                            case esriGeometryType.esriGeometryEllipticArc:

                                return true;

                        }

                    }

                    break;

                default:

                    return false;

            }

            return false;

        }

        /// <summary>

        /// 简化图形

        /// </summary>

        /// <param name="geo"></param>

        /// <param name="maxAllowableOffsetFactor"></param>

        public static void WeedGeometryOpera(ref IGeometry geo, double maxAllowableOffsetFactor)

        {

            if (null == geo)

            {

                return;

            }

            try

            {

                var polycurve = geo as IPolycurve;

                if (null != polycurve)

                {

                    polycurve.Weed(maxAllowableOffsetFactor);

                    (geo as ITopologicalOperator3).IsKnownSimple_2 = false;

                    (geo as ITopologicalOperator3).Simplify();

                }

            }

            catch { }

        }

 

        public static string CreateGeoJsonFromEsriGeometry(IGeometry pGeometry)

        {

            switch (pGeometry.GeometryType)

            {

                case esriGeometryType.esriGeometryPoint:

                case esriGeometryType.esriGeometryMultipoint:

                    return GetPointString(pGeometry);

                case esriGeometryType.esriGeometryLine:

                case esriGeometryType.esriGeometryPath:

                case esriGeometryType.esriGeometryPolyline:

                    return GetLineString(pGeometry);

                case esriGeometryType.esriGeometryRing:

                case esriGeometryType.esriGeometryPolygon:

                case esriGeometryType.esriGeometryEnvelope:

                    return GetPolygonString(pGeometry);

                default:

                    break;

            }

            return "";

        }

 

        // 处理点(esriGeometryPoint)或多点(esriGeometryMultipoint)

        public static IGeometryObject GetPoint(IGeometry pGeometry)

        {

            string resultStr = string.Empty;

 

            IPointCollection pointCollection = pGeometry as IPointCollection;

            if (pointCollection == null)

            {

                IPoint pPoint = pGeometry as IPoint;

                if (pPoint == null)

                {

 

                }

                else

                {

                    Position position = new Position(pPoint.Y, pPoint.X);

                    GeoJSON.Net.Geometry.Point point = new GeoJSON.Net.Geometry.Point(position);

                    resultStr = point.ToString();

                    return point;

                }

            }

            if (pointCollection.PointCount < 0)

            {

                return null;

            }

 

            if (pointCollection.PointCount == 1)

            {

                Position position = new Position(pointCollection.Point[0].Y, pointCollection.Point[0].X);

                GeoJSON.Net.Geometry.Point point = new GeoJSON.Net.Geometry.Point(position);

                resultStr = point.ToString();

                return point;

            }

            else

            {

                List<GeoJSON.Net.Geometry.Point> listPoint = new List<GeoJSON.Net.Geometry.Point>();

                //

                for (int i = 0; i < pointCollection.PointCount; i++)

                {

                    Position position = new Position(pointCollection.Point[0].Y, pointCollection.Point[0].X);

                    GeoJSON.Net.Geometry.Point point = new GeoJSON.Net.Geometry.Point(position);

                    listPoint.Add(point);

                }

                GeoJSON.Net.Geometry.MultiPoint multiPoint = new MultiPoint(listPoint);

                resultStr = multiPoint.ToString();

                return multiPoint;

            }

            //return resultStr;

        }

 

        // 处理点(esriGeometryPoint)或多点(esriGeometryMultipoint)

        public static string GetPointString(IGeometry pGeometry)

        {

            return GetPoint(pGeometry).ToString();

        }

 

        // 处理线(esriGeometryLine、esriGeometryPath、esriGeometryPolyline)

        public static IGeometryObject GetLine(IGeometry pGeometry)

        {

            IGeometryCollection pGeometryCollection = pGeometry as IGeometryCollection;

            if (pGeometryCollection.GeometryCount < 0)

            {

                return null;

            }

            // polyline 由一个path组成

            if (pGeometryCollection.GeometryCount == 1)

            {

                // Path 是连续的Segment集合 (Segment是两个点(起点和终点)的组成的线段)

                ISegmentCollection segmentCollection = pGeometryCollection.Geometry[0] as ISegmentCollection;

                // 这是不可能的

                if (segmentCollection.SegmentCount == 1)

                {

                    List<IPosition> listPosition = new List<IPosition>();

                    IPoint pStartPoint = segmentCollection.Segment[0].FromPoint;

                    Position pStartPosition = new Position(pStartPoint.Y, pStartPoint.X);

                    listPosition.Add(pStartPosition);

 

                    IPoint pToPoint = segmentCollection.Segment[0].ToPoint;

                    Position pToPosition = new Position(pToPoint.Y, pToPoint.X);

                    listPosition.Add(pToPosition);

 

                    LineString lineString = new LineString(listPosition);

                    return lineString;

                }

                else

                {

                    List<IPosition> listPosition = new List<IPosition>();

                    for (int i = 0; i < segmentCollection.SegmentCount; i++)

                    {

                        ISegment segment = segmentCollection.Segment[i];

                        IPoint pStartPoint = segment.FromPoint;

                        Position pStartPosition = new Position(pStartPoint.Y, pStartPoint.X);

                        listPosition.Add(pStartPosition);

                    }

                    LineString lineString = new LineString(listPosition);

 

                    return lineString;

                }

            }

            // polyline 由多个path组成

            else

            {

                List<LineString> listLineString = new List<LineString>();

                for (int i = 0; i < pGeometryCollection.GeometryCount; i++)

                {

                    // Path 是连续的Segment集合 (Segment是两个点(起点和终点)的组成的线段)

                    ISegmentCollection segmentCollection = pGeometryCollection.Geometry[0] as ISegmentCollection;

                    // 这是不可能的

                    if (segmentCollection.SegmentCount == 1)

                    {

                        List<IPosition> listPosition = new List<IPosition>();

                        IPoint pStartPoint = segmentCollection.Segment[0].FromPoint;

                        Position pStartPosition = new Position(pStartPoint.Y, pStartPoint.X);

                        listPosition.Add(pStartPosition);

 

                        IPoint pToPoint = segmentCollection.Segment[0].ToPoint;

                        Position pToPosition = new Position(pToPoint.Y, pToPoint.X);

                        listPosition.Add(pToPosition);

 

                        LineString lineString = new LineString(listPosition);

                        listLineString.Add(lineString);

                    }

                    else

                    {

                        List<IPosition> listPosition = new List<IPosition>();

                        for (int j = 0; j < segmentCollection.SegmentCount; j++)

                        {

                            ISegment segment = segmentCollection.Segment[j];

                            IPoint pStartPoint = segment.FromPoint;

                            Position pStartPosition = new Position(pStartPoint.Y, pStartPoint.X);

                            listPosition.Add(pStartPosition);

                        }

                        LineString lineString = new LineString(listPosition);

                        listLineString.Add(lineString);

                    }

                }

                MultiLineString multiLineString = new MultiLineString(listLineString);

                return multiLineString;

            }

        }

 

        // 处理线(esriGeometryLine、esriGeometryPath、esriGeometryPolyline)

        public static string GetLineString(IGeometry pGeometry)

        {

            return GetLine(pGeometry).ToString();

        }

 

        // 处理线性环

        public static List<IPosition> GetRing(IGeometry pGeometry)

        {

            ISegmentCollection segmentCollection = pGeometry as ISegmentCollection;

            // 这是不可能的,除非是具有圆弧的线

            if (segmentCollection.SegmentCount == 1)

            {

                return null;

            }

            else

            {

                List<IPosition> listPosition = new List<IPosition>();

                for (int j = 0; j < segmentCollection.SegmentCount; j++)

                {

                    ISegment segment = segmentCollection.Segment[j];

                    IPoint pStartPoint = segment.FromPoint;

                    Position pStartPosition = new Position(pStartPoint.Y, pStartPoint.X);

                    listPosition.Add(pStartPosition);

                    if (j == segmentCollection.SegmentCount - 1)

                    {

                        IPoint pToPoint = segment.ToPoint;

                        Position pToPosition = new Position(pToPoint.Y, pToPoint.X);

                        listPosition.Add(pToPosition);

                    }

                }

                return listPosition;

            }

        }

 

        // 处理面(esriGeometryRing、esriGeometryPolygon、esriGeometryEnvelope)

        public static IGeometryObject GetPolygon(IGeometry pGeometry)

        {

            List<GeoJSON.Net.Geometry.Polygon> listPolygon = new List<GeoJSON.Net.Geometry.Polygon>();

            IPolygon4 pPolygon = pGeometry as IPolygon4;

            if (pPolygon != null)

            {

                IGeometryBag bag = pPolygon.ExteriorRingBag;     //获取多边形的所有外环

                IEnumGeometry geo = bag as IEnumGeometry;

                geo.Reset();

                IRing exRing = geo.Next() as IRing;

                while (exRing != null)

                {

                    List<LineString> listLineString = new List<LineString>();

                    // 从外环获取其所有内环

                    List<IPosition> listExPosition = GetRing(exRing);

                    listLineString.Add(new LineString(listExPosition));

                    // 处理外环

                    IGeometryBag bags = pPolygon.get_InteriorRingBag(exRing);   //获取当前外环所包含的内环

                    IEnumGeometry geos = bags as IEnumGeometry;

                    geos.Reset();

                    IRing inRing = geos.Next() as IRing;

                    //再处理内环

                    while (inRing != null)   

                    {

                        List<IPosition> listInPosition = GetRing(inRing);

                        listLineString.Add(new LineString(listInPosition));

                        inRing = geos.Next() as IRing;

                    }

                    listPolygon.Add(new GeoJSON.Net.Geometry.Polygon(listLineString));

                    exRing = geo.Next() as IRing;

                }

                if (listPolygon.Count == 1)

                {

                    return listPolygon[0];

                }

                else

                {

                    GeoJSON.Net.Geometry.MultiPolygon multiPolygon = new GeoJSON.Net.Geometry.MultiPolygon(listPolygon);

                    return multiPolygon;

                }

            }

            else

            {

                return null;

            }

        }

 

        // 处理面(esriGeometryRing、esriGeometryPolygon、esriGeometryEnvelope)

        public static string GetPolygonString(IGeometry pGeometry)

        {

            return GetPolygon(pGeometry).ToString();

        }

 

 

 

        public static List<IPosition> getListPosition(IGeometry pGeometry)

        {

            IPointCollection pointCollection = pGeometry as IPointCollection;

            var coordinates = new List<IPosition>();

            for (int i = 0; i < pointCollection.PointCount; i++)

            {

                coordinates.Add(new Position(pointCollection.Point[i].Y, pointCollection.Point[i].Y));

            }

            return coordinates;

        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值