新手技术问询:从HashMap/jobs提取地址转LatLng并加入markerPoints数组
地址转LatLng并添加到markerPoints的解决方案
嘿,作为开发新手遇到这种地理编码的问题太正常了,我来一步步帮你搞定~核心思路是用地理编码工具把字符串地址转换成经纬度坐标(LatLng),然后结合你的现有代码逻辑来实现需求。
1. 先完善你的接口数据解析逻辑
首先把你代码里缺失的HashMap填充部分补全,同时加入地址转LatLng并添加到markerPoints的逻辑(假设接口返回的地址字段是"address",如果不是,替换成你实际的字段名):
try { JSONObject jobj = jparser.makeHttpRequest(URL, "POST", params); success = jobj.getInt("success"); s = jobj.getString("message"); if(success == 1){ jobs = new ArrayList<HashMap<String,String>>(); // 初始化markerPoints数组,假设是ArrayList<LatLng>类型 ArrayList<LatLng> markerPoints = new ArrayList<>(); JSONArray jAr = jobj.getJSONArray("routeplanning"); for (int i = 0; i < jAr.length(); i++) { JSONObject job = jAr.getJSONObject(i); HashMap<String, String> map = new HashMap<>(); // 从接口拿到地址并存入HashMap String address = job.getString("address"); map.put("address", address); // 把地址转成LatLng,成功的话加入markerPoints LatLng latLng = getLatLngFromAddress(address, getApplicationContext()); if(latLng != null){ markerPoints.add(latLng); } jobs.add(map); } } } catch (JSONException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
2. 实现地址转LatLng的工具方法
上面用到的getLatLngFromAddress是核心方法,用Android自带的Geocoder类来处理地址解析:
private LatLng getLatLngFromAddress(String address, Context context) throws IOException { Geocoder geocoder = new Geocoder(context, Locale.getDefault()); // 尝试获取地址对应的地理坐标,最多返回1个最匹配的结果 List<Address> addressList = geocoder.getFromLocationName(address, 1); if(addressList != null && !addressList.isEmpty()){ Address location = addressList.get(0); return new LatLng(location.getLatitude(), location.getLongitude()); } // 如果地址解析失败(比如地址不存在、网络问题),返回null return null; }
3. 从已有的HashMap数组(jobs)中批量处理地址
如果你已经填充好了jobs数组,之后想批量提取里面的地址转成LatLng,直接遍历jobs即可:
// 假设jobs是已经填充完成的ArrayList<HashMap<String,String>> ArrayList<LatLng> markerPoints = new ArrayList<>(); for(HashMap<String, String> map : jobs){ String address = map.get("address"); // 对应你存入HashMap时的key if(address != null && !address.trim().isEmpty()){ try { LatLng latLng = getLatLngFromAddress(address, getApplicationContext()); if(latLng != null){ markerPoints.add(latLng); } else { // 这里可以处理解析失败的情况,比如打印日志 Log.d("Geocoding", "无法解析地址:" + address); } } catch (IOException e) { e.printStackTrace(); Log.d("Geocoding", "解析地址时出错:" + e.getMessage()); } } }
几个重要提醒
- 权限配置:别忘了在
AndroidManifest.xml里添加必要权限,否则Geocoder可能无法正常工作:<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> - 异步处理:如果要解析的地址数量较多,一定要把解析操作放到异步线程(比如用Coroutine、AsyncTask)里,别在主线程执行,不然会导致UI卡顿甚至ANR。
- 异常兜底:Geocoder经常会因为地址模糊、网络波动返回null,一定要做好非空判断,避免空指针异常。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

