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;