package console;
|
import java.awt.Point;
|
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D.Double;
|
import java.io.IOException;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.sql.Connection;
|
import java.sql.DriverManager;
|
import java.sql.PreparedStatement;
|
import java.sql.ResultSet;
|
import java.sql.SQLException;
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
import javax.servlet.ServletException;
|
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
|
import a.AStar;
|
import a.MapInfo;
|
import a.Node;
|
import com.google.gson.JsonArray;
|
import com.google.gson.JsonObject;
|
|
|
public class MapConsole extends HttpServlet {
|
|
/**
|
*
|
*/
|
private static final long serialVersionUID = 1L;
|
private static final int DEFAULT_MINOR_COUNT = 3;
|
private HttpServletRequest request;
|
private HttpServletResponse response;
|
private Connection connection;
|
|
// private static String sqlUrl = "jdbc:mysql://rm-8vbgt2g7d2p34t91ao.mysql.zhangbei.rds.aliyuncs.com/cbi?useUnicode=true&characterEncoding=UTF8";
|
// private static String sqlUsername = "demo";
|
// private static String sqlpassword = "Demo123456";
|
private static String sqlUrl = "jdbc:mysql://localhost:3306/mapview";
|
private static String sqlUsername = "root";
|
private static String sqlpassword = "123456";
|
|
private ArrayList<double[]> kamparList = new ArrayList<double[]>();;
|
private Float Q = 5.f;
|
private Float kalmanR = 8.f;
|
|
@Override
|
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
|
try {
|
init(req, resp);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
String requestURL = req.getRequestURI();
|
System.out.println(requestURL);
|
int rootIndex = requestURL.lastIndexOf("/");
|
String menu = requestURL.substring(rootIndex+1);
|
|
try {
|
receive(menu);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
private void receive(String menu) throws Exception {
|
if ("getmap".equalsIgnoreCase(menu)) {
|
getMapViewInfo();
|
// getOrderedPoint();
|
}
|
else if ("getorderlist".equalsIgnoreCase(menu)) {
|
getOrderedPointnew();
|
}
|
else if ("shortest".equalsIgnoreCase(menu)) {
|
getShortestDistance();
|
}
|
else if ("getParkingSpaces".equalsIgnoreCase(menu)) {
|
getParkingSpaces();
|
}
|
|
}
|
|
private void getOrderedPointnew() throws IOException, SQLException {
|
String minorString = request.getParameter("minor");
|
request.setAttribute("list", new ArrayList<BeaconModel>());
|
@SuppressWarnings("unchecked")
|
List<BeaconModel> lists = (List<BeaconModel>) request.getAttribute("list");
|
for (BeaconModel beaconModel : lists) {
|
String bluetoothAddress = beaconModel.getBluetoothAddress();
|
|
}
|
String[] minorStrings = minorString.split(",");
|
BigDecimal endX = BigDecimal.ZERO;
|
BigDecimal endY = BigDecimal.ZERO;
|
|
if (minorStrings.length < DEFAULT_MINOR_COUNT) {
|
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
|
response.getWriter().write("minor count is not match");
|
return;
|
}
|
ResultSet resultSet = getPointList(minorStrings);
|
BigDecimal x = BigDecimal.ZERO;
|
BigDecimal y = BigDecimal.ZERO;
|
BigDecimal count = BigDecimal.ZERO;
|
while(resultSet.next()) {
|
String pointString = resultSet.getString("point");
|
String[] pointStrings = pointString.split(",");
|
x = x.add(new BigDecimal(pointStrings[0]));
|
y = y.add(new BigDecimal(pointStrings[1]));
|
count = count.add(BigDecimal.ONE);
|
}
|
if (count.intValue() == 0) {
|
return;
|
}
|
else {
|
endX = x.divide(count, RoundingMode.DOWN);
|
endY = y.divide(count, RoundingMode.DOWN);
|
}
|
Point kamparChange = kamparChange(endX, endY);
|
|
JsonObject result = new JsonObject();
|
result.addProperty("success", true);
|
result.addProperty("point", kamparChange.x + "," + kamparChange.y);
|
response.setStatus(HttpServletResponse.SC_OK);
|
response.getWriter().write(result.toString());
|
}
|
|
private Point kamparChange(BigDecimal x, BigDecimal y) {
|
int endX = -1, endY = -1;
|
System.out.println("原坐标:" + x.intValue() + "-------" + y.intValue());
|
//对原坐标进行滤波
|
//1 init
|
if (kamparList == null || kamparList.isEmpty()) {
|
double[] kalmparX = new double[3];
|
kalmparX[0] = x.doubleValue();//添加下一时刻的估计值,默认为初始添加实际信号值
|
kalmparX[1] = 1;//添加初始K增益
|
kalmparX[2] = x.doubleValue();//添加初始误差协方差P
|
kamparList.add(kalmparX);
|
|
double[] kalmparY = new double[3];
|
kalmparY[0] = y.doubleValue();//添加下一时刻的估计值,默认为初始添加实际信号值
|
kalmparY[1] = 1;//添加初始K增益
|
kalmparY[2] = y.doubleValue();//添加初始误差协方差P
|
kamparList.add(kalmparY);
|
}
|
for (int i = 0; i < kamparList.size(); i++) {
|
|
double newK = (kamparList.get(i)[2]+Q)/(kamparList.get(i)[2]+Q+kalmanR);//更新卡尔曼增益
|
//最优解
|
double betterPoint = kamparList.get(i)[0] + newK * (x.doubleValue() - kamparList.get(i)[0]);
|
double newP = (1-newK)*(kamparList.get(i)[2]+Q);//更新误差协方差P
|
kamparList.get(i)[0] = betterPoint;
|
kamparList.get(i)[1] = newK;
|
kamparList.get(i)[2] = newP;
|
if (i == 0) {
|
endX = (int)Math.round(betterPoint);
|
}
|
else if (i == 1) {
|
endY = (int)Math.round(betterPoint);
|
}
|
}
|
System.out.println("现坐标:" + endX + "-------" + endY);
|
return new Point(endX, endY);
|
}
|
private void getOrderedPoint() throws SQLException, IOException {
|
String orderString = request.getParameter("order");
|
String[] orderStrings = orderString.split(",");
|
|
Orders requestorder = new Orders(Integer.parseInt(orderStrings[0]), Integer.parseInt(orderStrings[1]), Integer.parseInt(orderStrings[2]), Integer.parseInt(orderStrings[3]), Integer.parseInt(orderStrings[4]));
|
ResultSet resultSet = getOrderList();
|
Map<BigDecimal ,Point> orderPointList = new HashMap<BigDecimal, Point>();
|
List<BigDecimal> orderDList = new ArrayList<BigDecimal>();
|
|
while(resultSet.next()) {
|
String pointString = resultSet.getString("point");
|
String[] pointStrings = pointString.split(",");
|
Point point = new Point(Util.ParseInt(pointStrings[0]), Util.ParseInt(pointStrings[1]));
|
String orderLiString = resultSet.getString("orderlist");
|
String[] orderListStrings = orderLiString.split(",");
|
Orders oneOrders = new Orders(Util.ParseInt(orderListStrings[0]), Util.ParseInt(orderListStrings[1]), Util.ParseInt(orderListStrings[2]), Util.ParseInt(orderListStrings[3]), Util.ParseInt(orderListStrings[4]));
|
BigDecimal d = Util.getDFromOrder(oneOrders, requestorder);
|
|
orderPointList.put(d, point);
|
|
if (orderDList.size() < 4) {
|
orderDList.add(d);
|
|
}
|
else {
|
Collections.sort(orderDList);
|
BigDecimal no4d = orderDList.get(3);
|
int compareTo = no4d.compareTo(d);
|
|
if (compareTo == 1) {
|
orderDList.set(3, d);
|
}
|
}
|
|
}
|
//end select
|
|
List<BigDecimal> wList = Util.calculateWValue(orderDList);
|
|
BigDecimal x = BigDecimal.ZERO;
|
BigDecimal y = BigDecimal.ZERO;
|
for (int i = 0; i < orderDList.size(); i++) {
|
BigDecimal wi = wList.get(i);
|
BigDecimal d = orderDList.get(i);
|
Point point = orderPointList.get(d);
|
BigDecimal xDecimal = new BigDecimal(point.x);
|
BigDecimal yDecimal = new BigDecimal(point.y);
|
BigDecimal Wnx = wi.multiply(xDecimal);
|
BigDecimal Wny = wi.multiply(yDecimal);
|
x = x.add(Wnx);
|
y = y.add(Wny);
|
}
|
|
x = x.divide(new BigDecimal(orderDList.size()), 10, RoundingMode.DOWN);
|
y = y.divide(new BigDecimal(orderDList.size()), 10, RoundingMode.DOWN);
|
|
Point kamparChange = kamparChange(x, y);
|
|
JsonObject result = new JsonObject();
|
result.addProperty("success", true);
|
result.addProperty("point", kamparChange.x + "," + kamparChange.y);
|
response.setStatus(HttpServletResponse.SC_OK);
|
response.getWriter().write(result.toString());
|
}
|
|
private ResultSet getPointList(String[] minorStrings) throws SQLException {
|
String getOrderListSql = "select * from orderlist where active = 'T' and minorcode in (";
|
for (int i = 0; i < minorStrings.length; i++) {
|
String minor = minorStrings[i];
|
getOrderListSql += minor;
|
if (i < minorStrings.length -1) {
|
getOrderListSql += ",";
|
}else if (i == minorStrings.length -1) {
|
getOrderListSql += ")";
|
}
|
}
|
|
PreparedStatement prepareStatement = connection.prepareStatement(getOrderListSql);
|
ResultSet resultSet = prepareStatement.executeQuery();
|
return resultSet;
|
}
|
|
private ResultSet getOrderList() throws SQLException {
|
String getOrderListSql = "select * from orderlist where active = 'T'";
|
PreparedStatement prepareStatement = connection.prepareStatement(getOrderListSql);
|
ResultSet resultSet = prepareStatement.executeQuery();
|
return resultSet;
|
}
|
|
private void getParkingSpaces() throws SQLException, IOException {
|
JsonObject result = new JsonObject();
|
JsonArray parkingPositionSet = new JsonArray();
|
String parentid = request.getParameter("id");
|
ResultSet parkingspacesSet = getParkingspacesFromParkingId(parentid);
|
while(parkingspacesSet.next()) {
|
JsonObject onePosition = new JsonObject();
|
onePosition.addProperty("id", parkingspacesSet.getString("id"));
|
onePosition.addProperty("spacex", parkingspacesSet.getString("spaceX"));
|
onePosition.addProperty("spacey", parkingspacesSet.getString("spaceY"));
|
onePosition.addProperty("isused", parkingspacesSet.getString("isused"));
|
onePosition.addProperty("direction", parkingspacesSet.getString("direction"));
|
|
parkingPositionSet.add(onePosition);
|
}
|
|
result.addProperty("success", true);
|
result.add("dataset", parkingPositionSet);
|
response.setStatus(HttpServletResponse.SC_OK);
|
response.getWriter().write(result.toString());
|
}
|
|
private void getShortestDistance() throws Exception {
|
ArrayList<ArrayList<Double>> banAreaList = null;
|
Node startNode =null;
|
Point changedScale = null;
|
|
String parkinglotId = request.getParameter("id");
|
String endpointx = request.getParameter("endpointx");
|
String endpointy = request.getParameter("endpointy");
|
Node endNode = new Node(Integer.valueOf(endpointx), Integer.valueOf(endpointy));
|
//1 获取 尺寸,障碍区域,起点,终点
|
ResultSet parkinglot = getParkingLotFromId(parkinglotId);
|
while (parkinglot.next()) {
|
String startpoint = parkinglot.getString("startpoint");
|
String[] starts = startpoint.split(",");
|
startNode = new Node(new Integer(starts[0]), new Integer(starts[1]));
|
|
String imgscale = parkinglot.getString("imgscale");
|
String[] areaPoint = imgscale.split(",");
|
String x = areaPoint[0];
|
String y = areaPoint[1];
|
changedScale = new Point(Integer.valueOf(x), Integer.valueOf(y));
|
|
ResultSet banAreaSet = getBanAreaFromParkingId(parkinglotId);
|
banAreaList = banArea2List(banAreaSet);
|
}
|
|
createMatrix(changedScale, banAreaList, startNode, endNode);
|
|
}
|
private Node replacedPoint(Node node, ArrayList<ArrayList<Double>> banAreaList, Point changedScale) {
|
Node replacedNode = null;
|
if (inBanArea(node.coord.x, node.coord.y, banAreaList)) {
|
//获取最近的代替点
|
replacedNode = getrePlaceNode(node, banAreaList, 1, changedScale);
|
}
|
else {
|
replacedNode = node;
|
}
|
return replacedNode;
|
|
}
|
|
private Node getrePlaceNode(Node node, ArrayList<ArrayList<Double>> banAreaList, int deep, Point changedScale) {
|
if (deep == 0) {
|
deep = 1;
|
}
|
Node replacedNode = null;
|
Point point = new Point(node.coord.x, node.coord.y);
|
|
java.util.List<Point> pointsCircular = Util.getPointsCircular(point, deep);
|
for (Point oneCriclePoint : pointsCircular) {
|
if (!inBanArea(oneCriclePoint.x, oneCriclePoint.y, banAreaList) && !isOutofImg(oneCriclePoint, changedScale)) {
|
replacedNode = new Node(new java.lang.Double(oneCriclePoint.x).intValue(), new java.lang.Double(oneCriclePoint.y).intValue());
|
return replacedNode;
|
}
|
}
|
deep++;
|
replacedNode = getrePlaceNode(node, banAreaList, deep, changedScale);
|
|
return replacedNode;
|
}
|
private boolean isOutofImg(Point oneCriclePoint, Point changedScale) {
|
if (oneCriclePoint.x <= changedScale.x && oneCriclePoint.y <= changedScale.y) {
|
return false;
|
}
|
return true;
|
}
|
|
private void createMatrix(Point changedScale, ArrayList<ArrayList<Double>> banAreaList, Node startNode, Node endNode) throws IOException {
|
//1 初始化map
|
int[][] maps = new int[changedScale.y/10][changedScale.x/10];
|
for (int i = 0; i < Integer.valueOf(changedScale.y /10 - 1); i++) {
|
for (int j = 0; j < Integer.valueOf(changedScale.x /10 - 1); j++) {
|
if(inBanArea(j, i, banAreaList)) {
|
maps[i][j] = 1;
|
}else {
|
maps[i][j] = 0;
|
}
|
}
|
}
|
|
startNode.coord.x = startNode.coord.x/10;
|
startNode.coord.y = startNode.coord.y/10;
|
endNode.coord.x = endNode.coord.x/10;
|
endNode.coord.y = endNode.coord.y/10;
|
//2 起点,终点是不是在障碍物里,如果在找寻最近的代替点
|
Point imgCcale = new Point(changedScale.x / 10, changedScale.y / 10);
|
startNode = replacedPoint(startNode, banAreaList, imgCcale);
|
endNode = replacedPoint(endNode, banAreaList, imgCcale);
|
MapInfo info=new MapInfo(maps,maps[0].length, maps.length, startNode, endNode);
|
|
new AStar().start(info);
|
|
for (int i = 0; i < maps.length; i++)
|
{
|
for (int j = 0; j < maps[i].length; j++)
|
{
|
System.out.print(maps[i][j] +" ");
|
}
|
System.out.println();
|
}
|
|
printMap(maps);
|
}
|
|
public void printMap(int[][] maps) throws IOException
|
{
|
JsonObject result = new JsonObject();
|
JsonArray pointList = new JsonArray();
|
for (int i = 0; i < maps.length; i++)
|
{
|
for (int j = 0; j < maps[i].length; j++)
|
{
|
if(maps[i][j] == 2) {
|
JsonObject onePoint = new JsonObject();
|
onePoint.addProperty("x", j);
|
onePoint.addProperty("y", i);
|
pointList.add(onePoint);
|
System.out.println("坐标:("+ i +"," + j +")" );
|
}
|
}
|
System.out.println();
|
}
|
result.addProperty("success", true);
|
result.add("dataset", pointList);
|
response.setStatus(HttpServletResponse.SC_OK);
|
response.getWriter().write(result.toString());
|
}
|
|
private boolean inBanArea(int i, int j, ArrayList<ArrayList<Double>> banAreaList) {
|
Double point = new Double(i,j);
|
for (ArrayList<Double> oneArea : banAreaList) {
|
boolean isContains = SpatialRelationUtil.isPolygonContainsPoint(oneArea, point);
|
boolean isIn = SpatialRelationUtil.isPointInPolygonBoundary(oneArea, point);
|
if(isContains || isIn) {
|
return true;
|
}
|
}
|
return false;
|
}
|
|
private ArrayList<ArrayList<Double>> banArea2List(ResultSet banAreaSet) throws Exception {
|
ArrayList<ArrayList<Point2D.Double>> banAreaList = new ArrayList<ArrayList<Point2D.Double>>();
|
while(banAreaSet.next()) {
|
ArrayList<Double> oneArea = new ArrayList<Point2D.Double>();
|
String areaPoints = banAreaSet.getString("areapoints");
|
String[] points = areaPoints.split(";");
|
for (String onePoint : points) {
|
String[] coordinates = onePoint.split(",");
|
Double point = new Point2D.Double(java.lang.Double.valueOf(coordinates[0]) / 10 , java.lang.Double.valueOf(coordinates[1]) / 10);
|
oneArea.add(point);
|
}
|
banAreaList.add(oneArea);
|
}
|
return banAreaList;
|
}
|
|
private ResultSet getParkingspacesFromParkingId(String parkinglotId) throws SQLException {
|
String banParkingAreaById = "select * from parkingspaces where parentid = ?";
|
PreparedStatement prepareStatement = connection.prepareStatement(banParkingAreaById);
|
prepareStatement.setString(1, parkinglotId);
|
ResultSet resultSet = prepareStatement.executeQuery();
|
return resultSet;
|
}
|
|
private ResultSet getBanAreaFromParkingId(String parkinglotId) throws SQLException {
|
String banParkingAreaById = "select * from banparkingarea where parentid = ?";
|
PreparedStatement prepareStatement = connection.prepareStatement(banParkingAreaById);
|
prepareStatement.setString(1, parkinglotId);
|
ResultSet resultSet = prepareStatement.executeQuery();
|
return resultSet;
|
}
|
|
|
private void getMapViewInfo() throws Exception {
|
JsonObject jsonObject = new JsonObject();
|
ResultSet resultSet = getParkingLotFromId("001");
|
|
while (resultSet.next()) {
|
JsonObject mapViewJsonObject = new JsonObject();
|
mapViewJsonObject.addProperty("id", resultSet.getString("id"));
|
mapViewJsonObject.addProperty("name", resultSet.getString("name"));
|
mapViewJsonObject.addProperty("imageurl", resultSet.getString("imageurl"));
|
jsonObject.add("mapview", mapViewJsonObject);
|
}
|
|
jsonObject.addProperty("success", true);
|
response.setStatus(HttpServletResponse.SC_OK);
|
response.getWriter().write(jsonObject.toString());
|
}
|
|
private ResultSet getParkingLotFromId(String id) throws SQLException {
|
String getTextMapSql = "select * from parkinglot where id = ?";
|
PreparedStatement prepareStatement = connection.prepareStatement(getTextMapSql);
|
prepareStatement.setString(1, id);
|
ResultSet resultSet = prepareStatement.executeQuery();
|
return resultSet;
|
}
|
|
private void initJDBC() throws IOException {
|
try {
|
Class.forName("com.mysql.jdbc.Driver");
|
connection = DriverManager.getConnection(sqlUrl, sqlUsername, sqlpassword);
|
} catch (Exception e) {
|
response.sendError(400);
|
response.getWriter().write(e.getMessage());
|
e.printStackTrace();
|
}
|
}
|
|
private void init(HttpServletRequest req, HttpServletResponse resp) throws Exception {
|
request = req;
|
response = resp;
|
request.setCharacterEncoding("UTF-8");
|
response.setContentType("text/html;charset=UTF-8");
|
initJDBC();
|
}
|
|
@Override
|
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
|
throws ServletException, IOException {
|
doGet(req, resp);
|
}
|
}
|