Uncaught Error:Invalid geoJson format Cannot read property ‘length‘ of undefind

对比geojson数据发现,出现报错原因是因为数据类型中有GeometryCollection存在。经分析,由于生成的地图里有一个区域为两块不连续的地图块,所以生成的geoJson中此区域的geometry.type===GeometryCollection。然而,echarts 中对于此类型没有做处理,详情见

源码
node_modules\echarts\lib\coord\geo\parseGeoJson.js

访问官方的github仓库,issues存在对应的解决方法, https://github.com/apache/echarts/issues/9350

二、修改方法

如果函数一样,可直接复制粘贴下面这一段,其他情况,请参考下图2处修改逻辑自行更改。

export default function parseGeoJson(geoJson, nameProperty) {
  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;
              console.log(coordinatesArr, "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") {
              console.log("coordinatesPolygon", coordinates);
              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)
                      });
                  }
              });
          }
          console.log(
              properties[nameProperty || "name"],
              geometries,
              properties.cp,
              "asdfasdfasdf"
          );
          var region = new GeoJSONRegion(
              properties[nameProperty || "name"],
              geometries,
              properties.cp
          );
          region.properties = properties;
          return region;
      }
  );
}

需要修改的parseGeoJson函数中的2处:echarts 源代码在116行左右

在这里插入图片描述
在这里插入图片描述
转载自

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值