【GIS算法:点在多边形内】射线法判断点在多边形内

55 篇文章 4 订阅
14 篇文章 12 订阅

射线法一般情况思路:

        从目标点出发朝x轴正方向引一条射线,计算这条射线和多边形所有边的交点数目。

        如果交点个数为奇数,则目标点在多边形内部;

        如果交点个数为偶数,则目标点在多边形外部

演示如下:

算法如下:

function isPointInPolygon(pt, pts) {
  // 交点个数
  var counter = 0;
  // 水平射线和多边形边的交点x坐标
  var xinters;
  // 线段起点和终点
  var p1, p2;
  // for循环
  for (let i = 0; i <  pts.length; i++) {
      p1=pts[i] 
      p2 = pts[(i+1) % pts.length];// 最后一个点等于起点pts[0]
      if (pt[1] > Math.min(p1[1], p2[1]) &&pt[1] <= Math.max(p1[1], p2[1])) {
          xinters =
              (pt[1] - p1[1]) *
                  (p2[0] - p1[0]) /
                  (p2[1] - p1[1]) +
              p1[0];
          if (p1[1] == p2[1] || pt[0] <= xinters) {
              counter++;
          }
      }
  }
  if (counter % 2 == 0) {
      return false;
  } else {
      return true;
  }
}

算法中核心有两步;

以多边形的P1P2线段为例,其他的线段道理一样,遍历计算即可;

图示如下;就是确定P点在两条虚线中间;然后P点在G点左侧

(1) 根据y值限定范围

代码一:pt[1] > Math.min(p1[1], p2[1]) &&pt[1] <= Math.max(p1[1], p2[1])

        上面代码表示:如果P点的y0值在两条虚线y1和y2内,则算法继续执行;即如果大于最大虚线或者小于最小虚线,那么过P点的射线不可能和线段有交点,直接返回false即可 

(2)  确定是否有交点

代码:pt[0] <= (pt[1] - p1[1]) *(p2[0] - p1[0]) /(p2[1] - p1[1]) +p1[0]

        上面代码表示:计算水平射线和线段的交点x坐标;因为是朝向x轴正方向的射线,如果交点x在目标点p的右侧,即可判断有交点;count+1;

        原理就是先确定P1P2的直线方程(y-y1)/(y2-y1)=(x-x1)/(x2-x1)   ;然后将y=y0代入即可求出G点的x0坐标;​​​​​​​

(3)最后验证一下:

        打开geojson.io

        拾取如下的多边形和三个点位的坐标;用上面的函数测试

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在Spring Boot中判断GIS坐标是否在某地理区域内,你可以使用Java的Geometry库来实现。下面是一个简单的示例代码: 首先,你需要引入相关的依赖: ```xml <dependency> <groupId>org.locationtech.jts</groupId> <artifactId>jts-core</artifactId> <version>1.18.0</version> </dependency> ``` 然后,你可以创建一个方判断坐标是否在指定的地理区域内: ```java import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; public class GisUtils { public static boolean isPointInPolygon(double lat, double lon, double[] polygonCoordinates) { GeometryFactory geometryFactory = new GeometryFactory(); // 创建坐标 Coordinate coordinate = new Coordinate(lon, lat); Point point = geometryFactory.createPoint(coordinate); // 创建多边形 Coordinate[] coordinates = new Coordinate[polygonCoordinates.length / 2]; for (int i = 0; i < polygonCoordinates.length; i += 2) { coordinates[i / 2] = new Coordinate(polygonCoordinates[i + 1], polygonCoordinates[i]); } Polygon polygon = geometryFactory.createPolygon(coordinates); // 判断是否在多边形内 return polygon.contains(point); } } ``` 在上面的代码中,`isPointInPolygon`方接受一个纬度(lat)、经度(lon)以及地理区域的坐标数组(polygonCoordinates)。它会创建一个坐标和一个多边形,并使用JTS库的`contains`方判断是否在多边形内部。 你可以在Spring Boot应用中使用该方判断坐标是否在指定的地理区域内。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨大大28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值