parent
a18ba767d6
commit
45eae9a076
@ -0,0 +1,128 @@
|
||||
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, mergedPolygonIDs) {
|
||||
console.log(module.exports.convertPointsObjToArray(points));
|
||||
let area = mathFunc.calculateArea(points);
|
||||
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) => {
|
||||
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);
|
||||
}
|
||||
});
|
||||
module.exports.submitFinalCollation(res, gameID, userID, polygonPoints, 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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue