社区首页 >问答首页 >创建自定义传单标记簇svg图标

创建自定义传单标记簇svg图标
EN

Stack Overflow用户
提问于 2015-03-03 02:01:08
回答 1查看 2.9K关注 0票数 1

我用的是传单和商标。

我在传单上显示了数千个标记,并使用MarkerCluster创建集群。工作很好。现在,我想替换图标,以获得饼图为这里的例子

因此,我重载了创建图标的函数:

代码语言:javascript
代码运行次数:0
复制
var markerCluster = new L.MarkerClusterGroup({
              showCoverageOnHover: false, spiderfyOnMaxZoom: true, zoomToBoundsOnClick: true,
              iconCreateFunction: defineClusterIcon
           });

我无法修改代码是链接,因为我不使用geojson数据,我的标记是从ajax调用中获得的。我想要做的是得到一个简单的饼图,每个星系团有三个部分,分别是“植物学”、“动物学”和“古生物论”。所以对于一个集群,我得到了孩子。对于每一个孩子,我只能得到iconUrl链接和计数每一个‘植物学’,‘动物学’和‘古生物学家’。

我宣布iconCreateFunction()

代码语言:javascript
代码运行次数:0
复制
           function defineClusterIcon(cluster) {
              var children = cluster.getAllChildMarkers();
              var bcount = 0,
                 zcount = 0,
                 pcount = 0 ;
              for(var i in children){
                 var child = children[i];
                 switch ( child.options.icon.options.iconUrl ){
                    case 'resources/vendors/leaflet/images/marker-icon-bota.png' :
                       hcount ++; break ;
                    case 'resources/vendors/leaflet/images/marker-icon-paleon.png' :
                       pcount ++; break ;
                    case 'resources/vendors/leaflet/images/marker-icon-zoo.png' :
                       zcount ++; break ;
                 }
              }
              var data = {
                 'Botanique' : hcount ,
                 'Zoologie' : zcount ,
                 'Paleontologie' : pcount
              };
              //bake some svg markup
              var html = bakeThePie(data);
              //Create a new divIcon and assign the svg markup to the html property
                 myIcon = new L.DivIcon({
                    html: html,
                    className: 'marker-cluster',
                    iconSize: new L.Point(iconDim, iconDim)
                 });
              return myIcon;
           }

有没有一种简单的方法来创建返回svg的bakeThePie()函数?我找到的所有库都直接在带有给定id的div中追加svg。

EN

回答 1

Stack Overflow用户

发布于 2015-03-27 01:06:06

工作解决方案:

代码语言:javascript
代码运行次数:0
复制
var markerCluster = new L.MarkerClusterGroup({
              showCoverageOnHover: false,
              spiderfyOnMaxZoom: true,
              zoomToBoundsOnClick: true,
              iconCreateFunction: defineClusterIcon // this function render the cluster icon 
           });

创建标记的方式:

代码语言:javascript
代码运行次数:0
复制
 L.marker([DECIMALLATITUDE, L_DECIMALLONGITUDE],{icon: icontmp, 'title': domaine,'domaine':domaine,'occurenceid':id}).on('click', getSpecimenDataOnClick).addTo(markerCluster);

和使用集群标题属性的defineClusterIcon函数:

