当前位置: 首页 >>ASP.NET >>ASP.NET实战 >>C#开发判断一个经纬度点是否在多边形区域内的实例

C#开发判断一个经纬度点是否在多边形区域内的实例

时间:2020/8/29 10:21:00 【@.YX】

C#中可以使用引射线法来判断,就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。这是所有方法中计算量最小的方法,在光线追踪算法中有大量的应用。…

C#中可以使用引射线法来判断,就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。这是所有方法中计算量最小的方法,在光线追踪算法中有大量的应用。


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace 判断点是否在多边形内

{

    class Program

    {

        public static void Main(String[] args)

        {

            Point[] ps = new Point[] { new Point(120.2043, 30.2795), new Point(120.2030, 30.2511), new Point(120.1810, 30.2543), new Point(120.1798, 30.2781), new Point(120.1926, 30.2752) };

            Point n1 = new Point(120.1936, 30.2846);

            Point n2 = new Point(120.1823, 30.2863);

            Point n3 = new Point(120.2189, 30.2712);

            Point y1 = new Point(120.1902, 30.2712);

            Point y2 = new Point(120.1866, 30.2672);

            Point y4 = new Point(120.1869, 30.2718);

 

 

            Console.WriteLine(IsPtInPoly(120.2043, 30.2795, ps));

            Console.ReadLine();

        }

        /// <summary>

        /// 判断点是否在多边形内或多边形上

        /// </summary>

        /// <param name="ALon">经度</param>

        /// <param name="ALat">纬度</param>

        /// <param name="Points">多边形边界点集合</param>

        /// <returns></returns>

        public static bool IsPtInPoly(double ALon, double ALat, Point[] Points)

        {

            int iSum, iCount, iIndex;

            double dLon1 = 0, dLon2 = 0, dLat1 = 0, dLat2 = 0, dLon;

            if (Points.Length < 3)

            {

                return false;

            }

            iSum = 0;

            iCount = Points.Length;

            for (iIndex = 0; iIndex < iCount; iIndex++)

            {          

                if (ALon == Points[iIndex].getX() && ALat == Points[iIndex].getY())  //A点在多边形上    

                    return true;

 

                if (iIndex == iCount - 1)

                {

                    dLon1 = Points[iIndex].getX();

                    dLat1 = Points[iIndex].getY();

                    dLon2 = Points[0].getX();

                    dLat2 = Points[0].getY();

                }

                else

                {

                    dLon1 = Points[iIndex].getX();

                    dLat1 = Points[iIndex].getY();

                    dLon2 = Points[iIndex + 1].getX();

                    dLat2 = Points[iIndex + 1].getY();

                }

               

                //以下语句判断A点是否在边的两端点的纬度之间,在则可能有交点

                if (((ALat > dLat1) && (ALat < dLat2)) || ((ALat > dLat2) && (ALat < dLat1)))

                {

                    if (Math.Abs(dLat1 - dLat2) > 0)

                    {

                        //获取A点向左射线与边的交点的x坐标:

                        dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat)) / (dLat1 - dLat2);

                        //如果交点在A点左侧,则射线与边的全部交点数加一:

                        if (dLon < ALon)

                        {

                            iSum++;

                        }

                        //如果相等,则说明A点在边上

                        if(dLon==ALon)

                            return true;

                    }

                }

            }

            if ((iSum % 2) != 0)

            {

                return true;

            }

            return false;

        }

    }

    public class Point

    {

        private Double x;

        private Double y;

        public Point(Double x, Double y)

        {

            this.x = x;

            this.y = y;

        }

        public Double getX()

        {

            return x;

        }

        public void setX(Double x)

        {

            this.x = x;

        }

        public Double getY()

        {

            return y;

        }

        public void setY(Double y)

        {

            this.y = y;

        }

 

    }

}


扩充阅读

CopyRight:2007-2018 语言吧 备案ICP:湘ICP备09009000号-15 http://www.yuyanba.com

分享按钮