cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
93 lines (92 loc) • 3.09 kB
JavaScript
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 };