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

从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();
}

代码说明

  1. 类型分支处理:通过geometry['type']判断几何类型,对应不同的坐标嵌套层级
  2. 复用解析逻辑:用_parseSinglePolygon函数统一处理最内层的坐标数组,避免重复代码
  3. 可扩展性:可以快速添加对其他GeoJson几何类型的支持,只需新增对应类型的分支判断

测试验证

用你提供的安圭拉GeoJson数据测试,代码会正确解析两组Polygon的边界坐标,borders数组将包含完整的边界数据,不会再出现类型转换错误。

内容的提问来源于stack exchange,提问作者Pannam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:02:01