openlayer实现文字转矢量线面可视化展示

一、实现原理及基本步骤

要使用OpenLayers实现文字转矢量线面的可视化展示,可以遵循以下步骤:

1. 创建矢量源(Vector Source):

首先,需要定义一个矢量源来存储将要绘制的文字。这个源可以是空的,或者已经包含了某些几何对象。

2. 添加矢量图层(Vector Layer):

将矢量源绑定到一个矢量图层上,并将该图层添加到地图中。这一步骤使得在地图上显示矢量数据成为可能。

3. 生成文字路径:

根据所需显示的文字内容生成相应的几何形状(例如多边形或折线)。这通常涉及到将每个字符转换为一系列点坐标,这些点构成了字符的轮廓。对于复杂的字体和样式,可能需要借助第三方库来处理这种转换。

4. 创建几何对象(Geometry):

基于上述生成的路径创建适当的OpenLayers几何对象,如LineString(线串)、Polygon(多边形)等。每种几何类型都对应于不同的显示效果;例如,用LineString来表示线条化的文字,而Polygon则可用于填充区域。

5. 设置样式(Style):

为生成的几何对象指定样式,包括颜色、宽度、透明度等属性。这对于确保最终结果符合预期至关重要。

6. 添加交互功能:

如果希望用户能够与这些文本图形进行互动(比如点击时弹出信息),还可以进一步配置交互控件。

7. 优化性能:

考虑到文字转矢量的过程可能会比较耗时,特别是当处理大量文字或复杂字体时,考虑使用Web Workers或其他异步技术来提高性能,避免阻塞主线程。

二、技术实现编码

1.字体编码

2.图层设置

3.样式符号设置

new Style({
  stroke: new Stroke({
    color: 'rgba(129, 0, 127, 1)',
    // lineDash:[6],
    width: 1
  })
}),
new Style({
  stroke: new Stroke({
    color: 'rgba(57, 136, 199, 0.85)',
    width: 1,
  }),
  fill: new Fill({
    color: 'rgba(57, 136, 199, 0.85)',
  }),
}),

4.功能逻辑编码实现

