java百度地图api判断点是否在圆形内_百度地图判断点是否在多边形内

这篇博客介绍了如何在Java中判断点是否在多边形内,通过射线法检查点与多边形边的交点个数,提供了两种实现方式,一种涉及除法运算,另一种采用斜率判断并避免除法,提高效率。
摘要由CSDN通过智能技术生成

jsapi里有如何判断点是否在多边形内的例子,但是这个项目根据实际需要,需要在后台来判断,点是否在多边形中,但是在百度地图web服务api中没有相关的方法,

只有百度其他的了:主要看来数学要不错才行啊。亲测可用。我用的第二种方法:

具体解法:

要判断点是否在多边形的内部,适用于任意多边形的方法最常用的就是射线法,即以要判断的点向左或者向右作水平射线,与多边形交点的个数为奇数个时则在多边形的内部,若为偶数个交点时则在多边形的外部,其中0个交点也为偶数个交点。

依据该原理,于是有了第一种实现:

///

/// 判断点是否在多边形内.

/// ----------原理----------

/// 注意到如果从P作水平向左的射线的话,如果P在多边形内部,那么这条射线与多边形的交点必为奇数,

/// 如果P在多边形外部,则交点个数必为偶数(0也在内)。

/// 所以,我们可以顺序考虑多边形的每条边,求出交点的总个数。还有一些特殊情况要考虑。假如考虑边(P1,P2),

/// 1)如果射线正好穿过P1或者P2,那么这个交点会被算作2次,处理办法是如果P的从坐标与P1,P2中较小的纵坐标相同,则直接忽略这种情况

/// 2)如果射线水平,则射线要么与其无交点,要么有无数个,这种情况也直接忽略。

/// 3)如果射线竖直,而P0的横坐标小于P1,P2的横坐标,则必然相交。

/// 4)再判断相交之前,先判断P是否在边(P1,P2)的上面,如果在,则直接得出结论:P再多边形内部。

///

/// 要判断的点

/// 多边形的顶点

///

public static bool IsInPolygon2(PointF checkPoint, List polygonPoints)

{

int counter = 0;

int i;

double xinters;

PointF p1, p2;

int pointCount = polygonPoints.Count;

p1 = polygonPoints[0];

for (i = 1; i <= pointCount; i++)

{

p2 = polygonPoints[i % pointCount];

if (checkPoint.Y > Math.Min(p1.Y, p2.Y)//校验点的Y大于线段端点的最小Y

&& checkPoint.Y <= Math.Max(p1.Y, p2.Y))//校验点的Y小于线段端点的最大Y

{

if (checkPoint.X <= Math.Max(p1.X, p2.X))//校验点的X小于等线段端点的最大X(使用校验点的左射线判断).

{

if (p1.Y != p2.Y)//线段不平行于X轴

{

xinters = (checkPoint.Y - p1.Y) * (p2.X - p1.X) / (p2.Y - p1.Y) + p1.X;

if (p1.X == p2.X || checkPoint.X <= xinters)

{

counter++;

}

}

}

}

p1 = p2;

}

if (counter % 2 == 0)

{

return false;

}

else

{

return true;

}

}

由于上述的方法中关键的判断在于xinters = (checkPoint.Y - p1.Y) * (p2.X - p1.X) / (p2.Y - p1.Y) + p1.X,这里使用了除法,一般而言除法的速度会低于乘法,特别是当除法是浮点数的时候,那能否改用乘法来实现呢?答案是可以的,只要进行一定的变换就可以实现。下面是第二种实现方法。

///

/// 判断点是否在多边形内.

/// ----------原理----------

/// 注意到如果从P作水平向左的射线的话,如果P在多边形内部,那么这条射线与多边形的交点必为奇数,

/// 如果P在多边形外部,则交点个数必为偶数(0也在内)。

///

/// 要判断的点

/// 多边形的顶点

///

public static bool IsInPolygon(PointF checkPoint, List polygonPoints)

