web-dev-qa-db-ja.com

マーカーの色を変更するリーフレット

ネイティブのリーフレットでマーカーの色をランダムに変更する方法はありますか?スタイルを設定できるsvg要素を使用しています。 mapbox.jsでそれが可能であることを知っています

編集:私がやろうとしていることを明確にするために:ダブルクリックなどでマップにマーカーを追加する場合、ランダムな色にする必要があります。これを実現するために、マーカーにsvgアイコンを使用してスタイルを設定しました。

これは私のコードです:

myIcon = L.icon({
  iconUrl: "icon_33997.svg",
  iconAnchor: pinAnchor
});

newMarker = L.marker(lat, long], {
  icon: myIcon
});
46
Chromos

だから、これはリーフレットアイコンをスタイリングするためのGoogleのトップヒットの1つですが、サードパーティなしで機能するソリューションはなく、Reactでこの問題が発生していました。ルートとアイコン。

私が思いついた解決策は、 Leaflet.DivIconhtml 属性を使用することでした。これにより、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}" />`
})

markerHtmlStylesbackground-colorをカスタムカラーに変更すると、準備完了です。

Map with multiple coloured Markers

47
tutts

このサイトのアイコンにバインドしてください!

https://github.com/pointhi/leaflet-color-markers

ウェブサイトに含まれる詳細なハウツー情報。

27
K. Rohde

リーフレットマーカーは、他のオブジェクト(ポリラインなど)とは異なり、ファイルとして保存されます

独自のマーカーが必要な場合は、 公式リーフレットチュートリアル を参照してください。

編集:

主な開発者と this conversation を読んだ後、マーカーSVGと here is を検索しました。

これにより、マーカーを好きなように色付けして、ランダムに色を設定できるはずです。

もう一度編集:

MakiMarkers を使用してマーカーの色を設定し、この拡張機能を使用してランダムなものを作成できます。 (シンプルでわかりやすく説明されています)

21
vdolez

Svg要素を使用しているので、 L.icon のiconUrlを使用してリンクする代わりに L.divIconhtmlプロパティでリーフレットマーカーのアイコンをフィードできます。あなたの画像。

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);
13
guillermogfer

Leaflet.awesome-markers libを試してください。色やその他のスタイルを設定できます。

9
Matt

Ahhイベントリスナーを使用して、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
gal007

これがアイコンの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>
4
Daniel Rasmuson

Google Charts APIを使用してアイコンを取得することもできます( 'abcdef'を希望する16進数の色に変更するだけです:

例:

4

SVGマーカー/アイコン が最適なものであることがわかりました。非常に柔軟で、好きな色を使用できます。面倒なことなくアイコン全体をカスタマイズできます。

function createIcon(markerColor) {
  /* ...Code ommitted ... */

  return new L.DivIcon.SVGIcon({
            color: markerColor,
            iconSize: [15,30],
            circleRatio: 0.35
  });
}
2
hbulens

Rで、addAwesomeMarkers()関数を使用します。赤いマーカーを生成するサンプルコード:

leaflet() %>%
addTiles() %>%
addAwesomeMarkers(lng = -77.03654, lat = 38.8973, icon = awesomeIcons(icon = 'ion-ionic', library = 'ion', markerColor = 'red'))

イオンアイコンのリンク: http://ionicons.com/

1
Nick Keramaris

色(またはその他の特性)を指定すると、目的のアイコンのSVG表現を返す関数を作成します。次に、マーカーを作成するときに、適切なパラメーターを使用してこの関数を参照します。

0
webacad

@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);
0
BananaAcid