类名 common/service/igs/GeometryServer.js
import BaseServer from '../BaseServer'
import { Zondy } from '../../base'
import { FetchMethod } from '../../base/enum'
import { defaultValue, isNull } from '../../util'

/**
 * 地理几何服务
 * @class GeometryServer
 * @moduleEx ServiceModule
 * @extends BaseServer
 * @param {Object} options 构造参数
 * @param {String} [options.url = 无] 服务基地址
 * @example
 * // ES5引入方式
 * const { GeometryServer } = Zondy.Service
 * // ES6引入方式
 * import { GeometryServer } from "@mapgis/webclient-common"
 * const geometryServer = new GeometryServer({
 *   url: 'http://localhost:8089/igs/rest/services/system/GeometryServer',
 *   requestInterceptor: {
 *     before: function (config) {
 *       return config;
 *     },
 *     failure: function (error) {
 *       console.log("请求发送失败(拦截器):", error)
 *     }
 *   },
 *   responseInterceptor: {
 *     success: function (result) {
 *       console.log("请求成功拦截响应")
 *       return result;
 *     },
 *     failure: function (result) {
 *       console.log("请求失败拦截响应")
 *       return result;
 *     }
 *   }
 * });
 */
class GeometryServer extends BaseServer {
  constructor(options) {
    super(options)
  }

  /**
   * 计算面积和周长
   * @param options 查询参数
   * @param {Polygon} [options.polygons] 要计算的多边形,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { Polygon } = Zondy.Geometry
   * // ES6引入方式
   * import { Polygon } from "@mapgis/webclient-common"
   * geometryServer.calculateAreasAndLengths({
   *   polygons: new Polygon({
   *     spatialReference: "EPSG:4326",
   *     coordinates: [
   *       [
   *         [108.9587, 34.2206],
   *         [112.9607, 31.2196],
   *         [110.9598, 30.2181],
   *         [110.9587, 32.2191],
   *         [108.9587, 34.2206]
   *       ]
   *     ]
   *   }),
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.calculateAreasAndLengths({
   *   polygons: new Polygon({
   *     spatialReference: "EPSG:4326",
   *     coordinates: [
   *       [
   *         [108.9587, 34.2206],
   *         [112.9607, 31.2196],
   *         [110.9598, 30.2181],
   *         [110.9587, 32.2191],
   *         [108.9587, 34.2206]
   *       ]
   *     ]
   *   })
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateAreasAndLengths(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      polygons: {
        type: 'Polygon',
        required: true,
        process: 'igsGeometryServer'
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/areasAndLengths?f=json`
      }
    )
  }

  /**
   * 计算面积
   * @param options 查询参数
   * @param {Polygon} [options.polygon] 要计算的多边形,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @param {ProjectInfo} [options.projectInfo] 投影参考信息,projectInfo或projectInfoBySrsID二选一
   * @param {ProjectInfoBySrsID} [options.projectInfoBySrsID] 源投影参考系ID,projectInfo或projectInfoBySrsID二选一
   * */
  calculateArea(options) {
    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      polygon: {
        type: 'Polygon',
        required: true,
        alias: 'Dots',
        process: 'igsDots'
      },
      projectInfo: {
        type: 'Object',
        alias: 'ProjectInfo',
        required: true,
        oneOf: ['projectInfoBySrsID']
      },
      projectInfoBySrsID: {
        type: 'Object',
        alias: 'ProjectInfoBySrsID',
        required: true,
        oneOf: ['projectInfo']
      }
    }

