| 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
/** 
 | 
 * Parse and decode geo json 
 | 
 */ 
 | 
import * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import { GeoJSONLineStringGeometry, GeoJSONPolygonGeometry, GeoJSONRegion } from './Region.js'; 
 | 
function decode(json) { 
 | 
  if (!json.UTF8Encoding) { 
 | 
    return json; 
 | 
  } 
 | 
  var jsonCompressed = json; 
 | 
  var encodeScale = jsonCompressed.UTF8Scale; 
 | 
  if (encodeScale == null) { 
 | 
    encodeScale = 1024; 
 | 
  } 
 | 
  var features = jsonCompressed.features; 
 | 
  zrUtil.each(features, function (feature) { 
 | 
    var geometry = feature.geometry; 
 | 
    var encodeOffsets = geometry.encodeOffsets; 
 | 
    var coordinates = geometry.coordinates; 
 | 
    // Geometry may be appeded manually in the script after json loaded. 
 | 
    // In this case this geometry is usually not encoded. 
 | 
    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': 
 | 
        zrUtil.each(coordinates, function (rings, idx) { 
 | 
          return decodeRings(rings, encodeOffsets[idx], encodeScale); 
 | 
        }); 
 | 
    } 
 | 
  }); 
 | 
  // Has been decoded 
 | 
  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; 
 | 
    // ZigZag decoding 
 | 
    x = x >> 1 ^ -(x & 1); 
 | 
    y = y >> 1 ^ -(y & 1); 
 | 
    // Delta deocding 
 | 
    x += prevX; 
 | 
    y += prevY; 
 | 
    prevX = x; 
 | 
    prevY = y; 
 | 
    // Dequantize 
 | 
    result.push([x / encodeScale, y / encodeScale]); 
 | 
  } 
 | 
  return result; 
 | 
} 
 | 
export default function parseGeoJSON(geoJson, nameProperty) { 
 | 
  geoJson = decode(geoJson); 
 | 
  return zrUtil.map(zrUtil.filter(geoJson.features, function (featureObj) { 
 | 
    // Output of mapshaper may have geometry null 
 | 
    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; 
 | 
        // According to the GeoJSON specification. 
 | 
        // First must be exterior, and the rest are all interior(holes). 
 | 
        geometries.push(new GeoJSONPolygonGeometry(coordinates[0], coordinates.slice(1))); 
 | 
        break; 
 | 
      case 'MultiPolygon': 
 | 
        zrUtil.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; 
 | 
  }); 
 | 
} 
 |