有没有办法随机更改原生Leaflet中的标记颜色?我正在使用可以设计风格的svg元素。 我知道有可能使用mapbox.js
编辑: 澄清我打算做什么:如果你通过双击或其他东西添加标记,它应该有随机颜色。为了达到这个目的,我想使用svg图标来标记它们。
这是我的代码:
myIcon = L.icon({
iconUrl: "icon_33997.svg",
iconAnchor: pinAnchor
});
newMarker = L.marker(lat, long], {
icon: myIcon
});
答案 0 :(得分:46)
所以这是谷歌在设计Leaflet Icon时的最佳热门之一,但它没有一个没有第三方的解决方案,我在React遇到了这个问题,因为我们需要动态颜色来处理我们的路线和图标
我提出的解决方案是使用Leaflet.DivIcon html
属性,它允许您传递一个被评估为DOM元素的字符串。
例如,我创建了一个标记样式:
const myCustomColour = '#583470'
const markerHtmlStyles = `
background-color: ${myCustomColour};
width: 3rem;
height: 3rem;
display: block;
left: -1.5rem;
top: -1.5rem;
position: relative;
border-radius: 3rem 3rem 0;
transform: rotate(45deg);
border: 1px solid #FFFFFF`
const icon = Leaflet.divIcon({
className: "my-custom-pin",
iconAnchor: [0, 24],
labelAnchor: [-6, 0],
popupAnchor: [0, -36],
html: `<span style="${markerHtmlStyles}" />`
})
将background-color
中的markerHtmlStyles
更改为您的自定义颜色,您就可以了。
答案 1 :(得分:23)
答案 2 :(得分:21)
Leaflet Markers存储为文件,与其他对象(如Polylines等)不同,
如果您需要自己的标记,可以找到解释如何操作的The official Leaflet Tutorial。
编辑:
在与主要开发人员阅读this conversation后,我搜索了标记SVG和here it is。
有了这个,您应该能够以您想要的方式为标记着色并随机设置它们的颜色。
再次编辑:
您可以使用MakiMarkers设置标记的颜色,并使用此扩展程序制作一些随机内容。 (这很简单,很好解释)
答案 3 :(得分:12)
由于您使用的是svg元素,因此您可以使用L.divIcon的html
属性提供传单标记图标,而不是使用L.icon中的iconUrl链接你的形象。
L.marker(latlng, {
icon: L.divIcon({
className: 'ship-div-icon',
html: '<svg>...</svg>'
})
}).addTo(map);
然后使用CSS fill属性为svg形状着色。将类\ es添加到svg的路径以进行精确控制可能很有用
<svg ... >
<g>
<path class="ship-icon" ... />
</g>
...
</svg>
最后,由于我还需要随机更改标记颜色,我在创建标记时直接更改了路径的填充属性
var pathFillColor = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
L.marker(latlng, {
icon: L.divIcon({
className: 'ship-div-icon',
html: '<svg ... ><g><path fill="'+pathFillColor+'" ... /> </g></svg>'
})
}).addTo(map);
答案 4 :(得分:9)
尝试Leaflet.awesome-markers lib - 它允许您设置颜色和其他样式。
答案 5 :(得分:8)
更改Leaflet标记颜色的一种廉价方法是使用CSS filter
属性。给该图标一个额外的类,然后在样式表中更改其颜色:
<style>
img.huechange { filter: hue-rotate(120deg); }
</style>
<script>
var marker = L.marker([y, x]).addTo(map);
marker._icon.classList.add("huechange");
</script>
这将产生一个红色标记:更改为hue-rotate
赋予的值以更改颜色。
答案 6 :(得分:6)
啊,事件监听器并通过setIcon()方法更改图标:
createdMarker.on("dblclick", function(evt) {
var myIcon = L.icon({
iconUrl: 'res/marker-icon-red.png',
shadowUrl: 'res/marker-shadow.png'
});
this.setIcon(myIcon);
});
答案 7 :(得分:4)
您还可以使用Google Charts API获取图标(只需使用您想要的十六进制颜色更改&#39; abcdef&#39;
示例:
答案 8 :(得分:3)
这是图标的SVG。
<svg width="28" height="41" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<linearGradient id="b">
<stop stop-color="#2e6c97" offset="0"/>
<stop stop-color="#3883b7" offset="1"/>
</linearGradient>
<linearGradient id="a">
<stop stop-color="#126fc6" offset="0"/>
<stop stop-color="#4c9cd1" offset="1"/>
</linearGradient>
<linearGradient y2="-0.004651" x2="0.498125" y1="0.971494" x1="0.498125" id="c" xlink:href="#a"/>
<linearGradient y2="-0.004651" x2="0.415917" y1="0.490437" x1="0.415917" id="d" xlink:href="#b"/>
</defs>
<g>
<title>Layer 1</title>
<rect id="svg_1" fill="#fff" width="12.625" height="14.5" x="411.279" y="508.575"/>
<path stroke="url(#d)" id="svg_2" stroke-linecap="round" stroke-width="1.1" fill="url(#c)" d="m14.095833,1.55c-6.846875,0 -12.545833,5.691 -12.545833,11.866c0,2.778 1.629167,6.308 2.80625,8.746l9.69375,17.872l9.647916,-17.872c1.177083,-2.438 2.852083,-5.791 2.852083,-8.746c0,-6.175 -5.607291,-11.866 -12.454166,-11.866zm0,7.155c2.691667,0.017 4.873958,2.122 4.873958,4.71s-2.182292,4.663 -4.873958,4.679c-2.691667,-0.017 -4.873958,-2.09 -4.873958,-4.679c0,-2.588 2.182292,-4.693 4.873958,-4.71z"/>
<path id="svg_3" fill="none" stroke-opacity="0.122" stroke-linecap="round" stroke-width="1.1" stroke="#fff" d="m347.488007,453.719c-5.944,0 -10.938,5.219 -10.938,10.75c0,2.359 1.443,5.832 2.563,8.25l0.031,0.031l8.313,15.969l8.25,-15.969l0.031,-0.031c1.135,-2.448 2.625,-5.706 2.625,-8.25c0,-5.538 -4.931,-10.75 -10.875,-10.75zm0,4.969c3.168,0.021 5.781,2.601 5.781,5.781c0,3.18 -2.613,5.761 -5.781,5.781c-3.168,-0.02 -5.75,-2.61 -5.75,-5.781c0,-3.172 2.582,-5.761 5.75,-5.781z"/>
</g>
</svg>
答案 9 :(得分:2)
我发现the SVG marker/icon是最好的一个。它非常灵活,可以包含您喜欢的任何颜色。您可以毫不费力地自定义整个图标:
function createIcon(markerColor) {
/* ...Code ommitted ... */
return new L.DivIcon.SVGIcon({
color: markerColor,
iconSize: [15,30],
circleRatio: 0.35
});
}
答案 10 :(得分:2)
添加地图的Html代码
<div id="map" style="height:480px; width:360px;"></div>
加载地图的css
.leaflet-div-icon
{
background-image: url('http://cloudmade.com/images/layout/cm-logo.png');
}
改变标记颜色的逻辑
var map = L.map('map').setView([51.5, -0.09], 13);
L.marker([51.49, -0.09]).addTo(map)
.bindPopup('Demo CSS3 popup. <br> Easily customizable.');
const myCustomColour = '#5f93ed'
const markerHtmlStyles = `
background-color: ${myCustomColour};
width: 15px;
height: 15px;
font-size:15px;
text-align:center;
display: block;
`
function thing(ct) {
return L.divIcon({
className: "box",
iconAnchor: [12, 25],
labelAnchor: [-6, 0],
popupAnchor: [0, -15],
html: `<span style="${markerHtmlStyles}" >M</span>`
})
}
L.marker([51.51, -0.09], {
icon: thing("hello")
}).addTo(map)
.bindPopup('divIcon CSS3 popup. <br> Supposed to be easily stylable.');
答案 11 :(得分:1)
在 R 中,使用addAwesomeMarkers()函数。产生红色标记的示例代码:
leaflet() %>%
addTiles() %>%
addAwesomeMarkers(lng = -77.03654, lat = 38.8973, icon = awesomeIcons(icon = 'ion-ionic', library = 'ion', markerColor = 'red'))
离子图标链接:http://ionicons.com/
答案 12 :(得分:0)
一个非常简单的方法是使用色调旋转过滤器:
https://developer.mozilla.org/fr/docs/Web/CSS/filter-function/hue-rotate()
有了这个,你可以打电话
var random_value = Math.floor(Math.random() * 360);
marker._icon.style.webkitFilter = "hue-rotate(" + parseString(random_value) + "deg)";
其中 random_value 是 0 到 360 之间的数字。
它将根据此值应用颜色。
答案 13 :(得分:0)
除了@guillermogfer描述的方式之外,如果您不想将整个svg代码粘贴到您的react组件中,这也是这样做的方法。 您可以将svg代码放在一个单独的文件中,并将其作为React组件加载到代码文件中,如下所示:
import { ReactComponent as SatelliteIcon } from "../assets/icons/satellite.svg";
完成此操作后,您就可以像使用React组件一样使用svg了,如下所示:
<SatelliteIcon className="svg-icon light-blue" />
我们最终要做的是定义一些在我们的应用程序中使用的标准svg颜色,因此我们可以将它们作为一个类传递,以更改svg的颜色。如果您事先不知道颜色或没有定义的颜色,则可以使用style属性动态覆盖svg文件中的属性,如下所示:
<SatelliteIcon style={{ stroke: "black" }}/>
要使其正常工作,将要覆盖的属性设置在svg中的元素上而不是单个路径上是很重要的。
为了使此svg图标显示在传单中,您可以使用@guillermogfer所述的divIcon。但是,由于divIcon的html属性不了解jsx,我们需要先将其转换为字符串:
L.divIcon({
className: 'div-icon',
html: ReactDOMServer.renderToString(
<SatelliteIcon className="svg-icon light-blue" />
)
})
答案 14 :(得分:0)
除了@tutts出色的答案外,我将其修改为:
...包括一个标题-您可以在其中使用FontAwesome图标或类似符号...
var myCustomColour = '#334455d0', // d0 -> alpha value
lat = 5.5,
lon = 5.5;
var caption = '', // '<i class="fa fa-eye" />' or 'abc' or ...
size = 10, // size of the marker
border = 2; // border thickness
var markerHtmlStyles = ' \
background-color: ' + myCustomColour + '; \
width: '+ (size * 3) +'px; \
height: '+ (size * 3) +'px; \
display: block; \
left: '+ (size * -1.5) +'px; \
top: '+ (size * -1.5) +'px; \
position: relative; \
border-radius: '+ (size * 3) +'px '+ (size * 3) +'px 0; \
transform: rotate(45deg); \
border: '+border+'px solid #FFFFFF;\
';
var captionStyles = '\
transform: rotate(-45deg); \
display:block; \
width: '+ (size * 3) +'px; \
text-align: center; \
line-height: '+ (size * 3) +'px; \
';
var icon = L.divIcon({
className: "color-pin-" + myCustomColour.replace('#', ''),
// on another project this is needed: [0, size*2 + border/2]
iconAnchor: [border, size*2 + border*2],
labelAnchor: [-(size/2), 0],
popupAnchor: [0, -(size*3 + border)],
html: '<span style="' + markerHtmlStyles + '"><span style="'+captionStyles+'">'+ caption + '</span></span>'
});
var marker = L.marker([lat, lon], {icon: icon})
.addTo(mymap);
和ES6版本(例如@tutts)..我将其与vue-leaflet一起使用
// caption could be: '<i class="fa fa-eye" />',
function makeMarkerIcon(color, caption) {
let myCustomColour = color + 'd0';
let size = 10, // size of the marker
border = 2; // border thickness
let markerHtmlStyles = `
background-color: ${myCustomColour};
width: ${size * 3}px;
height: ${size * 3}px;
display: block;
left: ${size * -1.5}px;
top: ${size * -1.5}px;
position: relative;
border-radius: ${size * 3}px ${size * 3}px 0;
transform: rotate(45deg);
border: ${border}px solid #FFFFFF;
`;
let captionStyles = `
transform: rotate(-45deg);
display:block;
width: ${size * 3}px;
text-align: center;
line-height: ${size * 3}px;
`;
let icon = L.divIcon({
className: 'color-pin-' + myCustomColour.replace('#', ''),
iconAnchor: [border, size*2 + border*2],
labelAnchor: [-(size/2), 0],
popupAnchor: [0, -(size*3 + border)],
html: `<span style="${markerHtmlStyles}"><span style="${captionStyles}">${caption || ''}</span></span>`
});
return icon;
}
var marker = L.marker([lat, lon], {icon: makeMarkerIcon('#123456d0', '?')})
.addTo(mymap);
答案 15 :(得分:0)
编写一个函数,该函数具有给定的颜色(或其他任何特征),可返回所需图标的SVG表示形式。然后,在创建标记时,请使用适当的参数引用此函数。
答案 16 :(得分:-1)
1)添加标记
2)找到css的backgroundcolor属性并进行更改。
这里是:
的 JS 强>
var myIcon = L.divIcon({
className: 'my-div-icon',
iconSize: [5, 5]
});
var marker = L.marker([50,-20], {icon: myIcon}).addTo(map);
marker.valueOf()._icon.style.backgroundColor = 'green'; //or any color