经纬度计算是否在圆形内,是否在矩形内,是否在多边形内方法

class 点面关系
{
static void Main(string[] args)
{
//Vector2D point1
= new Vector2D(39.909209536859834, 116.3225715637207);//in
Vector2D point1 =
new Vector2D(39.901045, 116.415596);//out
Vector2D cPoint = new
Vector2D(39.909209536859834,
116.3225715637207); 
Console.WriteLine("点是否在圆内:" + 点是否在圆内(cPoint, 8000,
point1));
Console.WriteLine("点是否在圆内:" + 点是否在圆内(cPoint, new
Vector2D(39.901045, 116.415596), point1));

//Vector2D point2 = new Vector2D(39.924745, 116.379204);//in
Vector2D
point2 = new Vector2D(39.928695, 116.546059);//out
Vector2D pointA = new
Vector2D(39.913423004886866, 116.36890411376953);
Vector2D pointB = new
Vector2D(39.93450133090293,
116.38727188110351); 
Console.WriteLine("点是否在矩形内:" + 点是否在矩形内(pointA,
pointB, point2));

Vector2D point3 = new Vector2D(39.957649, 116.376801);//in
//Vector2D
point3 = new Vector2D(39.919216, 116.2817);//out
List<Vector2D> polygon
= new List<Vector2D>();
polygon.Add(new Vector2D(39.909209536859834,
116.3225715637207));
polygon.Add(new Vector2D(39.95920953685983,
116.3725715637207));
polygon.Add(new Vector2D(39.95920953685983,
116.42257156372072));
polygon.Add(new Vector2D(39.909209536859834,
116.4725715637207));
polygon.Add(new Vector2D(39.85920953685984,
116.42257156372072));
polygon.Add(new Vector2D(39.85920953685984,
116.3725715637207)); 
Console.WriteLine("点是否在多边形内:" + 点是否在多边形内(point3,
polygon));

Console.ReadLine();
}

/// <summary>
/// 点是否在圆内(在边上也认为在圆内)
/// </summary>
///
<param name="cPoint">圆心坐标</param>
/// <param
name="cRadius">圆半径</param>
/// <param
name="point">当前点</param>
///
<returns></returns>
public static bool 点是否在圆内(Vector2D cPoint,
double cRadius, Vector2D point)
{
var d1 = Distance(cPoint.Lat,
cPoint.Lon, point.Lat, point.Lon);
double distance =
Math.Sqrt(Math.Pow(Math.Abs(point.X - cPoint.X), 2) + Math.Pow(Math.Abs(point.Y
- cPoint.Y), 2));
return distance <= cRadius;
}

private static double Distance(double lon1, double lat1, double lon2, double
lat2)
{
double R = 6378137; //地球半径
lat1 = lat1 * Math.PI /
180.0;
lat2 = lat2 * Math.PI / 180.0; 
double sa2 = Math.Sin((lat1 -
lat2) / 2.0);
double sb2 = Math.Sin(((lon1 - lon2) * Math.PI / 180.0) /
2.0);
return 2 * R * Math.Asin(Math.Sqrt(sa2 * sa2 + Math.Cos(lat1) *
Math.Cos(lat2) * sb2 * sb2));
}

/// <summary>
/// 点是否在圆内(在边上也认为在圆内)
/// </summary>
///
<param name="cPoint">圆心坐标</param>
/// <param
name="onPoint">圆边上坐标</param>
/// <param
name="point">当前点</param>
///
<returns></returns>
public static bool 点是否在圆内(Vector2D cPoint,
Vector2D onPoint, Vector2D point)
{
double cRadius = Distance(cPoint.Lat,
cPoint.Lon, onPoint.Lat, onPoint.Lon);
double distance = Distance(cPoint.Lat,
cPoint.Lon, point.Lat, point.Lon);
return distance <= cRadius;
}

/// <summary>
/// 点是否在多边形内(在边上也认为在多边形内)
///
</summary>
/// <param name="point">当前点</param>
///
<param name="polygon">多边形点</param>
///
<returns></returns>
public static bool 点是否在多边形内(Vector2D point,
List<Vector2D> polygon)
{
var res =
SMath.CalcPointPolygonRelation(point, polygon);
return res !=
PointPolygonRelation.OutOfPolygon;
}

/// <summary>
/// 点是否在矩形内
/// </summary>
/// <param
name="pointA">对角上点A</param>
/// <param
name="pointB">对角上点B</param>
/// <param
name="point">当前点</param>
///
<returns></returns>
public static bool 点是否在矩形内(Vector2D pointA,
Vector2D pointB, Vector2D point)
{
List<Vector2D> polygon = new
List<Vector2D>();
polygon.Add(pointA);
polygon.Add(new
Vector2D(pointA.X, pointB.Y));
polygon.Add(pointB); 
polygon.Add(new
Vector2D(pointB.X, pointA.Y));
var res =
SMath.CalcPointPolygonRelation(point, polygon);
return res !=
PointPolygonRelation.OutOfPolygon;
}
}

