从GeoJson提取坐标报错:List<dynamic>无法转为double
解决GeoJson MultiPolygon类型坐标提取的类型转换错误
问题原因
你的代码仅适配了Polygon类型的GeoJson坐标结构(层级为[ [lon, lat], ... ]),但遇到MultiPolygon类型时,坐标是多层嵌套结构(层级为[ [ [ [lon, lat], ... ], ... ], ... ]),直接取coordinates[0]后尝试将内部数组转换为double,就会抛出type 'List<dynamic>' is not a subtype of type 'double'错误。
解决方案
根据GeoJson的geometry.type区分处理不同的坐标嵌套层级,编写通用解析逻辑适配多种几何类型:
import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:flutter/services.dart' show rootBundle; import 'dart:convert'; List<List<LatLng>> borders = []; Future<void> loadGeoJson() async { String data = await rootBundle.loadString('assets/world.geojson'); Map<String, dynamic> geoJson = json.decode(data); List<dynamic> features = geoJson['features']; for (var feature in features) { var geometry = feature['geometry']; String type = geometry['type']; List<dynamic> coordinates = geometry['coordinates']; // 按几何类型处理坐标 if (type == 'Polygon') { // Polygon结构:[ [ [lon, lat], ... ] ] List<LatLng> border = _parseSinglePolygon(coordinates[0]); borders.add(border); } else if (type == 'MultiPolygon') { // MultiPolygon结构:[ [ [ [lon, lat], ... ] ], ... ] for (var polygonGroup in coordinates) { List<LatLng> border = _parseSinglePolygon(polygonGroup[0]); borders.add(border); } } // 可扩展支持LineString、MultiLineString等其他类型 } } // 统一解析单个Polygon的最内层坐标 List<LatLng> _parseSinglePolygon(List<dynamic> coords) { return coords.map((coord) => LatLng(coord[1], coord[0])).toList(); }
代码说明
- 类型分支处理:通过
geometry['type']判断几何类型,对应不同的坐标嵌套层级 - 复用解析逻辑:用
_parseSinglePolygon函数统一处理最内层的坐标数组,避免重复代码 - 可扩展性:可以快速添加对其他GeoJson几何类型的支持,只需新增对应类型的分支判断
测试验证
用你提供的安圭拉GeoJson数据测试,代码会正确解析两组Polygon的边界坐标,borders数组将包含完整的边界数据,不会再出现类型转换错误。
内容的提问来源于stack exchange,提问作者Pannam
相关产品推荐
相关产品推荐

