这其实很简单。有几种方法可以做到这一点,但以下方法可能是最简单的方法之一。它根本不使用 Canvas,只使用纯 SVG。
我假设当你说“pin”是另一个文件时,这并不是一个严格的要求。IE。没有理由不能在地图 SVG 文件中包含图钉图片。
这是一个示例 SVG 地图文件。我现在假设它嵌入在 HTML 文件中,但外部文件也应该可以工作。
<html>
<body>
<svg id="map" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="500" height="400" viewBox="0 0 500 400">
<defs>
<!-- Define our map "pin". Just a circle in this case.
The circle is centred on (0,0) to make positioning at the destination point simpler. -->
<g id="pin">
<circle cx="0" cy="0" r="7" fill="white" stroke="green" stroke-width="2"/>
</g>
</defs>
<!-- A simple floorplan map -->
<g id="floor" fill="#ddd" stroke="black" stroke-width="3">
<rect x="50" y="50" width="200" height="150" />
<rect x="100" y="200" width="150" height="150" />
<rect x="250" y="100" width="200" height="225" />
</g>
<!-- A group to hold the created pin refernces. Not necessary, but keeps things tidy. -->
<g id="markers">
</g>
</svg>
</body>
</html>
“地板”组是我们的平面图,图钉图像已包含在该<defs>
部分中。该部分中定义的<defs>
内容本身不会呈现。它必须在文件的其他地方引用。
从这里你需要的是一个简单的 Javascript 循环,它使用 DOM<use>
为每个 pin 添加一个元素。
var markerPositions = [[225,175], [75,75], [150,225], [400,125], [300,300]];
var svgNS = "http://www.w3.org/2000/svg";
var xlinkNS = "http://www.w3.org/1999/xlink";
for (var i=0; i<markerPositions.length; i++) {
// Create an SVG <use> element
var use = document.createElementNS(svgNS, "use");
// Point it at our pin marker (the circle)
use.setAttributeNS(xlinkNS, "href", "#pin");
// Set it's x and y
use.setAttribute("x", markerPositions[i][0]);
use.setAttribute("y", markerPositions[i][1]);
// Add it to the "markers" group
document.getElementById("markers").appendChild(use);
}
<use>
允许我们引用 SVG 文件中的另一个元素。因此,我们<use>
为要放置的每个引脚创建一个元素。每个都<use>
引用我们预定义的引脚符号。
这是一个演示:http: //jsfiddle.net/6cFfU/3/
更新:
要使用外部“pin”文件,从图像中引用它应该可以工作。
<g id="pin">
<image xlink:href="pin.svg"/>
</g>
在这里演示:http: //jsfiddle.net/6cFfU/4/
如果您甚至不允许从地图文件中引用pin 文件。然后,您只需要使用一些 DOM 操作来插入此标记定义。就像是:
var grp = document.createElementNS(svgNS, "g");
grp.id = "pin";
var img = document.createElementNS(svgNS, "image");
img.setAttributeNS(xlinkNS, "href", "pin.pvg");
grp.appendChild(img);
document.getElementsByTagName("defs")[0].appendChild(grp);
在这里演示:http: //jsfiddle.net/7Mysc/1/
假设您想走纯 SVG 路线。还有其他方法。例如,您可以使用 HTML 做类似的事情。将您的 PIN 文件包装在 a 中<div>
并使用 jQuery 克隆 div,然后使用绝对定位将它们定位在正确的位置。但是,您必须担心调整地图比例等。