******************

public static PointPolygonRelation CalcPointPolygonRelation(double x, double
y, IList polygon)
{
if(polygon.Count < 3) return
PointPolygonRelation.OutOfPolygon;
IVector start =
(IVector)polygon[polygon.Count - 2];
if(start == null) return
PointPolygonRelation.OutOfPolygon;
IVector middle =
(IVector)polygon[polygon.Count - 1];
IVector end;
PointPolygonRelation
result = PointPolygonRelation.OutOfPolygon;
int num = 0;
double minX,
minY, maxX, maxY;
for(int i = 0; i < polygon.Count; i++, start = middle,
middle = end)
{
end = (IVector)polygon[i];
//如果点刚好在顶点上,则直接返回
if((x
== start.X && y == start.Y) || (x == middle.X && y == middle.Y)
|| (x == end.X && y == end.Y))
{
result =
PointPolygonRelation.OnPolygonVertex;
goto Return;
}
if(middle.X ==
end.X && middle.Y == end.Y)
{
continue;
}
minX =
Math.Min(middle.X, end.X);
maxX = Math.Max(middle.X,
end.X);
//如果X不落在最大X值和最小X值之间,则跳过
if(x > maxX || x < minX)
continue;

minY = Math.Min(middle.Y, end.Y);
maxY = Math.Max(middle.Y,
end.Y);
//如果Y大于最大Y值则跳过,因为向上做射线不可能相交
if(y > maxY) continue;
if(minX
== maxX)//需要判断相交的线段为Y轴平行线
{
if(y > minY && y <
maxY)
{
result = PointPolygonRelation.OnPolygonBorder;
goto
Return;
}
else if(y <
minY)//如果在最小的Y之下,因为目标线段为Y轴平行线,所以记为1次
{
num++;
}
}
else
{
double
k = (middle.Y - end.Y) / (middle.X - end.X);
double b = middle.Y - k *
middle.X;

double crossY = k * x + b;

if(crossY < y) continue;//如果交点小于y则跳过,因为我们是向上做射线

if(crossY == y)
{
result =
PointPolygonRelation.OnPolygonBorder;
goto Return;
}

if(x == maxX || x == minX)
{
if((start.X > middle.X && end.X
< middle.X) || (start.X < middle.X && end.X >
middle.X))
num++;
}
else
{
num++;
}
}
}

if(num % 2 != 0) result = PointPolygonRelation.InPolygon;
Return:

return result;
}

/// <summary>
/// 计算点和面的关系
/// </summary>
/// <param
name="point"></param>
/// <param
name="polygon"></param>
///
<returns></returns>
public static PointPolygonRelation
CalcPointPolygonRelation(IVector point, IList polygon)
{
return
CalcPointPolygonRelation(point.X, point.Y, polygon);
}

_____________

public enum PointPolygonRelation
{
/// <summary>
///
点在面内
/// </summary>
InPolygon,
/// <summary>
///
点在边上
/// </summary>
OnPolygonBorder,
/// <summary>
///
点在面外
/// </summary>
OutOfPolygon,
/// <summary>
///
点在面的拐点上
/// </summary>
OnPolygonVertex
}

经纬度计算是否在圆形内,是否在矩形内,是否在多边形内方法,布布扣,bubuko.com

时间: 2024-07-31 14:24:31

经纬度计算是否在圆形内,是否在矩形内,是否在多边形内方法的相关文章

3.2 多边形的交点 [点/多边形 内/外 测试]

