/** * @param Address $address * @param string $precision * * @return bool */ public function isAccurate(Address $address, $precision) { if ($precision === GeocodePrecision::COUNTRY && is_null($address->getCountry())) { return false; } else { if ($precision === GeocodePrecision::CITY && is_null($address->getCity())) { return false; } else { if ($precision === GeocodePrecision::STREET_NAME && is_null($address->getStreetName())) { return false; } else { if ($precision === GeocodePrecision::STREET_NUMBER && is_null($address->getStreetNumber())) { return false; } } } } return true; }
/** * @param Address $address * * @return mixed * @throws UnresolvedGeonameException */ public function getOneByAddressTranslation(Address $address) { $queryBuilder = $this->getEntityManager()->createQueryBuilder()->select('g')->addSelect('DISTANCE(g.lat,g.lng,:lat,:lng) AS HIDDEN distance')->from(Geoname::SHORTCUT_CLASS_NAME, 'g')->leftJoin('g.translations', 't')->where('t.alternateName = :alternateName')->having('distance < 1')->setParameter('lat', $address->getLat())->setParameter('lng', $address->getLng())->setParameter('alternateName', $address->getCity()); $query = $queryBuilder->getQuery(); try { return $query->getSingleResult(); } catch (NoResultException $e) { return $this->getNearestCity($address); } catch (NonUniqueResultException $e) { return $this->getNearestCity($address); } }