export function generateTextGeometry(txt,map, layersInfo, layerCode){
  let loader = new FontLoader()
  let cFont = loader.parse(font);
  let shapes = cFont.generateShapes(txt, 2)
  let lineStrs=[]
  for(let ic = 0; ic < shapes.length; ic++){
    for(let j=0;j<shapes[ic].curves.length;j++){
      let line={
        "type": "LineString1",
        "coordinates": []
      }
      for(var key in shapes[ic].curves[j]){
        if(shapes[ic].curves[j][key].isVector2){
          line.coordinates.push([118.27344195264403+shapes[ic].curves[j][key].x/1000, 33.94611280702391+shapes[ic].curves[j][key].y/1000])
        }
      }
      lineStrs.push(line)
    }
    for(let k=0;k<shapes[ic].holes.length;k++){
      for(let m=0;m<shapes[ic].holes[k].curves.length;m++){
        let line={
          "type": "LineString1",
          "coordinates": []
        }
        for(var key in shapes[ic].holes[k].curves[m]){
          if(shapes[ic].holes[k].curves[m][key].isVector2){
            line.coordinates.push([118.27344195264403+shapes[ic].holes[k].curves[m][key].x/1000, 33.94611280702391+shapes[ic].holes[k].curves[m][key].y/1000])
          }
        }
        lineStrs.push(line)
      }
    }
  }
  commonCreateLine(map, layerCode, LayersRenderSet, lineStrs, layersInfo[layerCode].dataGeoField, layersInfo[layerCode].dataIdField, layersInfo[layerCode].labelField)
  return shapes
  // let geometry = new TextGeometry(text, {
  //   font: cFont,
  //   size: 2,
  //   height: 0.5,
  // });
}
 let shps=generatePolygonTextGeometry(
          '在这个宁静的夜晚,我坐在柔和的灯光下,周围的一切似乎都沉浸在梦乡之中,\n' +
              '唯独我的心,因你而醒着。我想借这笺素纸,倾诉那些平日里难以言表的情愫,让每\n' +
              '一个字,都成为穿梭于你我心间的温柔使者。\n' +
              '\n' +
              '遇见你,是命运最美丽的安排。在人海中与你相逢,就像是久旱逢甘霖,让我的世界\n' +
              '瞬间充满了色彩。你的笑,如同春日里最温暖的阳光,轻轻拂过我心灵的每一个角落;\n' +
              '你的眼,深邃而明亮,仿佛藏着星辰大海,让我愿意沉醉其中,探索那无尽的奥秘。\n' +
              '\n' +
              '有时,我独自回味我们共度的时光,那些简单的对话、不经意间的对视、共同走过的路……\n' +
              '每一点每一滴,都如同珍贵的珍珠,串联起我心中最闪耀的记忆项链。你的存在,让我\n' +
              '的生活变得更加丰富和有意义,每一个平凡的日子,都因为有了你而变得不凡。\n' +
              '\n' +
              '我渴望与你分享生活中的每一个瞬间,无论是清晨的第一缕阳光,还是夜晚的最后一抹\n' +
              '月色;无论是成功的喜悦,还是偶尔的挫败。我希望成为你的避风港,也是你前行路上\n' +
              '的同行者,无论风雨,携手并肩,直到世界的尽头。\n' +
              '\n' +
              '爱,于我而言,不仅仅是心动的瞬间,更是长久陪伴的承诺。我愿意用我的全部,去呵\n' +
              '护这份感情,让它如细水长流,经得起时间的考验,愈发醇厚。我梦想着与你一起,构\n' +
              '建属于我们的小世界,那里有欢笑,有梦想,更有彼此深深的爱。\n' +
              '\n' +
              '请原谅我笨拙的笔触,无法完全描绘出我内心对你的情感。但请相信,我的爱,比这些\n' +
              '文字更深沉,更真挚。我愿意等待,等待那一天,当你读到这封信时,能够感受到我心\n' +
              '底的温柔与坚定,愿意与我一起,书写属于我们的爱情故事。\n' +
              '\n' +
              '在这个宇宙的广阔里,能遇到你,是我最大的幸运。愿我的爱,如同夜空中最亮的星,\n' +
              '照亮你前行的路,也温暖你的心房。',icolMap, layersInfo,'polygon')
      // let shps=generateTextGeometry(
      //     '1234567890\n' +
      //     'ABCDEFGHIJKLMNOPQRSTUVWXYZ\n' +
      //     '今日は特別な日です。今日で私たちが(相识/相遇)の(年数)周年を迎えますね。元々一緒に祝うことができると思いましたが、今日は(收信人的名字)のそばで祝うことができません。本当にごめんなさいね。今度から毎年この日は僕がそばにいることをここで約束します。今そばにいなくても、ずっと心の中から、(收信人的名字)の幸福と健康を祈っています。遠距離恋愛って、難しいかもしれませんが、2人とも心の中に相手のことが詰まっていて、それが一番大事なのではないかと思います。僕にとって、(收信人的名字)は特別な存在です。だから、この感情にとても自信を持っています。再会の日が来るまで、2人頑張りましょう‌\n' +
      //     '1\n' +
      //     '。我喜欢你,xxx!',icolMap, layersInfo,'line')
      let shps1=generateTextGeometry(
          '在这个宁静的夜晚,我坐在柔和的灯光下,周围的一切似乎都沉浸在梦乡之中,\n' +
          '唯独我的心,因你而醒着。我想借这笺素纸,倾诉那些平日里难以言表的情愫,让每\n' +
          '一个字,都成为穿梭于你我心间的温柔使者。\n' +
          '\n' +
          '遇见你,是命运最美丽的安排。在人海中与你相逢,就像是久旱逢甘霖,让我的世界\n' +
          '瞬间充满了色彩。你的笑,如同春日里最温暖的阳光,轻轻拂过我心灵的每一个角落;\n' +
          '你的眼,深邃而明亮,仿佛藏着星辰大海,让我愿意沉醉其中,探索那无尽的奥秘。\n' +
          '\n' +
          '有时,我独自回味我们共度的时光,那些简单的对话、不经意间的对视、共同走过的路……\n' +
          '每一点每一滴,都如同珍贵的珍珠,串联起我心中最闪耀的记忆项链。你的存在,让我\n' +
          '的生活变得更加丰富和有意义,每一个平凡的日子,都因为有了你而变得不凡。\n' +
          '\n' +
          '我渴望与你分享生活中的每一个瞬间,无论是清晨的第一缕阳光,还是夜晚的最后一抹\n' +
          '月色;无论是成功的喜悦,还是偶尔的挫败。我希望成为你的避风港,也是你前行路上\n' +
          '的同行者,无论风雨,携手并肩,直到世界的尽头。\n' +
          '\n' +
          '爱,于我而言,不仅仅是心动的瞬间,更是长久陪伴的承诺。我愿意用我的全部,去呵\n' +
          '护这份感情,让它如细水长流,经得起时间的考验,愈发醇厚。我梦想着与你一起,构\n' +
          '建属于我们的小世界,那里有欢笑,有梦想,更有彼此深深的爱。\n' +
          '\n' +
          '请原谅我笨拙的笔触,无法完全描绘出我内心对你的情感。但请相信,我的爱,比这些\n' +
          '文字更深沉,更真挚。我愿意等待,等待那一天,当你读到这封信时,能够感受到我心\n' +
          '底的温柔与坚定,愿意与我一起,书写属于我们的爱情故事。\n' +
          '\n' +
          '在这个宇宙的广阔里,能遇到你,是我最大的幸运。愿我的爱,如同夜空中最亮的星,\n' +
          '照亮你前行的路,也温暖你的心房。',icolMap, layersInfo,'line')

三、实现效果

  如果对您有所帮助,请点赞打赏支持!

技术合作交流qq:2401315930

最后分享一下地图下载器设计及下载地址:

链接:https://pan.baidu.com/s/1RZX7JpTpxES-G7GiaVUxOw 
提取码:61cn

地图下载器代码结构设计及功能实现_地图下载管理器解析-CSDN博客

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

合抱阴阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值