新浪博客

Geometry的面积计算方法,创建空间参考

2015-06-23 09:38阅读:
///
/// 面积计算
///
/// 1:平方公里 保留6位小数 ;2:平方米 保留4位小数
///
///
public static string CalculateAreaPrecision(string unitType, IGeometry geometry)
{
ProjectGeometry(geometry);
(geometry as ITopologicalOperator).Simplify();
//如果面积为负数的话,则进行反转。因为geometry面积跟点的顺序有关,若是顺时针的话是面,为正;若是逆时针的话是洞,为负。
if ((geometry as IArea).Area <= 0)
{
(geometry as IPolygon).ReverseOrientation();
}
IArea wktArea = geometry as IArea;
string areaPrecision = '';
double area = Math.Abs(wktArea.Area);
switch (unitType)
{
case '1':
areaPrecision = (area / 1000000).ToString('0.000000');//平方公里时,保留六位小数
break;
case '2':
areaPrecision = (area).ToString('0.0000');//平方米时,保留四位小数
break;
default:
areaPrecision = (area).ToString('0.0000');
break;
}
return areaPrecision;
}
如果出现面积的大小与实际情况相差太大的话,或者为经纬度坐标时计算出来的面积特别小。则需要对geometry的空间参考赋值,投影。参考方法如下:
///
/// 根据需要创建空间参考
/// 如果是西安80大地坐标系,则创建西安80大地坐标系;
/// 如果是投影坐标系则根据传入的带号创建相应带号的投影坐标空间参考
/// 带号只限在37~40范围内(含37和40度带)
///
/// 是否是西安80大地坐标系(经纬度坐标)
/// 带号,如果是投影坐标,该值为0
///
public ISpatialReference CreateSpatialReferenceFromZone(bool isGCSCoord, int zone)
{
ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironmentClass();
ISpatialReference spatialReference = null;
if (isGCSCoord)
{
spatialReference = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCS3Type.esriSRGeoCS_Xian1980);
}
else
{
switch (zone)
{
case 37:
spatialReference = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_37);
break;
case 38:
spatialReference = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_38);
break;
case 39:
spatialReference = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_39);
break;
case 40:
spatialReference = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_40);
break;
case 41:
spatialReference = spatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_41);
break;
default:
throw new Exception(string.Format('不支持的带号:{0}', zone.ToString()));
}
}
return spatialReference;
}
///
///几何图形投影空间参考
///
public void ProjectGeometry(IGeometry geometry)
{
ISpatialReference spatialRef = CreateSpatialReferenceFromZone(true,0);//假设是经纬度坐标
geometry.SpatialReference = spatialRef
ISpatialReference projectSpatialRef = CreateSpatialReferenceFromZone(false,39);//39度带投影坐标
geometry.Project(projectSpatialRef );
}

我的更多文章

下载客户端阅读体验更佳

APP专享