一旦得到平面方程,就可以进行射线/多边形的交点.在计算射线/平面交叉后,下一步是确定交点是否在多边形内. 有许多不同的方法可以解决这个问题.Berlin[1]很好地概述了一些技术.这里给出的方法是在[14]中提出的"射线相交"算法的一个修改版本.该算法的工作原理是,从交点处向任意方向发射一束射线,并计算相交的线段数.如果交叉的数目是奇数,则点在多边形内;其他外.这就是所谓的Jordan曲线定理.图6描述了这个定理的用法.下面提出的改进算法优雅地处理了测试光线与多边形顶点相交的特殊情况.

php向js的函数内传递参数-用经纬度计算2点间距离

有时候需要从php传递数据到js,这时候该怎么办呢?实例;php微信开发,用经纬度计算2点间的距离,2个坐标分别从php和js获得. 基于tp5框架的开发. 说一下注意事项: 1.php实际不能直接传递数据到js,他们两个没办法直接交互 2.可以通过一个桥梁交互,就是html 3.做法就是把js写在html页面内,然后再把把php传递过来的数据变量写在js代码内. 主要易混点在html页面 核心代码如下,从857行开始: <!DOCTYPE html> <!-- saved from u

根据经纬度和半径计算经纬度范围,根据两点经纬度计算距离

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

地理空间距离计算及优化(根据两个点经纬度计算距离)

1.地理空间距离计算面临的挑战 打开美团app,不管是筛选团购还是筛选商家,默认的排序项都是"离我最近"或者"智能排序"(如下图所示). 不管是"离我最近"还是"智能排序",都涉及到计算用户位置与各个团购单子或者商家的距离(注:在智能排序中距离作为一个重要的参数参与排序打分).以筛选商家为例,北京地区有5~6w个POI(本文将商家称之为POI),当用户进入商家页,请求北京全城+所有品类+离我最近/智能排序时,我们筛选服务需要计

地理空间距离计算及优化(依据两个点经纬度计算距离)

1.地理空间距离计算面临的挑战 打开美团app.无论是筛选团购还是筛选商家,默认的排序项都是"离我近期"或者"智能排序"(例如以下图所看到的). 无论是"离我近期"还是"智能排序".都涉及到计算用户位置与各个团购单子或者商家的距离(注:在智能排序中距离作为一个重要的參数參与排序打分).以筛选商家为例.北京地区有5~6w个POI(本文将商家称之为POI),当用户进入商家页,请求北京全城+全部品类+离我近期/智能排序时.我们筛选服

PHP根据两点间的经纬度计算距离,php两点经纬度计算(转)

这是一个不错的示例,直接贴代码,首先要知道纬度值.经度值 /** * @desc 根据两点间的经纬度计算距离 * @param float $lat 纬度值 * @param float $lng 经度值 */ function getDistance($lat1, $lng1, $lat2, $lng2) { $earthRadius = 6367000; //approximate radius of earth in meters /* Convert these degrees to r

(转)根据经纬度计算方位距离

(原文地址:http://www.cnblogs.com/leejuan/p/5552460.html) 1.根据两点经纬度计算其间距离,发现有3种公式,结果区别不是很大. 2.根据一点的经纬度与到另外一点的距离.方位角,计算另一点的经纬度,误差不是很大. 1 /**  2  *   3  * 计算经纬度.距离.方位角  4  *   5  * */   6 public class CalculationLogLatDistance {   7     /**  8      * 地球赤道半径

记录两个函数--1.计算某个经纬度的周围某段距离的正方形的四个点。2.根据两点间的经纬度计算距离

前些日子在做手机网站开发的时候碰到这样一个需求,用某度地图的定位功能查看自己现在所在的位置,同时要显示出以自己为圆心,周围1000米以内的商家.功能很简单,拿到自己的经纬度,算出四个点的经纬度坐标,从数据库里拿出相对应的商家,显示在地图上即可,关键就是需要这么一个好用函数.还好找到了一个不错的,分享给大家,估计大家做到这一块的时候应该也会用到. /**  * 计算某个经纬度的周围某段距离的正方形的四个点  * 地球半径,平均半径为6371km  * @param lng float 经度  *

php根据经纬度计算距离和方向--摘录自http://haotushu.sinaapp.com/post-520.html

define('EARTH_RADIUS', 6367000);//需定义的静态变量 function getRadian($d) { return $d * M_PI / 180; } function getDistance ($lat1, $lng1, $lat2, $lng2) { $lat1 =getRadian($lat1); $lat2 = getRadian($lat2); $a = $lat1 - $lat2; $b = getRadian($lng1) - getRadian