123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- /**
- * Returns a cloned copy of the passed GeoJSON Object, including possible 'Foreign Members'.
- * ~3-5x faster than the common JSON.parse + JSON.stringify combo method.
- *
- * @name clone
- * @param {GeoJSON} geojson GeoJSON Object
- * @returns {GeoJSON} cloned GeoJSON Object
- * @example
- * var line = turf.lineString([[-74, 40], [-78, 42], [-82, 35]], {color: 'red'});
- *
- * var lineCloned = turf.clone(line);
- */
- function clone(geojson) {
- if (!geojson) {
- throw new Error("geojson is required");
- }
- switch (geojson.type) {
- case "Feature":
- return cloneFeature(geojson);
- case "FeatureCollection":
- return cloneFeatureCollection(geojson);
- case "Point":
- case "LineString":
- case "Polygon":
- case "MultiPoint":
- case "MultiLineString":
- case "MultiPolygon":
- case "GeometryCollection":
- return cloneGeometry(geojson);
- default:
- throw new Error("unknown GeoJSON type");
- }
- }
- /**
- * Clone Feature
- *
- * @private
- * @param {Feature<any>} geojson GeoJSON Feature
- * @returns {Feature<any>} cloned Feature
- */
- function cloneFeature(geojson) {
- var cloned = { type: "Feature" };
- // Preserve Foreign Members
- Object.keys(geojson).forEach(function (key) {
- switch (key) {
- case "type":
- case "properties":
- case "geometry":
- return;
- default:
- cloned[key] = geojson[key];
- }
- });
- // Add properties & geometry last
- cloned.properties = cloneProperties(geojson.properties);
- cloned.geometry = cloneGeometry(geojson.geometry);
- return cloned;
- }
- /**
- * Clone Properties
- *
- * @private
- * @param {Object} properties GeoJSON Properties
- * @returns {Object} cloned Properties
- */
- function cloneProperties(properties) {
- var cloned = {};
- if (!properties) {
- return cloned;
- }
- Object.keys(properties).forEach(function (key) {
- var value = properties[key];
- if (typeof value === "object") {
- if (value === null) {
- // handle null
- cloned[key] = null;
- }
- else if (Array.isArray(value)) {
- // handle Array
- cloned[key] = value.map(function (item) {
- return item;
- });
- }
- else {
- // handle generic Object
- cloned[key] = cloneProperties(value);
- }
- }
- else {
- cloned[key] = value;
- }
- });
- return cloned;
- }
- /**
- * Clone Feature Collection
- *
- * @private
- * @param {FeatureCollection<any>} geojson GeoJSON Feature Collection
- * @returns {FeatureCollection<any>} cloned Feature Collection
- */
- function cloneFeatureCollection(geojson) {
- var cloned = { type: "FeatureCollection" };
- // Preserve Foreign Members
- Object.keys(geojson).forEach(function (key) {
- switch (key) {
- case "type":
- case "features":
- return;
- default:
- cloned[key] = geojson[key];
- }
- });
- // Add features
- cloned.features = geojson.features.map(function (feature) {
- return cloneFeature(feature);
- });
- return cloned;
- }
- /**
- * Clone Geometry
- *
- * @private
- * @param {Geometry<any>} geometry GeoJSON Geometry
- * @returns {Geometry<any>} cloned Geometry
- */
- function cloneGeometry(geometry) {
- var geom = { type: geometry.type };
- if (geometry.bbox) {
- geom.bbox = geometry.bbox;
- }
- if (geometry.type === "GeometryCollection") {
- geom.geometries = geometry.geometries.map(function (g) {
- return cloneGeometry(g);
- });
- return geom;
- }
- geom.coordinates = deepSlice(geometry.coordinates);
- return geom;
- }
- /**
- * Deep Slice coordinates
- *
- * @private
- * @param {Coordinates} coords Coordinates
- * @returns {Coordinates} all coordinates sliced
- */
- function deepSlice(coords) {
- var cloned = coords;
- if (typeof cloned[0] !== "object") {
- return cloned.slice();
- }
- return cloned.map(function (coord) {
- return deepSlice(coord);
- });
- }
- exports.default = clone;
|