mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-27 04:43:54 +01:00
Calculate boundaries of nearby places, without iterating all of them again
This commit is contained in:
parent
1320952373
commit
283bc35a4a
1 changed files with 32 additions and 3 deletions
|
|
@ -42,17 +42,39 @@ public class NearbyController {
|
||||||
* @param curLatLng current location for user
|
* @param curLatLng current location for user
|
||||||
* @return Place list without distance information
|
* @return Place list without distance information
|
||||||
*/
|
*/
|
||||||
public List<Place> loadAttractionsFromLocation(LatLng curLatLng) {
|
//public List<Place> loadAttractionsFromLocation(LatLng curLatLng) {
|
||||||
|
public NearbyPlacesInfo loadAttractionsFromLocation(LatLng curLatLng) {
|
||||||
Timber.d("Loading attractions near %s", curLatLng);
|
Timber.d("Loading attractions near %s", curLatLng);
|
||||||
|
NearbyPlacesInfo nearbyPlacesInfo = new NearbyPlacesInfo();
|
||||||
|
//LatLng[] cornerCoordinates = new LatLng[4];
|
||||||
|
//LatLng west, east, north, south = new LatLng(0,0,0);
|
||||||
if (curLatLng == null) {
|
if (curLatLng == null) {
|
||||||
return Collections.emptyList();
|
//return Collections.emptyList();
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
List<Place> places = nearbyPlaces.getFromWikidataQuery(curLatLng, Locale.getDefault().getLanguage());
|
List<Place> places = nearbyPlaces.getFromWikidataQuery(curLatLng, Locale.getDefault().getLanguage());
|
||||||
|
LatLng[] boundaryCoordinates = {places.get(0).location, // south
|
||||||
|
places.get(0).location, // north
|
||||||
|
places.get(0).location, // west
|
||||||
|
places.get(0).location};// east, init with a random location
|
||||||
if (curLatLng != null) {
|
if (curLatLng != null) {
|
||||||
Timber.d("Sorting places by distance...");
|
Timber.d("Sorting places by distance...");
|
||||||
final Map<Place, Double> distances = new HashMap<>();
|
final Map<Place, Double> distances = new HashMap<>();
|
||||||
for (Place place: places) {
|
for (Place place: places) {
|
||||||
distances.put(place, computeDistanceBetween(place.location, curLatLng));
|
distances.put(place, computeDistanceBetween(place.location, curLatLng));
|
||||||
|
// Find boundaries with basic find max approach
|
||||||
|
if (place.location.getLatitude() < boundaryCoordinates[0].getLatitude()) {
|
||||||
|
boundaryCoordinates[0] = place.location;
|
||||||
|
}
|
||||||
|
if (place.location.getLatitude() > boundaryCoordinates[1].getLatitude()) {
|
||||||
|
boundaryCoordinates[1] = place.location;
|
||||||
|
}
|
||||||
|
if (place.location.getLongitude() < boundaryCoordinates[2].getLongitude()) {
|
||||||
|
boundaryCoordinates[2] = place.location;
|
||||||
|
}
|
||||||
|
if (place.location.getLongitude() > boundaryCoordinates[3].getLongitude()) {
|
||||||
|
boundaryCoordinates[3] = place.location;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Collections.sort(places,
|
Collections.sort(places,
|
||||||
(lhs, rhs) -> {
|
(lhs, rhs) -> {
|
||||||
|
|
@ -62,7 +84,9 @@ public class NearbyController {
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return places;
|
nearbyPlacesInfo.placeList = places;
|
||||||
|
nearbyPlacesInfo.boundaryCoordinates = boundaryCoordinates;
|
||||||
|
return nearbyPlacesInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -123,4 +147,9 @@ public class NearbyController {
|
||||||
}
|
}
|
||||||
return baseMarkerOptions;
|
return baseMarkerOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class NearbyPlacesInfo {
|
||||||
|
List<Place> placeList; // List of nearby places
|
||||||
|
LatLng[] boundaryCoordinates; // Corners of nearby area
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue