服务器------3.根据经纬度划分区域

Posted on 2017-01-09 17:36  奇思妙想的香菜  阅读(2783)  评论(0编辑  收藏  举报

目标:后台添加区域,前台传某一个经纬度,判定该经纬度是否在该区域内

1.创建jsp

<%@ page language="java" import="java.util.*"
    contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@include file="/context/mytags.jsp"%>
<!DOCTYPE html>  
<html>  
<head>  
<t:base type="jquery,easyui,tools,DatePicker"></t:base>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<title>Hello, World</title>  
<style type="text/css">  
html{height:100%}  
body{height:100%;margin:0px;padding:0px}  
#container{height:100%}  
    .anchorBL{  
       display:none;  
   }
    .carvesClear {
        background-image:none  !important;
    text-align: center;
    padding-top: 15px;
    background-color: white;
    }
</style> 
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=akTFtwB1MOHYX0ILEOUTk0Rh">
//v2.0版本的引用方式:src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"
//v1.4版本及以前版本的引用方式:src="http://api.map.baidu.com/api?v=1.4&key=您的密钥&callback=initialize"
</script>
<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
<link rel="stylesheet" href="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.css" />
</head>  
 
<body>  
<input type="hidden" value="${address }" id = "cityName"/> 
<input type="hidden" value="${masterid }" id = "masterId"/> 
<input type="hidden" value="" id ="masterPoints"/>
<div id="container"></div> 
<script type="text/javascript"> 
var map = new BMap.Map('container');        // 创建地图实例  

var cityName = $("#cityName").val();
//地区形式定位
map.centerAndZoom(cityName, 14);
//显示地图区域边界
function getBoundary() {
    var bdary = new BMap.Boundary();
    bdary.get(cityName, function (rs) {       //获取行政区域
       //map.clearOverlays();        //清除地图覆盖物       
        var count = rs.boundaries.length; //行政区域的点有多少个
        if (count === 0) {
            alert('未能获取当前行政区域的边界');
            return;
        }
        var pointArray = [];
        for (var i = 0; i < count; i++) {
            var ply = new BMap.Polygon(rs.boundaries[i], { strokeWeight: 2, strokeColor: "#ff0000",fillColor:"" }); //建立多边形覆盖物
            map.addOverlay(ply);  //添加覆盖物
            pointArray = pointArray.concat(ply.getPath());
        }
        //map.setViewport(pointArray);    //调整视野                 
    });
}
var drawingManager;
var points = [];

//已保存 、 编辑中的区域
var saveoverlays = {}, editoverlays = [];
var overlaycomplete = function (e) {
    editoverlays.push(e.overlay);

    //获取绘制的点
    points = e.overlay.ia;
    
    
};
getBoundary();

map.enableScrollWheelZoom();

var styleOptions = {
    strokeColor:"red",    //边线颜色。
    fillColor:"red",      //填充颜色。当参数为空时,圆形将没有填充效果。
    strokeWeight: 2,       //边线的宽度,以像素为单位。
    strokeOpacity: 0.8,       //边线透明度,取值范围0 - 1。
    fillOpacity: 0.5,      //填充的透明度,取值范围0 - 1。
    strokeStyle: 'dashed' //边线的样式,solid或dashed。
}

//实例化鼠标绘制工具
drawingManager = new BMapLib.DrawingManager(map, {
    isOpen: false, //是否开启绘制模式
    enableDrawingTool: true, //是否显示工具栏
    drawingToolOptions: {
        anchor: BMAP_ANCHOR_TOP_RIGHT, //位置
        offset: new BMap.Size(5, 5), //偏离值
        drawingModes: [
            BMAP_DRAWING_POLYGON
        ]
    },
    polygonOptions: styleOptions //多边形的样式
});
//drawingManager.enableCalculate();  //面积或距离
 //添加鼠标绘制工具监听事件,用于获取绘制结果
drawingManager.addEventListener('overlaycomplete', overlaycomplete);

function clearAll() {
    alert(editoverlays);
    for (var i = 0; i < editoverlays.length; i++) {
        map.removeOverlay(editoverlays[i]);
    }
    editoverlays.length = 0;
    points = [];
}

//绘制
function allts(pts,vid) {
    //创建多边形
    var strokeColor = "blue", fillColor = "blue";
    if (vid == 0) {
        strokeColor = "#c0c0c0", fillColor = "#c0c0c0";
    }
    var xiancunPolygon = new BMap.Polygon(pts, {
        strokeColor: strokeColor,    //边线颜色。
        fillColor: fillColor,      //填充颜色。当参数为空时,圆形将没有填充效果。
        strokeWeight: 2,       //边线的宽度,以像素为单位。
        strokeOpacity: 0.8,       //边线透明度,取值范围0 - 1。
        fillOpacity: 0.5,      //填充的透明度,取值范围0 - 1。
        strokeStyle: 'solid' //边线的样式,solid或dashed。
    });
    if (vid != 0) {
        xiancunPolygon.addEventListener("click", function (_vid) {
            $.messager.confirm('删除告警提示', '确定要删除此区域?', function(r) {
                if (r) {
                    $.ajax({
                        type: "post",
                        url: "xnMasterController.do?deleteMasterPoints",
                        data: "id="+vid,
                        dataType: "json",
                        async: false,
                        error : function() {// 请求失败处理函数
                        },
                        success : function(data) {
                            if(data.success){
                                alert(data.msg);
                            } else {
                                alert(data.msg);
                            }
                            window.location.reload();
                        }
                    });
                    /* ShuyaJs.postorg({
                        url: "/Oms/OmsJoinSite/ManageAreaDel", data: { Id: vid }, callfun: function (result) {
                            if (result.Code != "0") {
                                alert(result.Msg);
                            } else {
                                alert(result.Msg);
                                window.location.reload();
                            }
                        }
                    }); */
                }
            });
        });
    }
    saveoverlays[vid] = xiancunPolygon;
    //添加多边形到地图上     
    map.addOverlay(xiancunPolygon);
}

function SaveCarves() {
    var masterPointslength = $("#masterPoints").val();
    var masterId = $("#masterId").val();
    if (points!=null && points.length>=3 && masterPointslength == 0) {
        $.ajax({
            type: "post",
            url: "xnMasterController.do?saveMasterPoints",
            data: "points="+JSON.stringify(points)+"&id="+masterId,
            dataType: "json",
            async: false,
            error : function() {// 请求失败处理函数
            },
            success : function(data) {
                if(data.success){
                    alert(data.msg);
                } else {
                    alert(data.msg);
                }
                window.location.reload();
            }
        });
    } else if(masterPointslength != 0){
        alert("站长已经有所画区域,请删除后重新添加!");
    } else{
        alert("请进行绘制区域,并至少有三个点形成一个面");
    }
    
}

$(".BMapLib_Drawing_panel").append('<a class="BMapLib_box carvesClear" href="javascript:clearAll();" title="清除" >清除</a>');
$(".BMapLib_Drawing_panel").append('<a class="BMapLib_box carvesClear" href="javascript:SaveCarves();" title="保存" >保存</a>');

$(function () {
    var id = $("#masterId").val();
    $.ajax({
        type: "post",
        url: "xnMasterController.do?masterPoints",
        data: "id="+id,
        dataType: "json",
        async: false,
        error : function() {// 请求失败处理函数
        },
        success : function(data) {
        if(data.obj != null){
            $("#masterPoints").val(data.obj.length);
            allts(data.obj, data.msg);
        }else{
            $("#masterPoints").val(0);
        }
        }
    });
});
</script>  
</body>  
</html>

2.创建经纬度实体

package com.redstoneinfo.infant.entity.baizhuanghui;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="xn_gps_point",schema = "")
@SuppressWarnings("serial")
public class XnGpsPoint {
    private String id;//主键id
    private String masterId;//站长id
    private Double lng;//经度
    private Double lat;//纬度
    public XnGpsPoint() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**主键id*/
    @Id
    @GeneratedValue(generator = "paymentableGenerator")
    @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
    @Column(name ="id",nullable=false,length=255)
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @Column(name ="master_id")
    public String getMasterId() {
        return masterId;
    }

