解决报错:
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; } ); }