C# 计算地图上某个坐标点的是否在多边形内

原文:C# 计算地图上某个坐标点的是否在多边形内

这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143

使用百度地图的时候,常常会用到判断一个点是否在一个多边形的范围内,该方法用到的是射线法,

通过修改Javascrpit的代码过来的,射线法的意思就是从点出发和任意的一边的交叉点数为奇数则为在改区域内,

参考文档http://erich.realtimerendering.com/ptinpoly/

    public class location
    {
        public double lat;
        public double lng;
    }

    public class GpsPolygonHelper
    {
        /// <summary>
        /// 坐标点是否在多边形内判断
        /// </summary>
        /// <param name="point"></param>
        /// <param name="pts"></param>
        /// <returns></returns>
        public static bool isPointInPolygon(location point, List<location> pts)
        {

            //检查类型
            if (point == null || pts == null)
                return false;

            var N = pts.Count;
            var boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
            var intersectCount = 0; //cross points count of x
            var precision = 2e-10; //浮点类型计算时候与0比较时候的容差
            location p1, p2; //neighbour bound vertices
            var p = point; //测试点
            p1 = pts[0]; //left vertex
            for (var i = 1; i <= N; ++i)
            {
//check all rays
                if (p.lat.Equals(p1.lat) && p.lng.Equals(p1.lng))
                {
                    return boundOrVertex; //p is an vertex
                }

                p2 = pts[i % N]; //right vertex
                if (p.lat < Math.Min(p1.lat, p2.lat) || p.lat > Math.Max(p1.lat, p2.lat))
                {
//ray is outside of our interests
                    p1 = p2;
                    continue; //next ray left point
                }

                if (p.lat > Math.Min(p1.lat, p2.lat) && p.lat < Math.Max(p1.lat, p2.lat))
                {
//ray is crossing over by the algorithm (common part of)
                    if (p.lng <= Math.Max(p1.lng, p2.lng))
                    {
//x is before of ray
                        if (p1.lat == p2.lat && p.lng >= Math.Min(p1.lng, p2.lng))
                        {
//overlies on a horizontal ray
                            return boundOrVertex;
                        }

                        if (p1.lng == p2.lng)
                        {
//ray is vertical
                            if (p1.lng == p.lng)
                            {
//overlies on a vertical ray
                                return boundOrVertex;
                            }
                            else
                            {
//before ray
                                ++intersectCount;
                            }
                        }
                        else
                        {
//cross point on the left side
                            var xinters =
                                (p.lat - p1.lat) * (p2.lng - p1.lng) / (p2.lat - p1.lat) +
                                p1.lng; //cross point of lng
                            if (Math.Abs(p.lng - xinters) < precision)
                            {
//overlies on a ray
                                return boundOrVertex;
                            }

                            if (p.lng < xinters)
                            {
//before ray
                                ++intersectCount;
                            }
                        }
                    }
                }
                else
                {
//special case when ray is crossing through the vertex
                    if (p.lat == p2.lat && p.lng <= p2.lng)
                    {
//p crossing over p2
                        var p3 = pts[(i + 1) % N]; //next vertex
                        if (p.lat >= Math.Min(p1.lat, p3.lat) && p.lat <= Math.Max(p1.lat, p3.lat))
                        {
//p.lat lies between p1.lat & p3.lat
                            ++intersectCount;
                        }
                        else
                        {
                            intersectCount += 2;
                        }
                    }
                }
                p1 = p2; //next ray left point
            }

            if (intersectCount % 2 == 0)
            {
//偶数在多边形外
                return false;
            }
            else
            {
                //奇数在多边形内
                return true;
            }

        }

原文地址:https://www.cnblogs.com/lonelyxmas/p/10285397.html

时间: 2024-10-10 23:59:00

C# 计算地图上某个坐标点的是否在多边形内的相关文章

C# 计算地图上某个坐标点的到多边形各边的距离

原文:C# 计算地图上某个坐标点的到多边形各边的距离 在判断了某个坐标点是否在多边形内后,还有另一个需求就是当我这个坐标点在多边形外部时,我需要计算这个坐标点到多边形的距离是否在一个允许的误差范围内 通过两个位置的经纬度坐标计算距离(C#版本) 转自:https://blog.csdn.net/jasonsong2008/article/details/78423496 经纬坐标系中求点到线段距离的方法 转自C语言版本: https://blog.csdn.net/ufoxiong21/arti

计算球面上经纬度坐标方法比较

计算球面上的两点(坐标为经纬度)之间的距离可以直接通过公式计算得到,也可以先将经纬度坐标转化为墨卡托投影坐标来,然后用平面中两点之间的距离公式来计算. 在网上找了一些代码,然后简单进行了测试,发现前者精度更高: 资料来源:http://0414.iteye.com/blog/2039199 http://blog.sina.com.cn/s/blog_8ab3b2cf0100xd69.html 1 package com.suncreate.spatialquery.web.utils; 2 3

Openlayers3 计算地图上任意两点间的距离

主要用的接口是new ol.Sphere(6378137).haversineDistance([x1,y1],[x2,y2]): 4326坐标系中计算两点距离的方式为: var a = new ol.Sphere(6378137).haversineDistance([120.21592590991689, 30.210793016606],[120.21670777384473, 30.211168525868086]); 版权声明:本文为博主原创文章,未经博主允许不得转载.

根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米

/** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( 101 , 202 ) * @param array $point_2 第2个点的x,y坐标 array( 101 , 202 ) * @param bool $calc_as_string 是否计算为字符串公里距离 , 如果未否返回数字 * @return float | false | str

【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍

原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------------------------------------------------------------------------------------------------------- 哇,好久没有上来了.主要是因为最近工作繁忙,加上休息时间被各种排练.社团活动占满,导致木有更新此博客.

百度地图的使用之获取数据库表中信息的坐标点显示在地图上

//通用封装好的js: var map = new BMap.Map("container"); //建树Map实例 var point = new BMap.Point(103.976032, 33.845509); // 建树点坐标 map.centerAndZoom(point, 6); // 初始化地图,设置中心点坐标和地图级别. //地图事件设置函数: map.enableDragging(); //启用地图拖拽事件,默认启用(可不写) map.enableScrollWhe

计算地球上两个坐标点(经度,纬度)之间距离sql函数

go --计算地球上两个坐标点(经度,纬度)之间距离sql函数 --作者:lordbaby --整理:www.aspbc.com CREATE FUNCTION [dbo].[fnGetDistance](@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNS FLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EARTH_RADIUS REAL SET @

ArcGIS for Android地图上实际距离与对应的屏幕像素值计算

/** * 将实际地理距离转换为屏幕像素值 * * @param distance * 实际距离,单位为米 * @param currScale * 当前地图尺寸 * @param context * @return */ public static double metreToScreenPixel(double distance, double currScale, Context context) { float dpi = context.getResources().getDispla

通过地图上两个点的经纬度测算两点的距离

根据两点经纬度计算距离 这些经纬线是怎样定出来的呢?地球是在不停地绕地轴旋转(地轴是一根通过地球南北两极和地球中心的 假想线),在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈 就叫作"赤道".在赤道的南北两边,画出许多和赤道平行的圆圈,就是"纬圈":构成这些圆圈的线段, 叫做纬线.我们把赤道定为纬度零度,向南向北各为90度,在赤道以南的叫南纬,在赤道以北的叫北纬. 北极就是北纬90度,南极就是南纬90度.纬度的高低也标志着气候的冷