Beispiel #1
0
 /// <summary>
 ///   Checks whether two messages fall close one another.
 /// </summary>
 /// <param name="messages">The messages to be checked</param>
 /// <returns>True if (and only if) the message are close enough</returns>
 private bool AreCloseEnough(Localizzazione loc1, Localizzazione loc2)
 {
     var distance = loc1.GetDistanceTo(loc2);
     return distance <= InterpolationThreshold_mt;
 }
        public QueryProssimitaResult Get(Localizzazione punto, float distanzaMaxMt, string[] classiMezzo)
        {
            BsonDocument query;

            if ((classiMezzo != null) && (classiMezzo.Length > 0))
            {
                query = new BsonDocument {
                    { "query", new BsonDocument {
                          { "istanteAcquisizione", new BsonDocument {
                            {
                                "$gt", DateTime.Now.AddHours(-24).ToUniversalTime()
                            }
                        } },
                          { "classiMezzo", new BsonDocument {
                            {
                                "$in", new BsonArray(classiMezzo)
                            }
                        } }
                      } }
                }
            }
            ;
            else
            {
                query = new BsonDocument {
                    { "query", new BsonDocument {
                          { "istanteAcquisizione", new BsonDocument {
                            {
                                "$gt", DateTime.Now.AddHours(-24).ToUniversalTime()
                            }
                        } }
                      } }
                }
            };

            var geoNearOptions = new BsonDocument {
                { "near", new BsonDocument {
                      { "type", "Point" },
                      { "coordinates", new BsonArray {
                            punto.Lon, punto.Lat
                        } },
                  } },
                { "distanceField", "distanza" },
                { "maxDistance", distanzaMaxMt },
                query,
                { "spherical", true },
            };

            var pipeline = new[] {
                new BsonDocument {
                    { "$geoNear", geoNearOptions }
                },
            };

            var sw = new Stopwatch();

            sw.Start();
            var prossimitaMezzo = this.messaggiPosizioneCollection.Aggregate <BsonDocument>(pipeline)
                                  .ToEnumerable()
                                  .Select(d => new ProssimitaMezzo()
            {
                MessaggioPosizione = BsonSerializer.Deserialize <MessaggioPosizione_DTO>(d).ConvertToDomain(),
                DistanzaMt         = (float)d["distanza"].AsDouble
            });

            var arrayProssimitaMezzo = prossimitaMezzo.ToArray();

            sw.Stop();

            return(new QueryProssimitaResult()
            {
                IstanteQuery = DateTime.Now.ToUniversalTime(),
                NumeroMezzi = arrayProssimitaMezzo.Length,
                DistanzaMaxMt = distanzaMaxMt,
                Punto = punto,
                DurataQuery_msec = sw.ElapsedMilliseconds,
                Risultati = arrayProssimitaMezzo
            });
        }
    }
        public QueryProssimitaResult Get(Localizzazione punto, float distanzaMaxMt, string[] classiMezzo, int attSec)
        {
            var lastMessageFilter = Builders<MessaggioPosizione>.Filter
                .Eq(m => m.Ultimo, true);

            var recentMessagesFilter = Builders<MessaggioPosizione>.Filter
                .Gte(m => m.IstanteAcquisizione, DateTime.UtcNow.AddSeconds(-attSec));

            var filter = lastMessageFilter & recentMessagesFilter;

            if ((classiMezzo != null) && (classiMezzo.Length > 0))
            {
                var classFilter = Builders<MessaggioPosizione>.Filter
                    .AnyIn(m => m.ClassiMezzo, classiMezzo);

                filter &= classFilter;
            }

            var serializerRegistry = BsonSerializer.SerializerRegistry;
            var documentSerializer = serializerRegistry.GetSerializer<MessaggioPosizione>();
            var bsonFilter = filter.Render(documentSerializer, serializerRegistry);

            var geoNearOptions = new BsonDocument {
                { "near", new BsonDocument {
                    { "type", "Point" },
                    { "coordinates", new BsonArray { punto.Lon, punto.Lat } },
                } },
                { "distanceField", "distanza" },
                { "maxDistance", distanzaMaxMt },
                { "query", bsonFilter },
                { "spherical" , true },
            };

            var pipeline = new[] {
                new BsonDocument { { "$geoNear", geoNearOptions } },
                new BsonDocument { { "$sort", new BsonDocument { { "codiceMezzo", 1 } } } },
            };

            var sw = new Stopwatch();
            sw.Start();
            var prossimitaMezzo = this.messaggiPosizioneCollection.Aggregate<BsonDocument>(pipeline)
                .ToEnumerable()
                .Select(d => new ProssimitaMezzo()
                {
                    MessaggioPosizione = BsonSerializer.Deserialize<MessaggioPosizione>(d),
                    DistanzaMt = (float)d["distanza"].AsDouble
                })
                .ToArray();

            var arrayProssimitaMezzo = prossimitaMezzo.ToArray();
            sw.Stop();

            return new QueryProssimitaResult()
            {
                IstanteQuery = DateTime.UtcNow,
                NumeroMezzi = arrayProssimitaMezzo.Length,
                DistanzaMaxMt = distanzaMaxMt,
                Punto = punto,
                DurataQuery_msec = sw.ElapsedMilliseconds,
                Risultati = arrayProssimitaMezzo
            };
        }
Beispiel #4
0
 public Localizzazione_DTO(Localizzazione localizzazione)
 {
     this.Coordinates = new[] { localizzazione.Lon, localizzazione.Lat };
 }