如何按经纬度从近到远排序并存入ArrayList?代码实现咨询
我来帮你搞定经纬度按距离从近到远排序并存入ArrayList<LatLng>的需求,结合你给出的代码片段,咱们一步步实现:
核心思路
- 先把所有需要排序的地址(你代码里的取货/送货地址)转换为
LatLng对象 - 以你指定的原点(代码里的
originAddr)为基准,计算每个LatLng到原点的距离 - 使用自定义比较器对
LatLng列表按距离从小到大排序 - 将排序后的结果存入
mPoints
完整代码实现
首先补充你代码里的Geocoder解析部分,再添加排序逻辑:
// 初始化临时列表存放所有解析出的LatLng List<LatLng> tempLatLngList = new ArrayList<>(); // 获取原点的经纬度(从你代码里的originAddr提取) double originLat = originAddr.getLatitude(); double originLng = originAddr.getLongitude(); String address; String address1; Geocoder geocoder = new Geocoder(con); Address originAddr = addressList1.get(0); // 假设你已经正确拿到jobs列表和addressList数据 for (int i = 0; i < jobs.size(); i++) { address = jobs.get(i).get("pick_address"); address1 = jobs.get(i).get("delivery_address"); List<Address> addrList2 = null; List<Address> addrList3 = null; try { // 解析取货地址为LatLng,只取最匹配的第一个结果 addrList2 = geocoder.getFromLocationName(address, 1); if (addrList2 != null && !addrList2.isEmpty()) { Address pickAddr = addrList2.get(0); LatLng pickLatLng = new LatLng(pickAddr.getLatitude(), pickAddr.getLongitude()); tempLatLngList.add(pickLatLng); } // 解析送货地址为LatLng(如果不需要处理送货地址,直接删除这段即可) addrList3 = geocoder.getFromLocationName(address1, 1); if (addrList3 != null && !addrList3.isEmpty()) { Address deliveryAddr = addrList3.get(0); LatLng deliveryLatLng = new LatLng(deliveryAddr.getLatitude(), deliveryAddr.getLongitude()); tempLatLngList.add(deliveryLatLng); } } catch (IOException e) { // 处理地址解析失败的异常,比如打印日志排查问题 e.printStackTrace(); } } // 对LatLng列表按到原点的距离从小到大排序 Collections.sort(tempLatLngList, new Comparator<LatLng>() { @Override public int compare(LatLng latLngA, LatLng latLngB) { // 用Android SDK提供的方法计算球面距离,单位为米 float[] distanceToA = new float[1]; Location.distanceBetween(originLat, originLng, latLngA.latitude, latLngA.longitude, distanceToA); float[] distanceToB = new float[1]; Location.distanceBetween(originLat, originLng, latLngB.latitude, latLngB.longitude, distanceToB); // 比较距离实现从近到远排序,调换参数可改为从远到近 return Float.compare(distanceToA[0], distanceToB[0]); } }); // 将排序后的结果存入你的mPoints列表 mPoints = new ArrayList<>(tempLatLngList);
关键细节说明
- 解析容错处理:必须判断
addrList2/addrList3是否为null或空列表,避免空指针异常——地址解析可能因为地址无效、网络问题等失败 - 距离计算可靠性:用
Location.distanceBetween比自己手写Haversine公式更省心,Android SDK已经帮我们处理了球面距离的精准计算 - 排序灵活调整:如果需要从远到近排序,只需要把
Float.compare的两个参数调换位置即可 - 地址类型筛选:如果只需要处理取货地址或者送货地址,直接删除对应类型的解析代码就行
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

