空间搜索-射线法

本文介绍了在配送场景下,如何利用射线法判断用户定位点是否在商户配送区域内。针对精度和误判问题,文章详细探讨了存储点坐标类型的选择,并分享了为何采用Java的Polygon#contains方法,以及射线法在实际应用中与geohash和空间索引的结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

空间搜索-射线法

在配送场景下,每个商户都有自己的配送区域,底层数据是按照geojson格式保存对应的配送区域

比如下面的多边形对应的存储格式和地图上表示的范围
{
   
	"type": "Feature",
	"properties": {
   },
	"geometry": {
   
		"type": "Polygon",
		"coordinates": [
			[
				[106.10595703125, 33.33970700424026],
				[106.32568359375, 32.41706632846282],
				[108.03955078125, 32.2313896627376],
				[108.25927734375, 33.15594830078649],
				[106.10595703125, 33.33970700424026]
			]
		]
	}
}



在这里插入图片描述

在配送场景下每个商户都有多个如上图的配送区域,搜索干的事就是判断用户定位点是不是在这个配送区域里面,这不就是几何判断逻辑嘛!?



射线法

在几何学中,PIP(Point in Polygon)问题即判断一点在多边形的内部或外部。

射线法(Ray casting algorithm)是一种判断点是否在多边形内部的一种简单方法。即从该点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外部。

在这里插入图片描述
如何理解呢?
其实,对于平面内任意闭合曲线,曲线都把平面分割成了内、外两部分。对于平面内任意一条直线,在穿越多边形边界时,有且只有两种情况:进入多边形或穿出多边形。即:
如果点在多边形内部,射线第一次穿越边界一定是穿出多边形。
如果点在多边形外部,射线第一次穿越边界一定是进入多边形。
由于直线可以无限延伸,而闭合曲线包围的区域是有限的,因此最后一次穿越多边形边界,一定是穿出多边形,到达外部。

由上可推断,从一点做一条射线,计算它跟多边形边界的交点个数,如果交点个数为奇数,那么点在多边形内部,否则点在多边形外部。

这里直接上代码

import java.io.Serializable;
import java.util.List;

/**
 * @author duson
 */
public class MyPoly {
   

    private List<Corner> corner;

    public List<Corner> getCorner() {
   
        return corner;
    }

    public void setCorner(List<Corner> corner) 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值