一、算法需求
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];
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){
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?"左下":"右上";}
}
}
}