Функция $ geoIntersects в mon goose всегда возвращает true - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь проверить, пересекаются ли широта и долгота с моим полигоном. И если да, примените скидку на цену. Но что бы я ни делал, он всегда применяет скидку, даже если я использовал точку А из Нью-Йорка, а мой Полигон находится в Европе -

"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?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...