解决报错:
1.Invalid geoJson format Cannot read property 'length' of undefined
2 echarts.min.js:45 Uncaught Error: Invalid geoJson format Cannot read prope
项目中用echarts绘制地图,由于网上乡镇级别行政边界地图很少需要自己制作,所以用到了bigMap+geojson.io绘制自定义地图,
但是由于生成的地图里有一个区域为两块不连续的地图块,所以生成的geoJson中此区域的geometry.type===GeometryCollection.
然而 echarts 中对于此类型没有做处理,详情见源码
node_modules/echarts\lib\coord\geo\parseGeoJson.js
第133行左右
在这里插入图片描述
这段代码的意思是解析geoJson

 

解决方法

需要修改如下函数:
echarts 源代码 大约127行

export default function parseGeoJSON(geoJson, nameProperty) {
......
}

直接复制粘贴:

export default function parseGeoJSON(geoJson, nameProperty) {
  geoJson = decode(geoJson);

  return zrUtil.map(
    zrUtil.filter(geoJson.features, function (featureObj) {
      if (featureObj.geometry.geometries) {
        let geometry = featureObj.geometry.geometries.map(i => {
          return i.coordinates;
        });
        let { type, properties, ...params } = featureObj;
        return { type, properties, geometry };
      }
      // Output of mapshaper may have geometry null
      return (
        featureObj.geometry &&
        featureObj.properties &&
        featureObj.geometry.coordinates &&
        featureObj.geometry.coordinates.length > 0
      );
    }),
    function (featureObj) {
      var properties = featureObj.properties;
      var geo = featureObj.geometry;
      var coordinates = geo.coordinates;
      var geometries = [];

      if (geo.type === "GeometryCollection") {
        let geometry = {
          type: "Polygon"
        };
        let coordinatesArr = featureObj.geometry.geometries.map(i => {
          return i.coordinates;
        });
        geometry.coordinates = coordinatesArr;

        coordinatesArr.forEach(i => {
          geometries.push({
            type: "polygon",
            // According to the GeoJSON specification.
            // First must be exterior, and the rest are all interior(holes).
            exterior: i[0],
            interiors: i.slice(1)
          });
        });
      }
      if (geo.type === "Polygon") {

        geometries.push({
          type: "polygon",
          // According to the GeoJSON specification.
          // First must be exterior, and the rest are all interior(holes).
          exterior: coordinates[0],
          interiors: coordinates.slice(1)
        });
      }

      if (geo.type === "MultiPolygon") {
        zrUtil.each(coordinates, function (item) {
          if (item[0]) {
            geometries.push({
              type: "polygon",
              exterior: item[0],
              interiors: item.slice(1)
            });
          }
        });
      }

      var region = new GeoJSONRegion(
        properties[nameProperty || "name"],
        geometries,
        properties.cp
      );
      region.properties = properties;
      return region;
    }
  );

}