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;
}