You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对字符串中的浮点距离值求和?附经纬度测距代码问题

问题分析与解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:15:46