Google Places Api sort by distance

后端 未结 3 1361
盖世英雄少女心
盖世英雄少女心 2020-12-09 13:56

Currently developing an Android application that returns the closest 20 location to the users current location.

Google Places API is retur

3条回答
  •  没有蜡笔的小新
    2020-12-09 14:12

    Hope this code will work..

        private ArrayList sortLocation(LatLng currentLatLng, ArrayList alLocationDTO)
        {
            ArrayList clPlaceDTOArrayList;
            ArrayList clPlaceDTOArrayList1 = new ArrayList<>();
            double dCurrentLat = currentLatLng.latitude;
            double dCurrentLong = currentLatLng.longitude;
    
            Iterator clIterator = alLocationDTO.iterator();
            while (clIterator.hasNext())
            {
                clIterator.next();
                clPlaceDTOArrayList = new ArrayList<>();
                for (int j = 0; j < alLocationDTO.size(); j++)
                {
                    CLLocationDTO clLocationDTO = (CLLocationDTO) alLocationDTO.get(j);
                    double dLat = clLocationDTO.getLatitude().doubleValue();
                    double dLng = clLocationDTO.getLongitude().doubleValue();
                    LatLng clNewLatLng = new LatLng(dLat, dLng);
                    double dDistance = getDistance(dCurrentLat, dCurrentLong, dLat, dLng);
                    CLPlaceDTO clPlaceDTO = new CLPlaceDTO(clLocationDTO.getAccountName(), clNewLatLng, dDistance);
                    clPlaceDTOArrayList.add(clPlaceDTO);
                }
                Collections.sort(clPlaceDTOArrayList, new CLSortPlaces(currentLatLng));
                dCurrentLat = clPlaceDTOArrayList.get(0).getLatlng().latitude;
                dCurrentLong = clPlaceDTOArrayList.get(0).getLatlng().longitude;
                clPlaceDTOArrayList1.add(clPlaceDTOArrayList.get(0));
                clIterator.remove();
            }
    
            return clPlaceDTOArrayList1;
        }
    
         public static double getDistance(double dbFromLatitude,double dbFromLongitude,double dbToLatitude,double dbToLongitude)
        {
              double dbRadiusMeters = EARTH_RADIUS * 1000 ; // Earth’s mean radius in meter
              double dbLatitudeDiff = Math.toRadians(dbToLatitude - dbFromLatitude);
              double dbLongitudeDiff = Math.toRadians(dbToLongitude - dbFromLongitude);
    
              double a = Math.sin(dbLatitudeDiff / 2) * Math.sin(dbLatitudeDiff / 2) +
                                        Math.cos(Math.toRadians(dbFromLatitude)) * Math.cos(Math.toRadians(dbToLatitude)) *
                                        Math.sin(dbLongitudeDiff / 2) * Math.sin(dbLongitudeDiff / 2);
    
              double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
              double d = dbRadiusMeters * c;
              return d; // returns the distance in meter
        }
    
        public class CLSortPlaces implements Comparator
        {
            private LatLng currentLoc;
    
            CLSortPlaces(LatLng current)
            {
                currentLoc = current;
            }
    
            @Override
            public int compare(final CLPlaceDTO place1, final CLPlaceDTO place2)
            {
    
                return (int) (place1.dDistance - place2.dDistance);
            }
        }
    
    
    
         public class CLPlaceDTO
    {
        public LatLng latlng;
        public String sNameOfLocation;
        public double dDistance;
    
        public CLPlaceDTO(String sNameOfLocation, LatLng latlng,double dDistance)
        {
            this.sNameOfLocation = sNameOfLocation;
            this.latlng = latlng;
            this.dDistance=dDistance;
        }
        public CLPlaceDTO(String sNameOfLocation, LatLng latlng)
        {
            this.sNameOfLocation = sNameOfLocation;
            this.latlng = latlng;
            this.dDistance=dDistance;
        }}
    

提交回复
热议问题