• GPS点到道路起点距离


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

    }


    }
    }
  • 相关阅读:
    CF 1083 A. The Fair Nut and the Best Path
    2434: [Noi2011]阿狸的打字机
    HDU 6086 Rikka with String
    HDU 2825 Wireless Password
    异常处理与补充模块
    面向对象
    初始socket
    面向对象的进阶(组合和继承)
    初始面向对象
    python之其他模块的用法
  • 原文地址:https://www.cnblogs.com/hl3292/p/1850052.html
Copyright © 2020-2023  润新知