代码语言:javascript
代码运行次数:0
复制
function defineClusterIcon(cluster) {
/*function that generates a svg markup for the pie chart*/
function bakeThePie(options) {
    /*data and valueFunc are required*/
    if (!options.data || !options.valueFunc) {
        return '';
    }
    var data = options.data,
    valueFunc = options.valueFunc,
    r = options.outerRadius ? options.outerRadius : 28, //Default outer radius = 28px
    rInner = options.innerRadius ? options.innerRadius : r - 10, //Default inner radius = r-10
    strokeWidth = options.strokeWidth ? options.strokeWidth : 1, //Default stroke is 1
    pathClassFunc = options.pathClassFunc ? options.pathClassFunc : function () {
        return '';
    }, //Class for each path
    pathTitleFunc = options.pathTitleFunc ? options.pathTitleFunc : function () {
        return '';
    }, //Title for each path
    pieClass = options.pieClass ? options.pieClass : 'marker-cluster-pie', //Class for the whole pie
    pieLabel = options.pieLabel ? options.pieLabel : d3.sum(data, valueFunc), //Label for the whole pie
    pieLabelClass = options.pieLabelClass ? options.pieLabelClass : 'marker-cluster-pie-label', //Class for the pie label

    origo = (r + strokeWidth), //Center coordinate
    w = origo * 2, //width and height of the svg element
    h = w,
    donut = d3.layout.pie(),
    arc = d3.svg.arc().innerRadius(rInner).outerRadius(r);

    //Create an svg element
    var svg = document.createElementNS(d3.ns.prefix.svg, 'svg');
    //Create the pie chart
    var vis = d3.select(svg)
        .data([data])
        .attr('class', pieClass)
        .attr('width', w)
        .attr('height', h);

    var arcs = vis.selectAll('g.arc')
        .data(donut.value(valueFunc))
        .enter().append('svg:g')
        .attr('class', 'arc')
        .attr('transform', 'translate(' + origo + ',' + origo + ')');

    arcs.append('svg:path')
    .attr('class', pathClassFunc)
    .attr('stroke-width', strokeWidth)
    .attr('d', arc)
    .append('svg:title')
    .text(pathTitleFunc);

    vis.append('text')
    .attr('x', origo)
    .attr('y', origo)
    .attr('class', pieLabelClass)
    .attr('text-anchor', 'middle')
    //.attr('dominant-baseline', 'central')
    /*IE doesn't seem to support dominant-baseline, but setting dy to .3em does the trick*/
    .attr('dy', '.3em')
    .text(pieLabel);
    //Return the svg-markup rather than the actual element
    return serializeXmlNode(svg);
}

/*Helper function*/
function serializeXmlNode(xmlNode) {
    if (typeof window.XMLSerializer != "undefined") {
        return (new window.XMLSerializer()).serializeToString(xmlNode);
    } else if (typeof xmlNode.xml != "undefined") {
        return xmlNode.xml;
    }
    return "";
}

var children = cluster.getAllChildMarkers();

var n = children.length; //Get number of markers in cluster
var strokeWidth = 1; //Set clusterpie stroke width
var r = 30 - 2 * strokeWidth - (n < 10 ? 12 : n < 100 ? 8 : n < 1000 ? 4 : 0); //Calculate clusterpie radius...
var iconDim = (r + strokeWidth) * 2; //...and divIcon dimensions (leaflet really want to know the size)
var data = d3.nest() //Build a dataset for the pie chart
    .key(function (d) {
        return d.options.title;
    })
    .entries(children, d3.map);
//bake some svg markup
var html = bakeThePie({
        data : data,
        valueFunc : function (d) {
            return d.values.length;
        },
        strokeWidth : 1,
        outerRadius : r,
        innerRadius : r - 10,
        pieClass : 'cluster-pie',
        pieLabel : n,
        pieLabelClass : 'marker-cluster-pie-label',
        pathClassFunc : function (d) {
            return "category-" + d.data.key;
        },
        pathTitleFunc : function (d) {
            return d.data.key + ' (' + d.data.values.length + ' specimen' + (d.data.values.length != 1 ? 's' : '') + ')';
        }
    });
//Create a new divIcon and assign the svg markup to the html property
var myIcon = new L.DivIcon({
        html : html,
        className : 'marker-cluster',
        iconSize : new L.Point(iconDim, iconDim)
    });
return myIcon;

}

这样做并不好(浏览器冻结或显示一个弹出以停止脚本),因为我使用迭代Ajax调用来获取所需的所有数据。例如,10个ajax调用,它们分别创建500个标记。每次添加标记时,标记集群都会重新计算,图标的svg也会冻结。也许只有在加载所有数据或使用函数调用时才能创建svg图标?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28828870

