package
com.sun4j.module.util;
import
com.daoles.module.entity.Area;
import
com.daoles.module.entity.AreaInfo;
import
com.daoles.module.service.AreaInfoService;
import
com.daoles.module.service.AreaService;
import
java.awt.geom.Point2D;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
/** * description: 技术百度地图中的点在某个片区中 * Created by Sunlight on 2017/4/27. */
public
class MapTools {
/** * 传入一个坐标点判断 * @param areaService * @param areaInfoService * @param x 经度 * @param y 纬度 * @return 返回改点对应的片区 */
public
static
Area
getAreaByPoint
(AreaService areaService, AreaInfoService areaInfoService,Double x,Double y){ Point2D.Double point =
new
Point2D.Double(x, y); Map<String,Object> params=
new
HashMap<>(); params.put(
"deleted"
,
0
);
//查询所有片区
List<Area> areas=areaService.findList(params);
if
(areas.size()==
0
){
return
null
; }
for
(Area area : areas){ params=
new
HashMap<>(); params.put(
"areaId"
,area.getId()); List<AreaInfo> areaInfos=areaInfoService.findList(params);
if
(areaInfos.size()==
0
){
continue
; } List<Point2D.Double> pts =
new
ArrayList<Point2D.Double>();
for
(AreaInfo info : areaInfos) { pts.add(
new
Point2D.Double(info.getLng(), info.getLat())); }
if
(IsPtInPoly(point, pts)) { System.out.println(
"===========点在多边形内==========="
);
return
area; }
else
{ System.out.println(
"===========点在多边形外==========="
);
continue
; } }
return
null
; }
/** * 判断点是否在多边形内 * * @param point 检测点 * @param pts 多边形的顶点 * @return 点在多边形内返回true, 否则返回false */
public
static
boolean
IsPtInPoly
(Point2D.Double point, List<Point2D.Double> pts) {
int
N = pts.size();
boolean
boundOrVertex =
true
;
//如果点位于多边形的顶点或边上,也算做点在多边形内,直接返回true
int
intersectCount =
0
;
//cross points count of x
double
precision =
2e-10
;
//浮点类型计算时候与0比较时候的容差
Point2D.Double p1, p2;
//neighbour bound vertices
Point2D.Double p = point;
//当前点
p1 = pts.get(
0
);
//left vertex
for
(
int
i =
1
; i <= N; ++i) {
//check all rays
if
(p.equals(p1)) {
return
boundOrVertex;
//p is an vertex
} p2 = pts.get(i % N);
//right vertex
if
(p.x < Math.min(p1.x, p2.x) || p.x > Math.max(p1.x, p2.x)) {
//ray is outside of our interests
p1 = p2;
continue
;
//next ray left point
}
if
(p.x > Math.min(p1.x, p2.x) && p.x < Math.max(p1.x, p2.x)) {
//ray is crossing over by the algorithm (common part of)
if
(p.y <= Math.max(p1.y, p2.y)) {
//x is before of ray
if
(p1.x == p2.x && p.y >= Math.min(p1.y, p2.y)) {
//overlies on a horizontal ray
return
boundOrVertex; }
if
(p1.y == p2.y) {
//ray is vertical
if
(p1.y == p.y) {
//overlies on a vertical ray
return
boundOrVertex; }
else
{
//before ray
++intersectCount; } }
else
{
//cross point on the left side
double
xinters = (p.x - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;
//cross point of y
if
(Math.abs(p.y - xinters) < precision) {
//overlies on a ray
return
boundOrVertex; }
if
(p.y < xinters) {
//before ray
++intersectCount; } } } }
else
{
//special case when ray is crossing through the vertex
if
(p.x == p2.x && p.y <= p2.y) {
//p crossing over p2
Point2D.Double p3 = pts.get((i +
1
) % N);
//next vertex
if
(p.x >= Math.min(p1.x, p3.x) && p.x <= Math.max(p1.x, p3.x)) {
//p.x lies between p1.x & p3.x
++intersectCount; }
else
{ intersectCount +=
2
; } } } p1 = p2;
//next ray left point
}
return
intersectCount %
2
!=
0
; }}
Java判断坐标点是否在片区内—代码备份
最新推荐文章于 2024-06-17 17:32:07 发布