在Android客户端上实现按距离排序,需要使用javase数组工具类和集合工具类中提供的sort方法,sort就是使用Comparator接口来处理排序。
Arrays.sort(T[],Comparator<? super T> c);
Collections.sort(List<T> list,Comparator<? super T> c);
// 自定义比较器:
private static class SbLocationComparator implements Comparator {
private LatLng pCenter;
SbLocationComparator(LatLng pCenter) {
this.pCenter = pCenter;
}
public int compare(Object object1, Object object2) {// 实现接口中的方法
SbLocation p1 = (SbLocation) object1;
int distance1 = (int) DistanceUtil.getDistance2(pCenter.latitude, pCenter.longitude,
Double.valueOf(p1.getLatitude()),
Double.valueOf(p1.getLongitude()));
SbLocation p2 = (SbLocation) object2;
int distance2 = (int) DistanceUtil.getDistance2(pCenter.latitude, pCenter.longitude,
Double.valueOf(p2.getLatitude()),
Double.valueOf(p2.getLongitude()));
//L.d("compare:+distance1=>" + distance1 + " distance2=>" + distance2);
return distance1 - distance2;
}
}
import java.text.DecimalFormat;
public class DistanceUtil {
// 地球平均半径
private static final double EARTH_RADIUS = 6378137;
// 把经纬度转为度(°)
private static double rad(double d) {
return d * Math.PI / 180.0;
}
/**
* 根据两点间经纬度坐标(double值),计算两点间距离,单位:千米
* @author ershuai
* @param lng1
* @param lat1
* @param lng2
* @param lat2
* @return
*/
public static double getDistance(double lng1, double lat1, double lng2, double lat2) {
double radLat1 = rad(lat1);
double radLat2 = rad(lat2);
double a = radLat1 - radLat2;
double b = rad(lng1) - rad(lng2);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = s / 1000;
DecimalFormat df = new DecimalFormat("#.00");
s = Double.parseDouble(df.format(s));
return s;
}
/**
* 根据两点间经纬度坐标(double值),计算两点间距离,单位:千米
* @author ershuai
* @param pCenter_latitude
* @param pCenter_longitude
* @param latitude
* @param longitude
* @return
*/
public static double getDistance2(double pCenter_latitude,double pCenter_longitude,double latitude,double longitude) {
double radLat1 = rad(pCenter_latitude);
double radLat2 = rad(latitude);
double a = radLat1 - radLat2;
double b = rad(pCenter_longitude) - rad(longitude);
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
return s;
}
public static void main(String[] args) {
double distance1 = getDistance(104.046115, 30.6030110000, 104.074666, 30.611842);
System.out.println("Distance is: " + distance1 + " km");
}
}
LatLng pCenter//输入中心点
Collections.sort(trandomList, new SbLocationComparator(pCenter));
网友评论