您的位置:首页 > 其它

判断点在凸多边形内(基于经纬度坐标)

2017-07-04 16:24 501 查看
private boolean isContain(double center_lng, double center_lat, List<Map<String, Double>> array_points) {
double total_angle = 0;
for (int i = 0; i < array_points.size(); i++) {
Map<String, Double> point = array_points.get(i);
Map<String, Double> next_point = null;
if (i < array_points.size() - 1) {
next_point = array_points.get(i + 1);
} else {
next_point = array_points.get(0);
}
double angle = getAngle(center_lng, center_lat, point.get("lng"), point.get("lat"), next_point.get("lng"), next_point.get("lat"));
total_angle = total_angle + angle;
}
if ((int) (total_angle * 100) == (int) (2 * Math.PI * 100)) {
return true;
} else if (total_angle == 0) {
return false;
}
return false;
}
private double getAngle(double lng1, double lat1, double lng2, double lat2, double lng3, double lat3) {
double distance_1_2 = getDistanceBetweenPointsNew(lat1, lng1, lat2, lng2);
double distance_1_3 = getDistanceBetweenPointsNew(lat1, lng1, lat3, lng3);
double distance_2_3 = getDistanceBetweenPointsNew(lat3, lng3, lat2, lng2);

return Math.acos((distance_1_2 * distance_1_2 + distance_1_3 * distance_1_3 - distance_2_3 * distance_2_3) / (2 * distance_1_2 * distance_1_3));
}
private double getDistanceBetweenPointsNew(double latitude1, double longitude1, double latitude2, double longitude2) {
double theta = longitude1 - longitude2;
double miles = (Math.sin(Math.toRadians(latitude1)) * Math.sin(Math.toRadians(latitude2))) + (Math.cos(Math.toRadians(latitude1)) * Math.cos(Math.toRadians(latitude2)) * Math.cos(Math.toRadians(theta)));
miles = Math.acos(miles);
miles = Math.toDegrees(miles);
miles = miles * 60 * 1.1515;
double feet = miles * 5280;
double yards = feet / 3;
double kilometers = miles * 1.609344;
double meters = kilometers * 1000;

return meters;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多边形