Java判断坐标点是否在片区内—代码备份

本文介绍了一种基于Java的方法,用于确定地图上的一个给定点(由经纬度定义)是否位于特定的地理区域或多边形内。该方法首先获取所有地理区域的数据,然后检查每个区域的边界点,最终判断给定点是否在这些区域内的任意一个多边形内。

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

package com.sun4j.module.util;import com.daoles.module.entity.Area;import com.daoles.module.entity.AreaInfo;import com.daoles.module.service.AreaInfoService;import com.daoles.module.service.AreaService;import java.awt.geom.Point2D;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * description: 技术百度地图中的点在某个片区中 * Created by Sunlight on 2017/4/27. */public class MapTools { /** * 传入一个坐标点判断 * @param areaService * @param areaInfoService * @param x 经度 * @param y 纬度 * @return 返回改点对应的片区 */ public static Area getAreaByPoint(AreaService areaService, AreaInfoService areaInfoService,Double x,Double y){ Point2D.Double point = new Point2D.Double(x, y); Map<String,Object> params=new HashMap<>(); params.put("deleted",0); //查询所有片区 List<Area> areas=areaService.findList(params); if (areas.size()==0){ return null; } for (Area area : areas){ params=new HashMap<>(); params.put("areaId",area.getId()); List<AreaInfo> areaInfos=areaInfoService.findList(params); if (areaInfos.size()==0){ continue; } List<Point2D.Double> pts = new ArrayList<Point2D.Double>(); for (AreaInfo info : areaInfos) { pts.add(new Point2D.Double(info.getLng(), info.getLat())); } if (IsPtInPoly(point, pts)) { System.out.println("===========点在多边形内==========="); return area; } else { System.out.println("===========点在多边形外==========="); continue; } } return null; } /** * 判断点是否在多边形内 * * @param point 检测点 * @param pts 多边形的顶点 * @return 点在多边形内返回true, 否则返回false */ public static boolean IsPtInPoly(Point2D.Double point, List<Point2D.Double> pts) { int N = pts.size(); boolean boundOrVertex = true; //如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true int intersectCount = 0;//cross points count of x double precision = 2e-10; //浮点类型计算时候与0比较时候的容差 Point2D.Double p1, p2;//neighbour bound vertices Point2D.Double p = point; //当前点 p1 = pts.get(0);//left vertex for (int i = 1; i <= N; ++i) {//check all rays if (p.equals(p1)) { return boundOrVertex;//p is an vertex } p2 = pts.get(i % N);//right vertex if (p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) {//ray is outside of our interests p1 = p2; continue;//next ray left point } if (p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) {//ray is crossing over by the algorithm (common part of) if (p.y <= Math.max(p1.y, p2.y)) {//x is before of ray if (p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) {//overlies on a horizontal ray return boundOrVertex; } if (p1.y == p2.y) {//ray is vertical if (p1.y == p.y) {//overlies on a vertical ray return boundOrVertex; } else {//before ray ++intersectCount; } } else {//cross point on the left side double xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;//cross point of y if (Math.abs(p.y - xinters) < precision) {//overlies on a ray return boundOrVertex; } if (p.y < xinters) {//before ray ++intersectCount; } } } } else {//special case when ray is crossing through the vertex if (p.x == p2.x && p.y <= p2.y) {//p crossing over p2 Point2D.Double p3 = pts.get((i + 1) % N); //next vertex if (p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) {//p.x lies between p1.x & p3.x ++intersectCount; } else { intersectCount += 2; } } } p1 = p2;//next ray left point } return intersectCount % 2 != 0; }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值