svg text换行_arcgis api 3.x for js 解决 textSymbol 文本换行显示(附源码下载)

f255b821b33a099928016992399598c9.png

前言

关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类的介绍,还有就是在线例子:esri 官网在线例子,这个也是学习 arcgis api 3.x 的好素材。

内容概览

arcgis api 3.x for js 解决 textSymbol 文本换行显示
源代码 demo 下载

arcgis api 3.x for js 默认加载 textsymbol 显示文本是不支持换行的,识别不到 n r 等等转义符,需要拓展一下才能支持,下面是拓展后的效果图如下:

1543114fe797cce386d893b296d6b14f.png

实现思路

本篇实现文本换行显示效果 demo 是在arcgis api 3.x for js 地图加载多个 SHP 图层压缩以及 json 文件展示(附源码下载)基础上弄的

  • 拓展支持换行的 esri.symbol.MultiLineTextSymbol.js 文件,全部代码如下:
require(["esri/layers/LabelLayer"], function(ll) 
{ 
 if( typeof esri.layers.LabelLayer.prototype._addLabel == 'function' ) 
    { 
        esri.layers.LabelLayer.prototype._addLabel2 = esri.layers.LabelLayer.prototype._addLabel; 
        esri.layers.LabelLayer.prototype._addLabel = function(a,b,c,e,g,k,m) 
 { 
 // replace n by <br> 
            a = a.replace(/n/g, "<br />"); 
 this._addLabel2(a,b,c,e,g,k,m); 
        } 
    } 
}); 
 
require(["esri/symbols/TextSymbol", "dojox/gfx/svg"], function(ts, svg) 
{ 
 if( typeof dojox.gfx.svg.Text.prototype.setShape == 'function' ) 
    { 
        dojox.gfx.svg.Text.prototype.setShape = function(p) 
 { 
 this.shape = dojox.gfx.makeParameters(this.shape, p); 
 this.bbox = null; 
 var r = this.rawNode, s = this.shape; 
            r.setAttribute("x", s.x); 
            r.setAttribute("y", s.y); 
            r.setAttribute("text-anchor", s.align); 
            r.setAttribute("text-decoration", s.decoration); 
            r.setAttribute("rotate", s.rotated ? 90 : 0); 
            r.setAttribute("kerning", s.kerning ? "auto" : 0); 
            r.setAttribute("text-rendering", "optimizeLegibility"); 
 
 while(r.firstChild) 
                r.removeChild(r.firstChild); 
 
 if(s.text) 
            {  
 var texts = s.text.replace(/<brs*/?>/ig, "n").split("n"); 
 var lineHeight = 1.1 * parseInt(document.defaultView.getComputedStyle(r, "").getPropertyValue("font-size"), 10);  
 if( isNaN(lineHeight) || !isFinite(lineHeight) ) 
                    lineHeight = 15; 
 
 for(var i = 0, n = texts.length; i < n; i++) 
                {  
 var tspan = (document.createElementNS ? document.createElementNS(dojox.gfx.svg.xmlns.svg, "tspan") : document.createElement("tspan")); 
                    tspan.setAttribute("dy", i ? lineHeight : -(texts.length-1)*lineHeight/2);  
                    tspan.setAttribute("x", s.x); 
                    tspan.appendChild((dojox.gfx.useSvgWeb ? document.createTextNode(texts[i], true) : document.createTextNode(texts[i])));  
                    r.appendChild(tspan); 
                } 
            } 
 
 return this; 
        } 
    } 
}); 
  • map.html引用 esri.symbol.MultiLineTextSymbol.js
 <script type="text/javascript" src="js/main/esri.symbol.MultiLineTextSymbol.js"></script> 
  • map.js 加载显示核心代码:
 //定义文本图层 
    textGraphicsLayer = new esri.layers.GraphicsLayer();//标注文本图层 
 map.addLayer(textGraphicsLayer);//地图添加图层 
 //创建textsymbol文本标注 
 if (data.features.length > 0) {//动态读取json数据源结果集 
 for (var i = 0; i < data.features.length; i++) { 
 var feature = data.features[i]; 
 var point = new esri.geometry.Point(feature.geometry.x, feature.geometry.y, map.spatialReference); 
 //定义文本symbol                     
                    textsymbol = new esri.symbol.TextSymbol(feature.attributes.NAME + "n" + feature.attributes.PHONE).//动态设置文本值 
                        setColor(new dojo.Color([128, 0, 0])).//setColor设置文本颜色 
                        setFont(new esri.symbol.Font("10pt").//setFont设置文本大小 
                        setWeight(esri.symbol.Font.WEIGHT_BOLD)). //setWeight设置文本粗体 
                        setOffset(0, -35);//设置偏移方向 
 var graphic = new esri.Graphic(point, textsymbol); 
                    textGraphicsLayer.add(graphic); 
                } 
            } 
 //创建textsymbol文本标注 
 if (data.features.length > 0) {//动态读取json数据源结果集 
 for (var i = 0; i < data.features.length; i++) { 
 var feature = data.features[i]; 
 var point = new esri.geometry.Point(feature.geometry.x, feature.geometry.y, map.spatialReference); 
 //定义文本symbol                     
                    textsymbol = new esri.symbol.TextSymbol(feature.attributes.NAME + "n" + feature.attributes.ADDRESS).//动态设置文本值 
                        setColor(new dojo.Color([128, 0, 0])).//setColor设置文本颜色 
                        setFont(new esri.symbol.Font("10pt").//setFont设置文本大小 
                        setWeight(esri.symbol.Font.WEIGHT_BOLD)). //setWeight设置文本粗体 
                        setOffset(0, -35);//设置偏移方向 
 var graphic = new esri.Graphic(point, textsymbol); 
                    textGraphicsLayer.add(graphic); 
                } 
            }

完整demo源码见小专栏文章尾部

arcgis api 3.x for js 解决 textSymbol 文本换行显示(附源码下载) - 小专栏​xiaozhuanlan.com
307b7942a4d7aa0d76f887866c9b9d5f.png

文章尾部提供源代码下载,对本专栏感兴趣的话,可以关注一波

GIS之家店铺:GIS之家
GIS之家源码咨询:GIS之家webgis入门开发系列demo源代码咨询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值