直接上代码

/*主要算法,判断给定坐标是否在指定区域内
     * 参数:入参经度列,纬度列,经度,纬度;出参true-false
     * step1:取4个最值,先判断点与最值的位置关系
     * step2:点与边界点位置关系
     * step3:核心算法,判断点所引的横向射线与不规则区域交点个数
     */
    public static boolean JudgeInOutFirst(double[] LngCollotions,double[] LatCollotions,double Lng,double Lat){
        //点在最值区域外
        if(Lng<GetMinLng(LngCollotions)||Lng>GetMaxLng(LngCollotions)||Lat<GetMinLat(LatCollotions)||Lat>GetMaxLat(LatCollotions)){
            return false;
        }else{
            int nvert =LngCollotions.length;//点数
            int i,j,c=0,k=0;
            //该点位与n个点所成n-1条线的判断
            for(i=0,j=nvert-1;i<nvert;j=i++){
                
                boolean LngTemp =(LngCollotions[i]==Lng);
                Boolean latTemp = (LatCollotions[i]==Lat);
                
                if(LngTemp&&latTemp){
                    //点在点上
                    return true;
                }else if(((LngCollotions[i]>=Lng) !=(LngCollotions[j]>=Lng))&&
                        (Lat==(LatCollotions[j]-LatCollotions[i])*(Lng-LngCollotions[i])/(LngCollotions[j]-LngCollotions[i])+LatCollotions[i])) {
                    //点在边界线上
                    return true;
                }else if(((LngCollotions[i]>=Lng) !=(LngCollotions[j]>=Lng))&&
                        (Lat!=(LatCollotions[j]-LatCollotions[i])*(Lng-LngCollotions[i])/(LngCollotions[j]-LngCollotions[i])+LatCollotions[i])){
                    //点不再边界线上
                    double TempLat = (LatCollotions[j]-LatCollotions[i])*(Lng-LngCollotions[i])/(LngCollotions[j]-LngCollotions[i])+LatCollotions[i];//过点的横向线与边界线的交点
                    //统计单一方向射线方向数
                    if(Lat<TempLat){
                        k++;
                    }
                }
            }
            //改点位与始点与终点所在线的判断
            if(((LngCollotions[0]>=Lng) !=(LngCollotions[LngCollotions.length-1]>=Lng))&&
                    (Lat==(LatCollotions[LngCollotions.length-1]-LatCollotions[0])*(Lng-LngCollotions[i])/(LngCollotions[LngCollotions.length-1]-LngCollotions[0])+LatCollotions[0])){
                return true;
            }else if(((LngCollotions[0]>=Lng) !=(LngCollotions[LngCollotions.length-1]>=Lng))&&
                    (Lat!=(LatCollotions[LngCollotions.length-1]-LatCollotions[0])*(Lng-LngCollotions[i])/(LngCollotions[LngCollotions.length-1]-LngCollotions[0])+LatCollotions[0])){
                //点不再边界线上
                double TempLat = (LatCollotions[LngCollotions.length-1]-LatCollotions[0])*(Lng-LngCollotions[0])/(LngCollotions[LngCollotions.length-1]-LngCollotions[0])+LatCollotions[0];//过点的横向线与边界线的交点
                //统计单一方向射线方向数
                if(Lat<TempLat){
                    c++;
                }
            }
            System.out.println(c+"\t"+k);
            if((c+k)%2==0){
                return false;
            }else{
                return true;
            }
        }
    }

//工具相关

public static double[] String2Double(String[] List){
        double[] GpsList=new double[List.length];
        for(int i=0;i<List.length;i++){
            GpsList[i]=Double.parseDouble(List[i]);
        }
        return GpsList;
    }
    
    public static double GetMaxLng(double[] LngCollotions){
        double MaxLng=LngCollotions[0];
        for(int i=0;i<LngCollotions.length;i++){
            if(MaxLng<LngCollotions[i]){
                MaxLng=LngCollotions[i];
            }
        }
        return MaxLng;
    }
    
    public static double GetMinLng(double[] LngCollotions){
        double MinLng=LngCollotions[0];
        for(int i=0;i<LngCollotions.length;i++){
            if(MinLng>LngCollotions[i]){
                MinLng=LngCollotions[i];
            }
        }
        return MinLng;
    }
    
    public static double GetMaxLat(double[] LatCollotions){
        double MaxLat=LatCollotions[0];
        for(int i=0;i<LatCollotions.length;i++){
            if(MaxLat<LatCollotions[i]){
                MaxLat=LatCollotions[i];
            }
        }
        return MaxLat;
    }
    
    public static double GetMinLat(double[] LatCollotions){
        double MinLat=LatCollotions[0];
        for(int i=0;i<LatCollotions.length;i++){
            if(MinLat>LatCollotions[i]){
                MinLat=LatCollotions[i];
            }
        }
        return MinLat;
    }

