arcgis API for js之TextSymbol换行问题

arcgis API for javaScript 之TextSymbol换行问题

我来更新了,更新思路,想要显示textSymbol换行,其实主要也是为了显示属性,则可以用弹窗显示,使用InfoWindow、结合PopupTemplate或InfoTemplate 就可达到想要的效果啦,因为现在转战前端,所以这部分内容,可能后续会更新
1、textSymbol在API中 只能单行显示text
现在我们引入一个JS文件就可以解决换行问题。
首先引入文件:MultiLineTextSymbol.js(这里源自https://www.cnblogs.com/wandergis/p/4615802.html的博客)

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(/<br\s*\/?>/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;
        }
    }
});

然后就可以写我们自己的textSymbol样式了,直接带进去就行了。
示例如下:

$("#TotalWater").click(function () {//这里是绑定一个单击事件
                LabelLayer.clear();
                PolygonLayer.clear();//首先清理图层,我这里分别为标签图层和多边形图层

                for (var k in DmaAttr) {

                    var attr = {};
                    var regionGeometry = MT_DMA_REGION[k];
                    var region = new Polygon(regionGeometry);
                    attr.Name = k;
                    attr.total = DmaAttr[k].total;
                    attr.domesticWater1 = DmaAttr[k].domesticWater1;
                    attr.domesticWater2 = DmaAttr[k].domesticWater2;
                    attr.nonDomesticWater1 = DmaAttr[k].nonDomesticWater1;
                    attr.nonDomesticWater2 = DmaAttr[k].nonDomesticWater2;
                    attr.particularWater1 = DmaAttr[k].particularWater1;
                    attr.particularWater2 = DmaAttr[k].particularWater2;
                    console.log(attr);//上面这一串是准备把属性装进graphic
                    
                    graphics = new Graphic(region, symbol, attr);
                    //这里的t是组织好字符串,等一下方便显示
                    var t = "分区:" + attr.Name +
                        "\n总户数:" + attr.total +
                        "\n生活用水1:" + attr.domesticWater1 +
                        "\n生活用水2:" + attr.domesticWater2 +
                        "\n非生活用水1:" + attr.nonDomesticWater1 +
                        "\n非生活用水2:" + attr.nonDomesticWater2 +
                        "\n特种用水1:" + attr.particularWater1 +
                        "\n特种用水2:" + attr.particularWater2;
                    console.log(t);
                    PolygonLayer.add(graphics);
                    //这里是我的textSymbol的样式
                    var textSymbol3 = new TextSymbol({
                        
                        "type": "esriTS",
                        "color": [255, 99, 71, 255],
                        "backgroundColor": [0, 0, 0, 0],
                        "borderLineSize": 2,
                        "borderLineColor": [255, 0, 255, 255],
                        "haloSize": 0.5,
                        //"haloColor": [220, 220, 220, 220],
                        "verticalAlignment": "bottom",
                        "horizontalAlignment": "left",
                        "rightToLeft": false,
                        "angle": 0,
                        "xoffset": 0,
                        "yoffset": 0,
                        "kerning": true,
                        "text":t,//直接传t
                        "font": {
                            "family": "Arial",
                            "size": 12,
                            "style": "normal",
                            "weight": "normal",
                            "decoration": "none"
                        }
                       
                    });

                    var labelGraphic = new Graphic(new Point(DmaPoint[k].x, DmaPoint[k].y, map.SpatialReference), textSymbol3);
                    //把point和symbol组成一个graphic添加到,临时的graphic图层(我这里只需要临时显示,所以我使用的都是graphiclayer
                    LabelLayer.add(labelGraphic);
                }
            });

得到的结果如下:

zheyang de
我现在做出来得只能是显示多行,但还不能给他添加背景和边框,希望有会的朋友可以教一下我

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LH的苏小花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值