数据检索--区域检索

一、算法需求

1.根据当前经纬度检索该点所在经纬度区域的数据。

二、实现逻辑

1.根据经纬度圈定范围,可取四个点,获取这四个点对应的经纬度坐标组成一个封闭的四边形,简称经纬度四边形。
2.获取当前经纬度,在数据库所有经纬度四边形中匹配,查看该点是否被包含在某个经纬度四边形中。如果包含在某个经纬度四边形中,则可以获取相应的数据,否则说明该点未被圈定在某个四边形中,可另做处理。

三、方法原理

1.构成四边形

利用经纬度坐标,建立平面直角坐标系,纬度为横坐标,经度为纵坐标。根据数学知识,平面上的四条直线可以组成封闭的四边形,平面上一点要么在该四边形中(包括边线),要么在四边形外面。

2.判断点与四边形的关系

利用直线和点的关系,在封闭四边形中,四条直线和点的关系确定后,方可判断点与四边形面的关系。

四、java 代码实现

public class RegionSelectTool {
    public static boolean isVartical []={false,false,false,false};  //直线斜率是否存在
    public static double[][] canShu =new double[4][2];  // 斜率,截距               
    //point分别是左上,右上,左下,右下。
    public static boolean intheWhere(double lat, double lng,double point [][]){
        String[] fangxiang=new String[4];
        String[] fangxiang1=new String[4];
        //创建四条直线
        fangcheng(point[0][0],point[0][1],point[1][0],point[1][1],0);
        fangcheng(point[0][0],point[0][1],point[2][0],point[2][1],1);
        fangcheng(point[2][0],point[2][1],point[3][0],point[3][1],2);
        fangcheng(point[3][0],point[3][1],point[1][0],point[1][1],3);
        //记录四条线所围成区域的位置
        fangxiang[0]=aspet(canShu[0][0],canShu[0][1],isVartical[0],point[2][0],point[2][1]);
        fangxiang[1]=aspet(canShu[1][0],canShu[1][1],isVartical[1],point[3][0],point[3][1]);
        fangxiang[2]=aspet(canShu[2][0],canShu[2][1],isVartical[2],point[1][0],point[1][1]);
        fangxiang[3]=aspet(canShu[3][0],canShu[3][1],isVartical[3],point[0][0],point[0][1]);
        //记录了点相对四条线的位置
        fangxiang1[0]=aspet(canShu[0][0],canShu[0][1],isVartical[0],lat,lng);
        fangxiang1[1]=aspet(canShu[1][0],canShu[1][1],isVartical[1],lat,lng);
        fangxiang1[2]=aspet(canShu[2][0],canShu[2][1],isVartical[2],lat,lng);
        fangxiang1[3]=aspet(canShu[3][0],canShu[3][1],isVartical[3],lat,lng);
        //判断点的位置与区域的位置是否一致
        int k=0;
        for(int i=0;i<4;i++){
            if(fangxiang[i]==fangxiang1[i]||fangxiang[i].equals(fangxiang1[i])){
                k++;
            }
        }
        if(k==4){
            return true;
        }else{
            return false;
        }
    }

    //求方程参数
    public static void fangcheng(double x1,double y1,double x2,double y2,int i){
        //判断是否垂直于x轴
        if(x1==x2){
            isVartical[i]=true;
            canShu[i][1]=x1;
        }else{
            canShu[i][0]=(y2-y1)/(x2-x1);
            canShu[i][1]=y2-canShu[i][0]*x2;
        }
    }
    //判断方向
    public static String aspet(double xielv,double jieju, boolean isvartical,double x0,double y0){
        if(isvartical){
            if(x0<jieju){return "左";}
            else{return "右";}
        }else{
            if(xielv>0){return xielv*x0+jieju-y0>0?"右下":"左上";}
            else if(xielv==0){return y0>jieju?"上":"下";}
            else{return xielv*x0+jieju-y0>0?"左下":"右上";}
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值