复制
相关文章
lucene如何返回所有数据
我们在实际使用lucene的过程中,筛选多个条件时BooleanQuery这个类来实现,比如下面代码:
johnhuster的分享
2022/03/29
7110
如何利用CDO从数据集中提取数据
之前说了如何利用CDO查看数据集信息 使用CDO查看气象数据信息。这一次说一下利用CDO从数据集中提取数据。这部分是非常使用的,尤其是当涉及到大数据集的时候,其优势就变得非常明显了。
bugsuse
2020/04/21
8.8K0
如何利用CDO从数据集中提取数据
数据库的方向 - 行vs列
前言: 转载的好文不多,但此篇的确是难得一见的好文,如若不信,请仔细阅读。 此篇文章没有波涛汹涌的起伏,没有繁多的代码,只有悠然自得的文笔。 因此,分享此文给大家。 翻译原文链接:https://ww
谙忆
2021/01/21
1.1K0
数据库的方向 - 行vs列
从Bert预训练数据集中获取词向量
在一些操作过程中,经常要获取词向量,BERT做为一个在各项评测指标中都比较出色的,且提供了许多预训练模型的,从其中获取词向量是一些任务中必备的操作。
sparkexpert
2019/08/23
4.5K0
从Bert预训练数据集中获取词向量
Pandas DataFrame显示行和列的数据不全
pd.set_option('display.max_columns', None)
用户7886150
2020/12/26
6.7K0
FPGA计算3行同列数据之和
本文介绍了如何利用FPGA实现Sobel边缘检测算法,通过仿真实验证明该方法可以大幅提高边缘检测的实时性,从而在嵌入式系统中得到广泛应用。
NingHeChuan
2018/01/05
1.4K0
FPGA计算3行同列数据之和
从xlnet预训练数据集中获取词向量
利用pytorch-transformers中的方法进行预训练模型加载,然后进行词向量的获取和提取。
sparkexpert
2019/08/23
1.5K0
从xlnet预训练数据集中获取词向量
数据库行存储及列存储详解
本文参见:https://blog.csdn.net/Xingxinxinxin/article/details/80939277
全栈程序员站长
2022/09/06
2.7K0
数据库行存储及列存储详解
SAS数据集中一行与多行的比较
前几天看到一个群友提的一个问题:求上图中X小于等于所有Y值的个数。比如,第一个Y为0,则5个X中小于等于0的个数为0。实现这一目的的方法有多种,最易懂的方法应该是转置加数组,下面介绍其他两种方法:
专业余码农
2020/07/16
1.4K0
SAS数据集中一行与多行的比较
pandas数据清洗-删除没有序号的所有行的数据
pandas数据清洗-删除没有序号的所有行的数据 问题:我的数据如下,要求:我想要的是:有序号的行留下,没有序号的行都不要 图片 【代码及解析】 import pandas as pd filepath="E:/yhd_python/pandas.read_excel/student.xlsx" df=pd.read_excel(filepath,sheet_name='Sheet1',skiprows=1) df.tail() 先导入pands包,用read_excel读取文件,工作
哆哆Excel
2022/10/31
1.6K0
聊一聊数据库的行存与列存
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/07/26
1.7K0
聊一聊数据库的行存与列存
列存储、行存储
Sybase在2004年左右就推出了列存储的Sybase IQ数据库系统,主要用于在线分析、数据挖掘等查询密集型应用。列存储,缩写为DSM,相对于NSM(N-ary storage model),其主要区别在于:
全栈程序员站长
2022/09/14
7.9K0
列存储、行存储
ECharts数据集( dataset )的行或列映射为系列(series)
用户可以使用 seriesLayoutBy 配置项,改变图表对于行列的理解。seriesLayoutBy 可取值:
别团等shy哥发育
2023/02/25
1.1K0
ECharts数据集( dataset )的行或列映射为系列(series)
springmvc接收数据返回数据
1,当前端传递的参数名和方法形参名不一致时,通过@RequestParam指定转换关系
微醺
2019/01/17
1.5K0
Bootstrap行和列
在Bootstrap中,行(Row)和列(Column)是构建响应式网格布局的核心组件。它们允许我们创建灵活的网格系统,以便在不同的屏幕尺寸下进行布局。
堕落飞鸟
2023/05/17
2.1K0
从分散到集中,云南移动数据中心网络走上新征途
对于一家运营商来说,没什么比系统的高效稳定运行更重要了。对于云南移动信息技术部总经理于桃来说,自然同样如此。
IT创事记
2022/08/30
6540
从分散到集中,云南移动数据中心网络走上新征途
替换 VOC 数据集中图片路径
在一次做项目的时候,团队分配任务做数据集,用 labelimage 来打标,汇总数据时发现 xml 中的图片路径各不相同,于是就写了这个工具来修改 xml 中的图片路径。
HauHau
2022/01/12
1.6K0
用过Excel,就会获取pandas数据框架中的值、行和列
至此,我们已经学习了使用Python pandas来输入/输出(即读取和保存文件)数据,现在,我们转向更深入的部分。
fanjy
2021/11/29
19.2K0
用过Excel,就会获取pandas数据框架中的值、行和列
url从输入到页面返回数据经历了什么?
1>DNS解析可以理解为主寻找这个IP地址的过程,其中如果找到IP地址会进行本地缓存,以便下次继续使用
测试小兵
2019/07/22
8810
url从输入到页面返回数据经历了什么?
简单介绍数据采集中的数据埋点
每个人都会走路跑步,但是并不是人人都能成为专业的运动员那么出色。产品经理就是一种这样的职业,我们都可以站在产品的角度思考问题,但我们并不是都能够成为一名出色的产品经理。
木东居士
2019/02/28
2.6K0

相似问题

数据集中特定列的所有行

23

数据集中所有行的1列之和

33

从稀疏数据集中删除列和行

116

Excel,如何从数据集中返回特定行。

11

从数据集中复制符合条件的所有行

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档