{

bool inside = false;

int pointCount = polygonPoints.Count;

PointF p1, p2;

for (int i = 0, j = pointCount - 1; i < pointCount; j = i, i++)//第一个点和最后一个点作为第一条线,之后是第一个点和第二个点作为第二条线,之后是第二个点与第三个点,第三个点与第四个点...

{

p1 = polygonPoints[i];

p2 = polygonPoints[j];

if (checkPoint.Y < p2.Y)

{//p2在射线之上

if (p1.Y <= checkPoint.Y)

{//p1正好在射线中或者射线下方

if ((checkPoint.Y - p1.Y) * (p2.X - p1.X) > (checkPoint.X - p1.X) * (p2.Y - p1.Y))//斜率判断,在P1和P2之间且在P1P2右侧

{

//射线与多边形交点为奇数时则在多边形之内,若为偶数个交点时则在多边形之外。

//由于inside初始值为false,即交点数为零。所以当有第一个交点时,则必为奇数,则在内部,此时为inside=(!inside)

//所以当有第二个交点时,则必为偶数,则在外部,此时为inside=(!inside)

inside = (!inside);

}

}

}

else if (checkPoint.Y < p1.Y)

{

//p2正好在射线中或者在射线下方,p1在射线上

if ((checkPoint.Y - p1.Y) * (p2.X - p1.X) < (checkPoint.X - p1.X) * (p2.Y - p1.Y))//斜率判断,在P1和P2之间且在P1P2右侧

{

inside = (!inside);

}

}

}

return inside;

}

这里还使用一个隐含的知识,即顶点在射线之上。该方法摘自于《计算机图形学几何工具算法详解》。运行结果如下图:

184e502db223de7c87402a2f6dbd9cae.png

摘自:https://blog.csdn.net/xxdddail/article/details/49093635

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现百度地图的电子围栏,可以使用百度地图 JavaScript API 和 Vue.js 框架来实现。以下是实现步骤: 1. 首先,在 HTML 引入百度地图 JavaScript API 的库文件和 Vue.js 的库文件。 ```html <script src="http://api.map.baidu.com/api?v=2.0&ak=your_ak"></script> <script src="https://cdn.jsdelivr.net/npm/vue"></script> ``` 2. 创建一个地图容器,用于显示地图。 ```html <div id="map"></div> ``` 3. 在 Vue.js 创建一个地图实例,并设置地图的和缩放级别。 ```javascript new Vue({ el: '#map', data: { map: null, fence: null // 电子围栏对象 }, mounted() { this.map = new BMap.Map('map'); this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 15); } }); ``` 4. 实现电子围栏的绘制。可以使用百度地图提供的覆盖物来实现电子围栏的绘制,比如圆形多边形等。这里以圆形为例。 ```javascript drawFence() { // 获取圆形和半径 const center = new BMap.Point(116.404, 39.915); const radius = 1000; // 创建圆形覆盖物 const circle = new BMap.Circle(center, radius, { strokeColor: '#f00', strokeWeight: 2, strokeOpacity: 0.5, fillColor: '#f00', fillOpacity: 0.1 }); // 添加圆形覆盖物到地图上 this.fence = circle; this.map.addOverlay(circle); } ``` 5. 给电子围栏添加事件监听器。可以使用覆盖物的事件监听器来实现电子围栏的事件处理,比如进入、离开等。 ```javascript addFenceListener() { this.fence.addEventListener('mouseover', () => { console.log('进入电子围栏'); }); this.fence.addEventListener('mouseout', () => { console.log('离开电子围栏'); }); } ``` 6. 最后,在 Vue.js 的生命周期函数调用以上方法,实现电子围栏的创建和事件监听。 ```javascript mounted() { this.map = new BMap.Map('map'); this.map.centerAndZoom(new BMap.Point(116.404, 39.915), 15); // 绘制电子围栏 this.drawFence(); // 添加电子围栏事件监听器 this.addFenceListener(); } ``` 以上是使用百度地图 JavaScript API 和 Vue.js 框架实现百度地图的电子围栏的基本步骤。具体实现还需根据实际需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值