如何对字符串中的浮点距离值求和?附经纬度测距代码问题
问题分析与解决方案
Let's break down your two main issues and fix them step by step:
1. 解决多距离求和的NumberFormatException问题
你遇到NumberFormatException的核心原因很明确:你的字符串(比如"24.5 km10.1 km30.9 km")不是一个合法的单一数字,它混合了多个距离值和非数字字符(km和空格)。直接对整个字符串调用Double.parseDouble()必然会失败,因为方法无法解析非数字内容。
解决方案:拆分并逐个解析距离片段
我们可以把字符串拆分成单个距离片段,清理每个片段后再累加求和:
String stringValue = getDistanceOnRoad(lat, lon, lat2, lon2); double sumValue = 0.0; Log.d("my string is", stringValue); // 按"km"分割字符串,分离出每个数字片段 String[] distanceSegments = stringValue.split("km"); for (String segment : distanceSegments) { // 去除空格,跳过因末尾"km"产生的空片段 String cleanedSegment = segment.trim(); if (!cleanedSegment.isEmpty()) { try { sumValue += Double.parseDouble(cleanedSegment); Log.d("Added distance", cleanedSegment + " km"); } catch (NumberFormatException e) { Log.e("Distance Error", "无法解析的片段: " + cleanedSegment, e); } } } Log.d("Total Distance Sum", String.valueOf(sumValue) + " km");
这段代码会把输入字符串按"km"拆分,清理掉每个片段的多余空格,将合法的数字片段转为double类型后累加,最终得到总距离。
2. 经纬度计算两点距离的两种方式
根据你的需求,你可以选择以下两种方案:
方案1:直线距离(Haversine公式)
这是一种无需调用API的离线计算方式,用于计算地球表面两点的最短直线距离(无视道路、障碍),速度很快:
private double calculateStraightLineDistance(double lat1, double lon1, double lat2, double lon2) { final int EARTH_RADIUS_KM = 6371; // 地球平均半径,单位:公里 // 将角度转为弧度(三角函数要求的输入格式) double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - lon1); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return EARTH_RADIUS_KM * c; // 返回公里数 }
适合不需要考虑实际道路路径的场景。
方案2:优化后的道路距离(Google Directions API)
你原本的getDistanceOnRoad方法存在缺陷:它抓取XML响应中最后一个<text>标签,而这个标签可能来自分步导航文本,并非总道路距离。我们修改方法,精准定位总距离的标签:
private String getRoadDistance(double lat1, double lon1, double lat2, double lon2) { String totalDistance = ""; // 修正URL格式(解决原代码中的转义符问题) String url = String.format( "http://maps.google.com/maps/api/directions/xml?origin=%f,%f&destination=%f,%f&sensor=false&units=metric", lat1, lon1, lat2, lon2 ); try { HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); HttpResponse response = httpClient.execute(httpPost); InputStream is = response.getEntity().getContent(); DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.parse(is); // 导航到<leg> -> <distance> -> <text>标签,获取总道路距离 NodeList legNodes = doc.getElementsByTagName("leg"); if (legNodes.getLength() > 0) { Element legElement = (Element) legNodes.item(0); NodeList distanceNodes = legElement.getElementsByTagName("distance"); if (distanceNodes.getLength() > 0) { Element distanceElement = (Element) distanceNodes.item(0); NodeList textNodes = distanceElement.getElementsByTagName("text"); if (textNodes.getLength() > 0) { totalDistance = textNodes.item(0).getTextContent().trim(); } } } } catch (Exception e) { e.printStackTrace(); } return totalDistance; }
修改后的方法会返回类似"12.5 km"的清晰字符串,而非多个距离拼接的内容,后续解析求和会更简单。
内容的提问来源于stack exchange,提问作者Sunil Kumar
相关产品推荐
相关产品推荐

