Java 判断 一个点是不是在一个多边形围起来

 我来答
清新的怪兽
2018-01-19 · TA获得超过220个赞
知道小有建树答主
回答量:318
采纳率:87%
帮助的人:165万
展开全部

MobilelocationEntity 是手机位置信息类 包含经度纬度

Enclosure 围栏类 每一个对象是形成多边形围栏的一个点 包含经度纬度

[java] view plain copy

  • package com.sdunicomsi.util.map;  

  • import java.awt.geom.Point2D;  

  • import java.util.ArrayList;  

  • import java.util.List;  

  • import com.sdunicomsi.cgzft.entity.gis.Enclosure;  

  • import com.sdunicomsi.cgzft.entity.gis.MobilelocationEntity;  

  • /** 

  • *  

  • * @author lxg 

  • */  

  • public class MapTools {  

  • /** 

  • * 判断当前位置是否在围栏内 

  • * @param mobilelocationEntity 

  • * @param enclosureList 

  • * @return 

  • */  

  • public static boolean isInPolygon(MobilelocationEntity mobilelocationEntity,List<Enclosure> enclosureList){  

  • double p_x =Double.parseDouble(mobilelocationEntity.getLongitude());  

  • double p_y =Double.parseDouble(mobilelocationEntity.getLatitude());  

  • Point2D.Double point = new Point2D.Double(p_x, p_y);  

  • List<Point2D.Double> pointList= new ArrayList<Point2D.Double>();  

  • for (Enclosure enclosure : enclosureList){  

  • double polygonPoint_x=enclosure.getLongitude();  

  • double polygonPoint_y=enclosure.getLatitude();  

  • Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x,polygonPoint_y);  

  • pointList.add(polygonPoint);  

  • }  

  • MapTools test = new MapTools();  

  • return test.checkWithJdkGeneralPath(point,pointList);  

  • }  

  • /** 

  • * 返回一个点是否在一个多边形区域内 

  • * @param point 

  • * @param polygon 

  • * @return 

  • */  

  • private boolean checkWithJdkGeneralPath(Point2D.Double point, List<Point2D.Double> polygon) {  

  • java.awt.geom.GeneralPath p = new java.awt.geom.GeneralPath();  

  • Point2D.Double first = polygon.get(0);  

  • p.moveTo(first.x, first.y);  

  • polygon.remove(0);  

  • for (Point2D.Double d : polygon) {  

  • p.lineTo(d.x, d.y);  

  • }  

  • p.lineTo(first.x, first.y);  

  • p.closePath();  

  • return p.contains(point);  

  • }  

  • }  

  • [java] view plain copy

  • 第二种方法  

  • [java] view plain copy

  • // 方法二  

  • // 方法二  

  • public boolean checkWithJdkPolygon(Point2D.Double point, List<Point2D.Double> polygon) {  

  • java.awt.Polygon p = new Polygon();  

  • // java.awt.geom.GeneralPath  

  • final int TIMES = 1000;  

  • for (Point2D.Double d : polygon) {  

  • int x = (int) d.x * TIMES;  

  • int y = (int) d.y * TIMES;  

  • p.addPoint(x, y);  

  • }  

  • int x = (int) point.x * TIMES;  

  • int y = (int) point.y * TIMES;  

  • return p.contains(x, y);  

  • }  

简漠谷尔白
2020-07-31 · TA获得超过1220个赞
知道小有建树答主
回答量:1922
采纳率:91%
帮助的人:9.3万
展开全部
思路大概就是:判断这个点的横坐标、纵坐标绝对值在这个list中的各顶点的横坐标、纵坐标区间内(也就是说,将list的各顶点按照横坐标、纵坐标分别排序,再判断某个点的横纵坐标是否在排序后的list内)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式