C# 计算地图上某个坐标点的到多边形各边的距离
在判断了某个坐标点是否在多边形内后,还有另一个需求就是当我这个坐标点在多边形外部时,我需要计算这个坐标点到多边形的距离是否在一个允许的误差范围内
通过两个位置的经纬度坐标计算距离(C#版本)
转自:https://blog.csdn.net/jasonsong2008/article/details/78423496
经纬坐标系中求点到线段距离的方法
转自C语言版本: https://blog.csdn.net/ufoxiong21/article/details/46487001
依据地图上的经纬度坐标计算某个点到多边形各边的距离
转自JAVA版本 https://blog.csdn.net/james_laughing/article/details/72881056?locationNum=12&fps=1
在一些地图的应用中(如求偏航),常常需要求一个点到一条线程的距离,以判断是否远离航线。然而在经纬度坐标中,并没有类似直角坐标系中的公式来计算。在经纬度中,一般应用最广的公式是求两点距离的方法,如何通过两点之间的距离公式来达到计算出点到线段的方法呢,我们先来看在经纬度中求两点距离的计算方法。
一、经纬度中求两点距离的计算方法
网上有很多介绍该计算方法,此处不再 一一阐述。在北半球中:
C = sin(LatA*Pi/180)*sin(LatB*Pi/180) + cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180)
Distance = R*Arccos(C)*Pi/180
注1:其中LonA、LatA、LonB、LatB分别是A、B两个点的经纬度值,其中三角函数的输入和输出都采用弧度值
注2:R(地球半径)和Distance单位是相同,如果是采用6378.137千米作为半径,那么Distance就是千米为单位
C语言代码:

double getDistanceBtwP(double LonA, double LatA,double LonB, double LatB)//根据两点经纬度计算距离,X经度,Y纬度
{
double radLng1 = LatA * M_PI / 180.0;
double radLng2 = LatB * M_PI / 180.0;
double a = radLng1 - radLng2;
double b = (LonA - LonB) * M_PI/ 180.0;
double s = 2 * asin(sqrt(pow(sin(a / 2), 2)+ cos(radLng1) * cos(radLng2) * pow(sin(b / 2), 2))) * 6378.137; //返回单位为公里
return s;
}

二、经纬坐标中求点到线段的距离的方法
在经纬坐标系中,求点C(LonC,LatC)到以点A(LonA,LatA)和点B(LonB,LatB)为端点的线段的距离D。此问题可以分为三种情况:
①点C在线段AB的正上方时,则距离D=点C到直线AB的垂直距离,如图1;
②AC与AB形成钝角时,则距离D=线段AC的长度,如图2;
③BC与AB形成钝角时,则距离D=线段BC的长度,如图3;
1、首先如何判断是属于哪种情况
我们可以利用勾股定理逆定理的推广,假如AB、BC、AC的长度分别为a,b,c
①若b*b+c*c<a*a,则边a所对的角为钝角,即图1的情况;
②若a*a+c*c<b*b,则边b所对的角为钝角,即图2的情况;
③若a*a+b*b<c*c,则边c所对的角为钝角,即图3的情况;
2、求图1情况的距离D
我们希望可以通过距离公式即可求出距离D,从而联想到海伦公式。
在海伦公式中,三角形的面积,其中
,则距离D=2S/a;
三、计算方法总结
对于图1情况以及计算出,对于图2和图3的计算均已转换为两个点之间的距离公式,此处不再累赘。因此,在经纬度坐标系中,求点到线段的距离的C语言代码如下:

//点PCx,PCy到线段PAx,PAy,PBx,PBy的距离
double GetNearestDistance(double PAx, double PAy,double PBx, double PBy,double PCx, double PCy)
{
double a,b,c;
a=getDistanceBtwP(PAy,PAx,PBy,PBx);//经纬坐标系中求两点的距离公式
b=getDistanceBtwP(PBy,PBx,PCy,PCx);//经纬坐标系中求两点的距离公式
c=getDistanceBtwP(PAy,PAx,PCy,PCx);//经纬坐标系中求两点的距离公式
if(b*b>=c*c+a*a)return c;
if(c*c>=b*b+a*a)return b;
double l=(a+b+c)/2; //周长的一半
double s=sqrt(l*(l-a)*(l-b)*(l-c)); //海伦公式求面积
return 2*s/a;
}

好了上面是引用的C语言版本的逻辑,我们可以了解了基本的计算逻辑
下面是我经过简单修改过后的C#版本

