gis

// edge 3d视图占位
// WKT(Well-known text)是一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换
 let parseWKT =  wktFormat.parse(item.reportAddress)

// Turf.js:JavaScript 空间分析库,由Mapbox 提供,Turf 实现了常用的空间分析操作,例如生成缓冲区、计算等高线,建立 TIN 等等
// 画线
  let line = turf.lineString(parseWKT.coordinates)

// GeoJSON是一种对各种地理数据结构进行编码的格式 
1. let feature = new GeoJSON().readFeatures(JSON.stringify(faultPoint))
// 设定矢量要素的线样式。
2.Stroke
3.点击事件增加overLay覆盖
     addAttributesOver(layer) {
            // 这里的layer railRoadPointLayer
            let map = this.map;
            //建立overlay层 地图上显示面板id信息、鼠标hover事件
            let selectHover = new Select({
                layers: [layer],
                multi: true,
                condition: singleClick,
            });

            let pannelInf = document.getElementById("pannelInfo");

            selectHover.on("select", function (e) {
                let layerDataSourceId = new Overlay({ // 覆盖层
                    element: pannelInf,
                    autoPan: true, // 默认为false,如果设置为true,则在调用setPosition将平移映射,以便在当前视图中 overlay 完全可见
                    // offset: [-50, -100],
                });
                map.addOverlay(layerDataSourceId);
                //let element = layerDataSourceId.getElement(); 选中的feature
                let feature = e.selected[0];
                if (feature) {
                    // console.log(feature)
                    map.getTargetElement().style.cursor = "pointer";
                    pannelInf.style.display = "block"
                    let coordinate = feature.geometryChangeKey_.target.flatCoordinates;
                    layerDataSourceId.setPosition(coordinate);
                    // pannelInf.innerHTML = `<div>故障发生事件:${feature.values_.belongpro}</div>` +
                    //     `<div>网元名称:${feature.values_.code}</div>` +
                    //     `<div>故障类型:${feature.values_.name}</div>` +
                    //     `<div>工单级别:${feature.values_.projectmanager}</div>`
                    pannelInf.innerHTML = `<div>故障段:${feature.values_.belongpro}</div>` +
                        `<div>故障次数:${feature.values_.name}</div>` +
                        `<div>原因分析:${feature.values_.code}</div>`
                } else {
                    map.getTargetElement().style.cursor = "auto";
                    pannelInf.style.display = "none"
                }
            })
            // 将给定的交互添加到地图中
            map.addInteraction(selectHover)
        },


 /***  高德带箭头的道路样式  */
    setLineStyle(feature,res) {
        // trackLine是LineString对象
        // Get the feature's default geometry. A feature may have any number of named geometries. The "default" geometry (the one that is rendered by default) is set when calling
        let trackLine = feature.getGeometry()
        let styles = [
            new Style({
                stroke: new Stroke({
                    color: "#46ef30",
                    width: 10,
                }),
                zIndex: 3,
            }),
            new Style({
                stroke: new Stroke({
                    color: "#000000",
                    width: 12,
                }),
                zIndex: 1,
            }),
        ];
        //对segments建立btree索引

        /*RBush是一个high-performanceJavaScript库,用于点和矩形的二维空间索引。
        它基于优化的R-tree数据结构,支持大容量插入。空间索引是一种用于点和矩形的特殊数据结构,允许您非常高效地执行“此边界框中的所有项目”之类的查询(例如,比在所有项目上循环快数百倍)。
        它最常用于地图和数据可视化。*/

        let tree = new RBush(); //路段数
        // forEachSegment
        // 遍历每个段,调用提供的回调。 如果回调返回一个真实值,则函数立即返回该值。 否则函数返回
        trackLine.forEachSegment(function (start, end) {
            let dx = end[0] - start[0];
            let dy = end[1] - start[1];
            //计算每个segment的方向,即箭头旋转方向

             /*atan2 方法返回一个 -pi 到 pi 之间的数值,表示点 (x, y) 对应的偏移角度。这是一个逆时针角度,以弧度为单位,正X轴和点 (x, y) 与原点连线之间。
             函数接受的参数:先传递 y 坐标,然后是 x 坐标。*/
            let rotation = Math.atan2(dy, dx);
            let geom = new LineString([start, end])
            // 获取几何的范围。
            let extent = geom.getExtent();
            let item = {
                minX: extent[0],
                minY: extent[1],
                maxX: extent[2],
                maxY: extent[3],
                geom: geom,
                rotation: rotation,
            };
            tree.insert(item);
        });
        //轨迹地理长度
        let length = trackLine.getLength();
        //像素间隔步长
        let stpes = 40; //像素步长间隔
        //将像素步长转实际地理距离步长
        let geo_steps = stpes * res;
        //箭头总数
        let arrowsNum = parseInt(length / geo_steps);
        for (let i = 1; i < arrowsNum; i++) {
            // getCoordinateAt 返回沿线串提供的分数处的坐标。是一个介于 0 和 1 之间的fraction数字,其中 0 是线串的开始,1 是结束。
            let arraw_coor = trackLine.getCoordinateAt((i * 1.0) / arrowsNum);
            let tol = 0.0001; //查询设置的点的容差,测试地图单位是米(10)。如果是4326坐标系单位为度的话,改成0.0001.
            let arraw_coor_buffer = [
                arraw_coor[0] - tol,
                arraw_coor[1] - tol,
                arraw_coor[0] + tol,
                arraw_coor[1] + tol,
            ];
            //进行btree查询
            let treeSearch = tree.search({
                minX: arraw_coor_buffer[0],
                minY: arraw_coor_buffer[1],
                maxX: arraw_coor_buffer[2],
                maxY: arraw_coor_buffer[3],
            });
            let arrow_rotation;
            //只查询一个,那么肯定是它了,直接返回
            if (treeSearch.length === 1) arrow_rotation = treeSearch[0].rotation;
            else if (treeSearch.length > 1) {
                let results = treeSearch.filter(function (item) {
                    //箭头点与segment相交,返回结果。该方法实测不是很准,可能是计算中间结果
                    //保存到小数精度导致查询有点问题
                    // if(item.geom.intersectsCoordinate(arraw_coor))
                    //   return true;

                    //换一种方案,设置一个稍小的容差,消除精度问题
                    let _tol = 1; //消除精度误差的容差
                    if (
                        // 测试几何图形和传递的范围是否相交。
                        item.geom.intersectsExtent([
                            arraw_coor[0] - _tol,
                            arraw_coor[1] - _tol,
                            arraw_coor[0] + _tol,
                            arraw_coor[1] + _tol,
                        ])
                    )
                        return true;
                });
                if (results.length > 0) arrow_rotation = results[0].rotation;
            }
            styles.push(
                new Style({
                    geometry: new Point(arraw_coor),
                    image: new Icon({
                        src: require('../assets/images/arrow.png'),
                        scale: 0.8,
                        rotation: -arrow_rotation + Math.PI / 2,
                    }),
                    zIndex: 3,
                })
            );
        }
        return styles;
    },

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容