采集的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();

}


}
}

 

 

 

 

 

posted on 2010-10-13 14:05  hl3292  阅读(727)  评论(1编辑  收藏  举报