GEOJSON画线时需要的二维数组坐标怎么转换

发布于 2022-09-13 00:39:15 字数 2998 浏览 31 评论 0

使用的是思极地图 文档地址https://lbs.sgmap.cn/products...
其中创建线段用到GEOJSON,对这个不太熟
数据如下(无视坐标相同...事实是不同的)

      tableData: [
         {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151A",
        },
        {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151B",
        },
        {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151C",
        },
        {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151D",
        }
      ]

创建地图后需要画线段和圆点,每两个圆点有一条线段相连

画线的代码

    getLine(map, id, lineWidth, lineOpacity, lineOffset, coordinates, _this) {
      let currentLine = null;
      map.on("load", function (e) {
        //画线
        let polyline = map.addLayer({
          id: id,
          type: "line",
          source: {
            type: "geojson",
            data: {
              type: "FeatureCollection",
              features: [],
            },
          },
          paint: {
            "line-color": "#00896C",
            "line-width": lineWidth,
            "line-opacity": lineOpacity,
            "line-offset": lineOffset,
            //'line-dasharray':[4,4]
          },
        });
        map.getSource(id).setData({
          type: "FeatureCollection",
          features: [
            {
              type: "Feature",
              geometry: {
                type: "LineString",
                coordinates: coordinates, //二维数组[[0,0],[0,0]]
              },
            },
          ],
        });

        map.on("click", String(id), function (e) {
          if (!currentLine) {
            map.setPaintProperty(String(id), "line-color", "#6AD6C0");
            currentLine = polyline;
          } else {
            map.setPaintProperty(String(id), "line-color", "#00896C");
            currentLine = null
          }
        });
      });
    },

关键就在coordinates。

然后开始循环画线

data() {
  return {
    linePath: []
  }
}
computed: {
  dataDeal() {
   for (let [index, elem] of new Map(_this.tableData.map((item, i) => [i,item]))) {
      this.drawMarker(elem, index);
      }
    }
  }

mthods: {
  drawMarker(elem, index) {
     let _this = this
     if (elem.markerX && elem.markerY) {
        _this.linePath.push([elem.markerX, elem.markerY]);
        _this.getLine(
          map,
          String(elem.sectionNumber), //线id
          4, //线宽
          0.8, //透明度
          0, //偏移量
          _this.linePath, //线坐标,一个二维数组
          _this
        );
      }
  }
}

这样是可以正常显示出线段的,问题就是,我想要点击线段,然后点击的会有个高亮效果,
理想效果是:点击两个圆点之间的线段,只有这个线段高亮,其他圆点的连线不变。
事实效果是:点击两个圆点之间的线段,整条线段都高亮了。。。

排查问题发现是传入的coordinates,用push的方式之后,把所有数据都push到一个数组了,就相当于只创建了一条线段。

有没有什么办法,用现有的数据,创建成三个不同的二维数组,比如:[Arr0, Arr1] [Arr1, Arr2] [Arr2, Arr3]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

○闲身 2022-09-20 00:39:16

理想效果是:点击两个圆点之间的线段,只有这个线段高亮,其他圆点的连线不变。
事实效果是:点击两个圆点之间的线段,整条线段都高亮了。。。
我猜想是你生成一个layer图层,理论上你需要生成点数-1个图层。
理论上你需要把geojson分成一个数组,数组内每个元素都是两个点
比如:

tableData: [
         {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151A",
        },
        {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151B",
        },
        {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151C",
        },
        {
          markerX: 116.409197,
          markerY: 39.912869,
          lineId: "51515616151D",
        }
      ]

变成

tableData: [
 [
    {
      markerX: 116.409197,
      markerY: 39.912869,
      lineId: "51515616151A",
    },
    {
      markerX: 116.409197,
      markerY: 39.912869,
      lineId: "51515616151B",
    }
],
 [
  {
  markerX: 116.409197,
  markerY: 39.912869,
  lineId: "51515616151B",
},
{
  markerX: 116.409197,
  markerY: 39.912869,
  lineId: "51515616151C",
}
 ],
 [
  {
  markerX: 116.409197,
  markerY: 39.912869,
  lineId: "51515616151C",
},
{
  markerX: 116.409197,
  markerY: 39.912869,
  lineId: "51515616151D",
}
 ]
]

这样一个geojson变成三个再去创建线图层,就会生成多个layer
大概的数据处理方法

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文