Example #1
0
 public function pois($id, $max = 50)
 {
     $db = $this->em('nodes');
     $id = (string) $id;
     $ll = $this->getLatLng($this->native($id));
     return xCache('pois.map.' . $id, function () use($db, $ll) {
         $rows = $db->find(['type' => 'poi', 'subtype' => ['$exists' => false]]);
         $collection = [];
         foreach ($rows as $row) {
             $distances = distanceKmMiles(floatval($ll['lng']), floatval($ll['lat']), floatval($row['location']['coordinates'][0]), floatval($row['location']['coordinates'][1]));
             $row['distance'] = $distances['km'] * 1000;
             if ($row['distance'] <= 500 && !empty($row['medias'])) {
                 $collection[] = $row;
             }
         }
         return array_values(coll($collection)->sortBy('distance')->toArray());
     });
     $pois = Model::PoiAssoc()->where(['id_node', '=', $id])->cursor();
     $collection = [];
     $ll = $this->getLatLng($this->native($id));
     foreach ($pois as $poi) {
         $poi = $this->native($poi['id_poi']);
         $location = $poi['location'];
         $lng = current($location['coordinates']);
         $lat = end($location['coordinates']);
         $distances = distanceKmMiles(floatval($ll['lng']), floatval($ll['lat']), floatval($lng), floatval($lat));
         $poi['distance'] = $distances['km'] * 1000;
         if ($poi['distance'] <= 500 && !empty($poi['medias'])) {
             // $imgs = lib('geo')->panoramic($poi['title']);
             // $poi['imgs'] = $imgs;
             $collection[] = $poi;
         }
     }
     return array_values(coll($collection)->sortBy('distance')->toArray());
     $location = $this->native($id)['location'];
     $lng = current($location['coordinates']);
     $lat = end($location['coordinates']);
     $db = $this->em('geo.place');
     $db->ensureIndex(['coordinates' => '2d']);
     return $db->find(['id_4s' => ['$exists' => true], 'image' => ['$exists' => true], 'coordinates' => ['$near' => [floatval($lng), floatval($lat)]]])->limit($max);
 }