java实现判断给定点是否在指定区域内的判断相关推荐

  1. 判断一点是否在多边形内(附Java实现代码)

    引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...

  2. 射线法判断点是否在多边形内-JAVA

    1.定义点 public class Point {private BigDecimal x;private BigDecimal y;public Point() {};@Overridepubli ...

  3. 判断点是否处于多边形内的三种方法(转)

    1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...

  4. 判断点是否在凸多边形内

    文章目录 判断点是否在凸多边形内 1,原理 2.右手坐标系 3.向量叉积 补充知识: 可以理解利用向量的叉积,很容易判定一个多边形的凹凸性.也可以判定点是否在多边形的内部. - 判定多边形的凹凸性 判 ...

  5. 用Java编写2到100之间的素数;判断一个数是不是素数

    目录 1.用Java编写2到100之间的素数 2.判断一个数是不是素数 1.用Java编写2到100之间的素数 package day_2023_4_18;public class Main {pub ...

  6. Java File文件流读取文件夹内的文件并替换文件内容

    Java File文件流读取文件夹内的文件并替换文件内容 一.前言 二.代码 三.运行结果 一.前言 批量读取文件夹内的文件,并替换各个文件的内容 二.代码 新建一个普通 Java 项目就可以,创建文 ...

  7. java 计算 点是否在电子围栏范围内

    java计算坐标点是否在电子围栏范围内 ps:注意坐标系转换 /*** 地球半径*/private static double EARTH_RADIUS = 6378138.0;private sta ...

  8. c语言for循环多条件判断,解决在for循环内判断条件多次执行

    最近遇到的这个问题,就是在for循环内if判断的条件会多次执行. 例如,在返回的30数据中,a条目是第7条则会进行30次判断,弹出29次查无数据,也就是要点击29次关闭alert,很是让人不爽. 有了 ...

  9. 项目5 判断点是否在圆内

    项目5 判断点是否在圆内 请编写一个Java应用程序,判断给定的平面点坐标(x1,y1)是否在一个指定半径的圆内.程序先请求输入圆的半径,再请求输入点的x坐标和y坐标,然后给出判断点是否在圆内并打印输 ...

最新文章

  1. linux 安全 ***检测 杀毒 rootkit
  2. hdu_5878_I Count Two Three(预处理)
  3. DevOps自动化工具集合
  4. php输出多余的空格或者空行
  5. php解escape,PHP下escape解码函数用法示例
  6. 最近很喜欢Hello World啊,这次来Groovy的Hello World啦
  7. AWS ECS简单了解
  8. python文件路径改了需要重新配置环境吗_python自学环境配置
  9. sql2005安装过程,(不装C盘)
  10. vc 可用的正则表达式库
  11. 百度输入法皮肤工具提示 CSS,百度手机输入法皮肤布局制作工具
  12. mqtt+ActiveMQ用发布订阅实现点对点推送
  13. 基于java的志愿信息管理系统_毕业设计 基于JAVA的志愿者管理系统的设计与实现...
  14. google浏览器Chrome部署HttpWatch
  15. 新冠时空分析——Global evidence of expressed sentiment alterations during the COVID-19 pandemic
  16. H5--大概的,没事看看
  17. Jinja2渲染的两种方式
  18. csr_matrix矩阵
  19. 人工神经网络与深度神经网络
  20. 鼠标API函数(windows)

热门文章

  1. Android4.0中添加新语言实现方案(以缅甸语为例)
  2. 在Java中声明一个unsigned int
  3. Java开发环境:Win10安装最新版eclipse与jdk(超详细)
  4. 树莓派魔镜MagicMirror —— 8 MagicMirror基本模块设计
  5. 视频伪原创软件,这样处理或许更加简单
  6. 2023计算机毕业设计SSM最新选题之javaJava青年志愿者信息管理系统15925
  7. iris-session梳理
  8. 树莓派VNC远程桌面使用,包含静态IP设置与窗口大小调整 (附软件链接)
  9. MS10_002漏洞利用
  10. java排序 二分法_JAVA二分法排序