Android(Java)从字符串提取经纬度的简便方案
提取trkpt标签中经纬度的简便方案(Android/Java)
在Android的Java环境里,处理这种属性顺序不固定的<trkpt>标签,完全没必要手动去计算字符串索引,这里有两种省心又靠谱的方案,按需选择:
方案一:用Android自带XmlPullParser解析(推荐,适配完整GPX文件)
<trkpt>是GPX格式的标准XML标签,用系统内置的XmlPullParser可以完美兼容属性顺序变化的场景,不需要依赖第三方库,稳定性拉满。
示例代码:
// 假设已获取到GPX内容的输入流(比如从本地文件、网络请求读取) XmlPullParser parser = Xml.newPullParser(); parser.setInput(inputStream, "UTF-8"); int eventType = parser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { if (eventType == XmlPullParser.START_TAG && "trkpt".equals(parser.getName())) { // 直接通过属性名取值,完全不用管lat和lon的排列顺序 String latStr = parser.getAttributeValue(null, "lat"); String lonStr = parser.getAttributeValue(null, "lon"); // 转换为数值类型(可根据需求添加异常处理,比如捕获格式错误) double latitude = Double.parseDouble(latStr); double longitude = Double.parseDouble(lonStr); // 这里处理提取到的经纬度,比如存入集合或进行业务逻辑处理 // ... } eventType = parser.next(); }
这个方法完全遵循XML规范,就算标签里新增其他属性、属性顺序调整,都能精准拿到lat和lon的值,不会因为字符串格式的小变动就失效。
方案二:正则表达式提取(适合零散的标签字符串)
如果你的输入只是单独的<trkpt>标签片段,不想引入XML解析逻辑的话,正则表达式是个轻便的选择,写个通用正则就能匹配任意顺序的lat和lon属性。
示例代码:
String trkptStr = "<trkpt lon=\"18.062546\" lat=\"59.334781\">"; // 匹配lat="xxx"或lon="xxx"格式,捕获引号内的数值(支持负数的话把正则改成([-\\d.]+)) Pattern pattern = Pattern.compile("(lat|lon)=\"([\\d.]+)\""); Matcher matcher = pattern.matcher(trkptStr); double lat = 0.0; double lon = 0.0; while (matcher.find()) { String attrName = matcher.group(1); String valueStr = matcher.group(2); if ("lat".equals(attrName)) { lat = Double.parseDouble(valueStr); } else if ("lon".equals(attrName)) { lon = Double.parseDouble(valueStr); } } // 此时lat和lon就是提取到的经纬度数值
注意:正则更适合处理格式标准的标签片段,如果标签里存在引号转义等特殊情况,可能需要调整正则规则,但对于常规GPX标签来说完全够用。
两种方案各有优劣:优先选XmlPullParser,官方推荐的XML解析方式,鲁棒性更强;如果只是处理少量字符串片段,正则会更轻便灵活。
内容的提问来源于stack exchange,提问作者unipin
相关产品推荐
相关产品推荐

