You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
5.3 KiB

let db = require("../config/db.js");
let util = require("util");
let turf = require("turf");
let mathFunc = require("./mathFunc.js");
module.exports = {
organisePolygonPoints(polygonPoints) {
console.log(polygonPoints);
let polygons = []
let polygonDict = {};
polygonPoints.map((point) => {
if (!(point.polygonID in polygonDict)) {
polygonDict[point.polygonID] = {};
polygonDict[point.polygonID].coords = [];
polygonDict[point.polygonID].gameID = point.gameID;
polygonDict[point.polygonID].userID = point.userID;
polygonDict[point.polygonID].colour = point.colour;
polygonDict[point.polygonID].polygonID = point.polygonID;
}
polygonDict[point.polygonID].coords.push({lat: point.lat, lng: point.lng});
});
for (let [polygon, polygonData] of Object.entries(polygonDict)){
polygons.push(polygonDict[polygon]);
}
return polygons
},
submitFinalCollation(res, gameID, userID, points, area, mergedPolygonIDs) {
query = util.format("CALL insertPolygon(\"%s\", \"%s\", %d)", gameID, userID, area);
db.get().query(query, function(err, rows) {
if (err) {
console.log(err);
return res.send(400);
}
let polygonID = rows[0][0].polygonID;
query = "INSERT INTO polygonPoints (polygonID, lat, lng) VALUES ";
let delimiterNecessary = false;
points.map((point) => {
if (delimiterNecessary) {
query += ",";
}
query += util.format("(\"%s\",%s,%s)", polygonID, point.lat, point.lng);
delimiterNecessary = true;
});
query += ";";
db.get().query(query, function(err, pointRows) {
if (err) {
console.log(err);
return res.send(400);
}
module.exports.deleteMergedPolygons(mergedPolygonIDs, () => res.send(rows[0][0]));
// res.send(rows[0][0]);
return;
});
});
},
deleteMergedPolygons(mergedPolygonIDs, next) {
if (mergedPolygonIDs.length > 0) {
let id = mergedPolygonIDs.pop();
console.log(id);
let deleteQuery = util.format("CALL deletePolygon(\"%s\");", id);
db.get().query(deleteQuery, function(err, pointRows) {
if (err) {
console.log(err);
return res.send(400);
}
module.exports.deleteMergedPolygons(mergedPolygonIDs, next);
return;
});
} else {
next();
}
},
collatePolygons(res, gameID, userID, points) {
let query = util.format("CALL selectUserPolygon(\"%s\", \"%s\");", gameID, userID);
db.get().query(query, function (err, rows) {
if (err) {
console.log(err);
res.send(500);
}
let polygonPoints = points;
let polygons = module.exports.organisePolygonPoints(rows[0]);
let polygonResult = [];
let polygonsMerged = [];
polygons.map((polygon) => {
if (polygon[0].lat != polygon[polygon.length - 1].lat &&
polygon[0].lng != polygon[polygon.length - 1].lng) {
polygon.push({lat: polygon[0].lat, lng: polygon[0].lng})
}
let intersect = module.exports.checkIntersects(polygonPoints, polygon.coords);
if (intersect != null) {
polygonPoints = module.exports.unionPolygon(polygonPoints, polygon.coords);
polygonsMerged.push(polygon.polygonID);
} else {
polygonResult.push(polygon);
}
});
let area = mathFunc.calculateArea(points);
// module.exports.polygonDestruction(res, gameID, userID, polygonPoints, area, polygonsMerged);
module.exports.submitFinalCollation(res, gameID, userID, polygonPoints, area, polygonsMerged);
});
},
unionPolygon(points1, points2){
let arrayPoints1 = [module.exports.convertPointsObjToArray(points1)];
let arrayPoints2 = [module.exports.convertPointsObjToArray(points2)];
let poly1 = turf.polygon(arrayPoints1);
let poly2 = turf.polygon(arrayPoints2);
let unionPoly = turf.union(poly1, poly2);
return module.exports.convertPointsArrayToObj(unionPoly.geometry.coordinates[0]);
},
checkIntersects(points1, points2) {
let arrayPoints1 = [module.exports.convertPointsObjToArray(points1)];
let arrayPoints2 = [module.exports.convertPointsObjToArray(points2)];
let poly1 = turf.polygon(arrayPoints1);
let poly2 = turf.polygon(arrayPoints2);
return turf.intersect(poly1, poly2);
},
convertPointsObjToArray(points){
let array = points.map((point) => {
return [point.lng, point.lat];
});
return array;
},
convertPointsArrayToObj(points){
let array = points.map((point) => {
return {lat: point[1], lng: point[0]};
});
return array;
}
}