//地球半径,单位米
private const double EARTH_RADIUS = 6378137; /// <summary>
/// 判断是否在误差范围内
/// </summary>
/// <param name="point"></param>
/// <param name="points"></param>
/// <param name="limitDistance"></param>
/// <returns></returns>
public static bool InLimitDistance(location point, List<location> points, double limitDistance)
{
List<double> distance=new List<double>();
var len = points.Count;
var maxIndex = len - 1;
for (int i = 0; i < len; i++)
{
//多边形中当前点
var currentPoint = points[i];
var nearPoint = maxIndex == i ? points[0] : points[i + 1];
double a, b, c;
a = GetDistance(point, currentPoint);//经纬坐标系中求两点的距离公式
b = GetDistance(point, nearPoint);//经纬坐标系中求两点的距离公式
c = GetDistance(currentPoint, nearPoint);//经纬坐标系中求两点的距离公式
if (b * b >= c * c + a * a)
{
distance.Add(c);
continue; }
if (c * c >= b * b + a * a)
{
distance.Add(b);
continue;
} double l = (a + b + c) / 2; //周长的一半
double s = Math.Sqrt(l * (l - a) * (l - b) * (l - c)); //海伦公式求面积
distance.Add(2 * s / a);
} if (!distance.Any())
{
return false;
} var count = distance.Where(s => s < limitDistance).Count();
if (count > 0) return true;
return false;
}
/// <summary>
/// 计算两点位置的距离,返回两点的距离,单位:米
/// 该公式为GOOGLE提供,误差小于0.2米
/// </summary>
/// <param name="lng1">第一点经度</param>
/// <param name="lat1">第一点纬度</param>
/// <param name="lng2">第二点经度</param>
/// <param name="lat2">第二点纬度</param>
/// <returns></returns>
private static double GetDistance(location point1, location point2)
{
double radLat1 = Rad(point1.lat);
double radLng1 = Rad(point1.lng);
double radLat2 = Rad(point2.lat);
double radLng2 = Rad(point2.lng);
double a = radLat1 - radLat2;
double b = radLng1 - radLng2;
double result = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2))) * EARTH_RADIUS;
return result;
} /// <summary>
/// 经纬度转化成弧度
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
private static double Rad(double d)
{
return (double)d * Math.PI / 180d;
}
C# 计算地图上某个坐标点的到多边形各边的距离的更多相关文章
- C# 计算地图上某个坐标点的是否在多边形内
这个方法引用自群友的博客 https://www.xiaofengyu.com/?p=143 使用百度地图的时候,常常会用到判断一个点是否在一个多边形的范围内,该方法用到的是射线法, 通过修改Java ...
- 计算地图上两点间的距离PHP类
计算地图上两点间的距离,使用的是谷歌地图 <?php class GeoHelper { /** * @param int $lat1 * @param int $lon1 * @param i ...
- Python计算地图上两点经纬度间的距离
处理地图数据时,经常需要用到两个地理位置间的距离.比如A点经纬度(110.0123, 23.32435),B点经纬度(129.1344,25.5465),求AB两点之间的距离.我们可以用haversi ...
- Openlayers3 计算地图上随意两点间的距离
相应的openlayers的版本号为3.7. 主要用的接口是ol.Sphere.haversineDistance([x1,y1],[x2,y2]): 4326坐标系中计算两点距离的方式为: var ...
- echarts在地图上绘制散点图(任意点)
项目需求:在省份地图上绘制散点图,散点位置不一定是哪个城市或哪个区县,即任意点 通过查询官网文档,找到一个与需求类似的Demo:https://www.echartsjs.com/gallery/ed ...
- 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米
/** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( ...
- C#实现根据地图上的两点坐标,计算直线距离
根据地图上的两点坐标,计算直线距离,在网上找到javascript的写法,用C#实现一下 /// <summary> /// 根据地图上的两点坐标,计算直线距离 /// </summ ...
- 【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍
原文:[百度地图API]如何在地图上添加标注?--另有:坐标拾取工具+打车费用接口介绍 摘要: 在这篇文章中,你将学会,如何利用百度地图API进行标注.如何使用API新增的打车费用接口. ------ ...
- ArcGIS API for JavaScript根据两个点坐标在地图上画线
ArcGIS API for JavaScript根据两个点坐标在地图上画线比如说a(xxxx,xxxxx),b(xxxx,xxxxx).利用这两个点画一条线 var polyline = new e ...
随机推荐
- ansible初识
ansible: 运维自动化的工具, 基本功能, 基于ssh远程连接, 连接验证(ssh-keygen ssh-copy-id ip) 下载: 1. 安装epel源 wget -O /etc/yum ...
- APP数据的爬取
前言 App 的爬取相比 Web 端爬取更加容易,反爬虫能力没有那么强,而且数据大多是以 JSON形式传 输的,解析更加简单.在 Web 端,我们可以通过浏览器的开发者工具监听到各个网络请求和响应过程 ...
- 记事本:js简介
引用js和css很类似,大致有三种方式: 第一种: 在行内引用js, <div onclick="alert(111);"> </div> 第二种: 在行外 ...
- [JLOI2014]松鼠的新家-树链剖分
最开始的时候我在写线段树部分的时候还打了一个build,后来一想,打个球球大作战的build啊!!!有个锤子的用啊!!! #include<bits/stdc++.h> using nam ...
- Fiddler之iOS手机抓包实战操作
准备工作: 1.Fiddler是否安装 2.笔记本的360免费WiFi即可 步骤: 1.官网下载Fiddler并安装 2.打开Fiddler,点击上方Tools,进入Options,选择HTTPS,按 ...
- C++入门篇十
静态成员变量:可以共享数据,类内声明,类外初始化(实现) // 静态成员变量.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include &q ...
- python介绍及下载
python介绍 Python是一种计算机程序设计语言.是一种面向 对象的动态类型语言,支出被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多的被用于独立的.大型醒 ...
- Bootstrap-datepicker3官方文档中文翻译---Options/选项(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)
Options/选项 带“Date”的所有选项都可以处理 Date 对象; 字符串格式化根据 给定的 format 而定; 相对于今天的时间变量, 如 “-1d”, “+6m +1y”等等, 其中有效 ...
- java ReentrantLock结合条件队列 实现生产者-消费者模式 以及ReentratLock和Synchronized对比
package reentrantlock; import java.util.ArrayList; public class ProviderAndConsumerTest { static Pro ...
- .Net core使用Autofac进行依赖注入示例
一.官方文档 https://autofaccn.readthedocs.io/zh/latest/index.html 二.新建.net core 控制台程序 三.注册类型,示例一 1.新建接口 I ...