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); }