/** Profile **/ // import { // // extend, // isNil, // // isObject, // // isArrayHasData // } from '../core/util'; // import Layer from '../layer/Layer'; // import Map, { MapOptionsType } from './Map'; // import Geometry from '../geometry/Geometry'; // import GeoJSON from '../geometry/GeoJSON'; /** * Produce a geometry from one or more [JSON]{@link Geometry#toJSON} or GeoJSON. * @param {Object} json - a geometry's JSON or a geojson * @return {Geometry} geometry * @example * var profile = { "feature": { "type": "Feature", "id" : "point1", "geometry": {"type": "Point", "coordinates": [102.0, 0.5]}, "properties": {"prop0": "value0"} }, //construct options. "options":{ "draggable" : true }, //symbol "symbol":{ "markerFile" : "http://foo.com/icon.png", "markerWidth" : 20, "markerHeight": 20 } }; const marker = Geometry.fromJSON(profile); */ // Geometry.fromJSON = function (json) { // if (Array.isArray(json)) { // let result = []; // for (let i = 0, len = json.length; i < len; i++) { // //@ts-expect-error 等待Geometry typing // const c = Geometry.fromJSON(json[i]); // if (Array.isArray(json)) { // result = result.concat(c); // } else { // result.push(c); // } // } // return result; // } // if (json && !json['feature']) { // return GeoJSON.toGeometry(json); // } // let geometry; // if (json['subType']) { // //@ts-expect-error 等待Geometry typing // geometry = Geometry.getJSONClass(json['subType']).fromJSON(json); // if (!isNil(json['feature']['id'])) { // geometry.setId(json['feature']['id']); // } // } else { // //feature可能是GeometryCollection,里面可能包含Circle等 // geometry = GeoJSON.toGeometry(json['feature']); // if (json['options']) { // geometry.config(json['options']); // } // } // if (json['symbol']) { // geometry.setSymbol(json['symbol']); // } // if (json['infoWindow']) { // geometry.setInfoWindow(json['infoWindow']); // } // return geometry; // }; // /** // * Reproduce a Layer from layer's JSON. // * @param {Object} layerJSON - layer's JSON // * @return {Layer} // */ // Layer.fromJSON = function (layerJSON) { // if (!layerJSON) { // return null; // } // const layerType = layerJSON['type']; // const clazz = Layer.getJSONClass(layerType); // if (!clazz || !clazz.fromJSON) { // throw new Error('unsupported layer type:' + layerType); // } // return clazz.fromJSON(layerJSON); // }; // Map.include(/** @lends Map.prototype */ { // /** // * @property {String} - Version of the [JSON]{@link Map#toJSON} schema. // * @constant // * @static // */ // 'JSON_VERSION': '1.0', // /** // * Export the map's json, a snapshot of the map in JSON format.
// * It can be used to reproduce the instance by [fromJSON]{@link Map#fromJSON} method // * @param {Object} [options=null] - export options // * @param {Boolean|Object} [options.baseLayer=null] - whether to export base layer's JSON, if yes, it will be used as layer's toJSON options. // * @param {Boolean|Extent} [options.clipExtent=null] - if set with an extent instance, only the geometries intersectes with the extent will be exported. // * If set to true, map's current extent will be used. // * @param {Boolean|Object|Object[]} [options.layers=null] - whether to export other layers' JSON, if yes, it will be used as layer's toJSON options. // * It can also be an array of layer export options with a "id" attribute to filter the layers to export. // * @return {Object} layer's JSON // */ // toJSON: function (options?: MapOptionsType) { // if (!options) { // options = {}; // } // const json = { // 'jsonVersion': this['JSON_VERSION'], // 'version': this.VERSION, // 'extent': this.getExtent().toJSON() // }; // json['options'] = this.config(); // json['options']['center'] = this.getCenter(); // json['options']['zoom'] = this.getZoom(); // json['options']['bearing'] = this.getBearing(); // json['options']['pitch'] = this.getPitch(); // const baseLayer = this.getBaseLayer(); // if ((isNil(options['baseLayer']) || options['baseLayer']) && baseLayer) { // json['baseLayer'] = baseLayer.toJSON(options['baseLayer']); // } // const extraLayerOptions = {}; // if (options['clipExtent']) { // //if clipExtent is set, only geometries intersecting with extent will be exported. // //clipExtent's value can be an extent or true (map's current extent) // if (options['clipExtent'] === true) { // extraLayerOptions['clipExtent'] = this.getExtent(); // } else { // extraLayerOptions['clipExtent'] = options['clipExtent']; // } // } // const layersJSON = []; // if (isNil(options['layers']) || (options['layers'] && !Array.isArray(options['layers']))) { // const layers = this.getLayers(); // for (let i = 0, len = layers.length; i < len; i++) { // if (!layers[i].toJSON) { // continue; // } // const opts = extend({}, isObject(options['layers']) ? options['layers'] : {}, extraLayerOptions); // layersJSON.push(layers[i].toJSON(opts)); // } // json['layers'] = layersJSON; // } else if (isArrayHasData(options['layers'])) { // const layers = options['layers']; // for (let i = 0; i < layers.length; i++) { // const exportOption = layers[i]; // const layer = this.getLayer(exportOption['id']); // if (!layer.toJSON) { // continue; // } // const opts = extend({}, exportOption['options'], extraLayerOptions); // layersJSON.push(layer.toJSON(opts)); // } // json['layers'] = layersJSON; // } else { // json['layers'] = []; // } // return json; // } // }); // /** // * Reproduce a map from map's profile JSON. // * @param {(string|HTMLElement|object)} container - The container to create the map on, can be:
// * 1. A HTMLElement container.
// * 2. ID of a HTMLElement container.
// * 3. A canvas compatible container in node, // * e.g. [node-canvas]{@link https://github.com/Automattic/node-canvas}, // * [canvas2svg]{@link https://github.com/gliffy/canvas2svg} // * @param {Object} mapJSON - map's profile JSON // * @param {Object} [options=null] - options // * @param {Object} [options.baseLayer=null] - whether to import the baseLayer // * @param {Object} [options.layers=null] - whether to import the layers // * @return {Map} // * @static // * @function // * @example // * var map = Map.fromJSON('map', mapProfile); // */ // Map.fromJSON = function (container, profile, options) { // if (!container || !profile) { // return null; // } // if (!options) { // options = {}; // } // const map = new Map(container, profile['options']); // if (isNil(options['baseLayer']) || options['baseLayer']) { // const baseLayer = Layer.fromJSON(profile['baseLayer']); // if (baseLayer) { // map.setBaseLayer(baseLayer); // } // } // if (isNil(options['layers']) || options['layers']) { // const layers = []; // const layerJSONs = profile['layers']; // for (let i = 0; i < layerJSONs.length; i++) { // const layer = Layer.fromJSON(layerJSONs[i]); // layers.push(layer); // } // map.addLayer(layers); // } // return map; // };