    public void setMasterId(String masterId) {
        this.masterId = masterId;
    }
    @Column(name ="lng")
    public Double getLng() {
        return lng;
    }

    public void setLng(Double lng) {
        this.lng = lng;
    }
    @Column(name ="lat")
    public Double getLat() {
        return lat;
    }

    public void setLat(Double lat) {
        this.lat = lat;
    }

    public XnGpsPoint(String id, String masterId, Double lng, Double lat) {
        super();
        this.id = id;
        this.masterId = masterId;
        this.lng = lng;
        this.lat = lat;
    }

    
    
    
    
    

}

3.controller中添加删除修改

    // 为站长划分区域
    @RequestMapping(params = "centerMap")
    public ModelAndView centerMap(XnMaster xnMaster, HttpServletRequest req) {
        if (StringUtil.isNotEmpty(xnMaster.getId())) {
            xnMaster = systemService
                    .getEntity(XnMaster.class, xnMaster.getId());
            // 取出master里面的省市区字段 修改为地图的中心坐标
            req.setAttribute(
                    "address",
                    xnMaster.getShengfen() + xnMaster.getCity()
                            + xnMaster.getArea());
            req.setAttribute("masterid", xnMaster.getId());
        }

        return new ModelAndView(
                "baizhuanghuiPages/xnMaster/xnMasterMap/mapMaster");
    }

    // 站长自己的区域
    @RequestMapping(params = "masterPoints")
    @ResponseBody
    public AjaxJson masterPoints(HttpServletRequest request) {
        String id = request.getParameter("id");
        AjaxJson j = new AjaxJson();
        // 根据masterId 取出该站长对应的区域 XnGpsPoint实体
        JSONArray array = new JSONArray();
        List<XnGpsPoint> pointList = this.jeecgJdbcService.findByProperty(
                XnGpsPoint.class, "masterId", id);

        if (pointList.size() > 0) {
            // 站长有自己的区域 需要将区域id设置为站长id
            j.setMsg(id);
            for (int i = 0; i < pointList.size(); i++) {
                XnGpsPoint point = pointList.get(i);
                JSONObject ob = new JSONObject();
                ob.put("lng", point.getLng());
                ob.put("lat", point.getLat());
                array.add(ob);
            }
            j.setObj(array);
        }
        return j;
    }

    // 删除站长区域信息
    @RequestMapping(params = "deleteMasterPoints")
    @ResponseBody
    public AjaxJson deleteMasterPoints(HttpServletRequest request) {
        // 站长id
        String id = request.getParameter("id");
        AjaxJson j = new AjaxJson();
        // 根据masterId 取出该站长对应的区域 XnGpsPoint实体
        String sql = " delete from xn_gps_point where master_id = '" + id + "'";

        this.systemService.executeSql(sql);
        j.setSuccess(true);
        j.setMsg("删除区域成功");

        return j;
    }

    // 保存站长区域信息
    @RequestMapping(params = "saveMasterPoints")
    @ResponseBody
    public AjaxJson saveMasterPoints(HttpServletRequest request) {
        // 站长id
        String id = request.getParameter("id");
        // 区域points
        String points = request.getParameter("points").split("\\[")[1]
                .split("\\]")[0];
        String[] point = points.split("\\},\\{");
        AjaxJson js = new AjaxJson();
        // 取出每一个Point
        for (int i = 0; i < point.length; i++) {
            XnGpsPoint gps = new XnGpsPoint();
            gps.setMasterId(id);
            String[] lngandlat = point[i].split(",");
            for (int j = 0; j < lngandlat.length; j++) {
                if (lngandlat[j].indexOf("lng") != -1) {
                    // point[i] 是经度
                    String lng = lngandlat[j].split(":")[1];
                    gps.setLng(Double.valueOf(lng));
                } else if (lngandlat[j].indexOf("lat") != -1) {
                    // point[i] 是纬度
                    if (i != point.length - 1) {
                        String lat = lngandlat[j].split(":")[1];
                        gps.setLat(Double.valueOf(lat));
                    } else {
                        String lat = lngandlat[j].split(":")[1].split("\\}")[0];
                        gps.setLat(Double.valueOf(lat));
                    }
                }
            }
            try {
                this.systemService.save(gps);
                js.setSuccess(true);
                js.setMsg("保存成功");
            } catch (Exception e) {
                js.setSuccess(false);
                js.setMsg("保存失败");
            }
        }

        return js;
    }

