--------------------------------------------------------------------------------------------------------------------------------------------------
AccessOperate.cs
--------------------------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.DataSourcesFile;
using System.Collections;
using ESRI.ArcGIS.Geometry;
using System.Web.Script.Serialization;
using System.IO;
using ESRI.ArcGIS.esriSystem;
using System.Threading;
namespace ArcObjectsLibrary
{
public class AccessOperate
{
public AccessOperate()
{
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
ESRI.ArcGIS.esriSystem.IAoInitialize m_AoInitialize = new ESRI.ArcGIS.esriSystem.AoInitialize();
m_AoInitialize.Initialize(ESRI.ArcGIS.esriSystem.esriLicenseProductCode.esriLicenseProductCodeArcInfo);
}
public IWorkspace OpenAccessWorkspace(string connString)
{
IWorkspace pWorkspace = null;
IWorkspaceFactory pWorkspaceFactory = new AccessWorkspaceFactory();
pWorkspace = pWorkspaceFactory.OpenFromFile(connString, 0);
return pWorkspace;
}
public IWorkspace OpenShapfileWorkspace(string Location)
{
IWorkspace pWorkspace = null;
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
pWorkspace = pWorkspaceFactory.OpenFromFile(Location, 0);
return pWorkspace;
}
public IWorkspace OpenFileGDBWorkspace(string Location)
{
IWorkspace pWorkspace = null;
IWorkspaceFactory pWorkspaceFactory = new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactory();
pWorkspace = pWorkspaceFactory.OpenFromFile(Location, 0);
return pWorkspace;
}
public String createSegment(string Location, String segmentRiverArrayString, String sceneId)
{
IWorkspace pWorkspace = OpenFileGDBWorkspace(Location);
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;
String result = createSegmentAllByCoordinateAccordingRiver2(pFeatureWorkspace, segmentRiverArrayString, sceneId);
return result;
}
public String createSegmentAllByCoordinateAccordingRiver(IFeatureWorkspace pFeatureWorkspace, String segmentRiverArrayString, String sceneId)
{
String result = "successed";
String[] segmentRiverArray = segmentRiverArrayString.Split('|');
IList pPolygonArrayList = new List();
IList codeArrayList = new List();
//Single
IFeatureClass pFeatureClassRiverSinglePolyline = pFeatureWorkspace.OpenFeatureClass("河流单线");
ISpatialFilter pSpatialFilterRiverSinglePolyline = new SpatialFilter();
pSpatialFilterRiverSinglePolyline.GeometryField=(pFeatureClassRiverSinglePolyline.ShapeFieldName);
//Double
IFeatureClass pFeatureClassRiverDoublePolyline = pFeatureWorkspace.OpenFeatureClass("河流边线");
ISpatialFilter pSpatialFilterRiverDoublePolyline = new SpatialFilter();
pSpatialFilterRiverDoublePolyline.GeometryField=(pFeatureClassRiverDoublePolyline.ShapeFieldName);
//Polygon
IFeatureClass pFeatureClassRiverPolygon = pFeatureWorkspace.OpenFeatureClass("河流面");
ISpatialFilter pSpatialFilterRiverPolygon = new SpatialFilter();
pSpatialFilterRiverPolygon.GeometryField=(pFeatureClassRiverPolygon.ShapeFieldName);
//Segment
IFeatureClass pFeatureClassRiverSegment = pFeatureWorkspace.OpenFeatureClass("河流切片");
//
double distanceFromCurve = 0;
Boolean asRatio = false;
Boolean bRightSide = false;
IPoint pPointClosest = new Point();
if (segmentRiverArrayString.Length > 0)
{
for (int riverIndex = 0; riverIndex < segmentRiverArray.Length; ++riverIndex)
{
String segmentRiverString = segmentRiverArray[riverIndex];
String[] segmentRiverInfo = segmentRiverString.Split('$');
String riverCode = segmentRiverInfo[0];
String cordinateCodeArrayString = segmentRiverInfo[1];
String[] cordinateCodeArray = cordinateCodeArrayString.Split(':');
IPoint[] pPointArray = new IPoint[cordinateCodeArray.Length];
double[] lengthArray = new double[cordinateCodeArray.Length];
String[] codeArray = new String[cordinateCodeArray.Length];
IPolygon[] pPolygonArray = new IPolygon[cordinateCodeArray.Length];
for (int index = 0; index < cordinateCodeArray.Length; ++index)
{
String cordinateCodeString = cordinateCodeArray[index];
if (cordinateCodeString.Length > 0)
{
String[] coordinateCode = cordinateCodeString.Split(',');
String code = coordinateCode[0];
codeArray[index] = code;
String coordinateString = coordinateCode[1];
String[] coordinate = coordinateString.Split(' ');
double x = Double.Parse(coordinate[0]);
double y = Double.Parse(coordinate[1]);
IPoint pPoint = new Point();
pPoint.X = (x);
pPoint.Y = (y);
pPointArray[index] = pPoint;
}
}
//Single
pSpatialFilterRiverSinglePolyline.WhereClause=("CODE='" + riverCode + "'");
pSpatialFilterRiverSinglePolyline.SearchOrder=esriSearchOrder.esriSearchOrderAttribute;
IFeatureCursor pFeatureCursorRiverSinglePolyline = pFeatureClassRiverSinglePolyline.Search(pSpatialFilterRiverSinglePolyline, false);
IFeature pFeatureRiverSinglePolyline = pFeatureCursorRiverSinglePolyline.NextFeature();
IPolyline pPolylineSingleRiver = (IPolyline)pFeatureRiverSinglePolyline.Shape;
//Double
pSpatialFilterRiverDoublePolyline.WhereClause = ("CODE='" + riverCode + "'");
pSpatialFilterRiverDoublePolyline.SearchOrder = esriSearchOrder.esriSearchOrderAttribute;
IFeatureCursor pFeatureCursorRiverDoublePolyline = pFeatureClassRiverDoublePolyline.Search(pSpatialFilterRiverDoublePolyline, false);
IFeature pFeatureRiverDoubleOnePolyline = pFeatureCursorRiverDoublePolyline.NextFeature();
IPolyline pPolylineDoubleOneRiver = (IPolyline)pFeatureRiverDoubleOnePolyline.Shape;
IFeature pFeatureRiverDoubleTwoPolyline = pFeatureCursorRiverDoublePolyline.NextFeature();
IPolyline pPolylineDoubleTwoRiver = (IPolyline)pFeatureRiverDoubleTwoPolyline.Shape;
//Polygon
pSpatialFilterRiverPolygon.WhereClause = ("CODE='" + riverCode + "'");
pSpatialFilterRiverPolygon.SearchOrder = esriSearchOrder.esriSearchOrderAttribute;
IFeatureCursor pFeatureCursorRiverPolygon = pFeatureClassRiverPolygon.Search(pSpatialFilterRiverPolygon, false);
IFeature pFeatureRiverPolygon = pFeatureCursorRiverPolygon.NextFeature();
IPolygon pPolygonRiver = (IPolygon)pFeatureRiverPolygon.Shape;
ITopologicalOperator pITopologicalOperator = (ITopologicalOperator)pPolygonRiver;
IRelationalOperator pRelationalOperator2 = (IRelationalOperator)pPolygonRiver;
for (int index = 0; index < pPointArray.Length; ++index)
{
IPoint pPoint = pPointArray[index];
double distanceAlongCurve = 0;
pPolylineSingleRiver.QueryPointAndDistance(0, pPoint, asRatio, pPointClosest, distanceAlongCurve, distanceFromCurve, bRightSide);
lengthArray[index] = distanceAlongCurve;
}
for (int i = 0; i < lengthArray.Length - 1; i++)
{
for (int j = i + 1; j < lengthArray.Length; j++)
{
if (lengthArray[i] > lengthArray[j])
{
double temp = lengthArray[i];
lengthArray[i] = lengthArray[j];
lengthArray[j] = temp;
//
IPoint pPoint = pPointArray[i];
pPointArray[i] = pPointArray[j];
pPointArray[j] = pPoint;
//
String code = codeArray[i];
codeArray[i] = codeArray[j];
codeArray[j] = code;
}
}
}
for (int index = 0; index < pPointArray.Length; ++index)
{
IPoint pPointStart = null;
IPoint pPointEnd = null;
IPoint pPointCurrent = pPointArray[index];
if (index == 0)
{
pPointStart = pPointCurrent;
IPoint pPointNext = pPointArray[index + 1];
pPointEnd = new Point();
pPointEnd.X = ((pPointCurrent.X + pPointNext.X) / 2);
pPointEnd.Y = ((pPointCurrent.Y + pPointNext.Y) / 2);
}
else if (index == pPointArray.Length - 1)