Я пытаюсь проверить, пересекаются ли широта и долгота с моим полигоном. И если да, примените скидку на цену. Но что бы я ни делал, он всегда применяет скидку, даже если я использовал точку А из Нью-Йорка, а мой Полигон находится в Европе -
"coordinates" : [
[
[
41.5311338460033,
-8.61901849508286
],
[
41.5311338460033,
-8.61851692199707
],
[
41.5312944769825,
-8.61851692199707
],
[
41.5312944769825,
-8.61901849508286
],
[
41.5311338460033,
-8.61901849508286
]
]
]
Эти координаты съели мой Полигон и
'use strict';
const mongoose = require('mongoose');
let Schema = mongoose.Schema;
/**
* @typedef PlaceSchema
* @property {object} location
* @property {number} coordinates
* @property {number} range
* @property {number} capacity
* @property {number} quantity
* @property {string} street
*/
let PlaceSchema = new Schema({
location: {
type: {
type: String,
enum: ['Point', 'Polygon'],
required: true
},
coordinates: {
type: Array,
required: true
}
},
center: {
type: Array
},
range: { type: Number },
capacity: {
type: Number
},
quantity: {
type: Number
},
street: {
type: String
},
cp: {
type: String
},
city: {
type: String
}
});
location.coordinates - это 2-мерный массив моего многоугольника, хранящийся в базе данных
, а внутри модели у меня есть метод
//VALIDADO!
PlaceSchema.methods.comparePlaceWithFinalPlace = async function(lat, lon) {
this.model('Places').find(
{
'location.coordinates': {
$geoIntersects: {
$geometry: { type: 'Point', coordinates: [lat, lon] }
}
}
},
async function(error, places) {
if (error) {
return await error;
}
if (places) {
return true;
} else {
return false;
}
}
);
};
PlaceSchema.index({ location: '2dsphere' });
exports.payment = async function(req, res) {
const place = new Place();
let id = mongoose.Types.ObjectId(req.params.id);
let query = { _id: id };
Rental.findOneAndUpdate(
query,
{
$set: {
checkin: false,
checkout: false
}
},
{ upsert: true, new: true },
function(err, rental) {
console.log(rental);
const timeSpentInMinutes = (rental.end.date - rental.start.date) / 60000;
const timeSpentInHours = (rental.end.date - rental.start.date) / 3600000;
const lat = rental.end.geometry.coordinates[0];
const lon = rental.end.geometry.coordinates[1];
console.log(lat, lon); //40.73061 -73.935242
rental.price = 1;
if (rental.rentalMethod == 'minutes') {
rental.finalCost = rental.price + timeSpentInMinutes * 0.15;
rental.hasDiscount == false;
if (place.comparePlaceWithFinalPlace(lat, lon)) {
//ITS ALWAYS COMING HERE
rental.hasDiscount == true;
rental.finalCost = rental.price + timeSpentInMinutes * 0.15 - 0.5;
}
}
if (rental.rentalMethod == 'pack') {
rental.hasDiscount == false;
if (timeSpentInHours > 0 && timeSpentInHours <= 1) rental.finalCost = 6;
else if (timeSpentInHours > 1 && timeSpentInHours <= 2)
rental.finalCost = 10;
else rental.finalCost = 25;
if (place.comparePlaceWithFinalPlace(lat, lon)) {
console.log('ALWAYS COMES HERE');
rental.hasDiscount == true;
rental.finalCost = rental.finalCost - 0.5;
}
}```
And this is where im trying to use the method that i created but no matter what, it always enter the functions and applies the 0.5 discount.
Can anyone help me on why the $geo function isnt working?