# Source: SpaCalculator.js

    /**
     * @content 空间计算组件 仅包含简单的角度计算和两点距离计算 已包含在几何类内部的计算有：计算机长度、实地长度、计算机面积、实地面积、几何范围、label点等
     * @author  2019-09-25
     */
    import { NativeModules } from 'react-native';

    let SPC = NativeModules.JSSpaCalculator;

    import Dot from './Dot.js';
    import CrossData from './CrossData.js';

    /**
     * @class SpaCalculator
     * @description 空间计算
     */
    export default class SpaCalculator {
      /**
       * 计算直线角度(-PI到+PI)
       * @memberOf SpaCalculator
       * @param {Dot} xy0 点坐标
       * @param {Dot} xy1 点坐标
       * @return {Promise.<double>}直线角度(-PI到+PI)
       */
      static async anglePIOfDot(xy0, xy1) {
        try {
          return await SPC.anglePIOfDot(xy0._MGDotId, xy1._MGDotId);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算直线角度(-PI到+PI)
       * @memberOf SpaCalculator
       * @param {double} x0 x0坐标
       * @param {double} y0 y0坐标
       * @param {double} x1 x1坐标
       * @param {double} y1 y1坐标
       * @return {Promise.<double>}直线角度(-PI到+PI)
       */
      static async anglePIOfXY(x0, y0, x1, y1) {
        try {
          return await SPC.anglePIOfXY(x0, y0, x1, y1);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算直线角度(0到2PI)
       * @memberOf SpaCalculator
       * @param {Dot} xy0 点坐标
       * @param {Dot} xy1 点坐标
       * @return {Promise.<double>} 直线角度(0到2PI)
       */
      static async angle2PIOfDot(xy0, xy1) {
        try {
          return await SPC.angle2PIOfDot(xy0._MGDotId, xy1._MGDotId);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算直线角度(0到2PI)
       * @memberOf SpaCalculator
       * @param {double} x0 x0坐标
       * @param {double} y0 y0坐标
       * @param {double} x1 x1坐标
       * @param {double} y1 y1坐标
       * @return {Promise.<double>} 直线角度(0到2PI)
       */
      static async angle2PIOfXY(x0, y0, x1, y1) {
        try {
          return await SPC.angle2PIOfXY(x0, y0, x1, y1);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算两点距离
       * @memberOf SpaCalculator
       * @param {Dot} xy0 点坐标
       * @param {Dot} xy1 点坐标
       * @return {Promise.<double>} 两点距离
       */
      static async distanceOfDot(xy0, xy1) {
        try {
          return await SPC.distanceOfDot(xy0._MGDotId, xy1._MGDotId);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算两点距离
       * @memberOf SpaCalculator
       * @param {double} x0 x0坐标
       * @param {double} y0 y0坐标
       * @param {double} x1 x1坐标
       * @param {double} y1 y1坐标
       * @return {Promise.<double>}两点距离
       */
      static async distanceOfXY(x0, y0, x1, y1) {
        try {
          return await SPC.distanceOfXY(x0, y0, x1, y1);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算两个几何对象间的距离
       *                 **********************************************************************************
       *                 *        	*     点    	 *     线     	  *  区(单圈) 	*   多线 		*     多区 		*
       *                 **********************************************************************************
       *                 *   点   		*   min|max  *    min     *  min|max  	*  不支持   	*  不支持   		*
       *                 *   线   		*     min    *  min|max   *  不支持  		*  不支持   	*  不支持   		*
       *                 *  区(单圈)  	*   min|max  *  不支持    	  *    min    	*  不支持   	*  不支持   		*
       *                 *   多线 		*     min    *  min|max   *  不支持  		*  不支持   	*  不支持   		*
       *                 *   多区 		*   min|max  *  不支持    	  *    min    	*  不支持   	*  不支持   		*
       *                 **********************************************************************************
       *
       * @param {Geometry} geom1 几何对象1
       * @param {Geometry} geom2 几何对象2
       * @param {int} type 计算距离方法
       * @return {Promise.<double>} 距离长度
       */
      static async distanceOfGeometry(geom1, geom2, type) {
        try {
          return await SPC.distanceOfGeometry(geom1._MGGeometryId, geom2._MGGeometryId, type);
        } catch (e) {
          console.error(e);
        }
      }

      /**
       * 计算两条线的交点
       * @memberOf SpaCalculator
       * @param {GeoVarLine} line1 线1
       * @param {GeoVarLine} line2 线2
       * @return {Promise.<Dot[]>} 两条线的交点
       */
      static async calLinesInters(line1, line2) {
        try {
          var objArr = [];
          let { LinesIntersArray } = await SPC.calLinesInters(
            line1._MGGeoVarLineId,
            line2._MGGeoVarLineId
          );
          for (var i = 0; i < LinesIntersArray.length; i++) {
            var dot = new Dot();
            dot._MGDotId = LinesIntersArray[i];
            objArr.push(dot);
          }
          return objArr;
        } catch (e) {
          console.error(e);
        }
      }

      /**
       *  找出自相交的交点,自相交检查
       * @memberOf SpaCalculator
       * @param {Dot[]} pointArry          线坐标
       * @return {Promise.List<CrossData>} 交点数组
       */
      static async arcSelfCross(pointArry) {
        try {
          var objArr = [];
          let { CrossDataArray } = await SPC.arcSelfCross(pointArry);
          for (var i = 0; i < CrossDataArray.length; i++) {
            var crossData = new CrossData();
            crossData._MGCrossDataId = CrossDataArray[i];
            objArr.push(crossData);
          }
          return objArr;
        } catch (e) {
          console.error(e);
        }
      }
    }