采集的GPS点或者道路存在误差,因此Iidentify用的时候点转换成envelope。
代码
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.MapControl;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.ToolbarControl;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.AnalysisTools;
using ESRI.ArcGIS.DataSourcesFile;
namespace ClassLibrary1
{
public class GIS
{
public static GIS pGIS = new GIS();
public IPoint pointNow;//当前点的坐标
public IPolyline polylineNow;//当前公路
ILayer roadLayer;
/// <summary>
///
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public IPoint producePoint(double x, double y)
{
pointNow = new PointClass();
pointNow.PutCoords(x, y);
return pointNow;
}
/// <summary>
///
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
//public IPoint producePoint()
//{
// //pointNow = new PointClass();
// //pointNow.PutCoords(dx,dy);
// //return pointNow;
//}
public void setEnv(string FilePath)
{
string WorkSpacePath = System.IO.Path.GetDirectoryName(FilePath);
string ShapeFilePath = System.IO.Path.GetFileName(FilePath);
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(WorkSpacePath, 1);
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass(ShapeFilePath);
IDataset pDataset = pFeatureClass as IDataset;
IFeatureLayer pFeatureLayer = new FeatureLayerClass();
pFeatureLayer.FeatureClass = pFeatureClass;
pFeatureLayer.Name = pDataset.Name;
ILayer pLayer = pFeatureLayer as ILayer;
roadLayer = pLayer;
}
/// <summary>
///
/// </summary>
/// <param name="dx"></param>
/// <param name="dy"></param>
/// <returns></returns>
public IPolyline getPolyline(IPoint pPoint)
{
if (roadLayer == null)
{
MessageBox.Show("请输入地图文件路径和名称");
return null;
}
else
{
IFeatureLayer roadFeatureLayer = roadLayer as IFeatureLayer;
IIdentify i = (IIdentify)roadLayer;
IEnvelope env = new EnvelopeClass() as IEnvelope;
env.PutCoords(pPoint.X - 0.1, pPoint.Y - 0.1, pPoint.X + 0.1, pPoint.Y + 0.1);
IArray pIDArray = i.Identify(env);
IFeatureIdentifyObj pFeatIdObj;
pFeatIdObj = pIDArray.get_Element(0) as IFeatureIdentifyObj;
IRowIdentifyObject pRowIdentifyObj = pFeatIdObj as IRowIdentifyObject;
IFeature pFeature = pRowIdentifyObj.Row as IFeature;
IPolyline pPolyline = pFeature.Shape as IPolyline;
return pPolyline;
}
}
/// <summary>
///
/// </summary>
/// <param name="pPoint"></param>
/// <param name="pPolyline"></param>
/// <returns></returns>
public double getDistance(IPoint pPoint, IPolyline pPolyline)
{
IPoint outPoint = new PointClass();
double distanceAlongCurve = 0;//该点在曲线上最近的点距曲线起点的距离
double distanceFromCurve = 0;//该点到曲线的直线距离
bool bRightSide = false;
bool asRatio = false;
pPolyline.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, pPoint, asRatio, outPoint, ref distanceAlongCurve, ref distanceFromCurve, ref bRightSide);
return distanceAlongCurve;
}
/// <summary>
///
/// </summary>
/// <param name="dValue"></param>
/// <param name="inUnits"></param>
/// <param name="outUnits"></param>
/// <returns></returns>
public double ConvertUnit(double dValue, esriUnits inUnits, esriUnits outUnits)
{
IUnitConverter pUnitConverter = new UnitConverterClass();
dValue = pUnitConverter.ConvertUnits(dValue, inUnits, outUnits);
return dValue;
}
public string getNo(double x, double y)
{
pointNow = producePoint(x, y);
polylineNow = getPolyline(pointNow);
double distance = getDistance(pointNow, polylineNow);
double distanceresult = ConvertUnit(distance, ESRI.ArcGIS.esriSystem.esriUnits.esriDecimalDegrees, ESRI.ArcGIS.esriSystem.esriUnits.esriMeters);
return distanceresult.ToString();
}
}
}