/*
* 图形相关的操作 js
* */

import layers from '@/api/json/layers.json'
import queryUtils from "@/utils/map/queryUtils";
import identifyUtils from '@/utils/map/IdentifyUtils'
import { loadModules } from "esri-loader"
import featureUpdate from "@/utils/map/featureUpdate";
import arcgisParser from 'terraformer-arcgis-parser'
import wktParse from 'terraformer-wkt-parser'
import { maps } from '@/utils/map/mapUtils'
import graphicSymbol from '@/api/json/graphicSymbol.json'

export default {
    data () {
        return {

        }
    },
    methods: {
        getLayerByName (name) {
            for (var i = 0; i < layers.length; i++) {
                if (layers[i].layerName == name) {
                    return layers[i];
                }
            }
            return null;
        },
        queryGeoByBsm (bsm, type, callBackFunction, outSpatialReference) {
            var layer = null;
            if (type == 'zd') {
                layer = this.getLayerByName("ZDJBXX");
            } else if (type == 'zrz') {
                layer = this.getLayerByName("ZRZ");
            } else {
                console.log("未定义类型!!");
                return;
            }
            if (!layer) {
                console.log("没有找到图层,不能查询");
                return;
            }
            queryUtils.methods.queryByWhere(layer.layerUrl + "/" + layer.id, { "BSM": bsm }, null, true, null, outSpatialReference, function (res) {
                var features = res.features;
                if (callBackFunction && typeof callBackFunction == 'function') {
                    callBackFunction(features);
                }
            });
        },
        //生成介质点
        craetJZPoint (graphic) {
            var geomtry = graphic.geometry, rings = geomtry.rings[0];
            var pointInfos = [];
            this.getPointByRings(rings, pointInfos);
            return pointInfos;
        },
        getPointByRings (rings, pointInfos) {
            for (var i = 0; i < rings.length; i++) {
                var children = rings[i];
                if (children.length == 2 && typeof children[0] == 'number') {
                    var obj = {};
                    obj.jzdh = "j" + pointInfos.length;
                    obj.sxh = pointInfos.length;
                    obj.x = children[0];
                    obj.y = children[1];
                    pointInfos.push(obj);
                } else {
                    this.getPointByRings(children, pointInfos);
                }
            }
        },
        //生成介质线
        createJZLine (graphic, callBackFunction) {
            var self = this;
            loadModules([
                "esri/geometry/support/geodesicUtils",
                "esri/geometry/Point",
                "esri/geometry/Polyline"

            ]).then(([
                geodesicUtils,
                Point,
                Polyline
            ]) => {
                //取得各个坐标点 然后生成外围坐标线
                var geometry = graphic.geometry,
                    rings = geometry.rings,
                    points = [];
                if (rings.length > 0) {
                    for (var i = 0; i < rings.length; i++) {
                        var danPoints = [];
                        self.getPointByRings(rings[i], danPoints);
                        points.push(danPoints);
                    }
                } else {
                    var danPoints = [];
                    self.getPointByRings(rings, danPoints);
                    points.push(danPoints);
                }
                var lines = [];
                //meters
                for (var i = 0; i < points.length; i++) {
                    for (var j = 0; j < points[i].length; j++) {
                        if (j < (points[i].length - 1)) {
                            const join = geodesicUtils.geodesicDistance(
                                new Point({ x: points[i][j].x, y: points[i][j].y }),
                                new Point({ x: points[i][j + 1].x, y: points[i][j + 1].y }),
                                "meters"
                            );
                            const { distance, azimuth } = join;

                            var obj = {
                                startPoint: points[i][j].x + "," + points[i][j].y,
                                endPoint: points[i][j + 1].x + "," + points[i][j + 1].y,
                                qdh: points[i][j].sxh,
                                zdh: points[i][j + 1].sxh,
                                distance: distance,
                                jzxlx: "",
                                jzxwz: "",
                                jzxxz: "",
                                remark: ""
                            }
                            lines.push(obj);
                        } else {
                            const join = geodesicUtils.geodesicDistance(
                                new Point({ x: points[i][j].x, y: points[i][j].y }),
                                new Point({ x: points[i][0].x, y: points[i][0].y }),
                                "meters"
                            );
                            const { distance, azimuth } = join;
                            var obj = {
                                startPoint: points[i][j].x + "," + points[i][j].y,
                                endPoint: points[i][0].x + "," + points[i][0].y,
                                qdh: points[i][j].sxh,
                                zdh: points[i][0].sxh,
                                distance: distance,
                                jzxlx: "",
                                jzxwz: "",
                                jzxxz: "",
                                remark: ""
                            }
                            lines.push(obj);
                        }
                    }
                }
                if (callBackFunction && typeof callBackFunction == "function") {
                    callBackFunction(lines);
                }
            }).catch(err => {
                throw (err);
            })
        },
        //wkt转换成arcgis
        parseWktToArc (wkt) {
            var primitive = wktParse.parse(wkt);
            /*if(primitive.type == "MultiPolygon"){
                primitive.type = "Polygon"
            }*/
            return arcgisParser.convert(primitive)
        },
        postionToThisGeo (bsm, type) {
            var view = maps["testMap"];
            var layer = view.map.findLayerById("highlightLayer");
            if (layer) {
                var graphics = layer.graphics;
                if (graphics.length > 0 && graphics.items[0].attributes.BSM == bsm) {
                    // view.extent = graphics.items[0].geometry.extent;
                    view.center = graphics.items[0].geometry.extent.center;
                    view.zoom = 15;
                }
            } else {
                this.$message.success("暂无图形信息!!!");
            }
        },
        //导入空间图形是 先判断数据是否跨界
        geoJoint (geometry, callBacFunction) {
            var self = this;
            loadModules([
                "esri/geometry/geometryEngine",
                "esri/geometry/Polygon"
            ]).then(([
                geometryEngine,
                Polygon
            ]) => {
                var djqLayer = null, djzqLayer = null, xjzqLayer = null;
                djqLayer = self.getLayerByName("DJQ");
                djzqLayer = self.getLayerByName("DJZQ");
                xjzqLayer = self.getLayerByName("XJZQ");
                var layerIds = [];
                layerIds.push(djqLayer.id);
                layerIds.push(djzqLayer.id);
                layerIds.push(xjzqLayer.id);
                var polygon = new Polygon(geometry);
                identifyUtils.methods.identify(djqLayer.layerUrl, layerIds, polygon, function (res) {
                    var results = res.results;
                    var isJoint = false, layerName = "", message = "";
                    if (!results || results.length == 0) {
                        callBacFunction(true, "不在行政区内,请检查空间位置信息!!!");
                    }
                    for (var i = 0; i < results.length; i++) {
                        var feature = results[i].feature;
                        var flag = geometryEngine.intersects(polygon, feature.geometry);
                        var withinFlag = geometryEngine.within(polygon, feature.geometry);
                        if (!withinFlag && flag) {
                            isJoint = true;
                            layerName = results[i].layerName;
                            switch (layerName) {
                                case 'DJQ': message = "地块跨越地籍区,数据不合法!!!"; break;
                                case 'DJZQ': message = "地块跨越地籍子区,数据不合法!!!"; break;
                                case 'XJZQ': message = "地块跨越行政区,数据不合法!!!"; break;
                            }
                            break
                        }
                    }
                    if (callBacFunction && typeof callBacFunction == "function") {
                        callBacFunction(isJoint, message);
                    }
                }, true)
            }).catch(err => {
                console.log(err);
                throw (err);
            })
        },
        //保存或者编辑属性信息
        updAttributes (bsm, type, attributes, callBackFunction, ydybsm) {
            var layer = null;
            if (type == 'zd') {
                layer = this.getLayerByName("ZDJBXX");
            } else {
                layer = this.getLayerByName("ZRZ");
            }
            var featureUrl = layer.layerUrl.replace("MapServer", "FeatureServer");
            featureUrl += "/" + layer.id;
            this.queryGeoByBsm(ydybsm ? ydybsm : bsm, type, function (features) {
                if (features && features.length > 0) {
                    attributes.OBJECTID = features[0].attributes.OBJECTID;
                    features[0].attributes = attributes;
                    /* var wkt = "PROJCS[\"XADFZBX\",GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",0.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",0.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]";
                     features[0].geometry.spatialReference = {
                         wkt:wkt
                     }*/
                    if (ydybsm) {
                        features[0].attributes.BSM = ydybsm;
                    }
                    featureUpdate.methods.updateGraphic(featureUrl, features[0], callBackFunction);
                } else {
                    var graphic = {
                        attributes: attributes
                    }
                    featureUpdate.methods.addGraphic(featureUrl, graphic, callBackFunction);
                }
            });
        },
        //叠加分析 同一个图层的叠加分析
        zdOverAnalys (bsm, graphic, callBacFunction) {
            var self = this;
            loadModules([
                "esri/geometry/Polygon"
            ]).then(([
                Polygon
            ]) => {
                var zdLayer = null;
                zdLayer = self.getLayerByName("ZDJBXX");
                var layerIds = [];
                layerIds.push(zdLayer.id);
                var polygon = new Polygon(graphic.geometry);
                identifyUtils.methods.identify(zdLayer.layerUrl, layerIds, polygon, function (res) {
                    var results = res.results;
                    //判断数据是否与其他数据有重叠
                    var flag = false;
                    if (results && results.length > 0) {
                        flag = true;
                        //加载在图层上 原本的要导入的数据 和重叠数据
                        self.addOverLayer(polygon, results);
                    }
                    callBacFunction(flag, results);
                }, true)
            }).catch(err => {
                console.log(err);
                throw (err);
            })
        },
        //添加添加元素和覆盖的元素到地图上
        addOverLayer (geometry, results) {
            var view = maps["testMap"];
            loadModules([
                "esri/Graphic",
                "esri/geometry/Polygon",
                "esri/layers/GraphicsLayer",
                "esri/geometry/geometryEngineAsync",
                "esri/geometry/Extent"
            ]).then(([
                Graphic,
                Polygon,
                GraphicsLayer,
                geometryEngineAsync,
                Extent
            ]) => {
                var graphic = new Graphic({
                    geometry: geometry
                })
                var layer = view.map.findLayerById("overLayer");
                if (layer) {
                    layer.removeAll();
                } else {
                    layer = new GraphicsLayer({
                        id: "overLayer"
                    })
                    view.map.add(layer);
                }
                var impotSymbol = graphicSymbol.fillSymbol.importSymbol,
                    defaultSymbol = graphicSymbol.fillSymbol.defaultSymbol;
                for (var i = 0; i < results.length; i++) {
                    var feature = results[i].feature;
                    feature.symbol = defaultSymbol;
                    layer.add(feature);
                    var geo = geometryEngineAsync.intersect(feature.geometry, geometry);
                    geo.then(function (res) {
                        var interGra = new Graphic({
                            geometry: res,
                            symbol: graphicSymbol.fillSymbol.highlightSymbol
                        })
                        layer.add(interGra);
                    })
                }
                graphic.symbol = impotSymbol
                layer.add(graphic);
                var extent = new Extent(JSON.parse(JSON.stringify(graphic.geometry.extent)))
                extent.spatialReference = view.spatialReference;
                //  view.extent = extent;
                view.center = extent.center;
                view.zoom = 15;
            }).catch(err => {
                console.log(err);

            })
        },
        clearOverLayer () {
            var view = maps["testMap"];
            var layer = view.map.findLayerById("overLayer");
            if (layer) {
                layer.removeAll();
            }
        },
        //自然幢叠加分析 不能跨宗地 图层本身的叠加分析
        zrzOverAnalys (bsm, graphic, callBacFunction) {
            var self = this;
            loadModules([
                "esri/geometry/Polygon",
                "esri/geometry/geometryEngine"
            ]).then(([
                Polygon,
                geometryEngine
            ]) => {
                var polygon = new Polygon(graphic.geometry);
                var zdLayer = null,
                    zrzLayer = null;
                zdLayer = self.getLayerByName("ZDJBXX");
                zrzLayer = self.getLayerByName("ZRZ");
                var layerIds = [];
                layerIds.push(zdLayer.id);
                layerIds.push(zrzLayer.id);
                identifyUtils.methods.identify(zdLayer.layerUrl, layerIds, polygon, function (res) {
                    var results = res.results;
                    //判断数据是否与其他数据有重叠
                    var flag = false,
                        mesge = "";
                    if (results && results.length > 0) {
                        for (var i = 0; i < results.length; i++) {
                            var feature = results[i].feature,
                                layerName = results[i].layerName;
                            if (layerName == 'ZRZ') {
                                if (!feature.attributes['标识码'] || feature.attributes['标识码'] != bsm) {
                                    var interFlag = geometryEngine.intersects(polygon, feature.geometry);
                                    if (interFlag) {
                                        flag = true;
                                        mesge = "导入的自然幢与其他自然幢重叠,不能导入!!!";
                                        break;
                                    }
                                }
                            } else if (layerName == 'ZDJBXX') {
                                var interFlag = geometryEngine.intersects(polygon, feature.geometry);
                                var withinFlag = geometryEngine.within(polygon, feature.geometry);
                                if (!withinFlag && interFlag) {
                                    flag = true;
                                    mesge = "导入的自然幢与其跨宗地,不能导入!!!";
                                    break;
                                }
                            }
                        }
                    }
                    callBacFunction(flag, mesge);
                }, true)
            }).catch(err => {
                console.log(err);
            })
        },
        //去除重叠部分
        getDifference (inputGraphic, subGraphic, callBackFuncton) {
            loadModules([
                "esri/geometry/Polygon",
                "esri/geometry/geometryEngine",
                "esri/Graphic"
            ]).then(([
                Polygon,
                geometryEngine,
                Graphic
            ]) => {
                var inputGeometry = new Polygon(inputGraphic.geometry);
                var outGeometry = null;
                for (var i = 0; i < subGraphic.length; i++) {
                    var feature = subGraphic[i].feature;
                    outGeometry = geometryEngine.difference(inputGeometry, feature.geometry);
                }
                if (callBackFuncton && typeof callBackFuncton == 'function') {
                    callBackFuncton(outGeometry);
                }
            }).catch(err => {
                console.log(err);
            })
        },
        //业务处理 先用query方法 查询将所有属性查询 在做空间裁剪
        getResultsDif (subGraphics, currntGraphic, callBackFunction, flag) {
            var self = this;
            loadModules([
                "esri/geometry/geometryEngine",
                "esri/geometry/Polygon"
            ]).then(([
                geometryEngine,
                Polygon
            ]) => {
                var objectIds = [];
                subGraphics.filter(item => {
                    objectIds.push(item.feature.attributes.OBJECTID);
                })
                var inputGeometry = new Polygon(currntGraphic.geometry);
                var zdLayer = self.getLayerByName("ZDJBXX");
                queryUtils.methods.queryByWhere(zdLayer.layerUrl + "/" + zdLayer.id, { OBJECTID: objectIds }, null, true, "", subGraphics[0].feature.geometry.spatialReference, function (result) {
                    var features = result.features;
                    if (flag) {
                        for (var i = 0; i < features.length; i++) {
                            features[i].geometry = geometryEngine.difference(features[i].geometry, inputGeometry);
                            features[i].attributes.BGZT = 3;
                        }
                    } else {
                        for (var i = 0; i < features.length; i++) {
                            features[i].geometry = null;
                            features[i].attributes.BGZT = 4;
                        }
                    }
                    if (callBackFunction && typeof callBackFunction == 'function') {
                        callBackFunction(features);
                    }
                })

            }).catch(err => {
                console.log(err);
            })

        },
        addGeoByBsm (bsm, type, viewId) {
            var self = this;
            var layer = null;
            if (type == 'zd') {
                layer = this.getLayerByName("ZDJBXX");
            } else if (type == 'zrz') {
                layer = this.getLayerByName("ZRZ");
            } else {
                console.log("未定义类型!!");
                return;
            }
            if (!layer) {
                console.log("没有找到图层,不能查询");
                return;
            }
            queryUtils.methods.queryByWhere(layer.layerUrl + "/" + layer.id, { "BSM": bsm }, null, true, null, null, function (res) {
                var features = res.features;
                if (features && features.length > 0) {
                    if (!features[0].geometry || features[0].geometry.rings.length == 0) {
                        self.$message.success("暂无图形信息!!");
                        return;
                    }
                    loadModules([
                        "esri/layers/GraphicsLayer"
                    ]).then(([
                        GraphicsLayer
                    ]) => {
                        var view = maps[viewId];
                        var layer = view.map.findLayerById("highlightLayer");
                        if (layer) {
                            layer.removeAll();
                        } else {
                            layer = new GraphicsLayer({
                                id: "highlightLayer"
                            })
                            view.map.add(layer, 5);
                        }
                        var symbol = graphicSymbol.fillSymbol.highlightSymbol;
                        var graphic = features[0];
                        graphic.symbol = symbol;
                        layer.add(graphic);
                        // view.extent = graphic.geometry.extent;
                        view.center = graphic.geometry.extent.center;
                        view.zoom = 15;
                    }).catch(err => {
                        thow(err);
                    })
                } else {
                    self.$message.success("暂无图形信息!!");
                    return;
                }
            });
        },
        //清空当前图层
        clearHighlightLayer (viewId) {
            var view = maps[viewId];
            var layer = view.map.findLayerById("highlightLayer");
            if (layer) {
                layer.removeAll();
            }
        }
    }
}