4.判定

Point2D.Double point = new Point2D.Double(Double.valueOf(sendlongitude), Double.valueOf(sendlatitude));  
        List<XnMaster> list = this.findByQueryString(" from XnMaster");
        List<Point2D.Double> pointList= new ArrayList<Point2D.Double>();  
        for (XnMaster master : list){  
            List<XnGpsPoint> gpsList = this.findByQueryString(" from XnGpsPoint where masterId='"+master.getId()+"' ");
            for (XnGpsPoint gps : gpsList){  
                double polygonPoint_x=gps.getLng();  
                double polygonPoint_y=gps.getLat();  
                Point2D.Double polygonPoint = new Point2D.Double(polygonPoint_x,polygonPoint_y);  
                pointList.add(polygonPoint); 
            }
                Boolean flag = checkWithJdkGeneralPath(point,pointList);
                if(flag){
                    maTelephone = master.getTelephone();
                    maName = master.getMasterName();
                    masterId = master.getId();
                    break;
                }else{
                    a++;
            }  
        }




    /** 
     * 返回一个点是否在一个多边形区域内 
     * @param point 
     * @param polygon 
     * @return 
     */  
    private boolean checkWithJdkGeneralPath(Point2D.Double point, List<Point2D.Double> polygon) {  
        java.awt.geom.GeneralPath p = new java.awt.geom.GeneralPath();  

        Point2D.Double first = polygon.get(0);  
        p.moveTo(first.x, first.y);  
        polygon.remove(0);  
        for (Point2D.Double d : polygon) {  
            p.lineTo(d.x, d.y);  
        }  

        p.lineTo(first.x, first.y);  

        p.closePath();  

        return p.contains(point);  

    }