SVGファイルをロード
あなたはimageOverlay
を通して、あなたのファイルを読み込むことができますが、個々のパス/グループ/シェイプ上のイベント、あなたが取得することはありませんオーバーレイ上のイベントに限定されます。
SVGのコンポーネントでイベントを取得するには、SVGのコンポーネントをインライン展開するか、またはロードして必要なノードを作成することによって、そのノードに埋め込む必要があります。このような何か:
var url = 'https://upload.wikimedia.org/wikipedia/commons/f/fd/Ghostscript_Tiger.svg';
var req = new XMLHttpRequest();
req.onload = function(resp) {
var xml = this.responseXML;
var importedNode = document.importNode(xml.documentElement, true);
var g = document.createElementNS("http://www.w3.org/2000/svg", "g");
g.appendChild(importedNode);
g.setAttribute('class', 'svglayer');
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.appendChild(g);
svg.addEventListener('click', function(e) {
console.log(e.target.id)
})
document.body.appendChild(svg);
};
req.open("GET", url, true);
req.send();
このスニペットは、SVGファイルをロードDOMらとセットアップにターゲット要素のIDを記録しますclick
イベントを、それを追加します。
マップに埋め込みSVGこの知識を持つ
武装、あなたの代わりにdocument.body
のマップペインにSVGノードを追加することができます。ここでは、直接overlay
ペインを変更する簡単な例です:
map.getPane('overlayPane').appendChild(svg);
注意すべき重要な点は、リーフレットがnone
にCSS property pointer-events
を設定することにより、個々のパス要素をクリックを無効にしていることです。 Ghostscriptの作者によって
.leaflet-pane > svg .svglayer path {
pointer-events: auto ;
}
とデモ
var map = L.map(document.getElementById('map'),{
renderer: L.canvas()
}).setView([48.8583736, 2.2922926], 15);
L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
var url = 'https://upload.wikimedia.org/wikipedia/commons/f/fd/Ghostscript_Tiger.svg';
var req = new XMLHttpRequest();
req.onload = function(resp) {
var xml = this.responseXML;
var importedNode = document.importNode(xml.documentElement, true);
var g = document.createElementNS("http://www.w3.org/2000/svg", "g");
g.appendChild(importedNode);
g.setAttribute('class', 'svglayer');
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.appendChild(g);
svg.addEventListener('click', function(e) {
console.log(e.target.id, e.target.tagName)
})
map.getPane('overlayPane').appendChild(svg);
};
req.open("GET", url, true);
req.send();
html, body {padding:0; margin:0; height: 100%}
#map {height: 180px}
.leaflet-pane > svg .svglayer path {
pointer-events: auto ;
}
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" integrity="sha512-M2wvCLH6DSRazYeZRIm1JnYyh22purTM+FDB5CsyxtQJYeKq83arPe5wgbNmcFXGqiSH2XR8dT/fJISVA1r/zQ==" crossorigin=""/>
<script src="https://unpkg.com/[email protected]/dist/leaflet.js" integrity="sha512-lInM/apFSqyy1o6s89K4iQUKg6ppXEgsVxT35HbzUupEVRh2Eu9Wdl4tHj7dZO0s1uvplcYGmt3498TtHq+log==" crossorigin=""></script>
<div id='map'>
</div>
画像(:あなたは、パスのノード上のイベント、それゆえ追加CSSプロパティを取得するには、これを変更する必要がありGPL Ghostscript SVN:tiger。 L.imageOverlay(IMAGEURL、imageBounds).addTo(地図);(Wikimedia Commons
共有いくつかのコード –
するvar IMAGEURL = 'test2.svg' imageBounds = [(画像の境界を介してhttp://www.gnu.org/licenses/gpl.html)])EPS)GPL。 –
私はちょうどイメージとしてsvgをオーバーレイしていますが、これは正しいアプローチであるかどうかわかりません。他にも良い方法があれば教えてください –