    // 设置请求头,一定要是text/plain;charset=UTF-8
    options.headers = {
      'Content-Type': 'text/plain;charset=UTF-8'
    }
    // 使用post请求
    options.method = FetchMethod.post
    // post参数为Object形式
    options.useObject = true
    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/calArea?f=json`
      }
    )
  }

  /**
   * 计算长度
   * @param options 查询参数
   * @param {LineString} [options.lineString] 要计算的线,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @param {ProjectInfo} [options.projectInfo] 投影参考信息,projectInfo或projectInfoBySrsID二选一
   * @param {ProjectInfoBySrsID} [options.projectInfoBySrsID] 源投影参考系ID,projectInfo或projectInfoBySrsID二选一
   * */
  calculateLength(options) {
    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      lineString: {
        type: 'LineString',
        required: true,
        alias: 'Dots',
        process: 'igsDots'
      },
      projectInfo: {
        type: 'Object',
        alias: 'ProjectInfo',
        required: true,
        oneOf: ['projectInfoBySrsID']
      },
      projectInfoBySrsID: {
        type: 'Object',
        alias: 'ProjectInfoBySrsID',
        required: true,
        oneOf: ['projectInfo']
      }
    }

    // 设置请求头,一定要是text/plain;charset=UTF-8
    options.headers = {
      'Content-Type': 'text/plain;charset=UTF-8'
    }
    // 使用post请求
    options.method = FetchMethod.post
    // post参数为Object形式
    options.useObject = true
    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/callength?f=json`
      }
    )
  }

  /**
   * 对矩形范围坐标点进行投影转换
   * @param options 查询参数
   * @param {String} [options.gdbsvrName] 数据源名称,必填
   * @param {String} [options.gdbName] 地理数据库名称,必填
   * @param {String} [options.srefID] 源投影参考系ID,必填
   * @param {String} [options.desfID] 目的投影参考系ID,必填
   * @param {Extent} [options.extent] 矩形范围,必填
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @param {String} [options.userName] 地理数据源/地理数据库账户名
   * @param {String} [options.password] 地理数据源/地理数据库密码
   * */
  projectInExtent(options) {
    // 设置PATH PARAMETERS校验
    const checkPathOpts = {
      gdbsvrName: {
        type: 'String'
      },
      gdbName: {
        type: 'String'
      },
      srefID: {
        type: 'String'
      },
      desfID: {
        type: 'String'
      }
    }

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      extent: {
        type: 'Extent',
        alias: 'rang',
        required: true,
        process: 'igsRange$'
      },
      userName: {
        type: 'String'
      },
      password: {
        type: 'String'
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url, options) {
        return `${url}/${options.gdbsvrName}/${options.gdbName}/${options.srefID}/${options.desfID}?f=json`
      }
    )
  }

  /**
   * 缓冲分析
   * @param options 查询参数
   * @param {Polygon} [options.polygon] 要计算的多边形
   * @param {Number} [options.distance] 缓冲半径
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { Polygon } = Zondy.Geometry
   * const { FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { Polygon, FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.bufferAnalyse({
   *   geometries: new Polygon({
   *     spatialReference: "EPSG:4326",
   *     coordinates: [
   *       [
   *         [108.9587, 34.2206],
   *         [112.9607, 31.2196],
   *         [110.9598, 30.2181],
   *         [110.9587, 32.2191],
   *         [108.9587, 34.2206]
   *       ]
   *     ]
   *   }),
   *   method: FetchMethod.post,
   *   distance: 1,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.bufferAnalyse({
   *   geometries: new Polygon({
   *     spatialReference: "EPSG:4326",
   *     coordinates: [
   *       [
   *         [108.9587, 34.2206],
   *         [112.9607, 31.2196],
   *         [110.9598, 30.2181],
   *         [110.9587, 32.2191],
   *         [108.9587, 34.2206]
   *       ]
   *     ]
   *   }),
   *   distance: 100,
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  bufferAnalyse(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      geometries: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      distance: {
        type: 'Number',
        required: true
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/buffer?f=json`
      }
    )
  }

  /**
   * 求差计算
   * @param options 查询参数
   * @param {Geometry} [options.geometry1] 要计算的多边形1,必填
   * @param {Geometry} [options.geometry2] 要计算的多边形2,必填
   * @param {Number} [options.tolerance] 容差,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { Polygon } = Zondy.Geometry
   * // ES6引入方式
   * import { Polygon } from "@mapgis/webclient-common"
   * geometryServer.calculateDifference({
   *   geometry1: new Polygon({
   *     coordinates: [
   *       [
   *         [105.0, 0.0],
   *         [164.0, 0.0],
   *         [164.0, 10.0],
   *         [105.0, 10.0],
   *         [105.0, 0.0]
   *       ]
   *     ]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [
   *       [
   *         [110.0, 5.0],
   *         [170.0, 5.0],
   *         [170.0, 20.0],
   *         [110.0, 20.0],
   *         [110.0, 5.0]
   *       ]
   *     ]
   *   }),
   *   tolerance: 1,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.calculateDifference({
   *   geometry1: new Polygon({
   *     coordinates: [
   *       [
   *         [105.0, 0.0],
   *         [164.0, 0.0],
   *         [164.0, 10.0],
   *         [105.0, 10.0],
   *         [105.0, 0.0]
   *       ]
   *     ]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [
   *       [
   *         [110.0, 5.0],
   *         [170.0, 5.0],
   *         [170.0, 20.0],
   *         [110.0, 20.0],
   *         [110.0, 5.0]
   *       ]
   *     ]
   *   }),
   *   tolerance: 1
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateDifference(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      geometry1: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      geometry2: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      tolerance: {
        type: 'Number',
        required: true
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/difference?f=json`
      }
    )
  }

  /**
   * 求距离
   * @param options 查询参数
   * @param {Geometry} [options.geometry1] 要计算的多边形1,必填
   * @param {Geometry} [options.geometry2] 要计算的多边形2,必填
   * @param {Geometry} [options.srs] 参考系,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { Point,LineString } = Zondy.Geometry
   * const { FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { Point,LineString,FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.calculateDistance({
   *   geometry1: new Zondy.Geometry.Point({
   *     coordinates: [
   *       105.380859375, 31.57853542647338
   *     ]
   *   }),
   *   geometry2: new LineString({
   *     coordinates: [[-117,34],[-116,34],[-117,33]]
   *   }),
   *   srs: "EPSG:4326",
   *   method: FetchMethod.post,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.calculateDistance({
   *   geometry1: new Point({
   *     coordinates: [
   *       105.380859375, 31.57853542647338
   *     ]
   *   }),
   *   geometry2: new LineString({
   *     coordinates: [[-117,34],[-116,34],[-117,33]]
   *   }),
   *   srs: "EPSG:4326"
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateDistance(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      geometry1: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      geometry2: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      srs: {
        type: 'String',
        required: true
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/distance?f=json`
      }
    )
  }

  /**
   * 求交计算
   * @param options 查询参数
   * @param {Geometry} [options.geometry1] 要计算的多边形1,必填
   * @param {Geometry} [options.geometry2] 要计算的多边形2,必填
   * @param {Number} [options.tolerance] 容差,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // ES5引入方式
   * const { Polygon } = Zondy.Geometry
   * const { Polygon,FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { Polygon,FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.calculateIntersect({
   *   geometry1: new Polygon({
   *     coordinates: [[ [105.0, 0.0],[164.0, 0.0],[164.0, 10.0],[105.0, 10.0],[105.0, 0.0] ]]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [[ [110.0, 5.0],[170.0, 5.0],[170.0, 20.0],[110.0, 20.0],[110.0, 5.0] ]]
   *   }),
   *   tolerance: 1,
   *   method: FetchMethod.post,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.calculateIntersect({
   *   geometry1: new Polygon({
   *     coordinates: [[ [105.0, 0.0],[164.0, 0.0],[164.0, 10.0],[105.0, 10.0],[105.0, 0.0] ]]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [[ [110.0, 5.0],[170.0, 5.0],[170.0, 20.0],[110.0, 20.0],[110.0, 5.0] ]]
   *   }),
   *   tolerance: 1
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateIntersect(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      geometry1: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      geometry2: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      tolerance: {
        type: 'Number',
        required: true
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/intersect?f=json`
      }
    )
  }

  /**
   * 求label点
   * @param options 查询参数
   * @param {Polygon} [options.polygons] 要计算的多边形,单区或多区几何,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { Polygon } = Zondy.Geometry
   * const { Polygon,FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { Polygon,FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.calculateLabelPoints({
   *   polygons: new Polygon({
   *     coordinates: [[ [100.0, 0.0],[101.0, 0.0],[101.0, 1.0],[100.0, 1.0],[100.0, 0.0] ]]
   *   }),
   *   method: FetchMethod.post,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.calculateLabelPoints({
   *   polygons: new Polygon({
   *     coordinates: [[ [100.0, 0.0],[101.0, 0.0],[101.0, 1.0],[100.0, 1.0],[100.0, 0.0] ]]
   *   })
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateLabelPoints(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      polygons: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/labelPoints?f=json`
      }
    )
  }

  /**
   * 求长度
   * @param options 查询参数
   * @param {LineString | MultiLineString} [options.lineString] 要计算的线,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { LineString } = Zondy.Geometry
   * const { FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { LineString,FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.calculateLengths({
   *   polylines: new LineString({
   *     spatialReference: 'EPSG:4326',
   *     coordinates: [[-117,34],[-116,34],[-117,33]]
   *   }),
   *   method: FetchMethod.post,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.calculateLengths({
   *   polylines: new LineString({
   *     spatialReference: 'EPSG:4326',
   *     coordinates: [[-117,34],[-116,34],[-117,33]]
   *   }),
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateLengths(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      polylines: {
        type: 'LineString | MultiLineString',
        required: true,
        process: 'igsGeometryServer'
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/lengths?f=json`
      }
    )
  }

  /**
   * 几何投影
   * @param options 查询参数
   * @param {Geometry} [options.geometries] 要计算的投影几何对象,必填
   * @param {String} [options.inSrs] 原始参考系,必填
   * @param {String} [options.outSrs] 目标参考系,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { LineString } = Zondy.Geometry
   * const { FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { Polygon,FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.geometryProject({
   *   geometries: new LineString({
   *     coordinates: [[-117,34],[-116,34],[-117,33]]
   *   }),
   *   inSrs: 'EPSG:4326',
   *   outSrs: 'EPSG:3857',
   *   method: FetchMethod.post,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.geometryProject({
   *   geometries: new LineString({
   *     coordinates: [[-117,34],[-116,34],[-117,33]]
   *   }),
   *   inSrs: 'EPSG:4326',
   *   outSrs: 'EPSG:3857'
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  geometryProject(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      geometries: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      inSrs: {
        type: 'String',
        required: true
      },
      outSrs: {
        type: 'String',
        required: true
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/project?f=json`
      }
    )
  }

  /**
   * 计算拓扑关系
   * @param options 查询参数
   * @param {Geometry} [options.geometry1] 要计算的多边形1,必填
   * @param {Geometry} [options.geometry2] 要计算的多边形2,必填
   * @param {Number} [options.tolerance] 容差,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { LineString,Polygon } = Zondy.Geometry
   * const { FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { LineString,Polygon,FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.calculateTopologyRelation({
   *   geometry1: new LineString({
   *     coordinates:  [ [117,0],[117,44] ]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [[ [110.0, 5.0],[170.0, 5.0],[170.0, 20.0],[110.0, 20.0],[110.0, 5.0] ]]
   *   }),
   *   tolerance: 1,
   *   method: FetchMethod.post,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * //promise方式
   * geometryServer.calculateTopologyRelation({
   *   geometry1: new LineString({
   *     coordinates:  [ [117,0],[117,44] ]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [[ [110.0, 5.0],[170.0, 5.0],[170.0, 20.0],[110.0, 20.0],[110.0, 5.0] ]]
   *   }),
   *   tolerance: 1
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateTopologyRelation(options) {
    options = defaultValue(options, {})
    // 使用post请求
    options.method = defaultValue(options.method, FetchMethod.post)

    let checkPathOpts
    let checkQueryOpts
    if (this.url.indexOf('/igs/rest/mrgs/geomservice') > -1) {
      // 设置PATH PARAMETERS校验
      checkPathOpts = {}

      // 设置QUERY PARAMETERS校验
      checkQueryOpts = {
        distance: {
          type: 'Number',
          alias: 'NearDis',
          default: 0.01
        },
        point: {
          type: 'Point',
          alias: 'Pnt',
          process: 'toOldIGSGeometry'
        },
        lingString: {
          type: 'LineString',
          alias: 'Line',
          process: 'toOldIGSGeometry'
        },
        polygon: {
          type: 'Polygon',
          alias: 'Reg',
          process: 'toOldIGSGeometry'
        },
        topologyPolygon: {
          type: 'Polygon',
          alias: 'RelativeObj',
          process: 'toOldIGSGeometry'
        }
      }

      // 设置请求头,一定要是text/plain;charset=UTF-8
      options.headers = {
        'Content-Type': 'text/plain;charset=UTF-8'
      }
      // 使用post请求
      options.method = FetchMethod.post
      // post参数为Object形式
      options.useObject = true
      // 调用基类的查询信息方法
      return this._queryByParameters(
        options,
        checkPathOpts,
        checkQueryOpts,
        // 拼装返回基地址
        function (url) {
          return `${url}/topanalysis?f=json`
        }
      )
    } else {
      // 设置PATH PARAMETERS校验
      checkPathOpts = {}

      // 设置QUERY PARAMETERS校验
      checkQueryOpts = {
        geometry1: {
          type: 'Geometry',
          required: true,
          process: 'igsGeometryServerNoSRS'
        },
        geometry2: {
          type: 'Geometry',
          required: true,
          process: 'igsGeometryServerNoSRS'
        },
        tolerance: {
          type: 'Number',
          required: true
        }
      }

      // 调用基类的查询信息方法
      return this._queryByParameters(
        options,
        checkPathOpts,
        checkQueryOpts,
        // 拼装返回基地址
        function (url) {
          return `${url}/relation?f=json`
        }
      )
    }
  }

  /**
   * 计算光滑曲线,igs1.0服务
   * @param options 查询参数
   * @param {Number} [options.type] 插值方式,0为二次样条、1为三次样条、2为三次Beizer样条、3为三次B样条,必填
   * @param {LineString} [options.lineString] 要计算的线几何,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @param {Number} [options.tolerance] step
   * */
  smoothLineString(options) {
    options = defaultValue(options, {})

    if (isNull(options.type) || isNull(options.lineString)) {
      return
    }

    options.step = defaultValue(options.step, 1)

    // 设置请求头,一定要是text/plain;charset=UTF-8
    options.headers = {
      'Content-Type': 'text/plain;charset=UTF-8'
    }
    // 使用post请求
    options.method = FetchMethod.post
    options.data = JSON.stringify(options.lineString.toDots())
    // 调用基类的查询信息方法
    return this._postRequest(
      `${this.url}/smooth?f=json&type=${options.type}&step=${options.step}`,
      options
    )
  }

  /**
   * 求并
   * @param options 查询参数
   * @param {Geometry} [options.geometry1] 要计算的多边形1,必填
   * @param {Geometry} [options.geometry2] 要计算的多边形2,必填
   * @param {Number} [options.tolerance] 容差,必填
   * @param {Function} [options.success] 查询成功回调函数,若使用Promise方式则不必填写
   * @param {Function} [options.failure] 查询失败回调函数,若使用Promise方式则不必填写
   * @example
   * // 回调方式
   * // ES5引入方式
   * const { Polygon } = Zondy.Geometry
   * const { FetchMethod } = Zondy.Enum
   * // ES6引入方式
   * import { Polygon,FetchMethod } from "@mapgis/webclient-common"
   * geometryServer.calculateUnion({
   *   geometry1: new Polygon({
   *     coordinates:  [[ [105.0, 0.0],[164.0, 0.0],[164.0, 10.0],[105.0, 10.0],[105.0, 0.0] ]]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [[ [110.0, 5.0],[170.0, 5.0],[170.0, 20.0],[110.0, 20.0],[110.0, 5.0] ]]
   *   }),
   *   tolerance: 1,
   *   method: FetchMethod.post,
   *   success: function (result) {
   *     console.log('请求成功:', result);
   *   },
   *   failure: function (result) {
   *     console.log('请求失败:', result);
   *   }
   * });
   * // promise方式
   * geometryServer.calculateUnion({
   *   geometry1: new Polygon({
   *     coordinates:  [[ [105.0, 0.0],[164.0, 0.0],[164.0, 10.0],[105.0, 10.0],[105.0, 0.0] ]]
   *   }),
   *   geometry2: new Polygon({
   *     coordinates: [[ [110.0, 5.0],[170.0, 5.0],[170.0, 20.0],[110.0, 20.0],[110.0, 5.0] ]]
   *   }),
   *   tolerance: 1,
   * }).then(function (result) {
   *   console.log('请求成功:', result);
   * }).catch(function (result) {
   *   console.log('请求失败:', result);
   * })
   */
  calculateUnion(options) {
    // 设置PATH PARAMETERS校验
    const checkPathOpts = {}

    // 设置QUERY PARAMETERS校验
    const checkQueryOpts = {
      geometry1: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      geometry2: {
        type: 'Geometry',
        required: true,
        process: 'igsGeometryServerNoSRS'
      },
      tolerance: {
        type: 'Number',
        required: true
      }
    }

    // 调用基类的查询信息方法
    return this._queryByParameters(
      options,
      checkPathOpts,
      checkQueryOpts,
      // 拼装返回基地址
      function (url) {
        return `${url}/union?f=json`
      }
    )
  }
}

Zondy.Service.GeometryServer = GeometryServer
export default GeometryServer
构造函数
成员变量
方法
事件