目標:后台添加區域,前台傳某一個經緯度,判定該經緯度是否在該區域內
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); }