Source: GeoPolygon.js

/**
 * @content 用于对多边形的几何功能组件
 * @author  2019-09-09
 */
import { NativeModules } from 'react-native';

let GPG = NativeModules.JSGeoPolygon;

import GeometryExp from './GeometryExp.js';
import GeoLines from './GeoLines.js';
import Dots from './Dots.js';

/**
 * @class GeoPolygon
 */
export default class GeoPolygon extends GeometryExp {
  constructor() {
    super();
    Object.defineProperty(this, '_MGGeoPolygonId', {
      get: function() {
        return this._MGGeometryId;
      },
      set: function(_MGGeoPolygonId) {
        this._MGGeometryId = _MGGeoPolygonId;
      },
    });
  }

  /**
   * 构造一个新的 GeoPolygon 对象
   * @memberOf GeoPolygon
   * @return {Promise<GeoPolygon>}
   */
  async createObj() {
    try {
      var { GeoPolygonId } = await GPG.createObj();
      var geoPolygon = new GeoPolygon();
      geoPolygon._MGGeoPolygonId = GeoPolygonId;
      return geoPolygon;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 获取几何对象的类型
   * @memberOf GeoPolygon
   * @return {Promise} 几何对象类型
   */
  async getType() {
    try {
      return await GPG.getType(this._MGGeoPolygonId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 取几何维数
   * @memberOf GeoPolygon
   * @return {Promise}几何维数
   */
  async getDimension() {
    try {
      return await GPG.getDimension(this._MGGeoPolygonId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 计算两个几何对象间的距离
   * @memberOf GeoPolygon
   * @param type 距离计算方法
   * @param destGeom 第二个几何对象
   * @return {Promise} 距离长度
   */
  async distance(type, destGeom) {
    try {
      return await GPG.distance(
        this._MGGeoPolygonId,
        type,
        destGeom._MGGeometryId
      );
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 删除多边形
   * @memberOf GeoPolygon
   * @param index 待删除多边形序号
   * @return {Promise} 删除成功返回1,失败返回0
   */
  async del(index) {
    try {
      return await GPG.del(this._MGGeoPolygonId, index);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 取圆线数目
   * @memberOf GeoPolygon
   * @return {Promise} 圆线的总个数
   */
  async getCircleNum() {
    try {
      return await GPG.getCircleNum(this._MGGeoPolygonId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 添加多线
   * @memberOf GeoPolygon
   * @param ptLines 待添加的多线对象
   * @return {Promise} 添加成功返回1,失败返回0
   */
  async append(geoLines) {
    try {
      return await GPG.append(this._MGGeoPolygonId, geoLines._MGGeoLinesId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 取多线
   * @memberOf GeoPolygon
   * @param index 待取的多线的序号
   * @return {Promise<GeoLines>} 获取的多线对象
   */
  async get(index) {
    try {
      let { GeoLinesId } = await GPG.get(this._MGGeoPolygonId, index);
      var geoLines = new GeoLines();
      geoLines._MGGeoLinesId = GeoLinesId;
      return geoLines;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 由点构造多边形
   * @memberOf GeoPolygon
   * @param dots 待设置的所有点序列
   * @param {Array}numArray 每条线的点个数列表
   * @return {Promise} 构造成功返回1,失败返回0
   */
  async setDots(dots, numArray) {
    try {
      return await GPG.setDots(this._MGGeoPolygonId, dots._MGDotsId, numArray);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 获取一圈的点序列
   * @memberOf GeoPolygon
   * @param index 待取的点序列的序号
   * @return {Promise<Dots>} 获取的点序列
   */
  async getDots(index) {
    try {
      let { DotsId } = await GPG.getDots(this._MGGeoPolygonId, index);
      var dots = new Dots();
      dots._MGDotsId = DotsId;
      return dots;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 求多边形面积
   * @memberOf GeoPolygon
   * @param sRef 投影系
   * @return {Promise} 面积
   */
  async calAreaOfSRef(sRef) {
    try {
      return await GPG.calArea(this._MGGeoPolygonId, sRef._MGSRefDataId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 求多边形面积
   * @memberOf GeoPolygon
   * @return {Promise} 面积
   */
  async calArea() {
    try {
      return await GPG.calArea(this._MGGeoPolygonId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 求周长
   * @memberOf GeoPolygon
   * @param sRef 投影系
   * @return {Promise}周长
   */
  async calPerimeterOfSRef(sRef) {
    try {
      return await GPG.calPerimeter(this._MGGeoPolygonId, sRef._MGSRefDataId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 求周长
   * @memberOf GeoPolygon
   * @return {Promise}周长
   */
  async calPerimeter() {
    try {
      return await GPG.calPerimeter(this._MGGeoPolygonId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 求label点
   * @memberOf GeoPolygon
   * @return {Promise}周长
   */
  async calLabel(label) {
    try {
      return await GPG.calLabel(this._MGGeoPolygonId, label._MGDotId);
    } catch (e) {
      console.error(e);
    }
  }
}