UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

93 lines (92 loc) 3.09 kB
import { map, filter, each } from "../../../../zrender/lib/core/util.mjs"; import { GeoJSONLineStringGeometry, GeoJSONPolygonGeometry, GeoJSONRegion } from "./Region.mjs"; function decode(json) { if (!json.UTF8Encoding) { return json; } var jsonCompressed = json; var encodeScale = jsonCompressed.UTF8Scale; if (encodeScale == null) { encodeScale = 1024; } var features = jsonCompressed.features; each(features, function(feature) { var geometry = feature.geometry; var encodeOffsets = geometry.encodeOffsets; var coordinates = geometry.coordinates; if (!encodeOffsets) { return; } switch (geometry.type) { case "LineString": geometry.coordinates = decodeRing(coordinates, encodeOffsets, encodeScale); break; case "Polygon": decodeRings(coordinates, encodeOffsets, encodeScale); break; case "MultiLineString": decodeRings(coordinates, encodeOffsets, encodeScale); break; case "MultiPolygon": each(coordinates, function(rings, idx) { return decodeRings(rings, encodeOffsets[idx], encodeScale); }); } }); jsonCompressed.UTF8Encoding = false; return jsonCompressed; } function decodeRings(rings, encodeOffsets, encodeScale) { for (var c = 0; c < rings.length; c++) { rings[c] = decodeRing(rings[c], encodeOffsets[c], encodeScale); } } function decodeRing(coordinate, encodeOffsets, encodeScale) { var result = []; var prevX = encodeOffsets[0]; var prevY = encodeOffsets[1]; for (var i = 0; i < coordinate.length; i += 2) { var x = coordinate.charCodeAt(i) - 64; var y = coordinate.charCodeAt(i + 1) - 64; x = x >> 1 ^ -(x & 1); y = y >> 1 ^ -(y & 1); x += prevX; y += prevY; prevX = x; prevY = y; result.push([x / encodeScale, y / encodeScale]); } return result; } function parseGeoJSON(geoJson, nameProperty) { geoJson = decode(geoJson); return map(filter(geoJson.features, function(featureObj) { return featureObj.geometry && featureObj.properties && featureObj.geometry.coordinates.length > 0; }), function(featureObj) { var properties = featureObj.properties; var geo = featureObj.geometry; var geometries = []; switch (geo.type) { case "Polygon": var coordinates = geo.coordinates; geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1))); break; case "MultiPolygon": each(geo.coordinates, function(item) { if (item[0]) { geometries.push(new GeoJSONPolygonGeometry(item[0], item.slice(1))); } }); break; case "LineString": geometries.push(new GeoJSONLineStringGeometry([geo.coordinates])); break; case "MultiLineString": geometries.push(new GeoJSONLineStringGeometry(geo.coordinates)); } var region = new GeoJSONRegion(properties[nameProperty || "name"], geometries, properties.cp); region.properties = properties; return region; }); } export { parseGeoJSON as default };