service/ArcGis/Point.js Source
import {
    Zondy,extend
} from "../common";
import {ArcGisGeometry} from "./Geometry";
import proj4 from "proj4";
import {ArcGisSpatialReference} from "./SpatialReference";

/**
 * @class module:ArcGis.ArcGisPoint
 * @description 生成Point对象
 * @author 基础平台-杨琨
 * @param options - {Object} 必选项,构造点对象参数。
 * @param {String} [options.latitude] 可选项。纬度。
 * @param {String} [options.longitude] 可选项。经度。
 * @param {String} [options.m] 可选项。m值。
 * @param {String} [options.x] 可选项。x值,单位米。
 * @param {String} [options.y] 可选项。y值,单位米。
 * @param {String} [options.z] 可选项。z值,单位米。
 */
class ArcGisPoint extends ArcGisGeometry{
    constructor(options) {
        super();
        this.hasM = false;
        this.hasZ = false;
        this.latitude = 0;
        this.longitude = 0;
        this.m = undefined;
        this.x = 0;
        this.y = 0;
        this.z = undefined;
        this.type = "point";

        //保留原始坐标系
        let originalSR = this.spatialReference.wkid;

        extend(this,options);

        //options存才要做的处理
        if(options){
            if(!options.hasOwnProperty("spatialReference")
                    || (options.hasOwnProperty("spatialReference") && options.spatialReference.hasOwnProperty("wkid") && options.spatialReference.wkid === 4326)){
                //如果options里面的经纬度或者xy值没有,则为undefined
                let me = this;
                ["longitude","latitude","x","y"].forEach(function (key) {
                    if(!options.hasOwnProperty(key)) me[key] = undefined;
                })

                //如果x或y存在,增强行将xy的值传给经纬度
                if(options.hasOwnProperty("x"))this.longitude = this.x;
                if(options.hasOwnProperty("y"))this.latitude = this.y;
                if(!options.hasOwnProperty("x") && options.hasOwnProperty("longitude")) this.x = this.longitude;
                if(!options.hasOwnProperty("y") && options.hasOwnProperty("latitude")) this.y = this.latitude;
            }else if(options.hasOwnProperty("spatialReference") && options.spatialReference.hasOwnProperty("wkid")
                && options.spatialReference.wkid === 3857){
                if(options.hasOwnProperty("longitude") && options.hasOwnProperty("latitude")){
                    P(originalSR,"3857",[this.longitude,this.latitude],"x","y",this,options);
                }else if(options.hasOwnProperty("x") && options.hasOwnProperty("y")){
                    P("3857",originalSR,[this.x,this.y],"longitude","latitude",this,options);
                }else {
                    if(!options.hasOwnProperty("x")){
                        if(options.hasOwnProperty("longitude")) this.x = this.longitude;
                        if(!options.hasOwnProperty("longitude")) this.x = this.longitude = undefined;
                    }
                    if(!options.hasOwnProperty("y")){
                        if(options.hasOwnProperty("latitude")) this.y = this.latitude;
                        if(!options.hasOwnProperty("latitude")) this.y = this.latitude = undefined;
                    }
                    P("3857",originalSR,[this.x,this.y],"longitude","latitude",this,options);
                }
            }
        }else {
            this.x = this.y = this.latitude = this.longitude = undefined;
        }

        //只有m值存在,hasM才为true否则为false
        this.hasM = !!this.m;

        //只有z值存在,hasZ才为true否则为false
        this.hasZ = !!this.z;
    }
}

/**
 * @function module:ArcGis.ArcGisPoint.prototype.toArray
 * @description 返回[x,y]坐标数组,如果有z值,则返回[x,y,z]
 * @author 基础平台-杨琨
 * @returns [x,y,z]坐标数组
 */
ArcGisPoint.prototype.toArray = function () {
    let position = [];
    position.push(this.x);
    position.push(this.y);
    if(this.z)
    position.push(this.z);
    return position;
}

/**
 * @function module:ArcGis.ArcGisPoint.prototype.copy
 * @description 复制point的所有值,并覆盖当前对象
 * @author 基础平台-杨琨
 * @param point - {ArcGisPoint} 必选项,查询参数。
 */
ArcGisPoint.prototype.copy = function (point){
    extend(this,point);
}

/**
 * @function module:ArcGis.ArcGisPoint.prototype.distance
 * @description 根据两个point的x、y、z值,算出两点的距离
 * @author 基础平台-杨琨
 * @param point - {ArcGisPoint} 必选项,查询参数。
 * @returns Number,两点距离
 */
ArcGisPoint.prototype.distance = function (point){
    let width = Math.abs(this.x - point.x),
        height = Math.abs(this.y - point.y),
        zLength = 0;
    if(this.hasZ && point.hasZ) zLength = Math.abs(this.z - point.z);
    return Math.sqrt(Math.pow(width,2) + Math.pow(height,2) + Math.pow(zLength,2));
}

/**
 * @function module:ArcGis.ArcGisPoint.prototype.equals
 * @description 判断两个点是否相等,判断条件为x、y、z、m以及坐标系都相等
 * @author 基础平台-杨琨
 * @param point - {ArcGisPoint} 必选项,查询参数。
 * @returns Boolean,是否相等
 */
ArcGisPoint.prototype.equals = function (point){
    return this.x === point.x && this.y === point.y && this.z === point.z && this.m === point.m
        && this.spatialRefere.equals(point.spatialRefere)
}

/**
 * @function module:ArcGis.ArcGisPoint.prototype.toGeometryJSON
 * @description 将坐标转为特定格式,供IdentifyTask使用
 * @author 基础平台-杨琨
 * @returns String,包含点坐标的JSON字符串
 */
ArcGisPoint.prototype.toGeometryJSON = function () {
    return '{"x":' + this.x + ',"y":' + this.y + '}';
}
//转换坐标系
function P(fromSR,toST,point,xName,yName,me,options) {
    let arr = proj4("EPSG:" + fromSR, "EPSG:" + toST, [point[0], point[1]]);
    me[xName] = isNaN(arr[0]) ? undefined : arr[0];
    me[yName] = isNaN(arr[1]) ? undefined : arr[1];
    me.spatialReference = new ArcGisSpatialReference(options.spatialReference);
}

export {ArcGisPoint};
Zondy.Service.ArcGisPoint = ArcGisPoint;