You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Java实现:如何判断经纬度坐标是否在多边形内部

解决地理坐标点是否在多边形内部的问题

嘿,你遇到的问题我太熟悉了——普通的Polygon类根本不适合处理地理经纬度!我来给你拆解下问题和解决方案:

核心问题出在哪?

  1. 坐标系不匹配java.awt.Polygon这类平面多边形工具是为笛卡尔坐标系设计的,完全没考虑地球是个球体的曲率问题。如果你的多边形范围稍大,平面计算的误差会直接导致判断错误。
  2. 经纬度顺序搞反了:你把纬度放到了xCoords,经度放到了yCoords——地理坐标里,经度是横向的(对应平面X轴),纬度是纵向的(对应平面Y轴),顺序反了的话,多边形的形状会完全错位,判断结果肯定不对。

最佳解决方案:用专业空间几何库(JTS)

最靠谱的方式是用专门处理空间数据的库,比如Java Topology Suite(JTS),它完美支持地理坐标的点-in-多边形判断。

步骤1:引入JTS依赖

如果用Maven,在pom.xml里加:

<dependency>
    <groupId>org.locationtech.jts</groupId>
    <artifactId>jts-core</artifactId>
    <version>1.19.0</version>
</dependency>

步骤2:编写判断代码

注意JTS的坐标顺序是**(经度,纬度)**,而且多边形必须闭合(最后一个点和第一个点重合):

import org.locationtech.jts.geom.*;

public class GeoPolygonChecker {
    public static void main(String[] args) {
        // 构造多边形坐标:经度在前,纬度在后,最后闭合
        Coordinate[] polygonCoords = new Coordinate[]{
            new Coordinate(14.211753, 40.842226),
            new Coordinate(14.229262, 40.829498),
            new Coordinate(14.26617, 40.833394),
            new Coordinate(14.278701, 40.84768),
            new Coordinate(14.27715, 40.858716),
            new Coordinate(14.211753, 40.842226) // 必须闭合
        };

        // 创建JTS的多边形和点对象
        GeometryFactory factory = new GeometryFactory();
        Polygon polygon = factory.createPolygon(polygonCoords);
        Point myPoint = factory.createPoint(new Coordinate(14.245, 40.84)); // 你的待判断点

        // 执行判断
        boolean isInside = polygon.contains(myPoint);
        System.out.println("这个点在多边形内部吗?" + isInside);
    }
}

应急方案:小范围区域用普通Polygon(不推荐)

如果你的多边形范围极小(比如一个小区、一栋楼),可以忽略球面曲率,先纠正经纬度顺序,再放大坐标避免精度丢失(因为java.awt.Polygon只支持整数坐标):

import java.awt.Polygon;

public class QuickPolygonCheck {
    public static void main(String[] args) {
        // 纠正顺序:经度作为x,纬度作为y,放大1e6转成整数
        int[] xCoords = new int[]{
            (int)(14.211753 * 1e6),
            (int)(14.229262 * 1e6),
            (int)(14.26617 * 1e6),
            (int)(14.278701 * 1e6),
            (int)(14.27715 * 1e6)
        };
        int[] yCoords = new int[]{
            (int)(40.842226 * 1e6),
            (int)(40.829498 * 1e6),
            (int)(40.833394 * 1e6),
            (int)(40.84768 * 1e6),
            (int)(40.858716 * 1e6)
        };

        Polygon polygon = new Polygon(xCoords, yCoords, xCoords.length);
        // 待判断点同样放大
        int pointX = (int)(14.245 * 1e6);
        int pointY = (int)(40.84 * 1e6);

        boolean isInside = polygon.contains(pointX, pointY);
        System.out.println("点是否在内部:" + isInside);
    }
}

⚠️ 注意:这个方法只适合极小范围,稍微大一点的区域(比如一个城市)就会因为球面曲率出现误差,结果不可靠。

内容的提问来源于stack exchange,提问作者MarioC

火山引擎 最新活动